xrocusOS_ADXL355 version

Dependencies:   mbed SDFileSystem

Committer:
Inscape_ao
Date:
Sat Apr 20 09:23:39 2019 +0000
Revision:
0:c347f602596d
Child:
1:71c9c97c9f3d
create UartReceiver, CommandParser

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Inscape_ao 0:c347f602596d 1 #include "global.h"
Inscape_ao 0:c347f602596d 2
Inscape_ao 0:c347f602596d 3 static void lineHandler(char *line)
Inscape_ao 0:c347f602596d 4 {
Inscape_ao 0:c347f602596d 5 pCP->parse(line);
Inscape_ao 0:c347f602596d 6 }
Inscape_ao 0:c347f602596d 7
Inscape_ao 0:c347f602596d 8 CommandParser::CommandParser(UartReceiver *setUartReceiver, int setDeviceID,
Inscape_ao 0:c347f602596d 9 CmdParseRule *setRuleTable, int setRuleTableLen)
Inscape_ao 0:c347f602596d 10 {
Inscape_ao 0:c347f602596d 11 pR = setUartReceiver;
Inscape_ao 0:c347f602596d 12 pR->setLineHandler(lineHandler);
Inscape_ao 0:c347f602596d 13 deviceID = setDeviceID;
Inscape_ao 0:c347f602596d 14 ruleTable = setRuleTable;
Inscape_ao 0:c347f602596d 15 ruleTableLen = setRuleTableLen;
Inscape_ao 0:c347f602596d 16 pUart = pR->getCurrentUart();
Inscape_ao 0:c347f602596d 17 }
Inscape_ao 0:c347f602596d 18
Inscape_ao 0:c347f602596d 19 void CommandParser::run(void)
Inscape_ao 0:c347f602596d 20 {
Inscape_ao 0:c347f602596d 21 pR->run();
Inscape_ao 0:c347f602596d 22 }
Inscape_ao 0:c347f602596d 23
Inscape_ao 0:c347f602596d 24 int CommandParser::parse(char *pStr)
Inscape_ao 0:c347f602596d 25 {
Inscape_ao 0:c347f602596d 26 int rn;
Inscape_ao 0:c347f602596d 27 int len;
Inscape_ao 0:c347f602596d 28 char *head;
Inscape_ao 0:c347f602596d 29 /** skip - empty command*/
Inscape_ao 0:c347f602596d 30 if (pStr[0] == '\0') {
Inscape_ao 0:c347f602596d 31 pUart->printf("[CommandParser::parse] (empty)\n");
Inscape_ao 0:c347f602596d 32 return 0;
Inscape_ao 0:c347f602596d 33 }
Inscape_ao 0:c347f602596d 34 /* protection for buffer overrun */
Inscape_ao 0:c347f602596d 35 pStr[UartReceiver::MaxStr] = '\0';
Inscape_ao 0:c347f602596d 36 len = strlen(pStr);
Inscape_ao 0:c347f602596d 37
Inscape_ao 0:c347f602596d 38 /* parsing */
Inscape_ao 0:c347f602596d 39 head = pStr;
Inscape_ao 0:c347f602596d 40 pUart->printf("[CommandParser::parse] %s\n", pStr);
Inscape_ao 0:c347f602596d 41
Inscape_ao 0:c347f602596d 42 /** Command Format ":0 CMD 0000" */
Inscape_ao 0:c347f602596d 43 if (len != CmdLen) {
Inscape_ao 0:c347f602596d 44 pUart->printf("[CommandParser::parse] Invalid Command Length\n");
Inscape_ao 0:c347f602596d 45 return -1;
Inscape_ao 0:c347f602596d 46 }
Inscape_ao 0:c347f602596d 47 /** check Command Header */
Inscape_ao 0:c347f602596d 48 if (head[0] != ':') {
Inscape_ao 0:c347f602596d 49 pUart->printf("[CommandParser::parse] Invalid Command\n");
Inscape_ao 0:c347f602596d 50 return -1;
Inscape_ao 0:c347f602596d 51 }
Inscape_ao 0:c347f602596d 52 /** check Command DeviceID */
Inscape_ao 0:c347f602596d 53 if ((head[1] - '0') != deviceID) {
Inscape_ao 0:c347f602596d 54 pUart->printf("[CommandParser::parse] Ignore (DST is other)\n");
Inscape_ao 0:c347f602596d 55 return 0;
Inscape_ao 0:c347f602596d 56 }
Inscape_ao 0:c347f602596d 57
Inscape_ao 0:c347f602596d 58 /** search Command */
Inscape_ao 0:c347f602596d 59 head += 3;
Inscape_ao 0:c347f602596d 60 for(rn = 0; rn < ruleTableLen; rn++) {
Inscape_ao 0:c347f602596d 61 int check;
Inscape_ao 0:c347f602596d 62 check = strncmp((const char*)(ruleTable[rn].cmdName),
Inscape_ao 0:c347f602596d 63 (const char*)(head),CmdNameLen);
Inscape_ao 0:c347f602596d 64 if (check != 0) {
Inscape_ao 0:c347f602596d 65 continue;
Inscape_ao 0:c347f602596d 66 }
Inscape_ao 0:c347f602596d 67 head += 4;
Inscape_ao 0:c347f602596d 68 return (*ruleTable[rn].func)(head);
Inscape_ao 0:c347f602596d 69
Inscape_ao 0:c347f602596d 70 }
Inscape_ao 0:c347f602596d 71 pUart->printf("[CommandParser::parse] Invalid Command String\n");
Inscape_ao 0:c347f602596d 72 return -1;
Inscape_ao 0:c347f602596d 73 }