UDK + Shield

Dependencies:   DOGS102 ISL29011 MMA845x MPL3115A2 NCP5623B libmDot_1012-hotifx mbed-rtos mbed-src Senet_Packet X_NUCLEO_IKS01A1

Fork of MTDOT-EVBDemo_Senet by Dave Kjendal

Revision:
14:07ff01da6bbf
Parent:
12:ad92bbb6312f
Child:
16:7b3cc3221db1
Child:
17:162e42587b4d
--- a/main.cpp	Tue Aug 23 23:35:00 2016 -0400
+++ b/main.cpp	Wed Aug 24 13:56:52 2016 -0400
@@ -44,10 +44,30 @@
 #include "font_6x8.h"
 #include "MultiTech_Logo.h"
 
+// Min send delay from end of RX2 
+#define MIN_SEND_DELAY 0
+
+// Send frame period for unchanged sensor value 
+#define MIN_SEND_PERIOD pckt_time
+
+// Send frame period for unchanged sensor value 
+#define MAX_SEND_PERIOD 100 
+
 #elif defined(MTDOT_UDK)
 
 #include "x_nucleo_iks01a1.h"
 
+// Min send delay from end of RX2 
+#define MIN_SEND_DELAY 2000 
+
+// Min send period (limits sending to fast)
+#define MIN_SEND_PERIOD 1  
+
+// Max send period (max time between sends)
+#define MAX_SEND_PERIOD 12  
+
+
+
 #endif
 
 #include "mDot.h"
@@ -116,13 +136,16 @@
  * LoRaWAN Configuration 
  */
 static uint8_t app_id[8]   = {0x00,0x25,0x0C,0x00,0x00,0x01,0x00,0x01};
-static uint8_t app_key[16] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
+static uint8_t app_key[16] = {0x9F,0x93,0xDC,0xEB,0xAC,0x2F,0x4F,0xEE,0x80,0x3C,0x05,0x7A,0x54,0x8E,0x44,0x99};
 
 static std::vector<uint8_t> config_app_id(app_id,app_id+sizeof(app_id)/sizeof(uint8_t));
 static std::vector<uint8_t> config_app_key(app_key,app_key+sizeof(app_key)/sizeof(uint8_t));
 static uint8_t config_frequency_sub_band = 0;
 static bool    config_adr_on = true;
 
+bool     position_changed = true;
+uint32_t sample_period    = 0;
+
 #ifdef  MTDOT_EVB
 MMA845x_DATA accel_data;
 MPL3115A2_DATA baro_data;
@@ -138,7 +161,6 @@
  */
 uint8_t position_value   = 0xFF; // 00 unknown, 01 is flat, 02 is vertical
 uint8_t reflected_value  = 0xFE;
-bool    position_changed = true;
 
 unsigned char test;
 char     txtstr[17];
@@ -161,12 +183,16 @@
 
 #elif defined(MTDOT_UDK)
 
+uint16_t position_value  = 0;
+uint16_t reflected_value = 0;
+
 static X_NUCLEO_IKS01A1 *mems_shield; 
 
 #endif 
 
 mDot* mdot_radio;
 bool  exit_program = false;
+Ticker joinTicker;
 
 /* 
  * Process downlink
@@ -188,25 +214,15 @@
  */
 void SendFrame(std::vector<uint8_t> frame)
 {
-#if 0
-    static uint32_t count = 0; 
-    printf("%lu: send data: ",count++);
-    for(uint32_t i = 0;i < frame.size();i++)
-        printf("%02X",frame[i]);
-    printf("\r\n");
-#endif
+    int32_t mdot_ret;
 
-    int32_t mdot_ret;
     if ((mdot_ret = mdot_radio->send(frame)) != mDot::MDOT_OK) {
         log_error(mdot_radio, "failed to send", mdot_ret);
     } 
     else {
-        printf("successfully sent data to gateway\r\n");
+        printf("successfully sent data\r\n");
         frame.clear();
-        if ((mdot_ret = mdot_radio->recv(frame)) != mDot::MDOT_OK) {
-            log_error(mdot_radio,"failed to recv:", mdot_ret);
-        } else {
-
+        if ((mdot_ret = mdot_radio->recv(frame)) == mDot::MDOT_OK) {
             printf("recv data: ");
             for(uint32_t i = 0;i < frame.size();i++)
                 printf("%02X",frame[i]);
@@ -214,6 +230,10 @@
 
             ReceiveData(frame);
         }
+#ifndef DOWNLINK_REFLECT
+        position_changed = false;
+        reflected_value = position_value;
+#endif
     }
 }
 
@@ -506,24 +526,23 @@
 
 uint32_t PrepareFrame(std::vector<uint8_t> &frame, BoardSensorData &data)
 {
-    if((reflected_value != position_value)|| position_changed)
+    frame.clear();
+
+    if((reflected_value != position_value)|| position_changed || ( ( sample_period % MAX_SEND_PERIOD ) == 0 ) )
     {
-        frame.clear();
         // we will send a simple byte descriptor of the current position of the device: 01 is laying flat, 02 is vertically oriented
         frame.push_back(0x00);
         frame.push_back(position_value);
-        return 2;
     }
 
-    return 0;
+    return frame.size();
 }
 
 bool checkForExit(bool _exit)
 {
     // Check for PB1 press during network join attempt
     if (exit_program) {
-      printf("Exiting program\n\r");
-
+      printf("Exiting program\n\r"); 
       evbLCD->clearBuffer();
       sprintf(txtstr,"Exiting Program");
       evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
@@ -552,11 +571,6 @@
 }
 
 
-void wait()
-{
-    osDelay(1000);
-}
-
 /*
  * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
  */
@@ -655,6 +669,17 @@
 
 void ReceiveData(std::vector<uint8_t> frame)
 {
+    uint16_t value;
+
+    if(frame.size() >= 2)
+    {
+        value = frame[0] << 8 | frame[1];
+        if(value == position_value)
+        {
+            reflected_value = value;
+            position_changed = false;
+        }
+    }
 }
 
 void BoardInit()
@@ -689,29 +714,90 @@
        data.accel_x = accel_data[0];
        data.accel_y = accel_data[1];
        data.accel_z = accel_data[2];
+       /*  z-axis : > 0 = rightside up, < 0 upside down
+        *  x-axis: com LED to the left x < 0, x > 0 on the right
+        *  y-axis: y > 0 COM LED down, y < 0  COM LED up 
+        */
+       bool up         = false;
+       bool down       = false;
+       bool right      = false;
+       bool left       = false;
+       bool horizontal = false;
+       bool upsidedown = false;
+       uint16_t next_value = 0; 
+       
+       // rightside up
+       if(data.accel_z >= 750)
+       {
+           horizontal  = true;
+       }
+       // upside down
+       else if(data.accel_z <= -750)
+       {
+           horizontal  = true;
+           upsidedown  = true;
+           position_value = (2 << 12) | (1 << 8);
+       }
+       // vertical down
+       else if(data.accel_y >= 900 )
+       {
+           down = true;
+       }
+       // vertical up
+       else if(data.accel_y <= -900 )
+       {
+           up = true;
+       }
+       // side right
+       else if(data.accel_x > 900)
+       {
+           right = true;
+       }
+       // side left
+       else
+       {
+           left = true;
+       }
+
+       if(horizontal)
+       {
+           next_value = (2 << 12) | (upsidedown << 8); 
+       }
+       else
+       {
+           next_value = (up << 12) | (left << 8) | (down << 4) | right;
+       }
+
+       if(next_value != position_value)
+       {
+           position_value = next_value;
+           position_changed = true;
+       }
    }
 
-   printf("%s: Temperature=%f, Pressure=%f, x=%ld, y=%ld, z=%ld\r\n",__func__,
-           data.temperature, data.pressure, 
-           data.accel_x, data.accel_y, data.accel_z);
+   printf("%s: position_value=%04x, reflected_value=%04x\r\n",__func__, position_value, reflected_value);
 }
 
 uint32_t PrepareFrame(std::vector<uint8_t> &frame, BoardSensorData &data)
 {
-    static uint8_t buffer[256];
-    uint16_t xyz_mask = 0;
+    static uint8_t buffer[64];
+
+    frame.clear();
 
     // Sensor packet type serialized to the LMIC frame buffer
-    SensorPacket packet(buffer, sizeof(frame));
+    SensorPacket packet(buffer, sizeof(buffer));
 
-    packet.setPrimarySensor(xyz_mask);
-    packet.setTemperature(data.temperature);
-    packet.setPressure(data.pressure);
-            
-    // Serialize  packet to LMIC transmit buffer
-    packet.serialize();
+    if( position_changed  || (reflected_value != position_value) || ( ( sample_period % MAX_SEND_PERIOD ) == 0 ) )
+    {
+        packet.setPrimarySensor(position_value);
+        packet.setTemperature(data.temperature);
+        packet.setPressure(data.pressure);
+                
+        // Serialize  packet 
+        packet.serialize();
 
-    frame.assign(packet.payload(), packet.payload() + packet.length());
+        frame.assign(packet.payload(), packet.payload() + packet.length());
+    }
 
     return frame.size();
 }
@@ -724,16 +810,17 @@
     printf("Exiting\n\r");
 }
 
-void wait()
-{
-    osDelay(5000);
-}
-
-
 #else
 #error Board type not defined!
 #endif
 
+DigitalOut joinLED(PA_0);
+
+void joinLedToggle()
+{
+    joinLED = !joinLED;
+}
+
 void mDotConfigureAndJoin()
 { 
     bool    ok;
@@ -758,7 +845,7 @@
         
         // reset to default config so we know what state we're in
         mdot_radio->resetConfig();
-        mdot_radio->setLogLevel(6);
+        //mdot_radio->setLogLevel(6);
 
         mdot_radio->setAntennaGain(-3);
 
@@ -833,22 +920,26 @@
 
     }while(ok == false);
 
-  // attempt to join the network
-  printf("joining network\r\n");
-  while ((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) {
-      log_error(mdot_radio,"failed to join network:", mdot_ret);
-      if (mdot_radio->getFrequencyBand() == mDot::FB_868){
-          mdot_ret = mdot_radio->getNextTxMs();
-      }
-      else {
-          mdot_ret = 0;
-      } 
+    joinTicker.attach(joinLedToggle,1); 
+    
+    // attempt to join the network
+    printf("joining network\r\n");
+    while ((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) { 
+        log_error(mdot_radio,"failed to join network:", mdot_ret);
+        if (mdot_radio->getFrequencyBand() == mDot::FB_868){
+            mdot_ret = mdot_radio->getNextTxMs();
+        }
+        else {
+            mdot_ret = 0;
+        } 
+        checkForExit(true);
+        printf("delay = %lu\n\r",mdot_ret);
+        osDelay(mdot_ret + 10000);
+    } 
+    printf("network joined\r\n");
 
-      checkForExit(true);
-
-      printf("delay = %lu\n\r",mdot_ret);
-      osDelay(mdot_ret + 10000);
-  } 
+    joinTicker.detach(); 
+    joinLED=1;
 }
 
 
@@ -869,17 +960,26 @@
     /*
      * Main data acquisition loop
      */
-    do {
-        // Acquire sensor values
-        ReadSensors(sensorData);
+    while(!checkForExit(false))
+    {
+        if( MIN_SEND_DELAY  > 0 )
+            osDelay( MIN_SEND_DELAY ); 
 
-        // Send sensor packets
-        if( PrepareFrame(frame, sensorData) > 0 ){
-            SendFrame( frame );
+        // Minimum delay between sampling
+        if( ( sample_period % MIN_SEND_PERIOD ) == 0 )
+        {
+            // Acquire sensor values
+            ReadSensors(sensorData);
+
+            // Generate frame if send conditions are satisified
+            if( PrepareFrame(frame, sensorData) > 0 )
+            {
+                // Send sensor packets
+                SendFrame( frame );
+            }
         }
-        wait();
-
-    } while(!checkForExit(false));
+        sample_period++;
+    } 
 
     ExitingProgram();
 }