![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Fork to see if I can get working
Dependencies: BufferedSerial OneWire WinbondSPIFlash libxDot-dev-mbed5-deprecated
Fork of xDotBridge_update_test20180823 by
xDotBridge/src/SerialTermMgr.cpp@100:0882cf295f8e, 2017-11-29 (annotated)
- 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?
User | Revision | Line number | New 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 | } |