mDot LoRa example program that transfers analog battery voltage and two digital input status signals to the Conduit LoRa gateway.

Dependencies:   PinDetect libmDot mbed-rtos mbed-src

Files at this revision

API Documentation at this revision

Comitter:
jlcolemanmbed
Date:
Wed Oct 28 23:53:58 2015 +0000
Commit message:
Initial Version Posted For Tim Mulrooney. Code needs to be cleaned up.; This is a preliminary release for development purposes only.

Changed in this revision

PinDetect.lib Show annotated file Show diff for this revision Revisions of this file
libmDot.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed-rtos.lib Show annotated file Show diff for this revision Revisions of this file
mbed-src.lib Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 5fa2b08cb3e0 PinDetect.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PinDetect.lib	Wed Oct 28 23:53:58 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/AjK/code/PinDetect/#cb3afc45028b
diff -r 000000000000 -r 5fa2b08cb3e0 libmDot.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmDot.lib	Wed Oct 28 23:53:58 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/MultiTech/code/libmDot/#0b4eb17d07ae
diff -r 000000000000 -r 5fa2b08cb3e0 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Wed Oct 28 23:53:58 2015 +0000
@@ -0,0 +1,259 @@
+/**********************************************************************************
+ * 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"
+
+mDot* dot;
+Ticker ledTick;
+Ticker batteryvoltageMonitorTick;
+Ticker periodicSendTick;
+     
+AnalogIn batt_voltage(PB_1);
+DigitalIn mt_pwron(PA_4);
+DigitalIn mt_caught(PA_5);
+DigitalOut transmitLED(LED1);
+
+// Configuration variables
+static std::string config_network_name = "JFETENGINEERING";
+static std::string config_network_pass = "Deboraheng";
+static uint8_t config_frequency_sub_band = 7;
+
+
+//Global Variables
+//static uint16_t setPoint = 21;       //21 C is standard room temp
+static volatile bool timeToReadBatteryVoltage = true;
+static volatile bool dataChanged = true;
+//static volatile bool thermostatActivated = false;
+//static uint16_t sentSetPoint;
+
+//Function prototypes
+void ledTock();
+void periodicSendTock();
+void batteryvoltageMonitorTock();
+//void up_button_callback();
+//void down_button_callback();
+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 setPower(uint8_t power);
+bool setAck(uint8_t retries);
+bool joinNetwork();
+bool send(const std::string text);
+
+
+int main()
+{
+    int32_t ret;
+    //Start LED startup sequence
+    ledTick.attach(&ledTock, 0.1);
+
+    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);
+
+    // reset to default config so we know what state we're in
+    dot->resetNetworkSession();
+    dot->resetConfig();
+
+    // set up the mDot with our network information
+    setNetworkName(config_network_name);
+    setNetworkPassphrase(config_network_pass);
+    setFrequencySubBand(config_frequency_sub_band);
+    setPower(20);    // Reduce latency for 868 units
+    setAck(0);      // Disable ack for less latency
+
+logInfo("Setting TX Spreading factor");
+if ((ret = dot->setTxDataRate(mDot::SF_8)) != mDot::MDOT_OK) {
+    logError("Failed To Set Tx Datarate %d:%s", ret, mDot::getReturnCodeString(ret).c_str());
+}
+
+    while (!joinNetwork()) { wait(2); dot->resetNetworkSession(); }
+
+    // Stop LED startup sequence & configure them for operation
+    ledTick.detach();
+    transmitLED = 1;
+//    buttonPressLED = 1;
+
+    // Configure timers
+    periodicSendTick.attach(&periodicSendTock, 5*60);
+    batteryvoltageMonitorTick.attach(&batteryvoltageMonitorTock, 0.15);
+
+    // Setup Interrupt callback function
+//    up_button.attach_deasserted(&up_button_callback);
+//    down_button.attach_deasserted(&down_button_callback);
+
+    // Start sampling buttons using interrupts
+//    up_button.setSampleFrequency();
+//    down_button.setSampleFrequency();
+
+int old_mt_pwron = -1;
+int old_mt_caught = -1;
+
+while (1) {
+    if (timeToReadBatteryVoltage) 
+        
+    if (mt_pwron != old_mt_pwron) {
+        old_mt_pwron = mt_pwron;
+        dataChanged = true;
+    if (mt_caught != old_mt_caught) {
+        old_mt_caught = mt_caught;
+        dataChanged = true;
+        }
+       // printf("\n\r mt_pwron: %d, mt_caught: %d, batt_voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3));
+       
+       timeToReadBatteryVoltage = false;
+}
+
+        if (dataChanged) {
+            char latestData[100];
+            transmitLED = 1;
+            //sprintf(latestData, "temp: %d,set: %d", temperature, sentSetPoint);
+            sprintf(latestData, "power on: %d, kill status: %d, battery voltage: %f", old_mt_pwron, old_mt_caught, (batt_voltage*3.3));
+            printf("%s\r\n", latestData);
+            
+            if (send(latestData)) {
+                dataChanged = false;
+            }
+            transmitLED = 0;
+        }
+    }
+}
+
+
+void ledTock() {
+    transmitLED = !transmitLED;
+}
+
+void periodicSendTock() {
+    dataChanged = true;
+}
+
+void batteryvoltageMonitorTock() {
+    timeToReadBatteryVoltage = true;
+
+//    if (sentSetPoint != setPoint) {
+        dataChanged = true;
+    }
+
+void printVersion()
+{
+    printf("%s\r\n\r\n", dot->getId().c_str());
+}
+
+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 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());
+ }
diff -r 000000000000 -r 5fa2b08cb3e0 mbed-rtos.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Wed Oct 28 23:53:58 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#12552ef4e980
diff -r 000000000000 -r 5fa2b08cb3e0 mbed-src.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-src.lib	Wed Oct 28 23:53:58 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-src/#30f9462b5296