PICloud many important fixes
This commit is contained in:
@@ -27,27 +27,33 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode)
|
||||
setName("cloud_server__" + server_name);
|
||||
is_deleted = false;
|
||||
eth.setReopenEnabled(false);
|
||||
setThreadedReadBufferSize(eth.threadedReadBufferSize());
|
||||
CONNECT1(void, PIByteArray, &streampacker, packetReceiveEvent, this, _readed);
|
||||
CONNECTL(ð, connected, [this](){
|
||||
open_mutex.lock();
|
||||
opened_ = true;
|
||||
//piCoutObj << "connected" << ð
|
||||
cvar.notifyOne();
|
||||
open_mutex.unlock();
|
||||
//piCoutObj << "connected";
|
||||
tcp.sendStart();
|
||||
});
|
||||
CONNECTL(ð, disconnected, [this](bool){
|
||||
if (is_deleted) return;
|
||||
//piCoutObj << "disconnected" << ð
|
||||
//piCoutObj << "disconnected";
|
||||
clients_mutex.lock();
|
||||
removed_clients_.append(clients_);
|
||||
for (auto c : clients_) {
|
||||
c->is_connected = false;
|
||||
c->close();
|
||||
}
|
||||
removed_clients_.append(clients_);
|
||||
clients_.clear();
|
||||
index_clients.clear();
|
||||
clients_mutex.unlock();
|
||||
open_mutex.lock();
|
||||
opened_ = false;
|
||||
cvar.notifyOne();
|
||||
open_mutex.unlock();
|
||||
ping_timer.stop();
|
||||
piMSleep(100);
|
||||
});
|
||||
CONNECTL(&ping_timer, tickEvent, [this] (void *, int){
|
||||
if (eth.isConnected()) tcp.sendPing();
|
||||
@@ -62,10 +68,10 @@ PICloudServer::~PICloudServer() {
|
||||
close();
|
||||
waitThreadedReadFinished();
|
||||
//piCout << "wait";
|
||||
for (auto c : removed_clients_) {
|
||||
while(removed_clients_.isNotEmpty()) {
|
||||
Client * c = removed_clients_.take_back();
|
||||
delete c;
|
||||
}
|
||||
removed_clients_.clear();
|
||||
//piCoutObj << "~PICloudServer done" << this;
|
||||
}
|
||||
|
||||
@@ -83,7 +89,7 @@ PIVector<PICloudServer::Client *> PICloudServer::clients() const {
|
||||
|
||||
|
||||
bool PICloudServer::openDevice() {
|
||||
//piCout << "PICloudServer open device" << path();
|
||||
piCout << "PICloudServer open device" << path();
|
||||
bool op = eth.connect(PIEthernet::Address::resolve(path()), false);
|
||||
if (op) {
|
||||
eth.startThreadedRead();
|
||||
@@ -102,7 +108,12 @@ bool PICloudServer::closeDevice() {
|
||||
eth.stopAndWait();
|
||||
ping_timer.stop();
|
||||
eth.close();
|
||||
cvar.notifyOne();
|
||||
clients_mutex.lock();
|
||||
for (auto c : clients_) {
|
||||
c->is_connected = false;
|
||||
c->close();
|
||||
}
|
||||
removed_clients_.append(clients_);
|
||||
clients_.clear();
|
||||
index_clients.clear();
|
||||
@@ -114,7 +125,10 @@ bool PICloudServer::closeDevice() {
|
||||
ssize_t PICloudServer::readDevice(void * read_to, ssize_t max_size) {
|
||||
if (is_deleted) return -1;
|
||||
//piCoutObj << "readDevice";
|
||||
if (!opened_) openDevice();
|
||||
open_mutex.lock();
|
||||
if (isOpened()) cvar.wait(open_mutex);
|
||||
open_mutex.unlock();
|
||||
//piCoutObj << "opened_ = " << opened_;
|
||||
//else piMSleep(eth.readTimeout());
|
||||
return -1;
|
||||
}
|
||||
@@ -128,6 +142,7 @@ ssize_t PICloudServer::writeDevice(const void * data, ssize_t max_size) {
|
||||
|
||||
void PICloudServer::interrupt() {
|
||||
eth.interrupt();
|
||||
cvar.notifyOne();
|
||||
}
|
||||
|
||||
|
||||
@@ -145,6 +160,7 @@ int PICloudServer::sendData(const PIByteArray & data, uint client_id) {
|
||||
PICloudServer::Client::Client(PICloudServer * srv, uint id) : server(srv), client_id(id) {
|
||||
setMode(PIIODevice::ReadWrite);
|
||||
setReopenEnabled(false);
|
||||
setThreadedReadBufferSize(server->threadedReadBufferSize());
|
||||
is_connected = true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user