FTE-denshi / Mbed 2 deprecated FTE-06

Dependencies:   mbed FATFileSystem

Fork of FTE-06 by Tetsushi Amano

Committer:
mizuki_akaike
Date:
Mon Aug 14 04:56:52 2017 +0000
Revision:
23:9be034083282
?????????????;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mizuki_akaike 23:9be034083282 1 #include "IM920.h"
mizuki_akaike 23:9be034083282 2
mizuki_akaike 23:9be034083282 3 void IM920::recvData (char c) {
mizuki_akaike 23:9be034083282 4 static int sub, len, count;
mizuki_akaike 23:9be034083282 5 static char chr;
mizuki_akaike 23:9be034083282 6
mizuki_akaike 23:9be034083282 7 #ifdef DEBUG_DUMP
mizuki_akaike 23:9be034083282 8 if (c < 0x20 || c >= 0x7f) {
mizuki_akaike 23:9be034083282 9 std::printf("_%02x", c);
mizuki_akaike 23:9be034083282 10 } else {
mizuki_akaike 23:9be034083282 11 std::printf("_%c", c);
mizuki_akaike 23:9be034083282 12 }
mizuki_akaike 23:9be034083282 13 #endif
mizuki_akaike 23:9be034083282 14 switch (_state.mode) {
mizuki_akaike 23:9be034083282 15 case MODE_COMMAND:
mizuki_akaike 23:9be034083282 16 switch (c) {
mizuki_akaike 23:9be034083282 17 case 0:
mizuki_akaike 23:9be034083282 18 case 0x0a: // LF
mizuki_akaike 23:9be034083282 19 case 0x0d: // CR
mizuki_akaike 23:9be034083282 20 _state.buf[len] = 0;
mizuki_akaike 23:9be034083282 21 len = 0;
mizuki_akaike 23:9be034083282 22 parseMessage();
mizuki_akaike 23:9be034083282 23 break;
mizuki_akaike 23:9be034083282 24 case ':':
mizuki_akaike 23:9be034083282 25 if (_state.buf[2] == ',' && _state.buf[7] == ',' && len == 10) {
mizuki_akaike 23:9be034083282 26 sub = 0;
mizuki_akaike 23:9be034083282 27 _state.mode = MODE_DATA_RX;
mizuki_akaike 23:9be034083282 28 break;
mizuki_akaike 23:9be034083282 29 }
mizuki_akaike 23:9be034083282 30 /* FALLTHROUGH */
mizuki_akaike 23:9be034083282 31 default:
mizuki_akaike 23:9be034083282 32 if (len < sizeof(_state.buf) - 1) {
mizuki_akaike 23:9be034083282 33 _state.buf[len] = c;
mizuki_akaike 23:9be034083282 34 len ++;
mizuki_akaike 23:9be034083282 35 }
mizuki_akaike 23:9be034083282 36 break;
mizuki_akaike 23:9be034083282 37 }
mizuki_akaike 23:9be034083282 38 break;
mizuki_akaike 23:9be034083282 39
mizuki_akaike 23:9be034083282 40 case MODE_DATA_RX:
mizuki_akaike 23:9be034083282 41 if (c == '\r' || c == '\n') {
mizuki_akaike 23:9be034083282 42 DBG("recv %d/%d\r\n", count, len);
mizuki_akaike 23:9be034083282 43 _state.received = true;
mizuki_akaike 23:9be034083282 44 _state.mode = MODE_COMMAND;
mizuki_akaike 23:9be034083282 45 len = 0;
mizuki_akaike 23:9be034083282 46 break;
mizuki_akaike 23:9be034083282 47 }
mizuki_akaike 23:9be034083282 48 switch (sub) {
mizuki_akaike 23:9be034083282 49 case 0:
mizuki_akaike 23:9be034083282 50 chr = x2i(c) << 4;
mizuki_akaike 23:9be034083282 51 sub ++;
mizuki_akaike 23:9be034083282 52 break;
mizuki_akaike 23:9be034083282 53 case 1:
mizuki_akaike 23:9be034083282 54 chr |= x2i(c);
mizuki_akaike 23:9be034083282 55 sub ++;
mizuki_akaike 23:9be034083282 56 if (_state.data!= NULL) {
mizuki_akaike 23:9be034083282 57 _state.data->queue(chr);
mizuki_akaike 23:9be034083282 58 if (_state.data->available() >= CFG_DATA_SIZE) {
mizuki_akaike 23:9be034083282 59 _state.received = true;
mizuki_akaike 23:9be034083282 60 WARN("buf full");
mizuki_akaike 23:9be034083282 61 }
mizuki_akaike 23:9be034083282 62 }
mizuki_akaike 23:9be034083282 63 count ++;
mizuki_akaike 23:9be034083282 64 break;
mizuki_akaike 23:9be034083282 65 case 2:
mizuki_akaike 23:9be034083282 66 if (c == ',') {
mizuki_akaike 23:9be034083282 67 sub = 0;
mizuki_akaike 23:9be034083282 68 }
mizuki_akaike 23:9be034083282 69 break;
mizuki_akaike 23:9be034083282 70 }
mizuki_akaike 23:9be034083282 71 }
mizuki_akaike 23:9be034083282 72 }
mizuki_akaike 23:9be034083282 73
mizuki_akaike 23:9be034083282 74 #define RES_TABLE_NUM 4
mizuki_akaike 23:9be034083282 75 int IM920::parseMessage () {
mizuki_akaike 23:9be034083282 76 int i;
mizuki_akaike 23:9be034083282 77 static const struct RES_TABLE {
mizuki_akaike 23:9be034083282 78 const Response res;
mizuki_akaike 23:9be034083282 79 void (IM920::*func)(const char*);
mizuki_akaike 23:9be034083282 80 } res_table[RES_TABLE_NUM] = {
mizuki_akaike 23:9be034083282 81 {RES_NULL, NULL},
mizuki_akaike 23:9be034083282 82 {RES_RDID, &IM920::resRDID},
mizuki_akaike 23:9be034083282 83 {RES_RDNN, &IM920::resRDNN},
mizuki_akaike 23:9be034083282 84 {RES_RDRS, &IM920::resRDRS},
mizuki_akaike 23:9be034083282 85 };
mizuki_akaike 23:9be034083282 86
mizuki_akaike 23:9be034083282 87 if (_state.res != RES_NULL) {
mizuki_akaike 23:9be034083282 88 for (i = 0; i < RES_TABLE_NUM; i ++) {
mizuki_akaike 23:9be034083282 89 if (res_table[i].res == _state.res) {
mizuki_akaike 23:9be034083282 90 DBG("parse res %d '%s'\r\n", i, _state.buf);
mizuki_akaike 23:9be034083282 91 if (res_table[i].func != NULL) {
mizuki_akaike 23:9be034083282 92 (this->*(res_table[i].func))(_state.buf);
mizuki_akaike 23:9be034083282 93 }
mizuki_akaike 23:9be034083282 94 }
mizuki_akaike 23:9be034083282 95 }
mizuki_akaike 23:9be034083282 96 }
mizuki_akaike 23:9be034083282 97
mizuki_akaike 23:9be034083282 98 if (strncmp(_state.buf, "OK", 2) == 0) {
mizuki_akaike 23:9be034083282 99 _state.ok = true;
mizuki_akaike 23:9be034083282 100 if (_state.status == STAT_SLEEP) {
mizuki_akaike 23:9be034083282 101 _state.status = STAT_NONE;
mizuki_akaike 23:9be034083282 102 }
mizuki_akaike 23:9be034083282 103 return 0;
mizuki_akaike 23:9be034083282 104 } else
mizuki_akaike 23:9be034083282 105 if (strncmp(_state.buf, "NG", 2) == 0) {
mizuki_akaike 23:9be034083282 106 _state.failure = true;
mizuki_akaike 23:9be034083282 107 return 0;
mizuki_akaike 23:9be034083282 108 }
mizuki_akaike 23:9be034083282 109
mizuki_akaike 23:9be034083282 110 return -1;
mizuki_akaike 23:9be034083282 111 }
mizuki_akaike 23:9be034083282 112
mizuki_akaike 23:9be034083282 113 void IM920::resRDID (const char *buf) {
mizuki_akaike 23:9be034083282 114
mizuki_akaike 23:9be034083282 115 if (buf[0] < '0' || buf[0] > 'F') return;
mizuki_akaike 23:9be034083282 116
mizuki_akaike 23:9be034083282 117 _state.id = strtol(buf, NULL, 16);
mizuki_akaike 23:9be034083282 118 _state.res = RES_NULL;
mizuki_akaike 23:9be034083282 119 }
mizuki_akaike 23:9be034083282 120
mizuki_akaike 23:9be034083282 121 void IM920::resRDNN (const char *buf) {
mizuki_akaike 23:9be034083282 122
mizuki_akaike 23:9be034083282 123 if (buf[0] < '0' || buf[0] > 'F') return;
mizuki_akaike 23:9be034083282 124
mizuki_akaike 23:9be034083282 125 _state.node = strtol(buf, NULL, 16);
mizuki_akaike 23:9be034083282 126 _state.res = RES_NULL;
mizuki_akaike 23:9be034083282 127 }
mizuki_akaike 23:9be034083282 128
mizuki_akaike 23:9be034083282 129 void IM920::resRDRS (const char *buf) {
mizuki_akaike 23:9be034083282 130
mizuki_akaike 23:9be034083282 131 if (buf[0] < '0' || buf[0] > 'F') return;
mizuki_akaike 23:9be034083282 132
mizuki_akaike 23:9be034083282 133 _state.rssi = strtol(buf, NULL, 16);
mizuki_akaike 23:9be034083282 134 _state.res = RES_NULL;
mizuki_akaike 23:9be034083282 135 }
mizuki_akaike 23:9be034083282 136