more precise using PIIODevice::reading_now flag, Warning! one should use it manually now
small enum fix for pip_cmg
This commit is contained in:
@@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake
|
|||||||
project(PIP)
|
project(PIP)
|
||||||
set(PIP_MAJOR 3)
|
set(PIP_MAJOR 3)
|
||||||
set(PIP_MINOR 4)
|
set(PIP_MINOR 4)
|
||||||
set(PIP_REVISION 0)
|
set(PIP_REVISION 1)
|
||||||
set(PIP_SUFFIX )
|
set(PIP_SUFFIX )
|
||||||
set(PIP_COMPANY SHS)
|
set(PIP_COMPANY SHS)
|
||||||
set(PIP_DOMAIN org.SHS)
|
set(PIP_DOMAIN org.SHS)
|
||||||
|
|||||||
@@ -107,6 +107,7 @@ bool PICloudClient::closeDevice() {
|
|||||||
ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
|
ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
|
||||||
if (is_deleted) return -1;
|
if (is_deleted) return -1;
|
||||||
//piCoutObj << "readDevice";
|
//piCoutObj << "readDevice";
|
||||||
|
reading_now = true;
|
||||||
if (!is_connected && eth.isClosed()) openDevice();
|
if (!is_connected && eth.isClosed()) openDevice();
|
||||||
ssize_t sz = -1;
|
ssize_t sz = -1;
|
||||||
mutex_buff.lock();
|
mutex_buff.lock();
|
||||||
@@ -118,6 +119,7 @@ ssize_t PICloudClient::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
}
|
}
|
||||||
mutex_buff.unlock();
|
mutex_buff.unlock();
|
||||||
if (!is_connected) opened_ = false;
|
if (!is_connected) opened_ = false;
|
||||||
|
reading_now = false;
|
||||||
//piCoutObj << "readDevice done" << sz;
|
//piCoutObj << "readDevice done" << sz;
|
||||||
return sz;
|
return sz;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,8 +90,10 @@ bool PICloudServer::closeDevice() {
|
|||||||
|
|
||||||
ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) {
|
ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) {
|
||||||
//piCoutObj << "readDevice";
|
//piCoutObj << "readDevice";
|
||||||
|
reading_now = true;
|
||||||
if (!opened_) openDevice();
|
if (!opened_) openDevice();
|
||||||
else piMSleep(eth.readTimeout());
|
else piMSleep(eth.readTimeout());
|
||||||
|
reading_now = false;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -103,7 +103,9 @@ ssize_t PICAN::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
//piCout << "PICAN read";
|
//piCout << "PICAN read";
|
||||||
can_frame frame;
|
can_frame frame;
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
|
reading_now = true;
|
||||||
ret = ::read(sock, &frame, sizeof(can_frame));
|
ret = ::read(sock, &frame, sizeof(can_frame));
|
||||||
|
reading_now = false;
|
||||||
if (ret < 0) {/*piCoutObj << "Error while read CAN frame " << ret;*/ return -1;}
|
if (ret < 0) {/*piCoutObj << "Error while read CAN frame " << ret;*/ return -1;}
|
||||||
//piCoutObj << "receive CAN frame Id =" << frame.can_id;
|
//piCoutObj << "receive CAN frame Id =" << frame.can_id;
|
||||||
memcpy(read_to, frame.data, piMini(frame.can_dlc, max_size));
|
memcpy(read_to, frame.data, piMini(frame.can_dlc, max_size));
|
||||||
|
|||||||
@@ -685,14 +685,18 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
// piCoutObj << "read from " << ip_ << ":" << port_;
|
// piCoutObj << "read from " << ip_ << ":" << port_;
|
||||||
switch (type()) {
|
switch (type()) {
|
||||||
case TCP_SingleTCP:
|
case TCP_SingleTCP:
|
||||||
|
reading_now = true;
|
||||||
::listen(sock, 64);
|
::listen(sock, 64);
|
||||||
|
reading_now = false;
|
||||||
s = accept(sock, (sockaddr * )&client_addr, &slen);
|
s = accept(sock, (sockaddr * )&client_addr, &slen);
|
||||||
if (s == -1) {
|
if (s == -1) {
|
||||||
//piCoutObj << "Can`t accept new connection, " << ethErrorString();
|
//piCoutObj << "Can`t accept new connection, " << ethErrorString();
|
||||||
piMinSleep();
|
piMinSleep();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
reading_now = true;
|
||||||
rs = ethRecv(s, read_to, max_size);
|
rs = ethRecv(s, read_to, max_size);
|
||||||
|
reading_now = false;
|
||||||
closeSocket(s);
|
closeSocket(s);
|
||||||
return rs;
|
return rs;
|
||||||
case TCP_Client:
|
case TCP_Client:
|
||||||
@@ -714,7 +718,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
||||||
#endif
|
#endif
|
||||||
//piCout << "connect to " << path() << "...";
|
//piCout << "connect to " << path() << "...";
|
||||||
|
reading_now = true;
|
||||||
connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0);
|
connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0);
|
||||||
|
reading_now = false;
|
||||||
//piCout << "connect to " << path() << connected_;
|
//piCout << "connect to " << path() << connected_;
|
||||||
if (!connected_)
|
if (!connected_)
|
||||||
piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString();
|
piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString();
|
||||||
@@ -728,7 +734,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
}
|
}
|
||||||
if (!connected_) return -1;
|
if (!connected_) return -1;
|
||||||
errorClear();
|
errorClear();
|
||||||
|
reading_now = true;
|
||||||
rs = ethRecv(sock, read_to, max_size);
|
rs = ethRecv(sock, read_to, max_size);
|
||||||
|
reading_now = false;
|
||||||
//piCoutObj << "readed" << rs;
|
//piCoutObj << "readed" << rs;
|
||||||
if (rs <= 0) {
|
if (rs <= 0) {
|
||||||
lerr = ethErrorCore();
|
lerr = ethErrorCore();
|
||||||
@@ -757,7 +765,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
return rs;
|
return rs;
|
||||||
case UDP:
|
case UDP:
|
||||||
memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_));
|
memset(&PRIVATE->raddr_, 0, sizeof(PRIVATE->raddr_));
|
||||||
|
reading_now = true;
|
||||||
rs = ethRecvfrom(sock, read_to, max_size, 0, (sockaddr*)&PRIVATE->raddr_);
|
rs = ethRecvfrom(sock, read_to, max_size, 0, (sockaddr*)&PRIVATE->raddr_);
|
||||||
|
reading_now = false;
|
||||||
if (rs > 0) {
|
if (rs > 0) {
|
||||||
addr_lr.set(uint(PRIVATE->raddr_.sin_addr.s_addr), ntohs(PRIVATE->raddr_.sin_port));
|
addr_lr.set(uint(PRIVATE->raddr_.sin_addr.s_addr), ntohs(PRIVATE->raddr_.sin_port));
|
||||||
//piCoutObj << "read from" << ip_r << ":" << port_r << rs << "bytes";
|
//piCoutObj << "read from" << ip_r << ":" << port_r << rs << "bytes";
|
||||||
|
|||||||
@@ -439,7 +439,10 @@ PIByteArray PIFile::get() {
|
|||||||
|
|
||||||
ssize_t PIFile::readDevice(void * read_to, ssize_t max_size) {
|
ssize_t PIFile::readDevice(void * read_to, ssize_t max_size) {
|
||||||
if (!canRead() || PRIVATE->fd == 0) return -1;
|
if (!canRead() || PRIVATE->fd == 0) return -1;
|
||||||
return fread(read_to, 1, max_size, PRIVATE->fd);
|
reading_now = true;
|
||||||
|
ssize_t ret = fread(read_to, 1, max_size, PRIVATE->fd);
|
||||||
|
reading_now = false;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -270,9 +270,7 @@ void PIIODevice::stop() {
|
|||||||
|
|
||||||
|
|
||||||
ssize_t PIIODevice::read(void * read_to, ssize_t max_size) {
|
ssize_t PIIODevice::read(void * read_to, ssize_t max_size) {
|
||||||
reading_now = true;
|
|
||||||
ssize_t ret = readDevice(read_to, max_size);
|
ssize_t ret = readDevice(read_to, max_size);
|
||||||
reading_now = false;
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -285,9 +283,7 @@ ssize_t PIIODevice::read(PIMemoryBlock mb) {
|
|||||||
PIByteArray PIIODevice::read(ssize_t max_size) {
|
PIByteArray PIIODevice::read(ssize_t max_size) {
|
||||||
if (max_size <= 0) return PIByteArray();
|
if (max_size <= 0) return PIByteArray();
|
||||||
buffer_in.resize(max_size);
|
buffer_in.resize(max_size);
|
||||||
reading_now = true;
|
|
||||||
ssize_t ret = readDevice(buffer_in.data(), max_size);
|
ssize_t ret = readDevice(buffer_in.data(), max_size);
|
||||||
reading_now = false;
|
|
||||||
if (ret < 0) return PIByteArray();
|
if (ret < 0) return PIByteArray();
|
||||||
return buffer_in.resized(ret);
|
return buffer_in.resized(ret);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -536,6 +536,9 @@ protected:
|
|||||||
ReadRetFunc func_read = nullptr;
|
ReadRetFunc func_read = nullptr;
|
||||||
bool opened_ = false;
|
bool opened_ = false;
|
||||||
void * ret_data_ = nullptr;
|
void * ret_data_ = nullptr;
|
||||||
|
|
||||||
|
//! \~english Set this flag while blocking operations
|
||||||
|
//! \~russian Устанавливайте этот флаг во время блокирующих операций
|
||||||
std::atomic_bool reading_now;
|
std::atomic_bool reading_now;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -798,7 +798,9 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
if (sending) return -1;
|
if (sending) return -1;
|
||||||
// piCoutObj << "com event ...";
|
// piCoutObj << "com event ...";
|
||||||
//piCoutObj << "read ..." << PRIVATE->hCom;
|
//piCoutObj << "read ..." << PRIVATE->hCom;
|
||||||
|
reading_now = true;
|
||||||
ReadFile(PRIVATE->hCom, read_to, max_size, &PRIVATE->readed, 0);
|
ReadFile(PRIVATE->hCom, read_to, max_size, &PRIVATE->readed, 0);
|
||||||
|
reading_now = false;
|
||||||
DWORD err = GetLastError();
|
DWORD err = GetLastError();
|
||||||
//piCout << err;
|
//piCout << err;
|
||||||
if (err == ERROR_BAD_COMMAND || err == ERROR_ACCESS_DENIED) {
|
if (err == ERROR_BAD_COMMAND || err == ERROR_ACCESS_DENIED) {
|
||||||
@@ -810,11 +812,13 @@ ssize_t PISerial::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
return PRIVATE->readed;
|
return PRIVATE->readed;
|
||||||
#else
|
#else
|
||||||
if (!canRead()) return -1;
|
if (!canRead()) return -1;
|
||||||
|
reading_now = true;
|
||||||
ssize_t ret = ::read(fd, read_to, max_size);
|
ssize_t ret = ::read(fd, read_to, max_size);
|
||||||
|
reading_now = false;
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
int err = errno;
|
int err = errno;
|
||||||
if (err == EBADF || err == EFAULT || err == EINVAL || err == EIO) {
|
if (err == EBADF || err == EFAULT || err == EINVAL || err == EIO) {
|
||||||
PIThread::stop(false);
|
softStopThreadedRead();
|
||||||
close();
|
close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -322,15 +322,18 @@ bool PIUSB::closeDevice() {
|
|||||||
ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) {
|
ssize_t PIUSB::readDevice(void * read_to, ssize_t max_size) {
|
||||||
#ifdef PIP_USB
|
#ifdef PIP_USB
|
||||||
if (isClosed() || ep_read.isNull()) return -1;
|
if (isClosed() || ep_read.isNull()) return -1;
|
||||||
|
ssize_t ret = -1;
|
||||||
|
reading_now = true;
|
||||||
switch (ep_read.transfer_type) {
|
switch (ep_read.transfer_type) {
|
||||||
case Endpoint::Bulk:
|
case Endpoint::Bulk:
|
||||||
/*piCoutObj << "bulk read" << max_size;*/
|
/*piCoutObj << "bulk read" << max_size;*/
|
||||||
return usb_bulk_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
ret = usb_bulk_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
||||||
case Endpoint::Interrupt:
|
case Endpoint::Interrupt:
|
||||||
return usb_interrupt_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
ret = usb_interrupt_read(hdev, ep_read.address, (char * )read_to, max_size, timeout_r);
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
return -1;
|
reading_now = false;
|
||||||
|
return ret;
|
||||||
#else
|
#else
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -298,16 +298,24 @@ void writeClassStreamMembersIn(PIIOTextStream & ts, const PICodeParser::Entity *
|
|||||||
if (m.meta.contains("id"))
|
if (m.meta.contains("id"))
|
||||||
cnt = m.meta.value("id").toInt();
|
cnt = m.meta.value("id").toInt();
|
||||||
if (m.dims.isEmpty()) {
|
if (m.dims.isEmpty()) {
|
||||||
|
bool is_enum = parser.isEnum(m.type);
|
||||||
if (simple) {
|
if (simple) {
|
||||||
ts << "\ts >> ";
|
ts << "\t";
|
||||||
if (parser.isEnum(m.type))
|
if (is_enum) ts << "{int i; ";
|
||||||
ts << "(int&)";
|
ts << "s >> ";
|
||||||
ts << "v." << m.name << ";\n";
|
if (is_enum) ts << "i;";
|
||||||
|
else ts << "v." << m.name << ";";
|
||||||
|
if (is_enum) ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||||
|
ts << "\n";
|
||||||
} else {
|
} else {
|
||||||
ts << "\t\tcase " << cnt << ": cs.get(";
|
ts << "\t\tcase " << cnt << ":";
|
||||||
if (parser.isEnum(m.type))
|
if (is_enum) ts << " {int i;";
|
||||||
ts << "(int&)";
|
ts << " cs.get(";
|
||||||
ts << "v." << m.name << "); break;\n";
|
if (is_enum) ts << "i";
|
||||||
|
else ts << "v." << m.name;
|
||||||
|
ts << ");";
|
||||||
|
if (is_enum) ts << " v." << m.name << " = (" << m.type << ")i;}";
|
||||||
|
ts << " break;\n";
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PIString ptype = m.type.left(m.type.find('[')).trim();
|
PIString ptype = m.type.left(m.type.find('[')).trim();
|
||||||
|
|||||||
Reference in New Issue
Block a user