test demo
Dependencies: PinDetect libmDot mbed-rtos mbed-src
Fork of mDot_LoRa_Connect_Woodstream_Demo by
main.cpp
- Committer:
- tmulrooney
- Date:
- 2015-11-10
- Revision:
- 4:47c98ad6a0c3
- Parent:
- 3:34d92fdfbe06
- Child:
- 5:66abb6adfdc5
File content as of revision 4:47c98ad6a0c3:
/********************************************************************************** * This program monitors the power on state, kill state and battery voltage on * Woodstream mouse trap using the Multitech mDot and UDK2 development system. * The power on state is monitored on the PA_4(UDK2 Pin D10)and the kill state is * monitored on the PA_5 (UDK2 Pin D13) Digital Input Pins. The battery voltage * is monitored on the PB_1 (UDK2 Pin A0) Analog Input. The status of these pins * are transferred from the mDot LoRa to the Conduit LoRa gateway. The status is * also shown on the USB Debug Terminal Window. *********************************************************************************/ #include "mbed.h" #include "mDot.h" #include "MTSLog.h" #include <string> #include <vector> #include <algorithm> #include "PinDetect.h" #define MIN_CHANGE_BATTERY_VOLTAGE 0 #define LED_TIME 5 #define BATTERY_TIME 2.0 #define KILL_STATUS_TIME 3.0 #define POWER_ON_TIME 4.0 mDot* dot; Ticker ledTimer; Ticker batteryTimer; Ticker killStatusTimer; Ticker powerOnTimer; AnalogIn batteryVoltage(PB_1); DigitalIn powerOn(PA_4); DigitalIn killStatus(PA_5); DigitalOut transmitLED(PA_0); // Configuration variables static std::string config_network_name = "LORA_NET"; static std::string config_network_pass = "BLUE_HEN1"; static uint8_t config_frequency_sub_band = 7; //Global Variables bool readyToSendBatteryVoltage; bool readyToSendKillStatus; bool readyToSendPowerOn; float lastBatteryVoltage; uint8_t lastKillStatus; uint8_t lastPowerOn; //Function prototypes void ledWrite(); void periodicSendTock(); void batteryRead(); void killStatusRead(); void powerOnRead(); void printError(mDot* dot, int32_t returnCode); void printVersion(); bool setFrequencySubBand(uint8_t subBand); bool setNetworkName(const std::string name); bool setNetworkPassphrase(const std::string passphrase); bool setTxDataRate(const int dataRate); bool setPower(uint8_t power); bool setAck(uint8_t retries); bool joinNetwork(); bool send(const std::string text); char latestData[100]; int main() { bool configFail = false; readyToSendBatteryVoltage = false; readyToSendKillStatus = false; readyToSendPowerOn = false; lastBatteryVoltage = 0.0; lastKillStatus = transmitLED; lastPowerOn = powerOn; //Start LED startup sequence ledTimer.attach(&ledWrite, LED_TIME); printf("\r\n\r\n"); printf("=====================================\r\n"); printf("WoodStream LoRa Mousetrap Demo \r\n"); printf("=====================================\r\n"); printVersion(); // get the mDot handle dot = mDot::getInstance(); dot->setLogLevel(mts::MTSLog::INFO_LEVEL); //******************************************* // configuration //******************************************* // reset to default config so we know what state we're in dot->resetNetworkSession(); dot->resetConfig(); // set up the mDot with our network information: frequency sub band, network name, and network password // these can all be saved in NVM so they don't need to be set every time - see mDot::saveConfig() configFail = !setFrequencySubBand(config_frequency_sub_band); configFail |= !setNetworkName(config_network_name); configFail |= !setNetworkPassphrase(config_network_pass); configFail |= !setTxDataRate(mDot::SF_8); configFail |= !setPower(20); // Reduce latency for 868 units configFail |= !setAck(0); // Disable ack for less latency printf("Configration %s\r\n",configFail?"Failed":"Passed"); // save this configuration to the mDot's NVM printf("saving config\r\n"); if (! dot->saveConfig()) { logError("failed to save configuration"); } //******************************************* // end of configuration //******************************************* // keep trying to join the network while (!joinNetwork()) { wait(200); dot->resetNetworkSession(); } // Stop LED startup sequence & configure them for operation transmitLED = 1; // start all paramter timers to sample analog and digital inputs batteryTimer.attach(batteryRead, BATTERY_TIME); killStatusTimer.attach(killStatusRead, KILL_STATUS_TIME); powerOnTimer.attach(powerOnRead, POWER_ON_TIME); while (1) { // is there anything to send if(readyToSendBatteryVoltage) { sprintf(latestData,"Voltage %2.2f",(double)lastBatteryVoltage); printf("%s\r\n",latestData); send(latestData); readyToSendBatteryVoltage = false; } if(readyToSendKillStatus) { sprintf(latestData,"KillStatus %d",lastKillStatus); printf("%s\r\n",latestData); send(latestData); readyToSendKillStatus = false; } if(readyToSendPowerOn) { sprintf(latestData,"PowerOn %d",lastPowerOn); printf("%s\r\n",latestData); send(latestData); readyToSendPowerOn = false; } } } void ledWrite() { transmitLED = !transmitLED; } void batteryRead() { lastBatteryVoltage = batteryVoltage * (float)3.3; readyToSendBatteryVoltage = true; } void killStatusRead() { lastKillStatus = killStatus; readyToSendKillStatus = true; } void powerOnRead() { lastPowerOn = powerOn; readyToSendPowerOn = true; } void printVersion() { printf("%s Built on: %s %s\r\n\r\n", dot->getId().c_str(),__DATE__,__TIME__); } bool setFrequencySubBand(uint8_t subBand) { int32_t returnCode; printf("Setting frequency sub band to '%d'...\r\n", subBand); if ((returnCode = dot->setFrequencySubBand(subBand)) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } return true; } bool setNetworkName(const std::string name) { int32_t returnCode; printf("Setting network name to '%s'...\r\n", name.c_str()); if ((returnCode = dot->setNetworkName(name)) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } return true; } bool setNetworkPassphrase(const std::string passphrase) { int32_t returnCode; printf("Setting passphrase to '%s'...\r\n", passphrase.c_str()); if ((returnCode = dot->setNetworkPassphrase(passphrase)) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } return true; } bool setTxDataRate(const int dataRate) { int32_t returnCode; printf("Setting TX Spreading factor to %d...\r\n",dataRate); if ((returnCode = dot->setTxDataRate(dataRate)) != mDot::MDOT_OK) { logError("Failed To Set Tx Datarate %d:%s", returnCode, mDot::getReturnCodeString(returnCode).c_str()); printError(dot, returnCode); return false; } return true; } bool setPower(uint8_t power) { int32_t returnCode; printf("Setting tx power to '%d'...\r\n", power); if ((returnCode = dot->setTxPower(power)) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } return true; } bool joinNetwork() { int32_t returnCode; printf("\r\nJoining network...\r\n"); if ((returnCode = dot->joinNetworkOnce()) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } printf("Network Joined!\r\n"); return true; } bool setAck(uint8_t retries) { int32_t returnCode; printf("Setting ack to '%d'...\r\n", retries); if ((returnCode = dot->setAck(retries)) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } return true; } bool send(const std::string text) { int32_t returnCode; uint32_t timeTillSend = dot->getNextTxMs(); if (timeTillSend != 0) { printf("waiting %lu ms to send\r\n", timeTillSend); return false; } printf("Sending data... "); std::vector<uint8_t> data(text.begin(), text.end()); if ((returnCode = dot->send(data, 1)) != mDot::MDOT_OK) { printError(dot, returnCode); return false; } printf("Data sent!\r\n"); return true; } void printError(mDot* dot, int32_t returnCode) { std::string error = mDot::getReturnCodeString(returnCode) + " - " + dot->getLastError(); printf("%s\r\n", error.c_str()); }