ready to test
This commit is contained in:
@@ -107,7 +107,6 @@ 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();
|
||||||
@@ -119,7 +118,6 @@ 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;
|
||||||
}
|
}
|
||||||
@@ -132,6 +130,11 @@ ssize_t PICloudClient::writeDevice(const void * data, ssize_t size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PICloudClient::stopThreadedReadDevice() {
|
||||||
|
cond_buff.notifyOne();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PICloudClient::internalDisconnect() {
|
void PICloudClient::internalDisconnect() {
|
||||||
is_connected = false;
|
is_connected = false;
|
||||||
cond_buff.notifyOne();
|
cond_buff.notifyOne();
|
||||||
@@ -177,4 +180,3 @@ void PICloudClient::_readed(PIByteArray & ba) {
|
|||||||
while (buff.size_s() > threadedReadBufferSize()) piMSleep(100); // FIXME: sleep here is bad
|
while (buff.size_s() > threadedReadBufferSize()) piMSleep(100); // FIXME: sleep here is bad
|
||||||
//piCoutObj << "_readed done";
|
//piCoutObj << "_readed done";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -90,10 +90,8 @@ 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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,6 +102,11 @@ ssize_t PICloudServer::writeDevice(const void * data, ssize_t max_size) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void PICloudServer::stopThreadedReadDevice() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void PICloudServer::clientDisconnect(uint client_id) {
|
void PICloudServer::clientDisconnect(uint client_id) {
|
||||||
tcp.sendDisconnected(client_id);
|
tcp.sendDisconnected(client_id);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -53,6 +53,7 @@ protected:
|
|||||||
ssize_t readDevice(void * read_to, ssize_t max_size) override;
|
ssize_t readDevice(void * read_to, ssize_t max_size) override;
|
||||||
ssize_t writeDevice(const void * data, ssize_t size) override;
|
ssize_t writeDevice(const void * data, ssize_t size) override;
|
||||||
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
DeviceInfoFlags deviceInfoFlags() const override {return PIIODevice::Reliable;}
|
||||||
|
void stopThreadedReadDevice() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER1(void, _readed, PIByteArray &, data);
|
EVENT_HANDLER1(void, _readed, PIByteArray &, data);
|
||||||
@@ -65,6 +66,7 @@ private:
|
|||||||
PIConditionVariable cond_connect;
|
PIConditionVariable cond_connect;
|
||||||
std::atomic_bool is_connected;
|
std::atomic_bool is_connected;
|
||||||
std::atomic_bool is_deleted;
|
std::atomic_bool is_deleted;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // PICLOUDCLIENT_H
|
#endif // PICLOUDCLIENT_H
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ protected:
|
|||||||
bool closeDevice() override;
|
bool closeDevice() override;
|
||||||
ssize_t readDevice(void * read_to, ssize_t max_size) override;
|
ssize_t readDevice(void * read_to, ssize_t max_size) override;
|
||||||
ssize_t writeDevice(const void * data, ssize_t max_size) override;
|
ssize_t writeDevice(const void * data, ssize_t max_size) override;
|
||||||
|
void stopThreadedReadDevice() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EVENT_HANDLER1(void, _readed, PIByteArray &, ba);
|
EVENT_HANDLER1(void, _readed, PIByteArray &, ba);
|
||||||
|
|||||||
@@ -752,9 +752,9 @@ ssize_t PIEthernet::readDevice(void * read_to, ssize_t max_size) {
|
|||||||
#ifdef QNX
|
#ifdef QNX
|
||||||
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
PRIVATE->addr_.sin_len = sizeof(PRIVATE->addr_);
|
||||||
#endif
|
#endif
|
||||||
//piCout << "connect to " << path() << "...";
|
piCout << "connect to " << path() << "...";
|
||||||
connected_ = connectTCP();
|
connected_ = connectTCP();
|
||||||
//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();
|
||||||
opened_ = connected_;
|
opened_ = connected_;
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ PIIODevice::PIIODevice(const PIString & path, PIIODevice::DeviceMode mode): PIOb
|
|||||||
|
|
||||||
PIIODevice::~PIIODevice() {
|
PIIODevice::~PIIODevice() {
|
||||||
stop();
|
stop();
|
||||||
|
waitThreadedReadFinished();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -213,11 +214,12 @@ void PIIODevice::stopThreadedRead() {
|
|||||||
#ifdef MICRO_PIP
|
#ifdef MICRO_PIP
|
||||||
read_thread.stop();
|
read_thread.stop();
|
||||||
#else
|
#else
|
||||||
|
read_thread.stop();
|
||||||
|
read_thread.interrupt();
|
||||||
|
stopThreadedReadDevice();
|
||||||
if (reading_now) {
|
if (reading_now) {
|
||||||
read_thread.terminate();
|
read_thread.terminate();
|
||||||
reading_now = false;
|
reading_now = false;
|
||||||
} else {
|
|
||||||
read_thread.stop();
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -490,6 +490,10 @@ protected:
|
|||||||
//! \~english Function executed when thread read some data, default implementation execute external callback "ret_func_"
|
//! \~english Function executed when thread read some data, default implementation execute external callback "ret_func_"
|
||||||
//! \~russian Метод вызывается после каждого успешного потокового чтения, по умолчанию вызывает callback "ret_func_"
|
//! \~russian Метод вызывается после каждого успешного потокового чтения, по умолчанию вызывает callback "ret_func_"
|
||||||
virtual bool threadedRead(const uchar * readed, ssize_t size);
|
virtual bool threadedRead(const uchar * readed, ssize_t size);
|
||||||
|
|
||||||
|
//! \~english Function executed after PIThread::stop() and PIThread::interrupt() of read thread
|
||||||
|
//! \~russian Метод вызывается после PIThread::stop() и PIThread::interrupt() потока чтения
|
||||||
|
virtual void stopThreadedReadDevice() {}
|
||||||
|
|
||||||
//! \~english Reimplement to construct full unambiguous string, describes this device.
|
//! \~english Reimplement to construct full unambiguous string, describes this device.
|
||||||
//! Default implementation returns \a path()
|
//! Default implementation returns \a path()
|
||||||
|
|||||||
@@ -798,9 +798,7 @@ 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) {
|
||||||
|
|||||||
@@ -1114,7 +1114,10 @@ PIVector<PIIODevice * > PIConnection::DevicePool::boundedDevices(const PIConnect
|
|||||||
|
|
||||||
PIConnection::DevicePool::DeviceData::~DeviceData() {
|
PIConnection::DevicePool::DeviceData::~DeviceData() {
|
||||||
if (rthread) {
|
if (rthread) {
|
||||||
rthread->terminate();
|
rthread->stop();
|
||||||
|
rthread->interrupt();
|
||||||
|
if (!rthread->waitForFinish(1000))
|
||||||
|
rthread->terminate();
|
||||||
delete rthread;
|
delete rthread;
|
||||||
rthread = nullptr;
|
rthread = nullptr;
|
||||||
}
|
}
|
||||||
@@ -1146,8 +1149,13 @@ void __DevicePool_threadReadDP(void * ddp) {
|
|||||||
}
|
}
|
||||||
if (dev->isClosed()) {
|
if (dev->isClosed()) {
|
||||||
if (!dev->open()) {
|
if (!dev->open()) {
|
||||||
piMSleep(dev->reopenTimeout());
|
PITimeMeasurer tm;
|
||||||
return;
|
int timeout = dev->reopenTimeout();
|
||||||
|
while (tm.elapsed_m() < timeout) {
|
||||||
|
if (dd->rthread->isStopping())
|
||||||
|
return;
|
||||||
|
piMSleep(50);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
PIByteArray ba;
|
PIByteArray ba;
|
||||||
|
|||||||
42
main.cpp
42
main.cpp
@@ -109,41 +109,53 @@ int main(int argc, char * argv[]) {
|
|||||||
delete threads[i];
|
delete threads[i];
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
PIEthernet eth(PIEthernet::TCP_Server), seth(PIEthernet::TCP_Client);
|
PIEthernet eth(PIEthernet::TCP_Client), seth(PIEthernet::TCP_Client);
|
||||||
//eth.setReadAddress("127.0.0.1", 50000);
|
eth.connect("192.168.1.13", 22);
|
||||||
|
eth.startThreadedRead();
|
||||||
//piCout << eth.open();
|
//piCout << eth.open();
|
||||||
|
|
||||||
//PISerial ser;
|
/*
|
||||||
//ser.setSpeed(PISerial::S9600);
|
PISerial ser;
|
||||||
//ser.setOption(PIIODevice::BlockingRead);
|
ser.setSpeed(PISerial::S9600);
|
||||||
//piCout << ser.open("COM3");
|
ser.setOption(PIIODevice::BlockingRead);
|
||||||
|
piCout << ser.open("COM3");
|
||||||
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
PIThread thread;
|
PIThread thread;
|
||||||
thread.start([&](void*){
|
thread.start([&](void*){
|
||||||
piCout << "[T] start" << GetCurrentThreadId();
|
piCout << "[T] start" << GetCurrentThreadId();
|
||||||
//PIByteArray data = ((PIIODevice*)ð)->read(1024);
|
//PIByteArray data = ((PIIODevice*)&ser)->read(1024);
|
||||||
eth.connect("192.168.1.13", 23, false);
|
eth.connect("192.168.1.13", 23, false);
|
||||||
piCout << "[T] connected" << eth.isConnected() << errorString();
|
piCout << "[T] connected" << eth.isConnected() << errorString();
|
||||||
//piCout << "[T] readed" << data.size() << errorString();
|
//piCout << "[T] readed" << data.size() << errorString();
|
||||||
piCout << "[T] end";
|
piCout << "[T] end";
|
||||||
});
|
});
|
||||||
piMSleep(500);
|
piMSleep(500);
|
||||||
eth.close();
|
//eth.close();
|
||||||
//piMSleep(500);
|
//piMSleep(500);
|
||||||
//thread.stop();
|
thread.stop();
|
||||||
//thread.interrupt();
|
thread.interrupt();
|
||||||
//seth.send("127.0.0.1", 50000, "string", 7);
|
//seth.send("127.0.0.1", 50000, "string", 7);
|
||||||
//thread.interrupt();
|
//thread.interrupt();
|
||||||
thread.waitForFinish();*/
|
thread.waitForFinish();
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
eth.listen("127.0.0.1", 50000);
|
eth.listen("127.0.0.1", 50000);
|
||||||
piMSleep(500);
|
|
||||||
seth.connect("127.0.0.1", 50001, false);
|
seth.connect("127.0.0.1", 50001, false);
|
||||||
piMSleep(500);
|
piMSleep(500);
|
||||||
piCout << "connected" << seth.isConnected();
|
piCout << "connected" << seth.isConnected();
|
||||||
//eth.close();
|
*/
|
||||||
piCout << "main end";
|
piMSleep(1000);
|
||||||
|
piCout << "main stop ...";
|
||||||
|
eth.stopThreadedRead();
|
||||||
|
piCout << "main wait ..." << eth.isThreadedRead();
|
||||||
|
eth.waitThreadedReadFinished();
|
||||||
|
|
||||||
eth.close();
|
//eth.close();
|
||||||
|
piCout << "main end" << eth.isThreadedRead();
|
||||||
|
|
||||||
|
//ser.close();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user