diff --git a/libs/cloud/picloudserver.cpp b/libs/cloud/picloudserver.cpp index 62e51410..00f917be 100644 --- a/libs/cloud/picloudserver.cpp +++ b/libs/cloud/picloudserver.cpp @@ -25,7 +25,8 @@ PICloudServer::PICloudServer(const PIString & path, PIIODevice::DeviceMode mode) PICloudServer::~PICloudServer() { - + stop(); + close(); } diff --git a/libs/main/io_devices/pibinarylog.cpp b/libs/main/io_devices/pibinarylog.cpp index bae32580..8bef86c5 100644 --- a/libs/main/io_devices/pibinarylog.cpp +++ b/libs/main/io_devices/pibinarylog.cpp @@ -78,6 +78,12 @@ PIBinaryLog::PIBinaryLog() { } +PIBinaryLog::~PIBinaryLog() { + stop(); + close(); +} + + bool PIBinaryLog::openDevice() { lastrecord.timestamp = PISystemTime(); lastrecord.id = 0; diff --git a/libs/main/io_devices/pibinarylog.h b/libs/main/io_devices/pibinarylog.h index 9a835c4b..fb674700 100644 --- a/libs/main/io_devices/pibinarylog.h +++ b/libs/main/io_devices/pibinarylog.h @@ -31,7 +31,7 @@ class PIP_EXPORT PIBinaryLog: public PIIODevice PIIODEVICE(PIBinaryLog) public: explicit PIBinaryLog(); - ~PIBinaryLog() {closeDevice();} + virtual ~PIBinaryLog(); //! \brief Play modes for \a PIBinaryLog enum PlayMode { diff --git a/libs/main/io_devices/pican.cpp b/libs/main/io_devices/pican.cpp index f3201f09..0d0443c3 100644 --- a/libs/main/io_devices/pican.cpp +++ b/libs/main/io_devices/pican.cpp @@ -46,6 +46,12 @@ PICAN::PICAN(const PIString & path, PIIODevice::DeviceMode mode) : PIIODevice(pa } +PICAN::~PICAN() { + stop(); + close(); +} + + bool PICAN::openDevice() { #ifdef PIP_CAN piCout << "PICAN open device" << path(); diff --git a/libs/main/io_devices/pican.h b/libs/main/io_devices/pican.h index 51a6689a..11f2bb06 100644 --- a/libs/main/io_devices/pican.h +++ b/libs/main/io_devices/pican.h @@ -31,7 +31,7 @@ class PIP_EXPORT PICAN: public PIIODevice PIIODEVICE(PICAN) public: explicit PICAN(const PIString & path = PIString(), PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); - ~PICAN() {} + virtual ~PICAN(); void setCANID(int id); int CANID() const; diff --git a/libs/main/io_devices/piethernet.cpp b/libs/main/io_devices/piethernet.cpp index d0a0de20..3915425b 100644 --- a/libs/main/io_devices/piethernet.cpp +++ b/libs/main/io_devices/piethernet.cpp @@ -244,7 +244,7 @@ PIEthernet::PIEthernet(int sock_, PIString ip_port): PIIODevice("", ReadWrite) { PIEthernet::~PIEthernet() { //piCout << "~PIEthernet" << uint(this); stop(); - closeDevice(); + close(); //piCoutObj << "~PIEthernet done"; } @@ -566,7 +566,6 @@ bool PIEthernet::connect(bool threaded) { connected_ = (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) == 0); if (!connected_) { piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString(); - closeSocket(sock); } opened_ = connected_; if (connected_) { @@ -663,9 +662,8 @@ int PIEthernet::readDevice(void * read_to, int max_size) { //piCoutObj << "connect to " << ip_ << ":" << port_ << "..."; connected_ = (::connect(sock, (sockaddr * )&(PRIVATE->addr_), sizeof(PRIVATE->addr_)) == 0); //piCoutObj << "connect to " << ip_ << ":" << port_ << connected_; - if (!connected_) { + if (!connected_) piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString(); - } opened_ = connected_; if (connected_) { connecting_ = false; @@ -674,10 +672,7 @@ int PIEthernet::readDevice(void * read_to, int max_size) { piMSleep(10); //piCout << "connected to" << path(); } - if (!connected_) { - closeSocket(sock); - return -1; - } + if (!connected_) return -1; errorClear(); rs = ethRecv(sock, read_to, max_size); //piCoutObj << "readed" << rs; @@ -742,7 +737,7 @@ int PIEthernet::writeDevice(const void * data, int max_size) { //piCoutObj << "connect SingleTCP" << ip_s << ":" << port_s << "..."; if (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) != 0) { //piCoutObj << "Can`t connect to " << ip_s << ":" << port_s << ", " << ethErrorString(); - closeSocket(sock); + msleep(PIP_MIN_MSLEEP); return -1; } //piCoutObj << "ok, write SingleTCP" << int(data) << max_size << "bytes ..."; @@ -776,19 +771,15 @@ int PIEthernet::writeDevice(const void * data, int max_size) { #endif //piCoutObj << "connect to " << ip << ":" << port_; connected_ = (::connect(sock, (sockaddr * )&PRIVATE->addr_, sizeof(PRIVATE->addr_)) == 0); - if (!connected_) { + if (!connected_) piCoutObj << "Can`t connect to" << addr_r << "," << ethErrorString(); - } opened_ = connected_; if (connected_) { connecting_ = false; connected(); } } - if (!connected_) { - closeSocket(sock); - return -1; - } + if (!connected_) return -1; ret = ::send(sock, (const char *)data, max_size, 0); if (ret < 0) { connected_ = false; diff --git a/libs/main/io_devices/pifile.cpp b/libs/main/io_devices/pifile.cpp index efbcb521..8f598b05 100644 --- a/libs/main/io_devices/pifile.cpp +++ b/libs/main/io_devices/pifile.cpp @@ -154,6 +154,12 @@ bool PIFile::openTemporary(PIIODevice::DeviceMode mode) { } +PIFile::~PIFile() { + stop(); + close(); +} + + bool PIFile::openDevice() { close(); PIString p = path(); diff --git a/libs/main/io_devices/pifile.h b/libs/main/io_devices/pifile.h index ca6d0e6b..56b1df6f 100644 --- a/libs/main/io_devices/pifile.h +++ b/libs/main/io_devices/pifile.h @@ -91,7 +91,7 @@ public: //! Open temporary file with open mode "mode" bool openTemporary(PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); - ~PIFile() {closeDevice();} + virtual ~PIFile(); //! Immediate write all buffered data to disk void flush(); diff --git a/libs/main/io_devices/piiobytearray.h b/libs/main/io_devices/piiobytearray.h index 64212646..57bec2e4 100644 --- a/libs/main/io_devices/piiobytearray.h +++ b/libs/main/io_devices/piiobytearray.h @@ -37,8 +37,6 @@ public: //! Contructs %PIIOByteArray with \"buffer\" content only for read explicit PIIOByteArray(const PIByteArray & buffer); - ~PIIOByteArray() {closeDevice();} - //! Returns content PIByteArray * byteArray() const {return data_;} diff --git a/libs/main/io_devices/piiodevice.cpp b/libs/main/io_devices/piiodevice.cpp index ec54085b..9dea9dd6 100644 --- a/libs/main/io_devices/piiodevice.cpp +++ b/libs/main/io_devices/piiodevice.cpp @@ -137,11 +137,6 @@ PIIODevice::PIIODevice(const PIString & path, PIIODevice::DeviceMode mode): PITh PIIODevice::~PIIODevice() { stop(); - if (opened_) { - closeDevice(); - if (!opened_) - closed(); - } } diff --git a/libs/main/io_devices/piiostring.h b/libs/main/io_devices/piiostring.h index c195c0cd..9301060d 100644 --- a/libs/main/io_devices/piiostring.h +++ b/libs/main/io_devices/piiostring.h @@ -37,8 +37,6 @@ public: //! Contructs %PIIOString with \"string\" content only for read explicit PIIOString(const PIString & string); - ~PIIOString() {closeDevice();} - //! Returns content PIString * string() const {return str;} diff --git a/libs/main/io_devices/pipeer.cpp b/libs/main/io_devices/pipeer.cpp index 85cc0bc3..96a07810 100644 --- a/libs/main/io_devices/pipeer.cpp +++ b/libs/main/io_devices/pipeer.cpp @@ -181,6 +181,7 @@ PIPeer::PIPeer(const PIString & n): PIIODevice(), inited__(false), eth_tcp_srv(P PIPeer::~PIPeer() { //piCout << "~PIPeer" << uint(this); + stop(); if (destroyed) return; destroyed = true; sync_timer.stop(); diff --git a/libs/main/io_devices/piserial.cpp b/libs/main/io_devices/piserial.cpp index 4c526a62..07fdded6 100644 --- a/libs/main/io_devices/piserial.cpp +++ b/libs/main/io_devices/piserial.cpp @@ -197,7 +197,8 @@ PISerial::PISerial(const PIString & device_, PISerial::Speed speed_, PIFlags params = 0); - ~PISerial(); + virtual ~PISerial(); //! Set both input and output speed to "speed" diff --git a/libs/main/io_devices/pisharedmemory.cpp b/libs/main/io_devices/pisharedmemory.cpp index 63e43293..daaaa2c2 100644 --- a/libs/main/io_devices/pisharedmemory.cpp +++ b/libs/main/io_devices/pisharedmemory.cpp @@ -89,6 +89,12 @@ PISharedMemory::PISharedMemory(const PIString & shm_name, int size, PIIODevice:: } +PISharedMemory::~PISharedMemory() { + stop(); + close(); +} + + bool PISharedMemory::openDevice() { close(); //piCoutObj << "try open" << path() << dsize; diff --git a/libs/main/io_devices/pisharedmemory.h b/libs/main/io_devices/pisharedmemory.h index 36bd8c3f..495739f6 100644 --- a/libs/main/io_devices/pisharedmemory.h +++ b/libs/main/io_devices/pisharedmemory.h @@ -37,7 +37,7 @@ public: explicit PISharedMemory(const PIString & shm_name, int size, DeviceMode mode = ReadWrite); - virtual ~PISharedMemory() {close();} + virtual ~PISharedMemory(); //! Read all shared memory object content to byte array and return it PIByteArray readAll(); diff --git a/libs/main/io_devices/pispi.cpp b/libs/main/io_devices/pispi.cpp index 55bcc99e..80a1e5bc 100644 --- a/libs/main/io_devices/pispi.cpp +++ b/libs/main/io_devices/pispi.cpp @@ -59,6 +59,12 @@ PISPI::PISPI(const PIString & path, uint speed, PIIODevice::DeviceMode mode) : P } +PISPI::~PISPI() { + stop(); + close(); +} + + void PISPI::setSpeed(uint speed_hz) { spi_speed = speed_hz; } diff --git a/libs/main/io_devices/pispi.h b/libs/main/io_devices/pispi.h index 7c30a59f..29284a45 100644 --- a/libs/main/io_devices/pispi.h +++ b/libs/main/io_devices/pispi.h @@ -31,7 +31,7 @@ class PIP_EXPORT PISPI: public PIIODevice PIIODEVICE(PISPI) public: explicit PISPI(const PIString & path = PIString(), uint speed_hz = 1000000, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); - ~PISPI() {} + virtual ~PISPI(); //! \brief Parameters of PISPI enum Parameters { diff --git a/libs/main/io_devices/pitransparentdevice.cpp b/libs/main/io_devices/pitransparentdevice.cpp index 6ea60f2b..42f1a609 100644 --- a/libs/main/io_devices/pitransparentdevice.cpp +++ b/libs/main/io_devices/pitransparentdevice.cpp @@ -37,6 +37,12 @@ PITransparentDevice::PITransparentDevice() { } +PITransparentDevice::~PITransparentDevice() { + stop(); + close(); +} + + int PITransparentDevice::readDevice(void * read_to, int max_size) { if (!canRead()) return -1; que_mutex.lock(); diff --git a/libs/main/io_devices/pitransparentdevice.h b/libs/main/io_devices/pitransparentdevice.h index f1478668..4b49eb4b 100644 --- a/libs/main/io_devices/pitransparentdevice.h +++ b/libs/main/io_devices/pitransparentdevice.h @@ -34,7 +34,7 @@ public: //! Contructs empty %PITransparentDevice explicit PITransparentDevice(); - ~PITransparentDevice() {closeDevice();} + virtual ~PITransparentDevice(); protected: bool openDevice(); diff --git a/libs/main/io_devices/piusb.h b/libs/main/io_devices/piusb.h index 2b17d382..5ba47d8c 100644 --- a/libs/main/io_devices/piusb.h +++ b/libs/main/io_devices/piusb.h @@ -32,7 +32,7 @@ class PIP_EXPORT PIUSB: public PIIODevice PIIODEVICE(PIUSB) public: explicit PIUSB(ushort vid = 0, ushort pid = 0); - ~PIUSB() {closeDevice();} + virtual ~PIUSB(); struct PIP_EXPORT Endpoint { Endpoint(uchar a = 0, uchar at = 0, ushort mps = 0) {address = a; attributes = at; max_packet_size = mps; parse();} diff --git a/libs/usb/piusb.cpp b/libs/usb/piusb.cpp index 91e131a3..6db89eab 100644 --- a/libs/usb/piusb.cpp +++ b/libs/usb/piusb.cpp @@ -46,6 +46,11 @@ PIUSB::PIUSB(ushort vid, ushort pid): PIIODevice("", ReadWrite) { } +PIUSB::~PIUSB() { + stop(); + close(); +} + void PIUSB::Endpoint::parse() { synchronisation_type = NoSynchonisation; usage_type = DataEndpoint; diff --git a/main.cpp b/main.cpp index a69c28d7..193896f4 100644 --- a/main.cpp +++ b/main.cpp @@ -12,6 +12,7 @@ int main() { // } // s.open(); s.startThreadedRead(); - piSleep(200); + piSleep(2); +// s.stopThreadedRead(); return 0; }