
DSGateway sketch program for Nucleo. This program is using DSGatewayLibMBED
Dependencies: DSgatewayMBED mbed TrackReporterS88_DS
main.cpp@1:28c58a355b7f, 2015-01-24 (annotated)
- Committer:
- yaasan
- Date:
- Sat Jan 24 06:46:34 2015 +0000
- Revision:
- 1:28c58a355b7f
- Parent:
- 0:c05fdb9d1e8a
- Child:
- 2:4bece8af05e8
Support CV write func
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
yaasan | 0:c05fdb9d1e8a | 1 | #include "mbed.h" |
yaasan | 0:c05fdb9d1e8a | 2 | #include "DSGatewayMBED.h" |
yaasan | 0:c05fdb9d1e8a | 3 | #include <string> |
yaasan | 0:c05fdb9d1e8a | 4 | |
yaasan | 0:c05fdb9d1e8a | 5 | #define MAX_S88DECODER 1 |
yaasan | 0:c05fdb9d1e8a | 6 | #define RELPYERROR_300 "300 Command error" |
yaasan | 0:c05fdb9d1e8a | 7 | #define RELPYERROR_301 "301 Syntax error" |
yaasan | 0:c05fdb9d1e8a | 8 | #define RELPYERROR_302 "302 receive timeout" |
yaasan | 0:c05fdb9d1e8a | 9 | #define RELPYERROR_303 "303 Unknown error" |
yaasan | 0:c05fdb9d1e8a | 10 | #define RELPYERROR_NONE "" |
yaasan | 0:c05fdb9d1e8a | 11 | |
yaasan | 0:c05fdb9d1e8a | 12 | /* class definition */ |
yaasan | 0:c05fdb9d1e8a | 13 | Serial serial_pc(SERIAL_TX, SERIAL_RX); |
yaasan | 0:c05fdb9d1e8a | 14 | DSGatewayLib ds_gw; |
yaasan | 0:c05fdb9d1e8a | 15 | |
yaasan | 0:c05fdb9d1e8a | 16 | int gCounter = 0; |
yaasan | 0:c05fdb9d1e8a | 17 | string gReceivedMessage; |
yaasan | 0:c05fdb9d1e8a | 18 | word numOfArguments; |
yaasan | 0:c05fdb9d1e8a | 19 | string function; |
yaasan | 0:c05fdb9d1e8a | 20 | word arguments[8]; |
yaasan | 0:c05fdb9d1e8a | 21 | |
yaasan | 0:c05fdb9d1e8a | 22 | /* function definition */ |
yaasan | 0:c05fdb9d1e8a | 23 | word stringToWord(string s); |
yaasan | 0:c05fdb9d1e8a | 24 | void decodeSerialMessage(string inMessage); |
yaasan | 0:c05fdb9d1e8a | 25 | std::string trim(const std::string& string, const char* trimCharacterList); |
yaasan | 0:c05fdb9d1e8a | 26 | boolean ParseMessage(string inRequestText); |
yaasan | 0:c05fdb9d1e8a | 27 | boolean dispatch(); |
yaasan | 0:c05fdb9d1e8a | 28 | |
yaasan | 0:c05fdb9d1e8a | 29 | /* Implementation */ |
yaasan | 0:c05fdb9d1e8a | 30 | |
yaasan | 0:c05fdb9d1e8a | 31 | void decodeSerialMessage(string inMessage) |
yaasan | 0:c05fdb9d1e8a | 32 | { |
yaasan | 0:c05fdb9d1e8a | 33 | string aReplyText = RELPYERROR_NONE; |
yaasan | 0:c05fdb9d1e8a | 34 | |
yaasan | 0:c05fdb9d1e8a | 35 | if( ParseMessage(inMessage) == true) |
yaasan | 0:c05fdb9d1e8a | 36 | { |
yaasan | 0:c05fdb9d1e8a | 37 | |
yaasan | 0:c05fdb9d1e8a | 38 | if( dispatch() == true) |
yaasan | 0:c05fdb9d1e8a | 39 | { |
yaasan | 0:c05fdb9d1e8a | 40 | /* Parse successed */ |
yaasan | 0:c05fdb9d1e8a | 41 | serial_pc.printf("200 Ok"); |
yaasan | 0:c05fdb9d1e8a | 42 | } |
yaasan | 0:c05fdb9d1e8a | 43 | else |
yaasan | 0:c05fdb9d1e8a | 44 | { |
yaasan | 0:c05fdb9d1e8a | 45 | serial_pc.printf(RELPYERROR_300); |
yaasan | 0:c05fdb9d1e8a | 46 | } |
yaasan | 0:c05fdb9d1e8a | 47 | } |
yaasan | 0:c05fdb9d1e8a | 48 | else |
yaasan | 0:c05fdb9d1e8a | 49 | { |
yaasan | 0:c05fdb9d1e8a | 50 | /* Parse failed */ |
yaasan | 0:c05fdb9d1e8a | 51 | serial_pc.printf(RELPYERROR_301); |
yaasan | 0:c05fdb9d1e8a | 52 | } |
yaasan | 0:c05fdb9d1e8a | 53 | |
yaasan | 0:c05fdb9d1e8a | 54 | /* Reply to Desktop Station */ |
yaasan | 0:c05fdb9d1e8a | 55 | serial_pc.printf("\n"); |
yaasan | 0:c05fdb9d1e8a | 56 | |
yaasan | 0:c05fdb9d1e8a | 57 | } |
yaasan | 0:c05fdb9d1e8a | 58 | |
yaasan | 0:c05fdb9d1e8a | 59 | std::string trim(const std::string& string, const char* trimCharacterList = " \t\v\r\n") |
yaasan | 0:c05fdb9d1e8a | 60 | { |
yaasan | 0:c05fdb9d1e8a | 61 | std::string result; |
yaasan | 0:c05fdb9d1e8a | 62 | |
yaasan | 0:c05fdb9d1e8a | 63 | std::string::size_type left = string.find_first_not_of(trimCharacterList); |
yaasan | 0:c05fdb9d1e8a | 64 | |
yaasan | 0:c05fdb9d1e8a | 65 | if (left != std::string::npos) |
yaasan | 0:c05fdb9d1e8a | 66 | { |
yaasan | 0:c05fdb9d1e8a | 67 | // 左側からトリムする文字以外が見つかった場合は、同じように右側からも検索します。 |
yaasan | 0:c05fdb9d1e8a | 68 | std::string::size_type right = string.find_last_not_of(trimCharacterList); |
yaasan | 0:c05fdb9d1e8a | 69 | |
yaasan | 0:c05fdb9d1e8a | 70 | // 戻り値を決定します。ここでは右側から検索しても、トリムする文字以外が必ず存在するので判定不要です。 |
yaasan | 0:c05fdb9d1e8a | 71 | result = string.substr(left, right - left + 1); |
yaasan | 0:c05fdb9d1e8a | 72 | } |
yaasan | 0:c05fdb9d1e8a | 73 | |
yaasan | 0:c05fdb9d1e8a | 74 | return result; |
yaasan | 0:c05fdb9d1e8a | 75 | } |
yaasan | 0:c05fdb9d1e8a | 76 | |
yaasan | 0:c05fdb9d1e8a | 77 | boolean ParseMessage(string inRequestText) |
yaasan | 0:c05fdb9d1e8a | 78 | { |
yaasan | 0:c05fdb9d1e8a | 79 | int lpar = inRequestText.find('('); |
yaasan | 0:c05fdb9d1e8a | 80 | if (lpar == -1) { |
yaasan | 0:c05fdb9d1e8a | 81 | return false; |
yaasan | 0:c05fdb9d1e8a | 82 | } |
yaasan | 0:c05fdb9d1e8a | 83 | |
yaasan | 0:c05fdb9d1e8a | 84 | function = string(inRequestText.substr(0, lpar)); |
yaasan | 0:c05fdb9d1e8a | 85 | trim(function); |
yaasan | 0:c05fdb9d1e8a | 86 | |
yaasan | 0:c05fdb9d1e8a | 87 | int offset = lpar + 1; |
yaasan | 0:c05fdb9d1e8a | 88 | int comma = inRequestText.find(',', offset); |
yaasan | 0:c05fdb9d1e8a | 89 | numOfArguments = 0; |
yaasan | 0:c05fdb9d1e8a | 90 | while (comma != -1) { |
yaasan | 0:c05fdb9d1e8a | 91 | string tmp = inRequestText.substr(offset, comma - offset); |
yaasan | 0:c05fdb9d1e8a | 92 | trim(tmp); |
yaasan | 0:c05fdb9d1e8a | 93 | arguments[numOfArguments++] = stringToWord(tmp); |
yaasan | 0:c05fdb9d1e8a | 94 | offset = comma + 1; |
yaasan | 0:c05fdb9d1e8a | 95 | comma = inRequestText.find(',', offset); |
yaasan | 0:c05fdb9d1e8a | 96 | } |
yaasan | 0:c05fdb9d1e8a | 97 | |
yaasan | 0:c05fdb9d1e8a | 98 | int rpar = inRequestText.find(')', offset); |
yaasan | 0:c05fdb9d1e8a | 99 | while (rpar == -1) { |
yaasan | 0:c05fdb9d1e8a | 100 | return false; |
yaasan | 0:c05fdb9d1e8a | 101 | } |
yaasan | 0:c05fdb9d1e8a | 102 | |
yaasan | 0:c05fdb9d1e8a | 103 | if (rpar > offset) { |
yaasan | 0:c05fdb9d1e8a | 104 | string tmp = inRequestText.substr(offset, rpar - offset); |
yaasan | 0:c05fdb9d1e8a | 105 | trim(tmp); |
yaasan | 0:c05fdb9d1e8a | 106 | arguments[numOfArguments++] = stringToWord(tmp); |
yaasan | 0:c05fdb9d1e8a | 107 | } |
yaasan | 0:c05fdb9d1e8a | 108 | |
yaasan | 0:c05fdb9d1e8a | 109 | return true; |
yaasan | 0:c05fdb9d1e8a | 110 | } |
yaasan | 0:c05fdb9d1e8a | 111 | |
yaasan | 0:c05fdb9d1e8a | 112 | word stringToWord(string s) |
yaasan | 0:c05fdb9d1e8a | 113 | { |
yaasan | 0:c05fdb9d1e8a | 114 | word result = 0; |
yaasan | 0:c05fdb9d1e8a | 115 | |
yaasan | 0:c05fdb9d1e8a | 116 | for (int i = 0; i < s.length(); i++) { |
yaasan | 0:c05fdb9d1e8a | 117 | result = 10 * result + (s.at(i) - '0'); |
yaasan | 0:c05fdb9d1e8a | 118 | } |
yaasan | 0:c05fdb9d1e8a | 119 | |
yaasan | 0:c05fdb9d1e8a | 120 | return result; |
yaasan | 0:c05fdb9d1e8a | 121 | } |
yaasan | 0:c05fdb9d1e8a | 122 | |
yaasan | 0:c05fdb9d1e8a | 123 | // Serial receiver (IRQ) |
yaasan | 0:c05fdb9d1e8a | 124 | void isrRx() { |
yaasan | 0:c05fdb9d1e8a | 125 | char ch; |
yaasan | 0:c05fdb9d1e8a | 126 | ch = serial_pc.getc(); // 1文字受信バッファより取り出し |
yaasan | 0:c05fdb9d1e8a | 127 | |
yaasan | 0:c05fdb9d1e8a | 128 | if(ch != '\n') |
yaasan | 0:c05fdb9d1e8a | 129 | { |
yaasan | 0:c05fdb9d1e8a | 130 | gReceivedMessage = gReceivedMessage + ch; |
yaasan | 0:c05fdb9d1e8a | 131 | gCounter++; |
yaasan | 0:c05fdb9d1e8a | 132 | } |
yaasan | 0:c05fdb9d1e8a | 133 | else |
yaasan | 0:c05fdb9d1e8a | 134 | { |
yaasan | 0:c05fdb9d1e8a | 135 | /* Decode the commands from PC */ |
yaasan | 0:c05fdb9d1e8a | 136 | decodeSerialMessage(gReceivedMessage); |
yaasan | 0:c05fdb9d1e8a | 137 | |
yaasan | 0:c05fdb9d1e8a | 138 | gCounter = 0; |
yaasan | 0:c05fdb9d1e8a | 139 | gReceivedMessage = ""; |
yaasan | 0:c05fdb9d1e8a | 140 | } |
yaasan | 0:c05fdb9d1e8a | 141 | |
yaasan | 0:c05fdb9d1e8a | 142 | } |
yaasan | 0:c05fdb9d1e8a | 143 | |
yaasan | 0:c05fdb9d1e8a | 144 | boolean dispatch() { |
yaasan | 0:c05fdb9d1e8a | 145 | boolean aResult; |
yaasan | 0:c05fdb9d1e8a | 146 | |
yaasan | 0:c05fdb9d1e8a | 147 | if (function.compare("setLocoDirection") == 0) { |
yaasan | 0:c05fdb9d1e8a | 148 | return ds_gw.SetLocoDirection(arguments[0], (unsigned char)arguments[1]); |
yaasan | 0:c05fdb9d1e8a | 149 | |
yaasan | 0:c05fdb9d1e8a | 150 | } else if (function.compare("setLocoFunction") == 0) { |
yaasan | 0:c05fdb9d1e8a | 151 | return ds_gw.SetLocoFunction(arguments[0], arguments[1], (byte)arguments[2]); |
yaasan | 0:c05fdb9d1e8a | 152 | |
yaasan | 0:c05fdb9d1e8a | 153 | } else if (function.compare("setTurnout") == 0) { |
yaasan | 0:c05fdb9d1e8a | 154 | return ds_gw.SetTurnout(arguments[0], (byte)arguments[1]); |
yaasan | 0:c05fdb9d1e8a | 155 | |
yaasan | 0:c05fdb9d1e8a | 156 | } else if (function.compare("setPower") == 0) { |
yaasan | 0:c05fdb9d1e8a | 157 | return ds_gw.SetPower((byte)arguments[0]); |
yaasan | 0:c05fdb9d1e8a | 158 | |
yaasan | 0:c05fdb9d1e8a | 159 | } else if (function.compare("setLocoSpeed") == 0) { |
yaasan | 0:c05fdb9d1e8a | 160 | return ds_gw.SetLocoSpeed(arguments[0], arguments[1]); |
yaasan | 0:c05fdb9d1e8a | 161 | } |
yaasan | 0:c05fdb9d1e8a | 162 | else if (function.compare("getS88") == 0) |
yaasan | 0:c05fdb9d1e8a | 163 | { |
yaasan | 0:c05fdb9d1e8a | 164 | int aMaxS88Num = MAX_S88DECODER; |
yaasan | 0:c05fdb9d1e8a | 165 | |
yaasan | 0:c05fdb9d1e8a | 166 | if( arguments[0] > 0) |
yaasan | 0:c05fdb9d1e8a | 167 | { |
yaasan | 0:c05fdb9d1e8a | 168 | aMaxS88Num = arguments[0]; |
yaasan | 0:c05fdb9d1e8a | 169 | } |
yaasan | 0:c05fdb9d1e8a | 170 | |
yaasan | 0:c05fdb9d1e8a | 171 | //reporter.refresh(aMaxS88Num); |
yaasan | 0:c05fdb9d1e8a | 172 | |
yaasan | 0:c05fdb9d1e8a | 173 | //Send a S88 sensor reply |
yaasan | 0:c05fdb9d1e8a | 174 | serial_pc.printf("@S88,"); |
yaasan | 0:c05fdb9d1e8a | 175 | |
yaasan | 0:c05fdb9d1e8a | 176 | word aFlags = 0; |
yaasan | 0:c05fdb9d1e8a | 177 | |
yaasan | 0:c05fdb9d1e8a | 178 | for( int j = 0; j < aMaxS88Num; j++) |
yaasan | 0:c05fdb9d1e8a | 179 | { |
yaasan | 0:c05fdb9d1e8a | 180 | //aFlags = (reporter.getByte((j << 1) + 1) << 8) + reporter.getByte(j << 1); |
yaasan | 0:c05fdb9d1e8a | 181 | aFlags = 0; |
yaasan | 0:c05fdb9d1e8a | 182 | |
yaasan | 0:c05fdb9d1e8a | 183 | serial_pc.printf("%x", aFlags); |
yaasan | 0:c05fdb9d1e8a | 184 | serial_pc.printf(","); |
yaasan | 0:c05fdb9d1e8a | 185 | } |
yaasan | 0:c05fdb9d1e8a | 186 | |
yaasan | 0:c05fdb9d1e8a | 187 | serial_pc.printf("\n"); |
yaasan | 0:c05fdb9d1e8a | 188 | |
yaasan | 0:c05fdb9d1e8a | 189 | return true; |
yaasan | 0:c05fdb9d1e8a | 190 | |
yaasan | 0:c05fdb9d1e8a | 191 | } /* getS88 */ |
yaasan | 0:c05fdb9d1e8a | 192 | else if (function.compare("reset") == 0) |
yaasan | 0:c05fdb9d1e8a | 193 | { |
yaasan | 0:c05fdb9d1e8a | 194 | |
yaasan | 0:c05fdb9d1e8a | 195 | serial_pc.printf("100 Ready\n"); |
yaasan | 0:c05fdb9d1e8a | 196 | |
yaasan | 0:c05fdb9d1e8a | 197 | return true; |
yaasan | 0:c05fdb9d1e8a | 198 | } /* reset */ |
yaasan | 0:c05fdb9d1e8a | 199 | else if (function.compare("setPing") == 0) { |
yaasan | 1:28c58a355b7f | 200 | serial_pc.printf("@DSG,001,\n"); |
yaasan | 0:c05fdb9d1e8a | 201 | return true; |
yaasan | 1:28c58a355b7f | 202 | |
yaasan | 1:28c58a355b7f | 203 | } else if (function == "getLocoConfig") { |
yaasan | 1:28c58a355b7f | 204 | |
yaasan | 1:28c58a355b7f | 205 | /*aResult = ctrl.readConfig(arguments[0], arguments[1], &aValue);*/ |
yaasan | 1:28c58a355b7f | 206 | serial_pc.printf("@CV,"); |
yaasan | 1:28c58a355b7f | 207 | serial_pc.printf("%d", arguments[0]); |
yaasan | 1:28c58a355b7f | 208 | serial_pc.printf(","); |
yaasan | 1:28c58a355b7f | 209 | serial_pc.printf("%d", arguments[1]); |
yaasan | 1:28c58a355b7f | 210 | serial_pc.printf(","); |
yaasan | 1:28c58a355b7f | 211 | serial_pc.printf("%d", 0x00); |
yaasan | 1:28c58a355b7f | 212 | serial_pc.printf(",\n"); |
yaasan | 1:28c58a355b7f | 213 | |
yaasan | 1:28c58a355b7f | 214 | return true; |
yaasan | 1:28c58a355b7f | 215 | } else if (function == "setLocoConfig") { |
yaasan | 1:28c58a355b7f | 216 | return ds_gw.WriteConfig(arguments[0], arguments[1], arguments[2]); |
yaasan | 1:28c58a355b7f | 217 | |
yaasan | 0:c05fdb9d1e8a | 218 | } |
yaasan | 1:28c58a355b7f | 219 | |
yaasan | 0:c05fdb9d1e8a | 220 | else |
yaasan | 0:c05fdb9d1e8a | 221 | { |
yaasan | 0:c05fdb9d1e8a | 222 | return false; |
yaasan | 0:c05fdb9d1e8a | 223 | } |
yaasan | 0:c05fdb9d1e8a | 224 | |
yaasan | 0:c05fdb9d1e8a | 225 | } |
yaasan | 0:c05fdb9d1e8a | 226 | |
yaasan | 0:c05fdb9d1e8a | 227 | int main() { |
yaasan | 0:c05fdb9d1e8a | 228 | |
yaasan | 0:c05fdb9d1e8a | 229 | //initialization |
yaasan | 0:c05fdb9d1e8a | 230 | serial_pc.baud(115200); |
yaasan | 0:c05fdb9d1e8a | 231 | //serial_pc.format(8, 0, 1); |
yaasan | 0:c05fdb9d1e8a | 232 | serial_pc.attach(isrRx, Serial::RxIrq); |
yaasan | 0:c05fdb9d1e8a | 233 | |
yaasan | 0:c05fdb9d1e8a | 234 | serial_pc.printf("--------------------------------------\n"); |
yaasan | 0:c05fdb9d1e8a | 235 | serial_pc.printf("Desktop Station Gateway \n"); |
yaasan | 0:c05fdb9d1e8a | 236 | serial_pc.printf("--------------------------------------\n"); |
yaasan | 0:c05fdb9d1e8a | 237 | serial_pc.printf("100 Ready\n"); |
yaasan | 0:c05fdb9d1e8a | 238 | |
yaasan | 0:c05fdb9d1e8a | 239 | ds_gw.begin(); |
yaasan | 0:c05fdb9d1e8a | 240 | |
yaasan | 0:c05fdb9d1e8a | 241 | while(1) { |
yaasan | 0:c05fdb9d1e8a | 242 | wait_ms(50); |
yaasan | 0:c05fdb9d1e8a | 243 | |
yaasan | 0:c05fdb9d1e8a | 244 | } |
yaasan | 0:c05fdb9d1e8a | 245 | } |
yaasan | 0:c05fdb9d1e8a | 246 |