JLC test

Dependencies:   PinDetect libmDot mbed-rtos mbed

Files at this revision

API Documentation at this revision

Comitter:
tmulrooney
Date:
Fri Jan 22 00:33:38 2016 +0000
Child:
1:96c429800568
Commit message:
test for JLC

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.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/PinDetect.lib	Fri Jan 22 00:33:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/AjK/code/PinDetect/#cb3afc45028b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libmDot.lib	Fri Jan 22 00:33:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/teams/MultiTech/code/libmDot/#0b4eb17d07ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Fri Jan 22 00:33:38 2016 +0000
@@ -0,0 +1,418 @@
+/**********************************************************************************
+ * 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 I2C_TIME 5
+#define LED_TIME 1
+#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(PTB0);
+DigitalIn powerOn(PTC1);        /* SW2 */
+DigitalIn killStatus(PTB17);    /* SW3 */
+DigitalOut led_red(PTA1);
+DigitalOut led_green(PTA2);
+//DigitalOut led_blue(PTD5);
+DigitalOut spi_cs(PTD4);
+
+Serial pc(PTE0, PTE1);
+
+// 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 readyToSendI2C;
+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];
+I2C i2c_mem(PTB3,PTB2);
+//SPI spi_rf(PTD6, PTD7, PTD5, PTD4);
+SPI spi_rf(PTD6, PTD7, PTD5);
+int myI2CWrite(int addr, char *data, int length);
+int myI2CRead(int addr, char *data, int length);
+int mySPIWrite(int addr, char *data, int length);
+int mySPIRead(int addr, char *data, int length);
+
+int i2cAddr = 0xAA;
+char data[0x10];
+char data1[0x10];
+
+int main()
+{
+    bool configFail = false;
+    int ack;
+    
+    readyToSendI2C = false;
+    readyToSendBatteryVoltage = false;
+    readyToSendKillStatus = false;
+    readyToSendPowerOn = false;
+    lastBatteryVoltage = 0.0;
+    lastKillStatus = killStatus;
+    lastPowerOn = powerOn;
+    
+    i2c_mem.frequency(100000);
+    
+    // Setup the spi for 8 bit data, high steady state clock,
+    // second edge capture, with a 1MHz clock rate
+ //   spi_rf.format(16,3);
+    spi_rf.format(16,0);
+    spi_rf.frequency(1000000);
+    spi_cs = 1;
+  
+    //Start LED startup sequence
+    ledTimer.attach(&ledWrite, LED_TIME);
+ 
+    pc.baud(115200);
+    pc.printf("\r\n\r\n");
+    pc.printf("=====================================\r\n");
+    pc.printf("I2C Demo \r\n");
+    pc.printf("=====================================\r\n");
+    
+    // get the mDot handle
+//     dot = mDot::getInstance();  
+    printVersion();
+/*    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
+    led_red = 1;
+    led_green = 1;
+ //   led_blue = 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(readyToSendI2C)
+        {       
+        #if 0
+            data[0] = 0x12;
+            data[1] = 0x34;
+            data[2] = 0x56;
+            myI2CWrite(0,data,3);
+            myI2CRead(0,data1,3);
+            sprintf(latestData,"I2c %02X %02X %02X",data1[0], data1[1], data1[2]);
+            pc.printf("%s\r\n",latestData);
+        #endif
+            
+        #if 1
+            // Send 0x8f, the command to read the WHOAMI register
+             data[0] = 0x12;
+//           mySPIWrite(0x0A,data,1);
+//            mySPIRead(0x0A,data1,1);
+           mySPIRead(0x42,data1,1);
+ //            int spiData = spi_rf.write(0x0600 | 0x0000);
+            sprintf(latestData,"SPI %02X %02X",data1[0], data1[1]);
+            pc.printf("%s\r\n",latestData);
+  
+         #endif
+            send(latestData);
+            readyToSendI2C = false;
+        }
+        if(readyToSendBatteryVoltage)
+        {       
+            sprintf(latestData,"Voltage %2.2f",(double)lastBatteryVoltage);
+            pc.printf("%s\r\n",latestData);
+            send(latestData);
+            readyToSendBatteryVoltage = false;
+        }
+        if(readyToSendKillStatus)
+        {       
+            sprintf(latestData,"KillStatus %d",lastKillStatus);
+            pc.printf("%s\r\n",latestData);
+            send(latestData);
+            readyToSendKillStatus = false;
+        }
+        if(readyToSendPowerOn)
+        {       
+            sprintf(latestData,"PowerOn %d",lastPowerOn);
+            pc.printf("%s\r\n",latestData);
+            send(latestData);
+            readyToSendPowerOn = false;
+        }
+     }
+}
+
+int myI2CWrite(int addr, char *data, int length)
+{   
+    int i;
+    char bytes[3];
+ 
+    for(i=0; i< length; i++,addr++)
+    {
+        bytes[0] = addr << 8;
+        bytes[1] = addr & 0xFF;
+        bytes[2] = data[i];
+        i2c_mem.write(i2cAddr, bytes, 3);               /* write address and one byte */
+        while(i2c_mem.write(i2cAddr, bytes, 0) != 0);   /* wait till write complete */
+    }
+    return 0;
+} 
+
+int myI2CRead(int addr, char *data, int length)
+{   
+    char bytes[2];
+ 
+    bytes[0] = addr << 8;
+    bytes[1] = addr & 0xFF;
+    i2c_mem.write(i2cAddr, bytes, 2,true);      /* write address with repeated start */
+    i2c_mem.read(i2cAddr, data, length);        /* read all bytes */
+    return 0;
+}
+
+
+int mySPIWrite(int addr, char *data, int length)
+{   
+    int i;
+    
+    for(i=0;i<length;i++,addr++)
+    {
+        spi_cs = 0;
+        data[i] = spi_rf.write( (addr << 8) | data[i] | 0x8000);
+        spi_cs = 1;
+    }
+    return 0;
+}
+
+int mySPIRead(int addr, char *data, int length)
+{   
+    int i;
+    
+    for(i=0;i<length;i++,addr++)
+    {
+        spi_cs = 0;
+        data[i] = spi_rf.write( (addr << 8) | data[i] | 0x0000);
+        spi_cs = 1;
+    }
+    return 0;
+ }
+
+void ledWrite()
+{
+   led_red = !led_red;
+//    led_green = !led_green;
+//   led_blue = !led_blue;
+    readyToSendI2C = true;
+  }
+
+void batteryRead() 
+{
+    lastBatteryVoltage = batteryVoltage * (float)3.3;
+    readyToSendBatteryVoltage = true;
+}
+
+void killStatusRead() 
+{   
+    lastKillStatus = killStatus;
+    readyToSendKillStatus = true;
+}
+
+void powerOnRead() 
+{   
+    lastPowerOn = powerOn;
+    readyToSendPowerOn = true;
+ }
+
+void printVersion()
+{
+ //   pc.printf("%s Built on: %s %s\r\n\r\n", dot->getId().c_str(),__DATE__,__TIME__);
+   pc.printf("Built on: %s %s\r\n\r\n", __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());
+ }
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed-rtos.lib	Fri Jan 22 00:33:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed-rtos/#6c35e082773a
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Fri Jan 22 00:33:38 2016 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/165afa46840b
\ No newline at end of file