IntroRoboticsLab2/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/parser.ino

277 lines
4.5 KiB
C++

void parserRead()
{
currentTime = millis()/1000.0-lastTime;
readSerial();
if(isAvailable)
{
unsigned char c = serialRead & 0xff;
if((c == 0x55) && (isStart == false))
{
if(prevc == 0xff)
{
index=1;
isStart = true;
}
}
else
{
prevc = c;
if(isStart)
{
if(index == 2)
{
dataLen = c;
}
else if(index > 2)
{
dataLen--;
}
writeBuffer(index,c);
}
}
index++;
if(index > 51)
{
index=0;
isStart=false;
}
if(isStart && (dataLen == 0) && (index > 3))
{
isStart = false;
parseData();
index=0;
}
}
}
unsigned char readBuffer(int index)
{
if(BluetoothSource == DATA_SERIAL)
{
return buffer[index];
}
else if(BluetoothSource == DATA_SERIAL2)
{
return bufferBt1[index];
}
else if(BluetoothSource == DATA_SERIAL3)
{
return bufferBt2[index];
}
}
void writeBuffer(int index,unsigned char c)
{
if(BluetoothSource == DATA_SERIAL)
{
buffer[index]=c;
}
else if(BluetoothSource == DATA_SERIAL2)
{
bufferBt1[index]=c;
}
else if(BluetoothSource == DATA_SERIAL3)
{
bufferBt2[index]=c;
}
}
void writeSerial(unsigned char c)
{
Serial.write(c);
Serial2.write(c);
Serial3.write(c);
}
void readSerial(void)
{
isAvailable = false;
BluetoothSource = DATA_SERIAL;
if(Serial.available() > 0)
{
isAvailable = true;
BluetoothSource = DATA_SERIAL;
serialRead = Serial.read();
}
if(Serial2.available() > 0)
{
isAvailable = true;
BluetoothSource = DATA_SERIAL2;
serialRead = Serial2.read();
}
if(Serial3.available() > 0)
{
isAvailable = true;
BluetoothSource = DATA_SERIAL3;
serialRead = Serial3.read();
}
}
void writeHead(void)
{
writeSerial(0xff);
writeSerial(0x55);
}
void writeEnd(void)
{
Serial.println();
Serial2.println();
Serial3.println();
}
/*
ff 55 len idx action device port slot data a
0 1 2 3 4 5 6 7 8
*/
void parseData(void)
{
isStart = false;
int idx = readBuffer(3);
int action = readBuffer(4);
int device = readBuffer(5);
switch(action)
{
case GET:
{
writeHead();
writeSerial(idx);
readSensor(device);
writeEnd();
}
break;
case RUN:
{
runModule(device);
//callOK();
}
break;
case RESET:
{
//reset
resetAll();
}
break;
case START:
{
//start
callOK();
}
break;
}
}
void callOK(void)
{
writeSerial(0xff);
writeSerial(0x55);
writeEnd();
}
void sendByte(char c)
{
writeSerial(1);
writeSerial(c);
}
void sendString(String s)
{
int l = s.length();
writeSerial(4);
writeSerial(l);
for(int i=0;i<l;i++)
{
writeSerial(s.charAt(i));
}
}
void sendFloat(float value)
{
writeSerial(2);
val.floatVal = value;
writeSerial(val.byteVal[0]);
writeSerial(val.byteVal[1]);
writeSerial(val.byteVal[2]);
writeSerial(val.byteVal[3]);
}
void sendLong(long value)
{
writeSerial(6);
val.longVal = value;
writeSerial(val.byteVal[0]);
writeSerial(val.byteVal[1]);
writeSerial(val.byteVal[2]);
writeSerial(val.byteVal[3]);
}
void sendShort(short value)
{
writeSerial(3);
valShort.shortVal = value;
writeSerial(valShort.byteVal[0]);
writeSerial(valShort.byteVal[1]);
}
void sendDouble(double value)
{
writeSerial(5);
valDouble.doubleVal = value;
writeSerial(valDouble.byteVal[0]);
writeSerial(valDouble.byteVal[1]);
writeSerial(valDouble.byteVal[2]);
writeSerial(valDouble.byteVal[3]);
}
short readShort(int idx)
{
valShort.byteVal[0] = readBuffer(idx);
valShort.byteVal[1] = readBuffer(idx+1);
return valShort.shortVal;
}
float readFloat(int idx)
{
val.byteVal[0] = readBuffer(idx);
val.byteVal[1] = readBuffer(idx+1);
val.byteVal[2] = readBuffer(idx+2);
val.byteVal[3] = readBuffer(idx+3);
return val.floatVal;
}
long readLong(int idx)
{
val.byteVal[0] = readBuffer(idx);
val.byteVal[1] = readBuffer(idx+1);
val.byteVal[2] = readBuffer(idx+2);
val.byteVal[3] = readBuffer(idx+3);
return val.longVal;
}
char _receiveStr[20] = {};
uint8_t _receiveUint8[16] = {};
char* readString(int idx,int len)
{
for(int i=0;i<len;i++)
{
_receiveStr[i]=readBuffer(idx+i);
}
_receiveStr[len] = '\0';
return _receiveStr;
}
uint8_t* readUint8(int idx,int len)
{
for(int i=0;i<len;i++)
{
if(i > 15)
{
break;
}
_receiveUint8[i] = readBuffer(idx+i);
}
return _receiveUint8;
}