Fork to see if I can get working
Dependencies: BufferedSerial OneWire WinbondSPIFlash libxDot-dev-mbed5-deprecated
Fork of xDotBridge_update_test20180823 by
Revision 76:d1b20a259d8f, committed 2017-05-16
- Comitter:
- Matt Briggs
- Date:
- Tue May 16 15:15:58 2017 -0600
- Parent:
- 75:600cb3a9f126
- Child:
- 77:176e3eb8f712
- Commit message:
- Quick commit before lib add.
Changed in this revision
--- a/xDotBridge/inc/SerialTermMgr.h Wed May 10 13:54:25 2017 -0600
+++ b/xDotBridge/inc/SerialTermMgr.h Tue May 16 15:15:58 2017 -0600
@@ -11,8 +11,12 @@
#include "mbed.h"
#include "BaseboardIO.h"
+const uint32_t TERM_BAUD = 115200;
const uint8_t TERM_TIMEOUT = 30; // In seconds
+const float XMODEM_TIMEOUT = 10.0;
+const uint8_t FLASH_BIN_OFFSET = 0x20; // Skip first 32 bytes
+
enum ScreenId {
mainScreenId,
genInfoScreenId,
@@ -37,6 +41,9 @@
void printMainScreen();
void inputGenInfo (char in);
void printGenInfo();
+ void inputEnterProgMode (char in);
+ void printEnterProgMode();
+ bool xmodem2Flash();
public:
SerialTermMgr(BaseboardIO *bbio, float fwVersion);
void regSerial (Serial *pc) {
--- a/xDotBridge/src/SerialTermMgr.cpp Wed May 10 13:54:25 2017 -0600
+++ b/xDotBridge/src/SerialTermMgr.cpp Tue May 16 15:15:58 2017 -0600
@@ -8,6 +8,10 @@
#include "SerialTermMgr.h"
#include "UserInterface.h"
+extern Serial pc;
+const char ACK = 0x06;
+const char NAK = 0x15;
+
SerialTermMgr::SerialTermMgr(BaseboardIO *bbio, float fwVersion)
{
mPc = NULL;
@@ -29,8 +33,10 @@
case errorLogScreenId:
case liveLogScreenId:
case enterSerialBridgeScreenId:
+ printMainScreen();
+ break;
case enterProgModeScreenId:
- printMainScreen();
+ printEnterProgMode();
}
}
bool SerialTermMgr::input()
@@ -58,8 +64,10 @@
case errorLogScreenId:
case liveLogScreenId:
case enterSerialBridgeScreenId:
+ inputMainPage(c);
+ break;
case enterProgModeScreenId:
- inputMainPage(c);
+ inputEnterProgMode(c);
}
return quit;
}
@@ -92,8 +100,7 @@
// mCurrScreen = enterSerialBridgeScreenId;
break;
case '7':
- mPc->printf("\r\nNot implemented yet.\r\n");
-// mCurrScreen = enterProgModeScreenId;
+ mCurrScreen = enterProgModeScreenId;
break;
case 0x11: // ctrl-q
quit=true;
@@ -181,3 +188,72 @@
}
mPc->printf("===============================================\r\n");
}
+
+void SerialTermMgr::printEnterProgMode()
+{
+ if (mPc == NULL) {
+ return;
+ }
+ mPc->printf("\r\n\r\n");
+ mPc->printf("===============================================\r\n");
+ mPc->printf("= Serial Firmware Prog Mode (Esc to return) =\r\n");
+ mPc->printf("===============================================\r\n");
+ mPc->printf("===============================================\r\n");
+ mPc->printf("= To program firmware: \r\n");
+ mPc->printf("= 1: Have bin file ready =\r\n");
+ mPc->printf("= 2: Hit <ctrl>-d to enter XMODEM mode =\r\n");
+ mPc->printf("= 3: In terminal program (such as teraterm) =\r\n");
+ mPc->printf("= select transfer via XMODEM =\r\n");
+ mPc->printf("= 4: Programming may take up to a minute =\r\n");
+ mPc->printf("= 5: If successful terminal will print \"Success\" =\r\n");
+ mPc->printf("= 6: Wireless Bridge will then automatically =\r\n");
+ mPc->printf("= reboot with new firmware. =\r\n");
+ mPc->printf("===============================================\r\n");
+}
+
+void SerialTermMgr::inputEnterProgMode (char in) {
+ if (mPc == NULL) {
+ return;
+ }
+ switch (in) {
+ case 0x1B:
+ mCurrScreen = mainScreenId;
+ break;
+ case 0x04:
+ xmodem2Flash();
+ break;
+ default:
+ mPc->printf("Invalid key.\r\n");
+ }
+ printScreen();
+}
+
+bool SerialTermMgr::xmodem2Flash ()
+{
+ mPc->printf("Ready to receive file");
+ // TODO may need to buffer input
+ char packetBuf[132];
+ unsigned char pktIdx = 0;
+ time_t lastValidInput = 0;
+ while (1) {
+ if ((time(NULL)-lastValidInput) > XMODEM_TIMEOUT){
+ mPc->printf("%c", 0x15); // Send NAK
+ lastValidInput = time(NULL);
+ pc.printf("Total chars: %d\r\n", pktIdx);
+ pktIdx = 0;
+ }
+ if (mPc->readable()) {
+ mPc->gets(packetBuf, 132);
+ pc.printf("Got full packet.\r\n");
+ for (int i=0; i<132; i++) {
+ pc.printf("%02X", packetBuf[i]);
+ }
+// if (pktIdx >= 132) {
+// pc.printf("Got full packet.\r\n");
+// for (int i=0; i<132; i++) {
+// pc.printf("%02X", packetBuf[i]);
+// }
+// }
+ }
+ }
+}
--- a/xDotBridge/src/main.cpp Wed May 10 13:54:25 2017 -0600
+++ b/xDotBridge/src/main.cpp Tue May 16 15:15:58 2017 -0600
@@ -72,8 +72,6 @@
volatile bool pairBtnIntFlag;
void uart1RxCallback () {
uartRxFlag = true;
-// char c = outPc.getc();
-// printf("Got %d, %c", c, c);
}
void ccInIntCallback () {
ccIntFlag = true;
@@ -92,7 +90,6 @@
SerialTermMgr serialTermMgr(bbio, BridgeVersion);
pc.baud(115200);
-// outPc.baud(9600);
CmdResult result;
uartRxFlag = false;
ccIntFlag = false;
@@ -176,10 +173,7 @@
}
LedPatterns ledPatterns(bbio);
-// outPc.attach(&uart1RxCallback, Serial::RxIrq);
-// outPc.attach(&uart1RxCallback);
-// uart1RxIntIn.rise(&uart1RxCallback);
- uart1RxIntIn.fall(&uart1RxCallback);
+ uart1RxIntIn.rise(&uart1RxCallback); // Rising does appear to work better than falling edge
uart1RxIntIn.enable_irq();
Callback<void()> ccInIntObj (&ccInIntCallback);
// Callback<void()> tamperIntObj (&tamperIntCallback);
@@ -301,6 +295,7 @@
// pc.printf("Got uart flag!!!\r\n");
uartRxFlag = false;
outPc = new Serial(UART1_TX, UART1_RX);
+ outPc->baud(TERM_BAUD);
serialTermMgr.regSerial(outPc);
char c;
if (outPc->readable()) {
