Merge branch 'master' into pico_sdk

This commit is contained in:
2026-08-11 18:21:50 +03:00
29 changed files with 243 additions and 139 deletions
+4 -3
View File
@@ -77,7 +77,8 @@ bool PICAN::openDevice() {
}
fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK);
ifreq ifr;
strcpy(ifr.ifr_name, path().dataAscii());
piZeroMemory(ifr);
strncpy(ifr.ifr_name, path().dataAscii(), sizeof(ifr.ifr_name));
piCout << "PICAN try to get interface index...";
if (ioctl(sock, SIOCGIFINDEX, &ifr) < 0) {
piCoutObj << "Error! while determin the interface ioctl";
@@ -128,8 +129,8 @@ ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
#ifdef PIP_CAN
if (sock == -1) return -1;
// piCout << "PICAN read";
can_frame frame;
ssize_t ret = 0;
can_frame frame = {};
ssize_t ret = 0;
if (PRIVATE->event.wait(sock)) ret = ::read(sock, &frame, sizeof(can_frame));
if (ret < 0) { /*piCoutObj << "Error while read CAN frame " << ret;*/
return -1;
+6 -5
View File
@@ -373,15 +373,16 @@ PIVector<PIFile::FileInfo> PIDir::entries(const PIRegularExpression & regexp) {
closedir(dir);
}
# else
dirent ** list;
int cnt = scandir(p.data(),
&list,
0,
dirent ** list = nullptr;
int cnt = scandir(p.data(),
&list,
0,
# if defined(MAC_OS) || defined(ANDROID) || defined(BLACKBERRY)
alphasort);
alphasort);
# else
versionsort);
# endif
if (cnt < 0) return ret;
for (int i = 0; i < cnt; ++i) {
ret << PIFile::fileInfo(dp + PIString(list[i]->d_name));
free(list[i]);
+5 -3
View File
@@ -1207,8 +1207,10 @@ PIEthernet::InterfaceList PIEthernet::interfaces() {
strcpy(ir.ifr_name, in.dataAscii());
if (ioctl(s, SIOCGIFHWADDR, &ir) == 0) ci.mac = macFromBytes(PIByteArray(ir.ifr_hwaddr.sa_data, 6));
if (ioctl(s, SIOCGIFADDR, &ir) >= 0) ci.address = getSockAddr(&ir.ifr_addr);
if (ioctl(s, SIOCGIFNETMASK, &ir) >= 0) ci.netmask = getSockAddr(&ir.ifr_addr);
ioctl(s, SIOCGIFMTU, &ci.mtu);
if (ioctl(s, SIOCGIFNETMASK, &ir) >= 0) ci.netmask = getSockAddr(&ir.ifr_netmask);
if (ioctl(s, SIOCGIFMTU, &ir) == 0) {
ci.mtu = ir.ifr_mtu;
}
if (ci.address == "127.0.0.1") ci.flags |= PIEthernet::ifLoopback;
il << ci;
}
@@ -1302,7 +1304,7 @@ PINetworkAddress PIEthernet::interfaceAddress(const PIString & interface_) {
# else
struct ifreq ifr;
piZeroMemory(ifr);
strcpy(ifr.ifr_name, interface_.dataAscii());
strncpy(ifr.ifr_name, interface_.dataAscii(), sizeof(ifr.ifr_name));
int s = ::socket(AF_INET, SOCK_DGRAM, 0);
if (s != -1) {
ioctl(s, SIOCGIFADDR, &ifr);
+5
View File
@@ -1291,6 +1291,11 @@ PIVector<PISerial::DeviceInfo> PISerial::availableDevicesInfo(bool test) {
if (!rok) {
ret.remove(i);
--i;
#ifdef WINDOWS
CloseHandle(hComm);
#else
::close(fd);
#endif
continue;
}
# ifdef WINDOWS
+5
View File
@@ -144,6 +144,9 @@ bool PISharedMemory::openDevice() {
::close(fd);
if (PRIVATE->data == MAP_FAILED) {
piCoutObj << "mmap error," << errorString();
if (PRIVATE->owner) shm_unlink((const char *)PRIVATE->name.data());
PRIVATE->data = nullptr;
PRIVATE->owner = false;
return false;
}
// piCoutObj << "opened" << PRIVATE->data;
@@ -251,6 +254,7 @@ int PISharedMemory::read(void * read_to, int max_size) {
int PISharedMemory::read(void * read_to, int max_size, int offset) {
if (offset < 0 || max_size < 0 || offset > dsize - max_size) return -1;
#ifdef WINDOWS
if (!PRIVATE->data) return -1;
CopyMemory(read_to, &(((char *)(PRIVATE->data))[offset]), max_size);
@@ -271,6 +275,7 @@ int PISharedMemory::write(const void * data, int max_size) {
int PISharedMemory::write(const void * data, int max_size, int offset) {
if (offset < 0 || max_size < 0 || offset > dsize - max_size) return -1;
#ifdef WINDOWS
if (!PRIVATE->data) return -1;
CopyMemory(&(((char *)(PRIVATE->data))[offset]), data, max_size);
+6
View File
@@ -106,18 +106,24 @@ bool PISPI::openDevice() {
ret = ioctl(PRIVATE->fd, SPI_IOC_WR_MODE, &spi_mode);
if (ret == -1) {
piCoutObj << "can't set spi write mode";
::close(PRIVATE->fd);
PRIVATE->fd = -1;
return false;
}
// piCoutObj << "set bits" << spi_bits;
ret = ioctl(PRIVATE->fd, SPI_IOC_WR_BITS_PER_WORD, &spi_bits);
if (ret == -1) {
piCoutObj << "can't set bits per word";
::close(PRIVATE->fd);
PRIVATE->fd = -1;
return false;
}
// piCoutObj << "set speed" << spi_speed;
ret = ioctl(PRIVATE->fd, SPI_IOC_WR_MAX_SPEED_HZ, &spi_speed);
if (ret == -1) {
piCoutObj << "can't set max write speed hz";
::close(PRIVATE->fd);
PRIVATE->fd = -1;
return false;
}
piCoutObj << "SPI open" << path() << "speed:" << spi_speed / 1000 << "KHz"