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:
mbriggs_vortex
Date:
Wed Nov 29 13:54:36 2017 -0700
Revision:
100:0882cf295f8e
Parent:
99:83b54c851187
Adding relaese bin to repo

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 77:176e3eb8f712 14 const char SOH = 0x01;
Matt Briggs 77:176e3eb8f712 15 const char EOT = 0x04;
Matt Briggs 77:176e3eb8f712 16 const char SUB = 0x1A;
Matt Briggs 76:d1b20a259d8f 17
Matt Briggs 77:176e3eb8f712 18 SerialTermMgr::SerialTermMgr(BaseboardIO *bbio, WinbondSPIFlash *flash, float fwVersion)
Matt Briggs 75:600cb3a9f126 19 {
Matt Briggs 75:600cb3a9f126 20 mPc = NULL;
Matt Briggs 75:600cb3a9f126 21 mFwVersion = fwVersion;
Matt Briggs 75:600cb3a9f126 22 mCurrScreen = mainScreenId;
Matt Briggs 75:600cb3a9f126 23 mBbio = bbio;
Matt Briggs 77:176e3eb8f712 24 mFlash = flash;
Matt Briggs 75:600cb3a9f126 25 }
Matt Briggs 75:600cb3a9f126 26 void SerialTermMgr::printScreen()
Matt Briggs 75:600cb3a9f126 27 {
Matt Briggs 75:600cb3a9f126 28 switch (mCurrScreen) {
Matt Briggs 75:600cb3a9f126 29 case mainScreenId:
Matt Briggs 75:600cb3a9f126 30 printMainScreen();
Matt Briggs 75:600cb3a9f126 31 break;
Matt Briggs 75:600cb3a9f126 32 case genInfoScreenId:
Matt Briggs 75:600cb3a9f126 33 printGenInfo();
Matt Briggs 75:600cb3a9f126 34 break;
Matt Briggs 75:600cb3a9f126 35 case settingsScreenId:
mbriggs_vortex 98:3609f600c2f5 36 printSettings();
mbriggs_vortex 98:3609f600c2f5 37 break;
Matt Briggs 75:600cb3a9f126 38 case statsScreenId:
Matt Briggs 75:600cb3a9f126 39 case errorLogScreenId:
Matt Briggs 75:600cb3a9f126 40 case liveLogScreenId:
Matt Briggs 75:600cb3a9f126 41 case enterSerialBridgeScreenId:
Matt Briggs 76:d1b20a259d8f 42 printMainScreen();
Matt Briggs 76:d1b20a259d8f 43 break;
Matt Briggs 75:600cb3a9f126 44 case enterProgModeScreenId:
Matt Briggs 76:d1b20a259d8f 45 printEnterProgMode();
Matt Briggs 75:600cb3a9f126 46 }
Matt Briggs 75:600cb3a9f126 47 }
Matt Briggs 75:600cb3a9f126 48 bool SerialTermMgr::input()
Matt Briggs 75:600cb3a9f126 49 {
Matt Briggs 75:600cb3a9f126 50 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 51 return true;
Matt Briggs 75:600cb3a9f126 52 }
Matt Briggs 75:600cb3a9f126 53 bool quit = false;
Matt Briggs 75:600cb3a9f126 54 char c = 10;
Matt Briggs 75:600cb3a9f126 55 if (mPc->readable()) {
Matt Briggs 75:600cb3a9f126 56 c = mPc->getc();
Matt Briggs 75:600cb3a9f126 57 }
Matt Briggs 75:600cb3a9f126 58 else {
Matt Briggs 75:600cb3a9f126 59 return false; // Do nothing if there is no input
Matt Briggs 75:600cb3a9f126 60 }
Matt Briggs 75:600cb3a9f126 61 switch (mCurrScreen) {
Matt Briggs 75:600cb3a9f126 62 case mainScreenId:
Matt Briggs 75:600cb3a9f126 63 quit = inputMainPage(c);
Matt Briggs 75:600cb3a9f126 64 break;
Matt Briggs 75:600cb3a9f126 65 case genInfoScreenId:
Matt Briggs 75:600cb3a9f126 66 inputGenInfo(c);
Matt Briggs 75:600cb3a9f126 67 break;
Matt Briggs 75:600cb3a9f126 68 case settingsScreenId:
mbriggs_vortex 98:3609f600c2f5 69 inputSettings(c);
mbriggs_vortex 98:3609f600c2f5 70 break;
Matt Briggs 75:600cb3a9f126 71 case statsScreenId:
Matt Briggs 75:600cb3a9f126 72 case errorLogScreenId:
Matt Briggs 75:600cb3a9f126 73 case liveLogScreenId:
Matt Briggs 75:600cb3a9f126 74 case enterSerialBridgeScreenId:
Matt Briggs 76:d1b20a259d8f 75 inputMainPage(c);
Matt Briggs 76:d1b20a259d8f 76 break;
Matt Briggs 75:600cb3a9f126 77 case enterProgModeScreenId:
Matt Briggs 76:d1b20a259d8f 78 inputEnterProgMode(c);
Matt Briggs 75:600cb3a9f126 79 }
Matt Briggs 75:600cb3a9f126 80 return quit;
Matt Briggs 75:600cb3a9f126 81 }
Matt Briggs 75:600cb3a9f126 82
Matt Briggs 75:600cb3a9f126 83 // private methods
Matt Briggs 75:600cb3a9f126 84 bool SerialTermMgr::inputMainPage (char in) {
Matt Briggs 75:600cb3a9f126 85 bool quit = false;
Matt Briggs 75:600cb3a9f126 86 switch (in) {
Matt Briggs 75:600cb3a9f126 87 case '1':
Matt Briggs 75:600cb3a9f126 88 mCurrScreen = genInfoScreenId;
Matt Briggs 75:600cb3a9f126 89 break;
Matt Briggs 75:600cb3a9f126 90 case '2':
Matt Briggs 76:d1b20a259d8f 91 mCurrScreen = enterProgModeScreenId;
Matt Briggs 75:600cb3a9f126 92 break;
mbriggs_vortex 92:1f86edb14cbe 93 case '3':
mbriggs_vortex 99:83b54c851187 94 seedSaveSettings();
mbriggs_vortex 98:3609f600c2f5 95 mCurrScreen = settingsScreenId;
mbriggs_vortex 92:1f86edb14cbe 96 break;
mbriggs_vortex 91:8196900df6fe 97 // Future
mbriggs_vortex 91:8196900df6fe 98 // case '4':
mbriggs_vortex 91:8196900df6fe 99 // mPc->printf("\r\nNot implemented yet.\r\n");
mbriggs_vortex 91:8196900df6fe 100 //// mCurrScreen = statsScreenId;
mbriggs_vortex 91:8196900df6fe 101 // break;
mbriggs_vortex 91:8196900df6fe 102 // case '5':
mbriggs_vortex 91:8196900df6fe 103 // mPc->printf("\r\nNot implemented yet.\r\n");
mbriggs_vortex 91:8196900df6fe 104 //// mCurrScreen = errorLogScreenId;
mbriggs_vortex 91:8196900df6fe 105 // break;
mbriggs_vortex 91:8196900df6fe 106 // case '6':
mbriggs_vortex 91:8196900df6fe 107 // mPc->printf("\r\nNot implemented yet.\r\n");
mbriggs_vortex 91:8196900df6fe 108 //// mCurrScreen = liveLogScreenId;
mbriggs_vortex 91:8196900df6fe 109 // break;
mbriggs_vortex 91:8196900df6fe 110 // case '7':
mbriggs_vortex 91:8196900df6fe 111 // mPc->printf("\r\nNot implemented yet.\r\n");
mbriggs_vortex 91:8196900df6fe 112 //// mCurrScreen = enterSerialBridgeScreenId;
mbriggs_vortex 91:8196900df6fe 113 // break;
Matt Briggs 75:600cb3a9f126 114 case 0x11: // ctrl-q
Matt Briggs 75:600cb3a9f126 115 quit=true;
Matt Briggs 75:600cb3a9f126 116 break;
Matt Briggs 75:600cb3a9f126 117 default:
Matt Briggs 75:600cb3a9f126 118 mCurrScreen = mainScreenId;
Matt Briggs 75:600cb3a9f126 119 }
Matt Briggs 75:600cb3a9f126 120 if (!quit) {
Matt Briggs 75:600cb3a9f126 121 printScreen();
Matt Briggs 75:600cb3a9f126 122 }
Matt Briggs 75:600cb3a9f126 123 return quit;
Matt Briggs 75:600cb3a9f126 124 }
Matt Briggs 75:600cb3a9f126 125
Matt Briggs 75:600cb3a9f126 126 void SerialTermMgr::printMainScreen()
Matt Briggs 75:600cb3a9f126 127 {
Matt Briggs 75:600cb3a9f126 128 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 129 return;
Matt Briggs 75:600cb3a9f126 130 }
Matt Briggs 75:600cb3a9f126 131 mPc->printf("\r\n\r\n");
Matt Briggs 75:600cb3a9f126 132 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 133 mPc->printf("= Wireless Bridge Terminal (Firmware: v%0.2f) =\r\n", mFwVersion);
Matt Briggs 75:600cb3a9f126 134 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 135 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 136 mPc->printf("= Selection Options =\r\n");
Matt Briggs 75:600cb3a9f126 137 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 138 mPc->printf("= 0: Refresh (Enter and space also work) =\r\n");
Matt Briggs 75:600cb3a9f126 139 mPc->printf("= 1: General information =\r\n");
mbriggs_vortex 91:8196900df6fe 140 mPc->printf("= 2: Enter programming mode =\r\n");
mbriggs_vortex 92:1f86edb14cbe 141 mPc->printf("= 3: Settings =\r\n");
mbriggs_vortex 91:8196900df6fe 142 // Future
mbriggs_vortex 91:8196900df6fe 143 // mPc->printf("= 4: Statistics =\r\n");
mbriggs_vortex 91:8196900df6fe 144 // mPc->printf("= 5: Error log =\r\n");
mbriggs_vortex 91:8196900df6fe 145 // mPc->printf("= 6: Live log =\r\n");
mbriggs_vortex 91:8196900df6fe 146 // mPc->printf("= 7: Enter serial bridge mode =\r\n");
Matt Briggs 75:600cb3a9f126 147 mPc->printf("= <ctrl>-q: Exit terminal =\r\n");
Matt Briggs 75:600cb3a9f126 148 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 149 }
Matt Briggs 75:600cb3a9f126 150
Matt Briggs 75:600cb3a9f126 151 void SerialTermMgr::inputGenInfo (char in) {
Matt Briggs 75:600cb3a9f126 152 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 153 return;
Matt Briggs 75:600cb3a9f126 154 }
Matt Briggs 75:600cb3a9f126 155 switch (in) {
mbriggs_vortex 91:8196900df6fe 156 case 0x1B: // esc
Matt Briggs 75:600cb3a9f126 157 mCurrScreen = mainScreenId;
Matt Briggs 75:600cb3a9f126 158 break;
Matt Briggs 75:600cb3a9f126 159 case 'r':
Matt Briggs 75:600cb3a9f126 160 mBbio->sampleUserSwitches();
Matt Briggs 75:600cb3a9f126 161 mPc->printf("User switches sampled.\r\n");
Matt Briggs 75:600cb3a9f126 162 break;
Matt Briggs 75:600cb3a9f126 163 default:
Matt Briggs 75:600cb3a9f126 164 mPc->printf("Invalid key.\r\n");
Matt Briggs 75:600cb3a9f126 165 }
Matt Briggs 75:600cb3a9f126 166 printScreen();
Matt Briggs 75:600cb3a9f126 167 }
Matt Briggs 75:600cb3a9f126 168
Matt Briggs 75:600cb3a9f126 169 void SerialTermMgr::printGenInfo()
Matt Briggs 75:600cb3a9f126 170 {
Matt Briggs 75:600cb3a9f126 171 if (mPc == NULL) {
Matt Briggs 75:600cb3a9f126 172 return;
Matt Briggs 75:600cb3a9f126 173 }
Matt Briggs 75:600cb3a9f126 174 mPc->printf("\r\n\r\n");
Matt Briggs 75:600cb3a9f126 175 mPc->printf("===============================================\r\n");
mbriggs_vortex 99:83b54c851187 176 mPc->printf("= General Info (ESC to return to main menu) =\r\n");
Matt Briggs 75:600cb3a9f126 177 mPc->printf("===============================================\r\n");
mbriggs_vortex 99:83b54c851187 178 mPc->printf("= Press r to sample user switch values =\r\n");
Matt Briggs 75:600cb3a9f126 179 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 180 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 181 mPc->printf("= Firmware version: v%0.2f =\r\n", mFwVersion);
Matt Briggs 75:600cb3a9f126 182 //TODO
Matt Briggs 75:600cb3a9f126 183 // mPc->printf("= Radio EUI: %s =\r\n", mts::Text::bin2hexString(dot->getDeviceId()).c_str());
Matt Briggs 75:600cb3a9f126 184 mPc->printf("= Contact closure: %s =\r\n", mBbio->isCCNO() ? "Normally open " :
Matt Briggs 75:600cb3a9f126 185 "Normally closed");
Matt Briggs 75:600cb3a9f126 186 mPc->printf("= WB Mode: %s =\r\n", mBbio->isTx() ? "Transmitter" :
Matt Briggs 75:600cb3a9f126 187 "Receiver ");
mbriggs_vortex 91:8196900df6fe 188 // mPc->printf("= Comm Mode: %s =\r\n", mBbio->isLoRaWANMode() ? "LoRaWAN " :
mbriggs_vortex 91:8196900df6fe 189 // "Peer-to-peer");
mbriggs_vortex 91:8196900df6fe 190 // mPc->printf("= Serial Mode: %s =\r\n", mBbio->isSerialEnabled() ? "Enabled " :
mbriggs_vortex 91:8196900df6fe 191 // "Disabled");
Matt Briggs 75:600cb3a9f126 192 if (mBbio->isTx()) {
Matt Briggs 75:600cb3a9f126 193 mPc->printf("= Currently no rotary switches apply for TX =\r\n");
Matt Briggs 75:600cb3a9f126 194 }
Matt Briggs 75:600cb3a9f126 195 else {
mbriggs_vortex 99:83b54c851187 196 mPc->printf("= Rotary 1 hold setting is %05.1f seconds =\r\n",
mbriggs_vortex 99:83b54c851187 197 HoldTimeSetting::rotVal2Sec(mBbio->rotarySwitch1()));
Matt Briggs 75:600cb3a9f126 198 mPc->printf("= Rotary 2 currently does not apply for RX =\r\n");
Matt Briggs 75:600cb3a9f126 199 }
Matt Briggs 75:600cb3a9f126 200 mPc->printf("===============================================\r\n");
Matt Briggs 75:600cb3a9f126 201 }
Matt Briggs 76:d1b20a259d8f 202
mbriggs_vortex 98:3609f600c2f5 203 void SerialTermMgr::inputSettings (char in) {
mbriggs_vortex 98:3609f600c2f5 204 if (mPc == NULL) {
mbriggs_vortex 98:3609f600c2f5 205 return;
mbriggs_vortex 98:3609f600c2f5 206 }
mbriggs_vortex 98:3609f600c2f5 207 switch (in) {
mbriggs_vortex 98:3609f600c2f5 208 case 0x1B: // esc
mbriggs_vortex 98:3609f600c2f5 209 mCurrScreen = mainScreenId;
mbriggs_vortex 98:3609f600c2f5 210 break;
mbriggs_vortex 98:3609f600c2f5 211 case 0x13: // ctrl-s
mbriggs_vortex 98:3609f600c2f5 212 applySaveSettings();
mbriggs_vortex 98:3609f600c2f5 213 mPc->printf("Settings saved \r\n");
mbriggs_vortex 98:3609f600c2f5 214 mCurrScreen = mainScreenId;
mbriggs_vortex 98:3609f600c2f5 215 break;
mbriggs_vortex 98:3609f600c2f5 216 case 'r':
mbriggs_vortex 98:3609f600c2f5 217 mBbio->sampleUserSwitches();
mbriggs_vortex 98:3609f600c2f5 218 mPc->printf("User switches sampled.\r\n");
mbriggs_vortex 98:3609f600c2f5 219 break;
mbriggs_vortex 98:3609f600c2f5 220 case '1':
mbriggs_vortex 98:3609f600c2f5 221 mSaveIsCCNO = !mSaveIsCCNO;
mbriggs_vortex 99:83b54c851187 222 break;
mbriggs_vortex 98:3609f600c2f5 223 case '2':
mbriggs_vortex 98:3609f600c2f5 224 mSaveIsTx = !mSaveIsTx;
mbriggs_vortex 99:83b54c851187 225 break;
mbriggs_vortex 98:3609f600c2f5 226 case '3':
mbriggs_vortex 99:83b54c851187 227 if (!mSaveIsTx) {
mbriggs_vortex 99:83b54c851187 228 mSaveRot1 = (++mSaveRot1) % 10;
mbriggs_vortex 99:83b54c851187 229 }
mbriggs_vortex 99:83b54c851187 230 break;
mbriggs_vortex 98:3609f600c2f5 231 default:
mbriggs_vortex 98:3609f600c2f5 232 mPc->printf("Invalid key.\r\n");
mbriggs_vortex 98:3609f600c2f5 233 }
mbriggs_vortex 98:3609f600c2f5 234 printScreen();
mbriggs_vortex 98:3609f600c2f5 235 }
mbriggs_vortex 98:3609f600c2f5 236
mbriggs_vortex 98:3609f600c2f5 237 void SerialTermMgr::printSettings()
mbriggs_vortex 98:3609f600c2f5 238 {
mbriggs_vortex 98:3609f600c2f5 239 if (mPc == NULL) {
mbriggs_vortex 98:3609f600c2f5 240 return;
mbriggs_vortex 98:3609f600c2f5 241 }
mbriggs_vortex 98:3609f600c2f5 242 mPc->printf("\r\n\r\n");
mbriggs_vortex 98:3609f600c2f5 243 mPc->printf("===============================================\r\n");
mbriggs_vortex 99:83b54c851187 244 mPc->printf("= Settings (ESC to return to main menu) =\r\n");
mbriggs_vortex 98:3609f600c2f5 245 mPc->printf("===============================================\r\n");
mbriggs_vortex 98:3609f600c2f5 246 mPc->printf("= Press r to sample user switch values =\r\n");
mbriggs_vortex 99:83b54c851187 247 mPc->printf("= Press <ctrl>-s to save values =\r\n");
mbriggs_vortex 98:3609f600c2f5 248 mPc->printf("===============================================\r\n");
mbriggs_vortex 98:3609f600c2f5 249 mPc->printf("===============================================\r\n");
mbriggs_vortex 99:83b54c851187 250 mPc->printf("= Setting [Mod Key]: curr value, save value =\r\n");
mbriggs_vortex 99:83b54c851187 251 mPc->printf("= Contact closure [1]: %s, %s =\r\n",
mbriggs_vortex 98:3609f600c2f5 252 mBbio->isCCNO() ? "NO" : "NC",
mbriggs_vortex 98:3609f600c2f5 253 mSaveIsCCNO ? "NO" : "NC");
mbriggs_vortex 99:83b54c851187 254 mPc->printf("= WB Mode [2]: %s, %s =\r\n",
mbriggs_vortex 99:83b54c851187 255 mBbio->isTx() ? "TX" : "RX",
mbriggs_vortex 99:83b54c851187 256 mSaveIsTx ? "TX" : "RX");
mbriggs_vortex 98:3609f600c2f5 257 if (mSaveIsTx) {
mbriggs_vortex 98:3609f600c2f5 258 mPc->printf("= Currently no rotary switches apply for TX =\r\n");
mbriggs_vortex 98:3609f600c2f5 259 }
mbriggs_vortex 98:3609f600c2f5 260 else {
mbriggs_vortex 99:83b54c851187 261 mPc->printf("= Rotary 1 hold setting [3]: %05.1fs, %05.1fs =\r\n",
mbriggs_vortex 98:3609f600c2f5 262 HoldTimeSetting::rotVal2Sec(mBbio->rotarySwitch1()),
mbriggs_vortex 98:3609f600c2f5 263 HoldTimeSetting::rotVal2Sec(mSaveRot1));
mbriggs_vortex 98:3609f600c2f5 264 mPc->printf("= Rotary 2 currently does not apply for RX =\r\n");
mbriggs_vortex 98:3609f600c2f5 265 }
mbriggs_vortex 98:3609f600c2f5 266 mPc->printf("===============================================\r\n");
mbriggs_vortex 98:3609f600c2f5 267 }
mbriggs_vortex 98:3609f600c2f5 268
mbriggs_vortex 98:3609f600c2f5 269 void SerialTermMgr::seedSaveSettings()
mbriggs_vortex 98:3609f600c2f5 270 {
mbriggs_vortex 98:3609f600c2f5 271 mSaveIsCCNO = mBbio->isCCNO();
mbriggs_vortex 98:3609f600c2f5 272 mSaveIsTx = mBbio->isTx();
mbriggs_vortex 98:3609f600c2f5 273 mSaveRot1 = mBbio->rotarySwitch1();
mbriggs_vortex 98:3609f600c2f5 274 }
mbriggs_vortex 98:3609f600c2f5 275
mbriggs_vortex 98:3609f600c2f5 276 void SerialTermMgr::applySaveSettings()
mbriggs_vortex 98:3609f600c2f5 277 {
mbriggs_vortex 98:3609f600c2f5 278 mBbio->setIsCCNO(mSaveIsCCNO);
mbriggs_vortex 98:3609f600c2f5 279 mBbio->setIsTx(mSaveIsTx);
mbriggs_vortex 98:3609f600c2f5 280 mBbio->setRotarySwitch1(mSaveRot1);
mbriggs_vortex 98:3609f600c2f5 281 }
mbriggs_vortex 98:3609f600c2f5 282
Matt Briggs 76:d1b20a259d8f 283 void SerialTermMgr::printEnterProgMode()
Matt Briggs 76:d1b20a259d8f 284 {
Matt Briggs 76:d1b20a259d8f 285 if (mPc == NULL) {
Matt Briggs 76:d1b20a259d8f 286 return;
Matt Briggs 76:d1b20a259d8f 287 }
Matt Briggs 76:d1b20a259d8f 288 mPc->printf("\r\n\r\n");
Matt Briggs 76:d1b20a259d8f 289 mPc->printf("===============================================\r\n");
mbriggs_vortex 91:8196900df6fe 290 mPc->printf("= Serial Firmware Prog Mode (Esc to return) =\r\n");
Matt Briggs 76:d1b20a259d8f 291 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 292 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 293 mPc->printf("= To program firmware: \r\n");
Matt Briggs 76:d1b20a259d8f 294 mPc->printf("= 1: Have bin file ready =\r\n");
Matt Briggs 76:d1b20a259d8f 295 mPc->printf("= 2: Hit <ctrl>-d to enter XMODEM mode =\r\n");
Matt Briggs 76:d1b20a259d8f 296 mPc->printf("= 3: In terminal program (such as teraterm) =\r\n");
Matt Briggs 76:d1b20a259d8f 297 mPc->printf("= select transfer via XMODEM =\r\n");
Matt Briggs 76:d1b20a259d8f 298 mPc->printf("= 4: Programming may take up to a minute =\r\n");
mbriggs_vortex 91:8196900df6fe 299 mPc->printf("= 5: If successful terminal prints \"Success\" =\r\n");
Matt Briggs 76:d1b20a259d8f 300 mPc->printf("= 6: Wireless Bridge will then automatically =\r\n");
Matt Briggs 76:d1b20a259d8f 301 mPc->printf("= reboot with new firmware. =\r\n");
Matt Briggs 76:d1b20a259d8f 302 mPc->printf("===============================================\r\n");
Matt Briggs 76:d1b20a259d8f 303 }
Matt Briggs 76:d1b20a259d8f 304
Matt Briggs 76:d1b20a259d8f 305 void SerialTermMgr::inputEnterProgMode (char in) {
Matt Briggs 76:d1b20a259d8f 306 if (mPc == NULL) {
Matt Briggs 76:d1b20a259d8f 307 return;
Matt Briggs 76:d1b20a259d8f 308 }
Matt Briggs 76:d1b20a259d8f 309 switch (in) {
mbriggs_vortex 91:8196900df6fe 310 case 0x1B: // esc:
Matt Briggs 76:d1b20a259d8f 311 mCurrScreen = mainScreenId;
Matt Briggs 76:d1b20a259d8f 312 break;
Matt Briggs 76:d1b20a259d8f 313 case 0x04:
Matt Briggs 76:d1b20a259d8f 314 xmodem2Flash();
Matt Briggs 76:d1b20a259d8f 315 break;
Matt Briggs 76:d1b20a259d8f 316 default:
Matt Briggs 76:d1b20a259d8f 317 mPc->printf("Invalid key.\r\n");
Matt Briggs 76:d1b20a259d8f 318 }
Matt Briggs 76:d1b20a259d8f 319 printScreen();
Matt Briggs 76:d1b20a259d8f 320 }
Matt Briggs 76:d1b20a259d8f 321
Matt Briggs 76:d1b20a259d8f 322 bool SerialTermMgr::xmodem2Flash ()
Matt Briggs 76:d1b20a259d8f 323 {
Matt Briggs 77:176e3eb8f712 324 mPc->printf("Ready to receive file\r\n");
Matt Briggs 77:176e3eb8f712 325 mFlash->releaseFromPowerDown();
Matt Briggs 77:176e3eb8f712 326 mFlash->chipErase();
Matt Briggs 76:d1b20a259d8f 327 char packetBuf[132];
Matt Briggs 77:176e3eb8f712 328 uint16_t packetNum = 1;
Matt Briggs 77:176e3eb8f712 329 uint8_t csum = 0;
Matt Briggs 76:d1b20a259d8f 330 unsigned char pktIdx = 0;
Matt Briggs 76:d1b20a259d8f 331 time_t lastValidInput = 0;
mbriggs_vortex 78:43f074baac34 332 unsigned char nTimeouts = 0;
Matt Briggs 76:d1b20a259d8f 333 while (1) {
Matt Briggs 77:176e3eb8f712 334 // Send a NAK if a packet is not received within timeout period
Matt Briggs 76:d1b20a259d8f 335 if ((time(NULL)-lastValidInput) > XMODEM_TIMEOUT){
Matt Briggs 76:d1b20a259d8f 336 pc.printf("Total chars: %d\r\n", pktIdx);
Matt Briggs 76:d1b20a259d8f 337 pktIdx = 0;
Matt Briggs 77:176e3eb8f712 338 mPc->printf("%c", NAK); // Send NAK
Matt Briggs 77:176e3eb8f712 339 lastValidInput = time(NULL);
mbriggs_vortex 78:43f074baac34 340 nTimeouts++;
mbriggs_vortex 78:43f074baac34 341 if (nTimeouts >= MAX_TIMEOUTS) {
mbriggs_vortex 78:43f074baac34 342 mPc->printf("Programming timed out.\r\n");
mbriggs_vortex 78:43f074baac34 343 pc.printf("Programming timed out.\r\n");
mbriggs_vortex 78:43f074baac34 344 break;
mbriggs_vortex 78:43f074baac34 345 }
Matt Briggs 76:d1b20a259d8f 346 }
Matt Briggs 76:d1b20a259d8f 347 if (mPc->readable()) {
Matt Briggs 77:176e3eb8f712 348 packetBuf[pktIdx++] = mPc->getc();
Matt Briggs 77:176e3eb8f712 349 if (pktIdx == 1 && packetBuf[0] == EOT) {
Matt Briggs 77:176e3eb8f712 350 lastValidInput = time(NULL);
Matt Briggs 77:176e3eb8f712 351 mPc->printf("%c", ACK); // Last ACK
mbriggs_vortex 92:1f86edb14cbe 352
mbriggs_vortex 92:1f86edb14cbe 353 // Check for update string in last packet
mbriggs_vortex 92:1f86edb14cbe 354 bool foundKey;
mbriggs_vortex 94:8028c07f71fa 355 for (int packetIdx=3;packetIdx<sizeof(packetBuf)-sizeof(VORTEX_UPDATE_KEY);packetIdx++) {
mbriggs_vortex 92:1f86edb14cbe 356 foundKey = true;
mbriggs_vortex 93:f3adc409c54e 357 for (int i=0;i<sizeof(VORTEX_UPDATE_KEY)-1;i++) {
mbriggs_vortex 92:1f86edb14cbe 358 if (packetBuf[packetIdx+i] != VORTEX_UPDATE_KEY[i]) {
mbriggs_vortex 92:1f86edb14cbe 359 foundKey = false;
mbriggs_vortex 92:1f86edb14cbe 360 break;
mbriggs_vortex 92:1f86edb14cbe 361 }
mbriggs_vortex 92:1f86edb14cbe 362 }
mbriggs_vortex 92:1f86edb14cbe 363 if (foundKey) {
mbriggs_vortex 92:1f86edb14cbe 364 break;
mbriggs_vortex 92:1f86edb14cbe 365 }
mbriggs_vortex 92:1f86edb14cbe 366 }
mbriggs_vortex 92:1f86edb14cbe 367 if (foundKey) {
mbriggs_vortex 92:1f86edb14cbe 368 mPc->printf("Success.\r\n");
mbriggs_vortex 92:1f86edb14cbe 369 pc.printf("Success on xmodem. Reset in progress.\r\n");
mbriggs_vortex 92:1f86edb14cbe 370 writeBootloaderCtrlPage(packetNum*XMODEM_PACKET_SIZE);
mbriggs_vortex 92:1f86edb14cbe 371 }
mbriggs_vortex 92:1f86edb14cbe 372 else {
mbriggs_vortex 92:1f86edb14cbe 373 mPc->printf("Failed update key validation.\r\n");
mbriggs_vortex 92:1f86edb14cbe 374 pc.printf("Failed update key validation\r\n");
mbriggs_vortex 92:1f86edb14cbe 375 }
mbriggs_vortex 78:43f074baac34 376
Matt Briggs 77:176e3eb8f712 377 wait(0.01);
mbriggs_vortex 78:43f074baac34 378 mFlash->powerDown();
mbriggs_vortex 92:1f86edb14cbe 379 if (foundKey) {
mbriggs_vortex 92:1f86edb14cbe 380 NVIC_SystemReset();
mbriggs_vortex 92:1f86edb14cbe 381 }
Matt Briggs 77:176e3eb8f712 382 break;
Matt Briggs 76:d1b20a259d8f 383 }
Matt Briggs 77:176e3eb8f712 384 else if (pktIdx >= 132) {
Matt Briggs 77:176e3eb8f712 385 lastValidInput = time(NULL);
mbriggs_vortex 78:43f074baac34 386 nTimeouts = 0; // Clear n timeouts with new packet
Matt Briggs 77:176e3eb8f712 387 csum = 0;
Matt Briggs 77:176e3eb8f712 388 for (int i=3; i<131; i++) {
Matt Briggs 77:176e3eb8f712 389 csum += packetBuf[i];
Matt Briggs 77:176e3eb8f712 390 }
Matt Briggs 77:176e3eb8f712 391 pktIdx = 0;
Matt Briggs 77:176e3eb8f712 392 if ((csum == packetBuf[131]) && (packetBuf[0] == SOH) &&
mbriggs_vortex 92:1f86edb14cbe 393 (packetBuf[1] == ((uint8_t)packetNum)) && (((uint8_t)~packetBuf[2]) == ((uint8_t)packetNum))) {
mbriggs_vortex 92:1f86edb14cbe 394 mFlash->writeStream(FLASH_BIN_OFFSET+(packetNum-1)*XMODEM_PACKET_SIZE, packetBuf+3,
mbriggs_vortex 92:1f86edb14cbe 395 XMODEM_PACKET_SIZE);
Matt Briggs 77:176e3eb8f712 396 mPc->printf("%c", ACK);
Matt Briggs 77:176e3eb8f712 397 packetNum++;
Matt Briggs 77:176e3eb8f712 398 }
Matt Briggs 77:176e3eb8f712 399 else {
Matt Briggs 77:176e3eb8f712 400 mPc->printf("%c", NAK);
Matt Briggs 77:176e3eb8f712 401 }
Matt Briggs 77:176e3eb8f712 402 }
Matt Briggs 76:d1b20a259d8f 403 }
Matt Briggs 76:d1b20a259d8f 404 }
Matt Briggs 77:176e3eb8f712 405 mCurrScreen = mainScreenId; // Just return to main screen for now
Matt Briggs 77:176e3eb8f712 406 mFlash->powerDown();
Matt Briggs 77:176e3eb8f712 407
Matt Briggs 77:176e3eb8f712 408 return true;
Matt Briggs 76:d1b20a259d8f 409 }
mbriggs_vortex 78:43f074baac34 410
mbriggs_vortex 78:43f074baac34 411 void SerialTermMgr::writeBootloaderCtrlPage(uint32_t nBytes)
mbriggs_vortex 78:43f074baac34 412 {
mbriggs_vortex 78:43f074baac34 413 // This should always be less than 256 bytes
mbriggs_vortex 91:8196900df6fe 414
mbriggs_vortex 91:8196900df6fe 415 // Zero updates the bootloader version so that is cleared until the bootloader adds its back
mbriggs_vortex 91:8196900df6fe 416 const uint32_t zeroBootloaderVersion = 0;
mbriggs_vortex 91:8196900df6fe 417 const unsigned int ctrlSize = sizeof(NEW_CODE)+sizeof(nBytes)+sizeof(zeroBootloaderVersion);
mbriggs_vortex 78:43f074baac34 418 char buf[ctrlSize];
mbriggs_vortex 78:43f074baac34 419 std::memcpy(buf, NEW_CODE, sizeof(NEW_CODE));
mbriggs_vortex 78:43f074baac34 420 std::memcpy(buf+sizeof(NEW_CODE), &nBytes, sizeof(nBytes));
mbriggs_vortex 91:8196900df6fe 421 std::memcpy(buf+sizeof(NEW_CODE)+sizeof(nBytes),
mbriggs_vortex 91:8196900df6fe 422 &zeroBootloaderVersion, sizeof(zeroBootloaderVersion));
mbriggs_vortex 91:8196900df6fe 423 // TODO add reprogram counter or other functions
mbriggs_vortex 78:43f074baac34 424
mbriggs_vortex 78:43f074baac34 425 // Copy to first page of flash
mbriggs_vortex 78:43f074baac34 426 mFlash->writeStream(0, buf, sizeof(buf));
mbriggs_vortex 78:43f074baac34 427 }