migrate to async IO model

new PIIODevice::interrupt() virtual method
new PIWaitEvent private class
PIEthernet and PISerial basically tested on Windows and Linux
This commit is contained in:
2022-11-05 23:43:07 +03:00
parent e48d0ebaab
commit 8a5e72c723
15 changed files with 498 additions and 209 deletions

110
main.cpp
View File

@@ -79,6 +79,12 @@ public:
Pipe pipe;
};
PITimeMeasurer tm;
void phase(const char * msg) {
piCout << "";
piCout << piRound(tm.elapsed_s() * 10) / 10. << "s" << msg;
}
int main(int argc, char * argv[]) {
piCout << "main";
@@ -109,53 +115,87 @@ int main(int argc, char * argv[]) {
delete threads[i];
}*/
PIEthernet eth(PIEthernet::UDP), seth(PIEthernet::TCP_Client);
eth.connect("127.0.0.1", 50000);
eth.startThreadedRead();
//PIEthernet eth(PIEthernet::UDP), seth(PIEthernet::UDP);
//eth.setReadAddress("127.0.0.1", 50000);
//eth.startThreadedRead();
//piCout << eth.open();
/*
PIByteArray req = PIByteArray::fromHex("205e011000000000ef");
PISerial ser;
ser.setSpeed(PISerial::S9600);
ser.setOption(PIIODevice::BlockingRead);
piCout << ser.open("COM3");
*/
/*
ser.setOption(PIIODevice::BlockingRead, false);
ser.setVTime(200);
ser.open("COM3");
CONNECTL(&ser, threadedReadEvent, ([](const uchar * data, ssize_t size){
piCout << "*ser readed" << size;
}));
PIThread thread;
thread.start([&](void*){
piCout << "[T] start" << GetCurrentThreadId();
//PIByteArray data = ((PIIODevice*)&ser)->read(1024);
eth.connect("192.168.1.13", 23, false);
piCout << "[T] connected" << eth.isConnected() << errorString();
//piCout << "[T] readed" << data.size() << errorString();
piCout << "[T] start";
PIByteArray data = ((PIIODevice*)&ser)->read(1024);
piCout << "[T] readed" << data.size();// << errorString();
piCout << "[T] end";
});
piMSleep(500);
//eth.close();
//piMSleep(500);
thread.stop();
thread.interrupt();
//seth.send("127.0.0.1", 50000, "string", 7);
//thread.interrupt();
thread.waitForFinish();
*/
}, 200);
//ser.startThreadedRead();
piSleep(1);
ser.write(req);
phase("Send");
piSleep(2);
phase("End");
/*
eth.listen("127.0.0.1", 50000);
seth.connect("127.0.0.1", 50001, false);
PIEthernet eth(PIEthernet::TCP_Client), seth(PIEthernet::TCP_Server), * server_client = nullptr;
seth.listen("127.0.0.1", 50000, true);
//seth.startThreadedRead();
CONNECTL(&seth, newConnection, ([&server_client](PIEthernet * e){
server_client = e;
e->setName("TCP SC");
piCout << "newConn" << e;
CONNECTL(e, threadedReadEvent, ([](const uchar * data, ssize_t size){
piCout << "*TCP SC* readed" << size;
}));
CONNECTL(e, disconnected, ([](bool error){
piCout << "*TCP SC* disconnected" << error;
}));
e->startThreadedRead();
}));
eth.setName("TCP CC");
//eth.setParameter(PIEthernet::KeepConnection, false);
CONNECTL(&eth, connected, ([&eth](){
piCout << "*TCP CC* connected";
eth.send("byte", 5);
}));
CONNECTL(&eth, disconnected, ([](bool error){
piCout << "*TCP CC* disconnected" << error;
}));
piMSleep(500);
piCout << "connected" << seth.isConnected();
*/
piMSleep(1000);
piCout << "main stop ...";
eth.stopThreadedRead();
piCout << "main wait ..." << eth.isThreadedRead();
eth.waitThreadedReadFinished();
phase("Connect");
eth.connect("127.0.0.1", 50000);
eth.startThreadedRead();
piMSleep(500);
phase("Send 5");
piCout << "c-ing" << eth.isConnecting();
piCout << "c- ed" << eth.isConnected();
eth.send("byte", 5);
piMSleep(500);
phase("Send 6");
eth.send("bytes", 6);
piMSleep(500);
phase("Disconnect");
if (server_client)
server_client->close();
//eth.close();
piCout << "main end" << eth.isThreadedRead();
//ser.close();
piMSleep(500);
phase("END");
*/
return 0;
}