DSGateway sketch program for Nucleo. This program is using DSGatewayLibMBED

Dependencies:   DSgatewayMBED mbed TrackReporterS88_DS

Committer:
yaasan
Date:
Fri Jan 23 22:31:04 2015 +0000
Revision:
0:c05fdb9d1e8a
Child:
1:28c58a355b7f
First release

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 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 0:c05fdb9d1e8a 200 serial_pc.printf("@DSG,001,\n");
yaasan 0:c05fdb9d1e8a 201 return true;
yaasan 0:c05fdb9d1e8a 202 }
yaasan 0:c05fdb9d1e8a 203 else
yaasan 0:c05fdb9d1e8a 204 {
yaasan 0:c05fdb9d1e8a 205 return false;
yaasan 0:c05fdb9d1e8a 206 }
yaasan 0:c05fdb9d1e8a 207
yaasan 0:c05fdb9d1e8a 208 }
yaasan 0:c05fdb9d1e8a 209
yaasan 0:c05fdb9d1e8a 210 int main() {
yaasan 0:c05fdb9d1e8a 211
yaasan 0:c05fdb9d1e8a 212 //initialization
yaasan 0:c05fdb9d1e8a 213 serial_pc.baud(115200);
yaasan 0:c05fdb9d1e8a 214 //serial_pc.format(8, 0, 1);
yaasan 0:c05fdb9d1e8a 215 serial_pc.attach(isrRx, Serial::RxIrq);
yaasan 0:c05fdb9d1e8a 216
yaasan 0:c05fdb9d1e8a 217 serial_pc.printf("--------------------------------------\n");
yaasan 0:c05fdb9d1e8a 218 serial_pc.printf("Desktop Station Gateway \n");
yaasan 0:c05fdb9d1e8a 219 serial_pc.printf("--------------------------------------\n");
yaasan 0:c05fdb9d1e8a 220 serial_pc.printf("100 Ready\n");
yaasan 0:c05fdb9d1e8a 221
yaasan 0:c05fdb9d1e8a 222 ds_gw.begin();
yaasan 0:c05fdb9d1e8a 223
yaasan 0:c05fdb9d1e8a 224 while(1) {
yaasan 0:c05fdb9d1e8a 225 wait_ms(50);
yaasan 0:c05fdb9d1e8a 226
yaasan 0:c05fdb9d1e8a 227 }
yaasan 0:c05fdb9d1e8a 228 }
yaasan 0:c05fdb9d1e8a 229