Fork to see if I can get working

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

Fork of xDotBridge_update_test20180823 by Matt Briggs

Revision:
49:18f1354f9e51
Parent:
48:bab9f747d9ed
Child:
50:e89647e77fd5
diff -r bab9f747d9ed -r 18f1354f9e51 xDotBridge/src/BaseboardIO.cpp
--- a/xDotBridge/src/BaseboardIO.cpp	Mon Feb 13 17:10:59 2017 -0700
+++ b/xDotBridge/src/BaseboardIO.cpp	Fri Feb 17 08:06:37 2017 -0700
@@ -10,7 +10,7 @@
 
 const float COIL_ON_TIME = 0.030; // 30 ms
 
-// Port expander 0
+// Port expander 0 (Currently U7)
 const uint8_t pEx0232En     = 0x01;
 const uint8_t pEx0232TxDis  = 0x02;
 const uint8_t pEx0Rot1B1    = 0x04;
@@ -19,8 +19,9 @@
 const uint8_t pEx0Rot1B8    = 0x20;
 const uint8_t pEx0Rot2B1    = 0x40;
 const uint8_t pEx0Rot2B2    = 0x80;
+const uint8_t pEx0OutMask   = 0x03; // Only allow bits 0,1 to be changed
 
-// Port expander 1
+// Port expander 1 (Currently U8)
 const uint8_t pEx1NoNcSel   = 0x01;
 const uint8_t pEx1RxTxSel   = 0x02;
 const uint8_t pEx1WanSel    = 0x04;
@@ -29,6 +30,7 @@
 const uint8_t pEx1Rot2B4    = 0x20;
 const uint8_t pEx1RlyB      = 0x40; // This is actually a coil
 const uint8_t pEx1RlyA      = 0x80; // This is actually a coil
+const uint8_t pEx1OutMask   = 0xC0; // Only allow bits 6,7 to be changed
 
 /**
  * Note for interrupt within uC cannot use two pins with the same numeric suffix (e.g. cannot
@@ -42,7 +44,7 @@
       mPairBtn(UART_CTS), // Interrupt pin PA_11
 //      mLed(SWDIO),
       mLed(GPIO0),
-      mSwitchedIOCtrl(I2C_SCL)
+      mSwitchedIOCtrl(I2C_SCL, 0)
 {
 //    mCCInIntCallback = NULL;
 //    mTamperIntCallback = NULL;
@@ -100,16 +102,23 @@
     else {
         mCCIn.rise(func);
     }
+    mPairBtn.mode(PullNone);
+    mCCIn.enable_irq();
 }
 void BaseboardIO::regTamperInt(Callback<void()> func)
 {
     // Pulled high, switched low
+    mPairBtn.mode(PullNone);
+    mTamper.rise(func);
     mTamper.fall(func);
+    mTamper.enable_irq();
 }
 void BaseboardIO::regPairBtnInt(Callback<void()> func)
 {
     // Pulled low, switched high
+    mPairBtn.mode(PullDown);
     mPairBtn.rise(func);
+    mPairBtn.enable_irq();
 }
 
 // Input
@@ -118,14 +127,19 @@
     if ((mPortEx0 == NULL) || (mPortEx1 == NULL))
         return cmdError;
     // Sample port expanders
+    enableSwitchedIO();
+    wait(0.001);  // Wait 1 ms
     if (mPortEx0->pioLogicRead(mPortExpanderVal0) != cmdSuccess) {
+        disableSwitchedIO();
         logError("Error reading port expander 0.");
         return cmdError;
     }
     if (mPortEx1->pioLogicRead(mPortExpanderVal1) != cmdSuccess) {
+        disableSwitchedIO();
         logError("Error reading port expander 1.");
         return cmdError;
     }
+    disableSwitchedIO();
     return cmdSuccess;
 }
 bool BaseboardIO::isPairBtn()
@@ -136,7 +150,7 @@
 bool BaseboardIO::isCCNO()
 {
     // When DIP switch is not closed (i.e. value reads high) assume NO
-    return (mPortExpanderVal1 & pEx1NoNcSel) != 0;
+    return (mPortExpanderVal1 & pEx1NoNcSel) != 0; // Open NO, closed NC
 }
 bool BaseboardIO::isRx()
 {
@@ -211,6 +225,10 @@
 CmdResult BaseboardIO::serialRx(bool enable)
 {
     uint8_t val;
+    if (mPortEx0 == NULL) {
+        logError("Error enabling 232.  Port expanders not initialized.");
+        return cmdError;
+    }
     mPortEx0->pioLogicRead(val);
 
     // Active low from port expander -> pmos -> 232 (active chip EN)
@@ -221,7 +239,7 @@
         val |= pEx0232En;
     }
 
-    if (mPortEx1->pioLogicWrite(val) != cmdSuccess) {
+    if (mPortEx0->pioLogicWrite(val | ~pEx0OutMask) != cmdSuccess) {
         logError("Error enabling 232");
         return cmdError;
     }
@@ -230,6 +248,10 @@
 CmdResult BaseboardIO::serialTx(bool enable)
 {
     uint8_t val;
+    if (mPortEx0 == NULL) {
+        logError("Error enabling 232 TX.  Port expanders not initialized.");
+        return cmdError;
+    }
     mPortEx0->pioLogicRead(val);
 
     // Active high tx disable therefore active low tx enable (note chip must also be enabled for TX)
@@ -240,7 +262,7 @@
         val |= pEx0232TxDis;
     }
 
-    if (mPortEx1->pioLogicWrite(val) != cmdSuccess) {
+    if (mPortEx0->pioLogicWrite(val | ~pEx0OutMask) != cmdSuccess) {
         logError("Error enabling 232 TX");
         return cmdError;
     }
@@ -262,26 +284,36 @@
 {
     uint8_t addr[8];
     uint8_t result;
+    int i;
 
     // Search Bus
     logInfo("Starting OneWire Search");
-    int i=0;
-    mOWMaster.reset();
-    while (true) {
-        // TODO maybe change to family based search
-        result = mOWMaster.search(addr);
-        logInfo("ROM Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
-                addr[7],addr[6],addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
-        if (result != 1)
+    enableSwitchedIO();
+    for (int j=0;j<10;j++) { // Try 5 times
+        i=0;
+        mOWMaster.reset();
+        mOWMaster.reset_search();
+        wait(1.0);
+        while (true) {
+            // TODO maybe change to family based search
+            result = mOWMaster.search(addr);
+            if (result != 1) {
+                break;
+            }
+            logInfo("ROM Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x found.",
+                    addr[7],addr[6],addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]);
+            if (i == 0) {
+                std::memcpy(mPortExpanderROM0, addr, sizeof(mPortExpanderROM0));
+            }
+            else if (i == 1) {
+                std::memcpy(mPortExpanderROM1, addr, sizeof(mPortExpanderROM1));
+            }
+            i++;
+        }
+            // TODO maybe only allow a reasonable number of Port Expanders
+        if (i >=2) {
             break;
-        if (i == 0) {
-            std::memcpy(mPortExpanderROM0, addr, sizeof(mPortExpanderROM0));
         }
-        else if (i == 1) {
-            std::memcpy(mPortExpanderROM1, addr, sizeof(mPortExpanderROM1));
-        }
-        i++;
-        // TODO maybe only allow a reasonable number of Port Expanders
     }
 
     logInfo("Finished OneWire Search");
@@ -290,25 +322,31 @@
         return cmdError;
     }
 
+    // All rotary switches should be at 0.  DIPS should be asserted.
     // If switches are set in factory default mode then port expander 1 should read 0xFF and
     // port expander 2 should read 0xF0.
 
     mPortEx0 = new DS2408(&mOWMaster, mPortExpanderROM0);
     mPortEx1 = new DS2408(&mOWMaster, mPortExpanderROM1);
 
+
+    enableSwitchedIO();
     if (mPortEx0->pioLogicRead(mPortExpanderVal0) != cmdSuccess) {
         logError("Error during port expander ID.  Read failed.");
+        disableSwitchedIO();
         delete mPortEx0;
         delete mPortEx1;
         return cmdError;
     }
     if (mPortEx1->pioLogicRead(mPortExpanderVal1) != cmdSuccess) {
         logError("Error during port expander ID.  Read failed.");
+        disableSwitchedIO();
         delete mPortEx0;
         delete mPortEx1;
         return cmdError;
     }
 
+    disableSwitchedIO();
     if ((mPortExpanderVal0 == 0xFF) and (mPortExpanderVal1 == 0xF0)) { // Luckily got it right
         logInfo("ROMS Swap Not Needed.");
     }
@@ -319,7 +357,9 @@
         logInfo("Swapped ROMS.");
     }
     else {
-        logError("Error during port expander ID.  Port expanders not in expected states.  Check user switches.");
+        logError("Error during port expander ID.  Port expanders not in "
+                "expected states.  Check user switches.  Got %02X and %02X",
+                mPortExpanderVal0, mPortExpanderVal1);
         delete mPortEx0;
         delete mPortEx1;
         return cmdError;
@@ -331,56 +371,56 @@
 
     return cmdSuccess;
 }
-CmdResult BaseboardIO::closeRelay() {
+CmdResult BaseboardIO::openRelay() {
     uint8_t val;
     mPortEx1->pioLogicRead(val);
 
-    val |=  pEx1RlyA; // Turn on Relay A
-    val &= ~pEx1RlyB; // Make sure Relay B is off
+    val |= pEx1RlyA; // Make sure Relay A is off
+    val &= ~pEx1RlyB; // Turn on Relay B
 
-    if (mPortEx1->pioLogicWrite(val) != cmdSuccess) {
-        val &= ~pEx1RlyA; // Turn Relay A off
-        val &= ~pEx1RlyB; // Turn Relay B off
-        mPortEx1->pioLogicWrite(val); // Write a non assert value just to try to overcome an error
+    if (mPortEx1->pioLogicWrite(val | ~pEx1OutMask) != cmdSuccess) {
+        val |= pEx1RlyA; // Turn Relay A off
+        val |= pEx1RlyB; // Turn Relay B off
+        mPortEx1->pioLogicWrite(val | ~pEx1OutMask); // Write a non assert value just to try to overcome an error
         logError ("Error turning on coil.  Turning both coils off.");
         return cmdError;
     }
 
     wait(COIL_ON_TIME);
 
-    val &= ~pEx1RlyA; // Turn Relay A off
-    val &= ~pEx1RlyB; // Turn Relay B off
+    val |= pEx1RlyA; // Turn Relay A off
+    val |= pEx1RlyB; // Turn Relay B off
 
-    if (mPortEx1->pioLogicWrite(val) != cmdSuccess) {
-        mPortEx1->pioLogicWrite(val);
+    if (mPortEx1->pioLogicWrite(val | ~pEx1OutMask) != cmdSuccess) {
+        mPortEx1->pioLogicWrite(val | ~pEx1OutMask);
         logError ("Error turning off coils.  Trying again.");
         return cmdError;
     }
 
     return cmdSuccess;
 }
-CmdResult BaseboardIO::openRelay() {
+CmdResult BaseboardIO::closeRelay() {
     uint8_t val;
     mPortEx1->pioLogicRead(val);
 
-    val &= ~pEx1RlyA; // Make sure Relay A is off
-    val |=  pEx1RlyB; // Turn on Relay B
+    val &= ~pEx1RlyA; // Turn on Relay A
+    val |= pEx1RlyB; // Make sure Relay B is off
 
-    if (mPortEx1->pioLogicWrite(val) != cmdSuccess) {
-        val &= ~pEx1RlyA; // Turn Relay A off
-        val &= ~pEx1RlyB; // Turn Relay B off
-        mPortEx1->pioLogicWrite(val); // Write a non assert value just to try to overcome an error
+    if (mPortEx1->pioLogicWrite(val | ~pEx1OutMask) != cmdSuccess) {
+        val |= pEx1RlyA; // Turn Relay A off
+        val |= pEx1RlyB; // Turn Relay B off
+        mPortEx1->pioLogicWrite(val | ~pEx1OutMask); // Write a non assert value just to try to overcome an error
         logError ("Error turning on coil.  Turning both coils off.");
         return cmdError;
     }
 
     wait(COIL_ON_TIME);
 
-    val &= ~pEx1RlyA; // Turn Relay A off
-    val &= ~pEx1RlyB; // Turn Relay B off
+    val |= pEx1RlyA; // Turn Relay A off
+    val |= pEx1RlyB; // Turn Relay B off
 
-    if (mPortEx1->pioLogicWrite(val) != cmdSuccess) {
-        mPortEx1->pioLogicWrite(val);
+    if (mPortEx1->pioLogicWrite(val | ~pEx1OutMask) != cmdSuccess) {
+        mPortEx1->pioLogicWrite(val | ~pEx1OutMask);
         logError ("Error turning off coils.  Trying again.");
         return cmdError;
     }