![](/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
Diff: xDotBridge/src/BaseboardIO.cpp
- Revision:
- 49:18f1354f9e51
- Parent:
- 48:bab9f747d9ed
- Child:
- 50:e89647e77fd5
--- 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; }