Files
pip/piserial.h

80 lines
1.9 KiB
C++

#ifndef PISERIAL_H
#define PISERIAL_H
#include "pithread.h"
#include "pistring.h"
#ifndef WINDOWS
#include <termios.h>
#include <fcntl.h>
#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 <func>(void*, char*)"
PISerial(PIString name = "serial", void * data = 0, 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 setDevice(const PIString & dev) {devName = dev;}
void setParameters(Flags<PISerial::Parameters> 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:
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, ospeed, ispeed;
PIString devName;
SerialFunc ret_func;
char * buffer, * sbuffer, * hbuffer, * pbuffer;
void * headerPtr, * data;
int dataSize, headerSize, sbuffIndex, startIndex, backIndex;
Flags<PISerial::Parameters> params;
bool first, tryagain;
};
#endif // PISERIAL_H