/* PIP - Platform Independent Primitives COM Copyright (C) 2011 Ivan Pelipenko peri4@rambler.ru This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #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(); PIByteArray lastHeader() {return mheader;} PIByteArray internalBuffer() {return PIByteArray(sbuffer, BUFFER_SIZE);} 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; PIByteArray mheader; void * headerPtr, * data; int dataSize, headerSize, sbuffIndex, startIndex, backIndex; PIFlags params; bool first, tryagain; }; #endif // PISERIAL_H