08.02.2010 - version 0.1.2
This commit is contained in:
145
piserial.cpp
145
piserial.cpp
@@ -20,18 +20,17 @@
|
||||
#include "piserial.h"
|
||||
|
||||
|
||||
PISerial::PISerial(PIString name, void * data_, SerialFunc slot): PIThread() {
|
||||
PISerial::PISerial(PIString name, void * data_, SerialFunc slot, SerialHeaderFunc slot_header): PIThread() {
|
||||
piMonitor.serials++;
|
||||
setPriority(piHigh);
|
||||
data = data_;
|
||||
devName = name;
|
||||
fd = -1;
|
||||
missed = 0;
|
||||
dataSize = headerSize = 0;
|
||||
headerPtr = 0;
|
||||
hbuffer = pbuffer = 0;
|
||||
ret_func = slot;
|
||||
memset(buffer, 0, BUFFER_SIZE);
|
||||
memset(sbuffer, 0, BUFFER_SIZE);
|
||||
ret_func_header = slot_header;
|
||||
#ifdef WINDOWS
|
||||
hCom = 0;
|
||||
#endif
|
||||
@@ -87,121 +86,59 @@ int PISerial::convertSpeed(PISerial::Speed speed) {
|
||||
|
||||
|
||||
void PISerial::begin() {
|
||||
sbuffIndex = 0;
|
||||
startIndex = 0;
|
||||
backIndex = 0;
|
||||
tryagain = first = false;
|
||||
hbuffer = new char[headerSize];
|
||||
pbuffer = new char[dataSize];
|
||||
allReaded = addSize = curInd = 0;
|
||||
first = false;
|
||||
packetSize = headerSize + dataSize;
|
||||
if (headerSize > 0) mheader.resize(headerSize);
|
||||
if (!init()) stop();
|
||||
}
|
||||
|
||||
|
||||
void PISerial::run() {
|
||||
if (dataSize == 0) return;
|
||||
char b;
|
||||
uint i = 0;
|
||||
int j;
|
||||
while (allReaded < packetSize + addSize) {
|
||||
#ifdef WINDOWS
|
||||
WaitCommEvent(hCom, 0, 0);
|
||||
ReadFile(hCom, buffer, dataSize, &readed, 0);
|
||||
WaitCommEvent(hCom, 0, 0);
|
||||
ReadFile(hCom, &buffer[allReaded], SERIAL_BUFFER_SIZE, &readed, 0);
|
||||
#else
|
||||
readed = read(fd, buffer, BUFFER_SIZE);
|
||||
readed = read(fd, &buffer[allReaded], SERIAL_BUFFER_SIZE);
|
||||
#endif
|
||||
if (headerSize > 0)
|
||||
{
|
||||
while (i < readed)
|
||||
{
|
||||
//cout << sbuffIndex << ";" << startIndex << endl;
|
||||
if (!tryagain)
|
||||
{
|
||||
b = buffer[i];
|
||||
sbuffer[sbuffIndex] = b;
|
||||
} else {
|
||||
backIndex++;
|
||||
if (backIndex == headerSize + dataSize) tryagain = false;
|
||||
}
|
||||
if (first)
|
||||
{
|
||||
if (sbuffIndex-startIndex == headerSize + dataSize - 1)
|
||||
{
|
||||
//cout << "vsdfgvb" << endl;
|
||||
memcpy(pbuffer,&sbuffer[startIndex+headerSize],dataSize);
|
||||
if (ret_func(data, pbuffer, dataSize))
|
||||
{
|
||||
startIndex = 0;
|
||||
sbuffIndex = -1;
|
||||
} else {
|
||||
//startIndex++;
|
||||
memcpy(sbuffer, hbuffer, headerSize);
|
||||
memcpy(&sbuffer[headerSize], pbuffer, dataSize);
|
||||
backIndex = 0;
|
||||
tryagain = true;
|
||||
startIndex = 1;
|
||||
sbuffIndex = -1;
|
||||
}
|
||||
first = false;
|
||||
}
|
||||
} else {
|
||||
if (sbuffIndex - startIndex == headerSize - 1)
|
||||
{
|
||||
memcpy(hbuffer, &sbuffer[startIndex], headerSize);
|
||||
for (j = 0; j < headerSize; ++j) {
|
||||
if (hbuffer[j] != ((char*)headerPtr)[j]) {
|
||||
startIndex++;
|
||||
//cout << "no" << endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (j == headerSize) {
|
||||
first = true;
|
||||
mheader.resize(headerSize);
|
||||
memcpy(mheader.data(),headerPtr,headerSize);
|
||||
//cout << "yes" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
sbuffIndex++;
|
||||
if (sbuffIndex >= BUFFER_SIZE)
|
||||
{
|
||||
if (first)
|
||||
{
|
||||
memcpy(pbuffer, &sbuffer[startIndex + headerSize], BUFFER_SIZE - startIndex - headerSize);
|
||||
memcpy(sbuffer, hbuffer, headerSize);
|
||||
memcpy(&sbuffer[headerSize], pbuffer, BUFFER_SIZE - startIndex - headerSize);
|
||||
sbuffIndex = BUFFER_SIZE - startIndex - 1;
|
||||
} else {
|
||||
memcpy(sbuffer, hbuffer, headerSize);
|
||||
sbuffIndex = headerSize - 1;
|
||||
startIndex = 0;
|
||||
}
|
||||
}
|
||||
if (!tryagain) i++;
|
||||
allReaded += readed;
|
||||
}
|
||||
if (headerSize > 0) {
|
||||
if (allReaded + curInd >= SERIAL_BUFFER_SIZE) {
|
||||
memcpy(sbuffer, buffer, SERIAL_BUFFER_SIZE);
|
||||
memcpy(buffer, &sbuffer[SERIAL_BUFFER_SIZE - packetSize], allReaded);
|
||||
allReaded = packetSize;
|
||||
addSize = curInd = 0;
|
||||
}
|
||||
while (!ret_func_header(data, (uchar * )headerPtr, &buffer[curInd], headerSize)) {
|
||||
curInd++; missed++;
|
||||
if (curInd > addSize) {
|
||||
addSize += packetSize;
|
||||
return;
|
||||
}
|
||||
}
|
||||
memcpy(mheader.data(), &buffer[curInd + headerSize], headerSize);
|
||||
if (!ret_func(data, &buffer[curInd + headerSize], dataSize)) {
|
||||
curInd++; missed++;
|
||||
return;
|
||||
}
|
||||
memcpy(sbuffer, buffer, allReaded);
|
||||
memcpy(buffer, &sbuffer[packetSize + curInd], allReaded);
|
||||
allReaded -= packetSize + curInd;
|
||||
curInd = addSize = 0;
|
||||
} else {
|
||||
for (uint i = 0; i < readed; ++i) {
|
||||
b = buffer[i];
|
||||
sbuffer[sbuffIndex] = b;
|
||||
if (sbuffIndex == dataSize - 1) {
|
||||
if (ret_func != 0) ret_func(data, sbuffer, dataSize);
|
||||
sbuffIndex = -1;
|
||||
}
|
||||
sbuffIndex++;
|
||||
}
|
||||
ret_func(data, buffer, dataSize);
|
||||
memcpy(sbuffer, buffer, allReaded);
|
||||
memcpy(buffer, &sbuffer[packetSize], allReaded);
|
||||
allReaded -= packetSize;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void PISerial::end() {
|
||||
terminate();
|
||||
if (pbuffer != 0) {
|
||||
delete pbuffer;
|
||||
pbuffer = 0;
|
||||
}
|
||||
if (hbuffer != 0) {
|
||||
delete hbuffer;
|
||||
hbuffer = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -279,7 +216,7 @@ bool PISerial::init() {
|
||||
}
|
||||
|
||||
|
||||
bool PISerial::send(char * data, int size) {
|
||||
bool PISerial::send(uchar * data, int size) {
|
||||
//cout << "[PISerial] send size: " << sizeof(data) << endl;
|
||||
if (fd == -1) {
|
||||
//cout << "[PISerial] Can`t write to uninitialized COM" << endl;
|
||||
@@ -292,7 +229,7 @@ bool PISerial::send(char * data, int size) {
|
||||
int wrote;
|
||||
wrote = write(fd, data, size);
|
||||
#endif
|
||||
if ((int)wrote != size) {
|
||||
if ((int)wrote != size) {
|
||||
//cout << "[PISerial] Error while sending" << endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user