Fork to see if I can get working

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

Fork of xDotBridge_update_test20180823 by Matt Briggs

Files at this revision

API Documentation at this revision

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

xDotBridge/inc/SerialTermMgr.h Show annotated file Show diff for this revision Revisions of this file
xDotBridge/src/SerialTermMgr.cpp Show annotated file Show diff for this revision Revisions of this file
xDotBridge/src/main.cpp Show annotated file Show diff for this revision Revisions of this file
--- 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()) {