diff --git a/libs/cloud/picloudclient.cpp b/libs/cloud/picloudclient.cpp index 38877d8b..82e640a4 100644 --- a/libs/cloud/picloudclient.cpp +++ b/libs/cloud/picloudclient.cpp @@ -63,7 +63,7 @@ void PICloudClient::setKeepConnection(bool on) { bool PICloudClient::openDevice() { PIString p = path(); - piCout << "PICloudClient open device" << p; +// piCout << "PICloudClient open device" << p; bool op = eth.connect(p, false); if (op) { mutex_buff.lock(); @@ -97,7 +97,7 @@ bool PICloudClient::closeDevice() { int PICloudClient::readDevice(void * read_to, int max_size) { - piCoutObj << "readDevice"; +// piCoutObj << "readDevice"; if (!is_connected) return -1; mutex_buff.lock(); cond_buff.wait(mutex_buff, [this](){return !buff.isEmpty();}); @@ -110,7 +110,7 @@ int PICloudClient::readDevice(void * read_to, int max_size) { int PICloudClient::writeDevice(const void * data, int size) { - piCoutObj << "writeDevice"; +// piCoutObj << "writeDevice"; return tcp.sendData(PIByteArray(data, size)); } diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index c2a62533..22253ebe 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -71,14 +71,14 @@ bool PICloudServer::closeDevice() { int PICloudServer::readDevice(void * read_to, int max_size) { - piCoutObj << "readDevice"; + //piCoutObj << "readDevice"; piMSleep(eth.readTimeout()); return -1; } int PICloudServer::writeDevice(const void * data, int max_size) { - piCoutObj << "writeDevice"; + //piCoutObj << "writeDevice"; return -1; } @@ -94,23 +94,37 @@ int PICloudServer::sendData(const PIByteArray & data, uint client_id) { PICloudServer::Client::Client(PICloudServer * srv, uint id) : server(srv), client_id(id) { + is_connected = true; +} + +PICloudServer::Client::~Client() { + if (is_connected) { + is_connected = false; + cond_buff.notifyOne(); + } + close(); } bool PICloudServer::Client::openDevice() { - return true; + return is_connected; } bool PICloudServer::Client::closeDevice() { server->clientDisconnect(client_id); + if (is_connected) { + is_connected = false; + cond_buff.notifyOne(); + } return true; } int PICloudServer::Client::readDevice(void * read_to, int max_size) { //piCoutObj << "readDevice"; + if (!is_connected) return -1; mutex_buff.lock(); cond_buff.wait(mutex_buff, [this](){return !buff.isEmpty();}); int sz = piMini(max_size, buff.size()); @@ -127,6 +141,7 @@ int PICloudServer::Client::writeDevice(const void * data, int size) { void PICloudServer::Client::pushBuffer(const PIByteArray & ba) { + if (!is_connected) return; mutex_buff.lock(); buff.append(ba); cond_buff.notifyOne(); diff --git a/libs/cloud/picloudtcp.cpp b/libs/cloud/picloudtcp.cpp index 04aae4aa..97b8faac 100644 --- a/libs/cloud/picloudtcp.cpp +++ b/libs/cloud/picloudtcp.cpp @@ -47,7 +47,7 @@ void PICloud::TCP::setServerName(const PIString & server_name) { void PICloud::TCP::sendStart() { - piCout << "sendStart"; + //piCout << "sendStart"; header.type = PICloud::TCP::Connect; PIByteArray ba; ba << header << sname; diff --git a/libs/main/cloud/picloudclient.h b/libs/main/cloud/picloudclient.h index 547d93cc..37027a50 100644 --- a/libs/main/cloud/picloudclient.h +++ b/libs/main/cloud/picloudclient.h @@ -37,11 +37,11 @@ public: void setServerName(const PIString & server_name); void setKeepConnection(bool on); + bool isConnected() const {return is_connected;} protected: bool openDevice(); bool closeDevice(); - bool isConnected() const {return is_connected;} int readDevice(void * read_to, int max_size); int writeDevice(const void * data, int size); diff --git a/libs/main/cloud/picloudserver.h b/libs/main/cloud/picloudserver.h index da00229a..e363b288 100644 --- a/libs/main/cloud/picloudserver.h +++ b/libs/main/cloud/picloudserver.h @@ -40,6 +40,7 @@ public: friend class PICloudServer; public: Client(PICloudServer * srv = nullptr, uint id = 0); + virtual ~Client(); protected: bool openDevice(); bool closeDevice(); @@ -53,6 +54,7 @@ public: PIByteArray buff; PIMutex mutex_buff; PIConditionVariable cond_buff; + std::atomic_bool is_connected; }; void setServerName(const PIString & server_name);