![](/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/main.cpp
- Committer:
- Matt Briggs
- Date:
- 2017-01-26
- Revision:
- 39:64f79fa6e3cc
- Parent:
- 38:8a512e23d99e
- Child:
- 40:2ec4be320961
File content as of revision 39:64f79fa6e3cc:
#include <math.h> #include "config.h" #include "xdot_flash.h" #include "dot_util.h" #include "RadioEvent.h" #include <OneWire.h> ///////////////////////////////////////////////////////////////////////////// // -------------------- DOT LIBRARY REQUIRED ------------------------------// // * Because these example programs can be used for both mDot and xDot // // devices, the LoRa stack is not included. The libmDot library should // // be imported if building for mDot devices. The libxDot library // // should be imported if building for xDot devices. // // * https://developer.mbed.org/teams/MultiTech/code/libmDot-dev-mbed5/ // // * https://developer.mbed.org/teams/MultiTech/code/libmDot-mbed5/ // // * https://developer.mbed.org/teams/MultiTech/code/libxDot-dev-mbed5/ // // * https://developer.mbed.org/teams/MultiTech/code/libxDot-mbed5/ // ///////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////// // * these options must match between the two devices in // // order for communication to be successful ///////////////////////////////////////////////////////////// static uint8_t network_address[] = { 0x01, 0x02, 0x03, 0x04 }; static uint8_t network_session_key[] = { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 }; static uint8_t data_session_key[] = { 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04, 0x01, 0x02, 0x03, 0x04 }; // wireless bridge protocol const uint8_t TX_PWR = 20; // 20 dBm const float RX_SLEEP_TIME = 2000; // ms (one second resolution, min 2 seconds) const uint8_t TX_TIME = 30; // in ms //const uint8_t maxPayloadSize = 10; // Number of bytes (used for toa calcultion) /////////////////////// // I/O Configuration // /////////////////////// DigitalOut led1(GPIO0); AnalogIn an1(GPIO1); AnalogIn an2(GPIO2); // Inputs //DigitalIn gpio3(GPIO3); //DigitalIn wake_DOUT(WAKE); //DigitalIn i2cOut1(I2C1_SCL); //DigitalIn i2cOut2(I2C1_SDA); InterruptIn intTest(I2C1_SDA); //DigitalIn uartOut1(UART1_CTS); //DigitalIn uartOut2(UART1_RTS); //DigitalIn jtag_gpio1(SWDIO); //DigitalIn jtag_gpio2(SWCLK); // Outputs //DigitalOut gpio3(GPIO3); ////DigitalOut wake_DOUT(WAKE); //DigitalOut i2cOut1(I2C1_SCL); //DigitalOut i2cOut2(I2C1_SDA); // //DigitalOut uartOut1(UART1_CTS); //DigitalOut uartOut2(UART1_RTS); mDot* dot = NULL; Serial pc(USBTX, USBRX); unsigned int callbackTime = 0; void testCallback () { callbackTime = us_ticker_read(); } int main() { unsigned int wakeMode; RadioEvent events; // Custom event handler for automatically displaying RX data uint32_t tx_frequency; uint8_t tx_datarate; uint8_t tx_power; uint8_t frequency_band; pc.baud(115200); mts::MTSLog::setLogLevel(mts::MTSLog::TRACE_LEVEL); dot = mDot::getInstance(); logInfo("mbed-os library version: %d", MBED_LIBRARY_VERSION); // start from a well-known state logInfo("defaulting Dot configuration"); dot->resetConfig(); // make sure library logging is turned on dot->setLogLevel(mts::MTSLog::INFO_LEVEL); // attach the custom events handler dot->setEvents(&events); // Setup programmable voltage detector // PVD_LEVEL0 Falling 1.85 // PVD_LEVEL1 Falling 2.04 // PVD_LEVEL2 Falling 2.24 // PVD_LEVEL3 Falling 2.44 // PVD_LEVEL4 Falling 2.64 // PVD_LEVEL5 Falling 2.84 // PVD_LEVEL6 Falling 3.05 PWR_PVDTypeDef pvdConfig; pvdConfig.Mode = PWR_PVD_MODE_NORMAL; pvdConfig.PVDLevel = PWR_PVDLEVEL_5; HAL_PWR_ConfigPVD(&pvdConfig); HAL_PWR_EnablePVD(); logInfo("Programmable Voltage Detector set for level: %d", pvdConfig.PVDLevel); // TODO setup IO here // update configuration if necessary logInfo("Setting up peer to peer configuration"); if (dot->getJoinMode() != mDot::PEER_TO_PEER) { logInfo("changing network join mode to PEER_TO_PEER"); if (dot->setJoinMode(mDot::PEER_TO_PEER) != mDot::MDOT_OK) { logError("failed to set network join mode to PEER_TO_PEER"); } } frequency_band = dot->getFrequencyBand(); switch (frequency_band) { case mDot::FB_EU868: // 250kHz channels achieve higher throughput // DR6 : SF7 @ 250kHz // DR0 - DR5 (125kHz channels) available but much slower tx_frequency = 869850000; tx_datarate = mDot::DR6; // the 869850000 frequency is 100% duty cycle if the total power is under 7 dBm - tx power 4 + antenna gain 3 = 7 tx_power = 4; break; case mDot::FB_US915: case mDot::FB_AU915: default: // 500kHz channels achieve highest throughput // DR8 : SF12 @ 500kHz // DR9 : SF11 @ 500kHz // DR10 : SF10 @ 500kHz // DR11 : SF9 @ 500kHz // DR12 : SF8 @ 500kHz // DR13 : SF7 @ 500kHz // DR0 - DR3 (125kHz channels) available but much slower tx_frequency = 915500000; tx_datarate = mDot::DR13; // 915 bands have no duty cycle restrictions, set tx power to max tx_power = 20; break; } // in PEER_TO_PEER mode there is no join request/response transaction // as long as both Dots are configured correctly, they should be able to communicate update_peer_to_peer_config(network_address, network_session_key, data_session_key, tx_frequency, tx_datarate, tx_power); /////////////////////////////// // Transmitter Configuration // /////////////////////////////// #if BRIDGE_TX_BRUTE wakeMode = mDot::INTERRUPT; #endif //////////////////////////// // Receiver Configuration // //////////////////////////// #if BRIDGE_RX_BRUTE wakeMode = mDot::RTC_ALARM_OR_INTERRUPT; #endif // Common Configuration dot->setTxWait(false); dot->setAck(0); // Disable Ack dot->setWakePin(WAKE); // Use the wake pin as sleep interrupt dot->setClass("C"); // Set class C dot->setTxPower(TX_PWR); // save changes to configuration logInfo("saving configuration"); if (!dot->saveConfig()) { logError("failed to save configuration"); } // display configuration display_config(); unsigned int nTimesToTx = ceil(RX_SLEEP_TIME / ((float)TX_TIME)); logInfo("RX_SLEEP_TIME %f, timeOnAir %lu, nTimesToTx %lu", RX_SLEEP_TIME, TX_TIME, nTimesToTx); uint16_t seqNum=0; uint32_t cDwnLink = dot->getDownLinkCounter(); // Interrupt setup intTest.pullup(); intTest.fall(testCallback); while (true) { std::vector<uint8_t> data; led1=0; // join network if not joined if (!dot->getNetworkJoinStatus()) { join_network(); } ////////////////////// // Common main loop // ////////////////////// // TODO sample rotary // TODO sample DIPs ////////////////////////////////////////// // Brute Protocol Transmitter main loop // ////////////////////////////////////////// #if BRIDGE_TX_BRUTE #if LED_FEEDBACK led1=1; #endif // TODO check for CC_IN data.push_back((seqNum >> 8) & 0xFF); data.push_back(seqNum & 0xFF); logInfo("Starting TX. Time: %lu, seqNum: %lu", us_ticker_read(), seqNum); for(uint i=0;i<nTimesToTx;++i) { dot->send(data); } seqNum++; led1=0; logInfo("Finished TX. Time: %lu", us_ticker_read()); sleep_save_io(); sleep_configure_io(); dot->sleep(0, wakeMode, false); // Go to sleep until wake button sleep_restore_io(); #endif /////////////////////////////////////// // Brute Protocol Receiver main loop // /////////////////////////////////////// #if BRIDGE_RX_BRUTE logInfo("Waiting for new message current DLC: %d, Time %d", cDwnLink, us_ticker_read()); wait(TX_TIME/1000.0); // Wait TX_TIME // TODO need to figure out what to do when DLC get resets if (cDwnLink < dot->getDownLinkCounter()) { cDwnLink = dot->getDownLinkCounter(); dot->recv(data); std::string dataStr(data.begin(), data.end()); logInfo("Got msg num: %d, payload: %s", seqNum, dataStr.c_str()); // TODO add CC_OUT code here seqNum++; #if LED_FEEDBACK led1 = 1; wait(0.5); #endif } led1=0; logInfo("Sleeping. Time %d", us_ticker_read()); sleep_save_io(); sleep_configure_io(); // TODO maybe add if statement here to prevent double hits by sleeping for a longer time dot->sleep(2, wakeMode, false); // Go to sleep until wake button sleep_restore_io(); #endif ////////////// // I/O Play // ////////////// // Check interrupt logInfo("Callback last called @ %d", callbackTime); // // Check Analog // logInfo("Read AN1/GPIO1: %f", an1.read()); // logInfo("Read AN2/GPIO2: %f", an2.read()); // Ranges from 0.0 to 1.0 // // // check inputs // logInfo("Read GPIO3: %d", gpio3.read()); //// logInfo("Read wake_DOUT: %d", wake_DOUT.read()); // logInfo("Read i2cOut1: %d", i2cOut1.read()); // Appears to be pulled up // logInfo("Read i2cOut2: %d", i2cOut2.read()); // Appears to be pulled up // logInfo("Read uartOut1: %d", uartOut1.read()); // logInfo("Read uartOut2: %d", uartOut2.read()); // // logInfo("Read jtag_gpio1: %d", jtag_gpio1.read()); // logInfo("Read jtag_gpio2: %d", jtag_gpio2.read()); // // if (jtag_gpio1.read() == 0) { // led1 = 1; // } // else { // led1 = 0; // } // check digital outputs // led1 = !led1; // gpio3 = !gpio3; //// wake_DOUT = !wake_DOUT; // i2cOut1 = !i2cOut1; // i2cOut2 = !i2cOut2; // // uartOut1 = !uartOut1; // uartOut2 = !uartOut2; logInfo("================================"); wait(1.0); ////////////////// // OneWire Play // ////////////////// // logInfo("Starting OneWire Play"); // OneWire owMaster(I2C_SDA); // uint8_t addr[8]; // uint8_t result; // // // Search Bus // logInfo("Starting OneWire Search"); // do { // result = owMaster.search(addr); // logInfo("ROM Addr: %02x:%02x:%02x:%02x:%02x:%02x:%02x%02x\n", // addr[7],addr[6],addr[5],addr[4],addr[3],addr[2],addr[1],addr[0]); // } while (result == 1); // logInfo("Finished OneWire Search"); // wait(1.0); // // uint8_t pioStateAddr[] = {0x88, 0x00}; // uint8_t pioLatchAddr[] = {0x89, 0x00}; // uint8_t printAddr = 0x88; // while (true) { // owMaster.reset(); // owMaster.select(addr); // owMaster.write(0xF0); // Read Register Command // owMaster.write_bytes(pioStateAddr, 2); // Write 2 byte addr // printAddr = 0x88; // for (int i=0;i<8;i++) { // result = owMaster.read(); // logInfo("%02x Reg Value: %02x\n", printAddr++, result); // } // // owMaster.reset(); // owMaster.select(addr); // owMaster.write(0xF0); // Read Register Command // owMaster.write_bytes(pioLatchAddr, 2); // Write 2 byte addr // result = owMaster.read(); // logInfo("Latch Reg Value: %02x\n", result); // // TODO try reading inverted 16-bit CRC // // wait(1.0); // // Try write // owMaster.reset(); // owMaster.select(addr); // owMaster.write(0x5A); // Channel Access Write Command // uint8_t val = ~0xAA; // owMaster.write(val); // Pull-down all even bits // owMaster.write(~val); // Pull-down all even bits // result = owMaster.read(); // logInfo("Confirm after write value: %02x, expected %02x\n", result, 0xAA); // // // Check if the read back is just a latch reg thing or a true logic state // wait(1.0); } } return 0; }