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