Fork to see if I can get working

Dependencies:   BufferedSerial OneWire WinbondSPIFlash libxDot-dev-mbed5-deprecated

Fork of xDotBridge_update_test20180823 by Matt Briggs

Committer:
Matt Briggs
Date:
Tue May 16 15:15:58 2017 -0600
Revision:
76:d1b20a259d8f
Parent:
75:600cb3a9f126
Child:
77:176e3eb8f712
Quick commit before lib add.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Matt Briggs 75:600cb3a9f126 1 /*
Matt Briggs 75:600cb3a9f126 2 * SerialTermMgr.cpp
Matt Briggs 75:600cb3a9f126 3 *
Matt Briggs 75:600cb3a9f126 4 * Created on: May 8, 2017
Matt Briggs 75:600cb3a9f126 5 * Author: mbriggs
Matt Briggs 75:600cb3a9f126 6 */
Matt Briggs 75:600cb3a9f126 7
Matt Briggs 75:600cb3a9f126 8 #include "SerialTermMgr.h"
Matt Briggs 75:600cb3a9f126 9 #include "UserInterface.h"
Matt Briggs 75:600cb3a9f126 10
Matt Briggs 76:d1b20a259d8f 11 extern Serial pc;
Matt Briggs 76:d1b20a259d8f 12 const char ACK = 0x06;
Matt Briggs 76:d1b20a259d8f 13 const char NAK = 0x15;
Matt Briggs 76:d1b20a259d8f 14
Matt Briggs 75:600cb3a9f126 15 SerialTermMgr::SerialTermMgr(BaseboardIO *bbio, float fwVersion)
Matt Briggs 75:600cb3a9f126 16 {
Matt Briggs 75:600cb3a9f126 17 mPc = NULL;
Matt Briggs 75:600cb3a9f126 18 mFwVersion = fwVersion;
Matt Briggs 75:600cb3a9f126 19 mCurrScreen = mainScreenId;
Matt Briggs 75:600cb3a9f126 20 mBbio = bbio;
Matt Briggs 75:600cb3a9f126 21 }
Matt Briggs 75:600cb3a9f126 22 void SerialTermMgr::printScreen()
Matt Briggs 75:600cb3a9f126 23 {
Matt Briggs 75:600cb3a9f126 24 switch (mCurrScreen) {
Matt Briggs 75:600cb3a9f126 25 case mainScreenId:
Matt Briggs 75:600cb3a9f126 26 printMainScreen();
Matt Briggs 75:600cb3a9f126 27 break;
Matt Briggs 75:600cb3a9f126 28 case genInfoScreenId:
Matt Briggs 75:600cb3a9f126 29 printGenInfo();
Matt Briggs 75:600cb3a9f126 30 break;
Matt Briggs 75:600cb3a9f126 31 case settingsScreenId:
Matt Briggs 75:600cb3a9f126 32 case statsScreenId:
Matt Briggs 75:600cb3a9f126 33 case errorLogScreenId:
Matt Briggs 75:600cb3a9f126 34 case liveLogScreenId:
Matt Briggs 75:600cb3a9f126 35 case enterSerialBridgeScreenId:
Matt Briggs 76:d1b20a259d8f 36 printMainScreen();
Matt Briggs 76:d1b20a259d8f 37 break;
Matt Briggs 75:600cb3a9f126 38 case enterProgModeScreenId:
Matt Briggs 76:d1b20a259d8f 39 printEnterProgMode();
Matt Briggs 75:600cb3a9f126 40 }
Matt Briggs 75:600cb3a9f126 41 }
Matt Briggs 75:600cb3a9f126 42 bool SerialTermMgr::input()
Matt Briggs 75:600cb3a9f126 43 {
Matt Briggs 75:600cb3a9f126 44 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 45 return true;
Matt Briggs 75:600cb3a9f126 46 }
Matt Briggs 75:600cb3a9f126 47 bool quit = false;
Matt Briggs 75:600cb3a9f126 48 char c = 10;
Matt Briggs 75:600cb3a9f126 49 if (mPc->readable()) {
Matt Briggs 75:600cb3a9f126 50 c = mPc->getc();
Matt Briggs 75:600cb3a9f126 51 }
Matt Briggs 75:600cb3a9f126 52 else {
Matt Briggs 75:600cb3a9f126 53 return false; // Do nothing if there is no input
Matt Briggs 75:600cb3a9f126 54 }
Matt Briggs 75:600cb3a9f126 55 switch (mCurrScreen) {
Matt Briggs 75:600cb3a9f126 56 case mainScreenId:
Matt Briggs 75:600cb3a9f126 57 quit = inputMainPage(c);
Matt Briggs 75:600cb3a9f126 58 break;
Matt Briggs 75:600cb3a9f126 59 case genInfoScreenId:
Matt Briggs 75:600cb3a9f126 60 inputGenInfo(c);
Matt Briggs 75:600cb3a9f126 61 break;
Matt Briggs 75:600cb3a9f126 62 case settingsScreenId:
Matt Briggs 75:600cb3a9f126 63 case statsScreenId:
Matt Briggs 75:600cb3a9f126 64 case errorLogScreenId:
Matt Briggs 75:600cb3a9f126 65 case liveLogScreenId:
Matt Briggs 75:600cb3a9f126 66 case enterSerialBridgeScreenId:
Matt Briggs 76:d1b20a259d8f 67 inputMainPage(c);
Matt Briggs 76:d1b20a259d8f 68 break;
Matt Briggs 75:600cb3a9f126 69 case enterProgModeScreenId:
Matt Briggs 76:d1b20a259d8f 70 inputEnterProgMode(c);
Matt Briggs 75:600cb3a9f126 71 }
Matt Briggs 75:600cb3a9f126 72 return quit;
Matt Briggs 75:600cb3a9f126 73 }
Matt Briggs 75:600cb3a9f126 74
Matt Briggs 75:600cb3a9f126 75 // private methods
Matt Briggs 75:600cb3a9f126 76 bool SerialTermMgr::inputMainPage (char in) {
Matt Briggs 75:600cb3a9f126 77 bool quit = false;
Matt Briggs 75:600cb3a9f126 78 switch (in) {
Matt Briggs 75:600cb3a9f126 79 case '1':
Matt Briggs 75:600cb3a9f126 80 mCurrScreen = genInfoScreenId;
Matt Briggs 75:600cb3a9f126 81 break;
Matt Briggs 75:600cb3a9f126 82 case '2':
Matt Briggs 75:600cb3a9f126 83 mPc->printf("\r\nNot implemented yet.\r\n");
Matt Briggs 75:600cb3a9f126 84 // mCurrScreen = settingsScreenId;
Matt Briggs 75:600cb3a9f126 85 break;
Matt Briggs 75:600cb3a9f126 86 case '3':
Matt Briggs 75:600cb3a9f126 87 mPc->printf("\r\nNot implemented yet.\r\n");
Matt Briggs 75:600cb3a9f126 88 // mCurrScreen = statsScreenId;
Matt Briggs 75:600cb3a9f126 89 break;
Matt Briggs 75:600cb3a9f126 90 case '4':
Matt Briggs 75:600cb3a9f126 91 mPc->printf("\r\nNot implemented yet.\r\n");
Matt Briggs 75:600cb3a9f126 92 // mCurrScreen = errorLogScreenId;
Matt Briggs 75:600cb3a9f126 93 break;
Matt Briggs 75:600cb3a9f126 94 case '5':
Matt Briggs 75:600cb3a9f126 95 mPc->printf("\r\nNot implemented yet.\r\n");
Matt Briggs 75:600cb3a9f126 96 // mCurrScreen = liveLogScreenId;
Matt Briggs 75:600cb3a9f126 97 break;
Matt Briggs 75:600cb3a9f126 98 case '6':
Matt Briggs 75:600cb3a9f126 99 mPc->printf("\r\nNot implemented yet.\r\n");
Matt Briggs 75:600cb3a9f126 100 // mCurrScreen = enterSerialBridgeScreenId;
Matt Briggs 75:600cb3a9f126 101 break;
Matt Briggs 75:600cb3a9f126 102 case '7':
Matt Briggs 76:d1b20a259d8f 103 mCurrScreen = enterProgModeScreenId;
Matt Briggs 75:600cb3a9f126 104 break;
Matt Briggs 75:600cb3a9f126 105 case 0x11: // ctrl-q
Matt Briggs 75:600cb3a9f126 106 quit=true;
Matt Briggs 75:600cb3a9f126 107 break;
Matt Briggs 75:600cb3a9f126 108 default:
Matt Briggs 75:600cb3a9f126 109 mCurrScreen = mainScreenId;
Matt Briggs 75:600cb3a9f126 110 }
Matt Briggs 75:600cb3a9f126 111 if (!quit) {
Matt Briggs 75:600cb3a9f126 112 printScreen();
Matt Briggs 75:600cb3a9f126 113 }
Matt Briggs 75:600cb3a9f126 114 return quit;
Matt Briggs 75:600cb3a9f126 115 }
Matt Briggs 75:600cb3a9f126 116
Matt Briggs 75:600cb3a9f126 117 void SerialTermMgr::printMainScreen()
Matt Briggs 75:600cb3a9f126 118 {
Matt Briggs 75:600cb3a9f126 119 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 120 return;
Matt Briggs 75:600cb3a9f126 121 }
Matt Briggs 75:600cb3a9f126 122 mPc->printf("\r\n\r\n");
Matt Briggs 75:600cb3a9f126 123 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 124 mPc->printf("= Wireless Bridge Terminal (Firmware: v%0.2f) =\r\n", mFwVersion);
Matt Briggs 75:600cb3a9f126 125 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 126 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 127 mPc->printf("= Selection Options =\r\n");
Matt Briggs 75:600cb3a9f126 128 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 129 mPc->printf("= 0: Refresh (Enter and space also work) =\r\n");
Matt Briggs 75:600cb3a9f126 130 mPc->printf("= 1: General information =\r\n");
Matt Briggs 75:600cb3a9f126 131 mPc->printf("= 2: Settings =\r\n");
Matt Briggs 75:600cb3a9f126 132 mPc->printf("= 3: Statistics =\r\n");
Matt Briggs 75:600cb3a9f126 133 mPc->printf("= 4: Error log =\r\n");
Matt Briggs 75:600cb3a9f126 134 mPc->printf("= 5: Live log =\r\n");
Matt Briggs 75:600cb3a9f126 135 mPc->printf("= 6: Enter serial bridge mode =\r\n");
Matt Briggs 75:600cb3a9f126 136 mPc->printf("= 7: Enter programming mode =\r\n");
Matt Briggs 75:600cb3a9f126 137 mPc->printf("= <ctrl>-q: Exit terminal =\r\n");
Matt Briggs 75:600cb3a9f126 138 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 139 }
Matt Briggs 75:600cb3a9f126 140
Matt Briggs 75:600cb3a9f126 141 void SerialTermMgr::inputGenInfo (char in) {
Matt Briggs 75:600cb3a9f126 142 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 143 return;
Matt Briggs 75:600cb3a9f126 144 }
Matt Briggs 75:600cb3a9f126 145 switch (in) {
Matt Briggs 75:600cb3a9f126 146 case 0x1B:
Matt Briggs 75:600cb3a9f126 147 mCurrScreen = mainScreenId;
Matt Briggs 75:600cb3a9f126 148 break;
Matt Briggs 75:600cb3a9f126 149 case 'r':
Matt Briggs 75:600cb3a9f126 150 mBbio->sampleUserSwitches();
Matt Briggs 75:600cb3a9f126 151 mPc->printf("User switches sampled.\r\n");
Matt Briggs 75:600cb3a9f126 152 break;
Matt Briggs 75:600cb3a9f126 153 default:
Matt Briggs 75:600cb3a9f126 154 mPc->printf("Invalid key.\r\n");
Matt Briggs 75:600cb3a9f126 155 }
Matt Briggs 75:600cb3a9f126 156 printScreen();
Matt Briggs 75:600cb3a9f126 157 }
Matt Briggs 75:600cb3a9f126 158
Matt Briggs 75:600cb3a9f126 159 void SerialTermMgr::printGenInfo()
Matt Briggs 75:600cb3a9f126 160 {
Matt Briggs 75:600cb3a9f126 161 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 162 return;
Matt Briggs 75:600cb3a9f126 163 }
Matt Briggs 75:600cb3a9f126 164 mPc->printf("\r\n\r\n");
Matt Briggs 75:600cb3a9f126 165 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 166 mPc->printf("= General Info (ESC to return to main menu) =\r\n", mFwVersion);
Matt Briggs 75:600cb3a9f126 167 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 168 mPc->printf("= Press r to sample user switch values =\r\n"); // FIXME
Matt Briggs 75:600cb3a9f126 169 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 170 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 171 mPc->printf("= Firmware version: v%0.2f =\r\n", mFwVersion);
Matt Briggs 75:600cb3a9f126 172 //TODO
Matt Briggs 75:600cb3a9f126 173 // mPc->printf("= Radio EUI: %s =\r\n", mts::Text::bin2hexString(dot->getDeviceId()).c_str());
Matt Briggs 75:600cb3a9f126 174 mPc->printf("= Contact closure: %s =\r\n", mBbio->isCCNO() ? "Normally open " :
Matt Briggs 75:600cb3a9f126 175 "Normally closed");
Matt Briggs 75:600cb3a9f126 176 mPc->printf("= WB Mode: %s =\r\n", mBbio->isTx() ? "Transmitter" :
Matt Briggs 75:600cb3a9f126 177 "Receiver ");
Matt Briggs 75:600cb3a9f126 178 mPc->printf("= Comm Mode: %s =\r\n", mBbio->isLoRaWANMode() ? "LoRaWAN " :
Matt Briggs 75:600cb3a9f126 179 "Peer-to-peer");
Matt Briggs 75:600cb3a9f126 180 mPc->printf("= Serial Mode: %s =\r\n", mBbio->isSerialEnabled() ? "Enabled " :
Matt Briggs 75:600cb3a9f126 181 "Disabled");
Matt Briggs 75:600cb3a9f126 182 if (mBbio->isTx()) {
Matt Briggs 75:600cb3a9f126 183 mPc->printf("= Currently no rotary switches apply for TX =\r\n");
Matt Briggs 75:600cb3a9f126 184 }
Matt Briggs 75:600cb3a9f126 185 else {
Matt Briggs 75:600cb3a9f126 186 mPc->printf("= Rotary 1 hold setting is %0.1f seconds =\r\n", HoldTimeSetting::rotVal2Sec(mBbio->rotarySwitch1()));
Matt Briggs 75:600cb3a9f126 187 mPc->printf("= Rotary 2 currently does not apply for RX =\r\n");
Matt Briggs 75:600cb3a9f126 188 }
Matt Briggs 75:600cb3a9f126 189 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 190 }
Matt Briggs 76:d1b20a259d8f 191
Matt Briggs 76:d1b20a259d8f 192 void SerialTermMgr::printEnterProgMode()
Matt Briggs 76:d1b20a259d8f 193 {
Matt Briggs 76:d1b20a259d8f 194 if (mPc == NULL) {
Matt Briggs 76:d1b20a259d8f 195 return;
Matt Briggs 76:d1b20a259d8f 196 }
Matt Briggs 76:d1b20a259d8f 197 mPc->printf("\r\n\r\n");
Matt Briggs 76:d1b20a259d8f 198 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 199 mPc->printf("= Serial Firmware Prog Mode (Esc to return) =\r\n");
Matt Briggs 76:d1b20a259d8f 200 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 201 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 202 mPc->printf("= To program firmware: \r\n");
Matt Briggs 76:d1b20a259d8f 203 mPc->printf("= 1: Have bin file ready =\r\n");
Matt Briggs 76:d1b20a259d8f 204 mPc->printf("= 2: Hit <ctrl>-d to enter XMODEM mode =\r\n");
Matt Briggs 76:d1b20a259d8f 205 mPc->printf("= 3: In terminal program (such as teraterm) =\r\n");
Matt Briggs 76:d1b20a259d8f 206 mPc->printf("= select transfer via XMODEM =\r\n");
Matt Briggs 76:d1b20a259d8f 207 mPc->printf("= 4: Programming may take up to a minute =\r\n");
Matt Briggs 76:d1b20a259d8f 208 mPc->printf("= 5: If successful terminal will print \"Success\" =\r\n");
Matt Briggs 76:d1b20a259d8f 209 mPc->printf("= 6: Wireless Bridge will then automatically =\r\n");
Matt Briggs 76:d1b20a259d8f 210 mPc->printf("= reboot with new firmware. =\r\n");
Matt Briggs 76:d1b20a259d8f 211 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 212 }
Matt Briggs 76:d1b20a259d8f 213
Matt Briggs 76:d1b20a259d8f 214 void SerialTermMgr::inputEnterProgMode (char in) {
Matt Briggs 76:d1b20a259d8f 215 if (mPc == NULL) {
Matt Briggs 76:d1b20a259d8f 216 return;
Matt Briggs 76:d1b20a259d8f 217 }
Matt Briggs 76:d1b20a259d8f 218 switch (in) {
Matt Briggs 76:d1b20a259d8f 219 case 0x1B:
Matt Briggs 76:d1b20a259d8f 220 mCurrScreen = mainScreenId;
Matt Briggs 76:d1b20a259d8f 221 break;
Matt Briggs 76:d1b20a259d8f 222 case 0x04:
Matt Briggs 76:d1b20a259d8f 223 xmodem2Flash();
Matt Briggs 76:d1b20a259d8f 224 break;
Matt Briggs 76:d1b20a259d8f 225 default:
Matt Briggs 76:d1b20a259d8f 226 mPc->printf("Invalid key.\r\n");
Matt Briggs 76:d1b20a259d8f 227 }
Matt Briggs 76:d1b20a259d8f 228 printScreen();
Matt Briggs 76:d1b20a259d8f 229 }
Matt Briggs 76:d1b20a259d8f 230
Matt Briggs 76:d1b20a259d8f 231 bool SerialTermMgr::xmodem2Flash ()
Matt Briggs 76:d1b20a259d8f 232 {
Matt Briggs 76:d1b20a259d8f 233 mPc->printf("Ready to receive file");
Matt Briggs 76:d1b20a259d8f 234 // TODO may need to buffer input
Matt Briggs 76:d1b20a259d8f 235 char packetBuf[132];
Matt Briggs 76:d1b20a259d8f 236 unsigned char pktIdx = 0;
Matt Briggs 76:d1b20a259d8f 237 time_t lastValidInput = 0;
Matt Briggs 76:d1b20a259d8f 238 while (1) {
Matt Briggs 76:d1b20a259d8f 239 if ((time(NULL)-lastValidInput) > XMODEM_TIMEOUT){
Matt Briggs 76:d1b20a259d8f 240 mPc->printf("%c", 0x15); // Send NAK
Matt Briggs 76:d1b20a259d8f 241 lastValidInput = time(NULL);
Matt Briggs 76:d1b20a259d8f 242 pc.printf("Total chars: %d\r\n", pktIdx);
Matt Briggs 76:d1b20a259d8f 243 pktIdx = 0;
Matt Briggs 76:d1b20a259d8f 244 }
Matt Briggs 76:d1b20a259d8f 245 if (mPc->readable()) {
Matt Briggs 76:d1b20a259d8f 246 mPc->gets(packetBuf, 132);
Matt Briggs 76:d1b20a259d8f 247 pc.printf("Got full packet.\r\n");
Matt Briggs 76:d1b20a259d8f 248 for (int i=0; i<132; i++) {
Matt Briggs 76:d1b20a259d8f 249 pc.printf("%02X", packetBuf[i]);
Matt Briggs 76:d1b20a259d8f 250 }
Matt Briggs 76:d1b20a259d8f 251 // if (pktIdx >= 132) {
Matt Briggs 76:d1b20a259d8f 252 // pc.printf("Got full packet.\r\n");
Matt Briggs 76:d1b20a259d8f 253 // for (int i=0; i<132; i++) {
Matt Briggs 76:d1b20a259d8f 254 // pc.printf("%02X", packetBuf[i]);
Matt Briggs 76:d1b20a259d8f 255 // }
Matt Briggs 76:d1b20a259d8f 256 // }
Matt Briggs 76:d1b20a259d8f 257 }
Matt Briggs 76:d1b20a259d8f 258 }
Matt Briggs 76:d1b20a259d8f 259 }