
UART Command Parser Time Manager Data Store for SD Card for stm32l476 [it's not Licensed as BSD/GPLx]
Dependencies: mbed SDFileSystem
common/CommandParser.cpp@0:c347f602596d, 2019-04-20 (annotated)
- 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?
User | Revision | Line number | New 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 | } |