DCC Speed Step 128 Version

Dependencies:   DSgatewayMBED TrackReporterS88_DS mbed

Fork of DSGatewayMBED_Nucleo by Yaasan K

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?

UserRevisionLine numberNew 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