#ifndef PISERIAL_H #define PISERIAL_H #include "pithread.h" #include "pistring.h" #ifndef WINDOWS #include #include #else #define B110 110 #define B300 300 #define B600 600 #define B1200 1200 #define B2400 2400 #define B4800 4800 #define B9600 9600 #define B14400 14400 #define B19200 19200 #define B38400 38400 #define B57600 57600 #define B115200 115200 #define B128000 128000 #define B256000 256000 #endif #define BUFFER_SIZE 4096 typedef bool (*SerialFunc)(void * , char * , int ); class PISerial: public PIThread { public: // slot is any function format "bool (void*, char*, int)" PISerial(PIString name = "serial", void * data = 0, SerialFunc slot = 0); ~PISerial(); enum Parameters {ParityControl = 0x01, ParityOdd = 0x02, TwoStopBits = 0x04}; enum Speed { S110 = 110, S300 = 300, S600 = 600, S1200 = 1200, S2400 = 2400, S4800 = 4800, S9600 = 9600, S19200 = 19200, S38400 = 38400, S57600 = 57600, S115200 = 115200 }; void setSlot(SerialFunc func) {ret_func = func;} void setSpeed(PISerial::Speed speed) {ospeed = ispeed = speed;} void setOutSpeed(PISerial::Speed speed) {ospeed = speed;} void setInSpeed(PISerial::Speed speed) {ispeed = speed;} void setDevice(const PIString & dev) {devName = dev;} void setParameters(PIFlags parameters) {params = parameters;} void setData(void * d) {data = d;} void setReadData(void * headerPtr, int headerSize, int dataSize) {this->headerPtr = headerPtr; this->headerSize = headerSize; this->dataSize = dataSize;} bool send(char * data, int size); bool init(); bool initialized() const {return fd != -1;} void terminate(); private: int convertSpeed(PISerial::Speed speed); void begin(); void run(); void end(); #ifdef WINDOWS DCB desc, sdesc; void * hCom; DWORD readed, mask; #else termios desc, sdesc; uint readed; #endif int fd; PISerial::Speed ospeed, ispeed; PIString devName; SerialFunc ret_func; char buffer[BUFFER_SIZE], sbuffer[BUFFER_SIZE], * hbuffer, * pbuffer; void * headerPtr, * data; int dataSize, headerSize, sbuffIndex, startIndex, backIndex; PIFlags params; bool first, tryagain; }; #endif // PISERIAL_H