#ifndef PISERIAL_H #define PISERIAL_H #include "pithread.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 * ); class PISerial: public PIThread { public: // slot is any function format "bool (void*, char*)" PISerial(string name, void * data, SerialFunc slot = 0); ~PISerial(); enum Parameters {IgnoreParityControl = 0x01, TwoStopBits = 0x02}; void setSlot(SerialFunc func) {ret_func = func;} void setSpeed(int speed) {ospeed = ispeed = speed;} void setOutSpeed(int speed) {ospeed = speed;} void setInSpeed(int speed) {ispeed = speed;} void setParameters(Flags parameters) {params = parameters;} 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;} private: void begin(); void run(); void end(); #ifdef WINDOWS DCB desc, sdesc; void * hCom; DWORD readed, mask; #else termios desc, sdesc; int readed; #endif int fd, ospeed, ispeed; string devName; SerialFunc ret_func; char * buffer, * sbuffer, * hbuffer, * pbuffer; void * headerPtr, * data; int dataSize, headerSize, sbuffIndex, startIndex, backIndex; Flags params; bool first, tryagain; }; #endif // PISERIAL_H