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:
10:658720d51610
Parent:
7:3ccfc47b8e0b
Child:
12:ad92bbb6312f
--- a/main.cpp	Tue Aug 23 16:51:04 2016 +0000
+++ b/main.cpp	Tue Aug 23 18:03:01 2016 -0400
@@ -30,7 +30,15 @@
  *
  */
 
+// #define MTDOT_EVB
+
+//#define MTDOT_UDK
+
 #include "mbed.h"
+#include "senet_packet.h"
+
+// EVB Sensors
+#ifdef MTDOT_EVB
 #include "MMA845x.h"
 #include "MPL3115A2.h"
 #include "ISL29011.h"
@@ -38,6 +46,10 @@
 #include "DOGS102.h"
 #include "font_6x8.h"
 #include "MultiTech_Logo.h"
+#elif defined(MTDOT_UDK)
+#include "x_nucleo_iks01a1.h"
+#endif
+
 #include "mDot.h"
 #include "rtos.h"
 #include <string>
@@ -66,12 +78,33 @@
     uint8_t t_u[2];		// convert to 8 bit unsigned array
 };
 
+struct BoardSensorData
+{
+    float temperature;
+    float pressure;
+    int32_t accel_x;
+    int32_t accel_y;
+    int32_t accel_z;
+
+    inline void init()
+    {
+        temperature= 0;
+        pressure = 0;
+        accel_x = 0;
+        accel_y = 0;
+        accel_z = 0;
+    }
+
+    BoardSensorData() { init(); }
+};
+
 //DigitalIn mDot02(PA_2);          				//  GPIO/UART_TX
 //DigitalOut mDot03(PA_3);         				//  GPIO/UART_RX
 //DigitalIn mDot04(PA_6);          				//  GPIO/SPI_MISO
 //DigitalIn mDot06(PA_8);          				//  GPIO/I2C_SCL
 //DigitalIn mDot07(PC_9);         				//  GPIO/I2C_SDA
 
+#ifdef MDOT_EVB
 InterruptIn mDot08(PA_12);           			//  GPIO/USB       PB S1 on EVB
 InterruptIn mDot09(PA_11);           			//  GPIO/USB       PB S2 on EVB
 
@@ -95,6 +128,11 @@
 I2C mDoti2c(PC_9,PA_8);							// mDot External I2C mDot6 and mDot7
 
 SPI mDotspi(PA_7,PA_6,PA_5);					// mDot external SPI mDot11, mDot4, and mDot18
+#elif defined(MTDOT_UDK)
+
+Serial debugUART(USBTX, USBRX);				// mDot debug UART
+
+#endif
 
 /* **** replace these values with the proper public or private network settings ****
  * config_network_nameand config_network_pass are for private networks.
@@ -127,14 +165,20 @@
 
 bool exit_program = false;
 
+#ifdef  MTDOT_EVB
 MMA845x_DATA accel_data;
 MPL3115A2_DATA baro_data;
 uint16_t  lux_data;
-MMA845x* evbAccel;
-MPL3115A2* evbBaro;
-ISL29011* evbAmbLight;
-NCP5623B* evbBackLight;
-DOGS102* evbLCD;
+MMA845x* evbAccel      = NULL;
+MPL3115A2* evbBaro     = NULL;
+ISL29011* evbAmbLight  = NULL;
+NCP5623B* evbBackLight = NULL;
+DOGS102* evbLCD        = NULL;
+
+#elif defined(MTDOT_UDK)
+static X_NUCLEO_IKS01A1 *mems_shield; 
+#endif
+
 mDot* mdot_radio;
 
 convert32 convertl;
@@ -154,19 +198,48 @@
 
 void config_pkt_xmit (void const *args);
 
-int main()
+void SendFrame(std::vector<uint8_t> frame)
 {
+    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");
+        frame.clear();
+        if ((mdot_ret = mdot_radio->recv(frame)) != mDot::MDOT_OK) {
+            log_error(mdot_radio,"failed to recv:", mdot_ret);
+        } else {
+            printf("recv data: ");
+            for(uint32_t i = 0;i < frame.size();i++)
+                printf("%02X",frame[i]);
+            printf("\r\n");
+            reflected_value = frame[0];
+            if(reflected_value == position_value)
+            {
+#if MTDOT_EVB
+                evbBackLight->setLEDCurrent(16);
+#endif
+                position_changed = false;
+            }
+#if MTDOT_EVB
+            else 
+            {
+                evbBackLight->setLEDCurrent(0);
+            }
+#endif
+        }
+    }
+}
 
-    std::vector<uint8_t> mdot_data;
-    std::vector<uint8_t> mdot_EUI;
-    uint16_t i = 0;
+#ifdef MDOT_EVB
+void BoardInit()
+{
+    static Thread thread_1(pb1_debounce);	 // threads for de-bouncing pushbutton switches
+    static Thread thread_2(pb2_debounce);
 
     debugUART.baud(115200);
 //  mDotUART.baud(9600);    // mdot UART unused but available on external connector
 
-    Thread thread_1(pb1_debounce);						// threads for de-bouncing pushbutton switches
-    Thread thread_2(pb2_debounce);
-
     thread_3 = new Thread(config_pkt_xmit);				// start thread that sends LoRa packet when SW2 pressed
 
     evbAccel = new MMA845x(mDoti2c,MMA845x::SA0_VSS); 	// setup Accelerometer
@@ -227,117 +300,11 @@
 
     evbLCD->endUpdate();
 
-   printf("\n\r setup mdot\n\r");
-
-    // get a mDot handle
-    mdot_radio = mDot::getInstance();
-
-    if (mdot_radio) {
-        // reset to default config so we know what state we're in
-        mdot_radio->resetConfig();
-        mdot_radio->setLogLevel(6);
-        mdot_radio->setAntennaGain(-3);
-
-        // Setting up LED1 as activity LED
-        mdot_radio->setActivityLedPin(PB_0);
-        mdot_radio->setActivityLedEnable(true);
-
-        // Read node ID
-        mdot_EUI = mdot_radio->getDeviceId();
-        printf("mDot EUI = ");
-
-        for (i=0; i<mdot_EUI.size(); i++) {
-            printf("%02x ", mdot_EUI[i]);
-        }
-        printf("\n\r");
-
-
-// Setting up the mDot with network information.
-
-/*
- * This call sets up private or public mode on the MTDOT. Set the function to true if
- * connecting to a public network
- */
-       printf("setting Public Network Mode\r\n");
-       if ((mdot_ret = mdot_radio->setPublicNetwork(true)) != mDot::MDOT_OK) {
-           log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
-       }
-       mdot_radio->setTxDataRate(mDot::DR0);
-       mdot_radio->setTxPower(14);
-       mdot_radio->setJoinRetries(1);
-       mdot_radio->setJoinMode(mDot::OTA);
+    pckt_time = 10;
+}
 
-/*
- * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
- * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
- * This function can be commented out for EU networks
- */
-        printf("setting frequency sub band\r\n");
-        if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
-            log_error(mdot_radio, "failed to set frequency sub band", mdot_ret);
-        }
-        
-        printf("setting ADR\r\n");
-        if ((mdot_ret = mdot_radio->setAdr(config_adr_on)) != mDot::MDOT_OK) {
-            log_error(mdot_radio, "failed to set ADR", mdot_ret);
-        }
-/*
- * setNetworkName is used for private networks.
- * Use setNetworkID(AppID) for public networks
- */
-
-// 		config_app_id.assign(app_id,app_id+7);
-
-        printf("setting network name\r\n");
-//        if ((mdot_ret = mdot_radio->setNetworkName(config_network_name)) != mDot::MDOT_OK) {
-      if ((mdot_ret = mdot_radio->setNetworkId(config_app_id)) != mDot::MDOT_OK) {
-            log_error(mdot_radio, "failed to set network name", mdot_ret);
-        }
-
-/*
- * setNetworkPassphrase is used for private networks
- * Use setNetworkKey for public networks
- */
-
-// 		config_app_key.assign(app_key,app_key+15);
-
-        printf("setting network password\r\n");
-//        if ((mdot_ret = mdot_radio->setNetworkPassphrase(config_network_pass)) != mDot::MDOT_OK) {
-      if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
-            log_error(mdot_radio, "failed to set network password", mdot_ret);
-        }
-
-        // attempt to join the network
-        printf("joining network\r\n");
-        while (((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) && (!exit_program)) {
-            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;
-         	}
-        		
-            printf("delay = %lu\n\r",mdot_ret);
-            osDelay(mdot_ret + 10000);
-        }
-
-        /*
-         * Check for PB1 press during network join attempt
-         */
-        if (exit_program) {
-            printf("Exiting program\n\r");
-            evbLCD->clearBuffer();
-            sprintf(txtstr,"Exiting Program");
-            evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
-            exit(1);
-        }
-
-    } else {
-        printf("radio setup failed\n\r");
-        //exit(1);
-    }
-
+void PostJoinInit()
+{
     osDelay(200);
     evbBackLight->setPWM(NCP5623B::LED_3,16); // enable LED2 on EVB and set to 50% PWM
 
@@ -409,183 +376,395 @@
         evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
         exit(1);
     }
+}
+
+void ReadSensors(BoardSensorData &sensorData)
+{
+    MMA845x_DATA accel_data;
+    /*
+     * Test Accelerometer XYZ data ready bit to see if acquisition complete
+     */
+    do {
+        osDelay(100);			// allows other threads to process
+        result = evbAccel->getStatus();
+    } while ((result & MMA845x::XYZDR) == 0 );
+
+    /*
+     * Retrieve and print out accelerometer data
+     */
+    accel_data = evbAccel->getXYZ();
+
+    sprintf(txtstr,"Accelerometer");
+    evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
+    sprintf(txtstr, "x = %d", accel_data._x);
+    evbLCD->writeText(20,1,font_6x8,txtstr,strlen(txtstr));
+    sprintf(txtstr, "y = %d", accel_data._y);
+    evbLCD->writeText(20,2,font_6x8,txtstr,strlen(txtstr));
+    sprintf(txtstr, "z = %d", accel_data._z );
+    evbLCD->writeText(20,3,font_6x8,txtstr,strlen(txtstr));
+
+    sensorData->accel_x = accel_data._x;
+    sensorData->accel_y = accel_data._y;
+    sensorData->accel_z = accel_data._z;
+
+    // Update accelerometer state
+    evbLCD->startUpdate();
+    evbLCD->clearBuffer();
+    
+    // convert to simple position value for use in send/recv
+    if((accel_data._x > 500)&&(accel_data._z < 500))
+    {
+        if(position_value != 0x02)
+            position_changed = true;
+        position_value = 0x02;
+    }
+    else if((accel_data._x < 500)&&(accel_data._z > 500))
+    {
+        if(position_value != 0x01)
+            position_changed = true;
+        position_value = 0x01;
+    }
+    else
+    {
+        if(position_value != 0x00)
+            position_changed = true;
+        position_value= 0x00;
+    }
+
+    if(changed)
+        evbBackLight->setLEDCurrent(0);
+    /*
+     * Trigger a Pressure reading
+     */
+    evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
+                           MPL3115A2::AT_1);
+    evbBaro->triggerOneShot();
+
+    /*
+     * Test barometer device status to see if acquisition is complete
+     */
+    do {
+        osDelay(100);			// allows other threads to process
+        result = evbBaro->getStatus();
+    } while ((result & MPL3115A2::PTDR) == 0 );
+
+    /*
+     * Retrieve and print out barometric pressure
+     */
+    pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
+    num_whole = pressure >> 2;			// 18 bit integer significant
+    num_frac = (pressure & 0x3) * 25;		// 2 bit fractional  0.25 per bit
+    sensorData.pressure = pressure + (.25 * num_frac);
+
+    sprintf(txtstr,"Press=%ld.%02d Pa", num_whole, num_frac);
+    evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
+
+    /*
+     * Trigger a Altitude reading
+     */
+    evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16,
+                           MPL3115A2::AT_1);
+    evbBaro->triggerOneShot();
+
+    /*
+     * Test barometer device status to see if acquisition is complete
+     */
+    do {
+        osDelay(100);			// allows other threads to process
+        result = evbBaro->getStatus();
+    } while ((result & MPL3115A2::PTDR) == 0 );
+
+    /*
+     * Retrieve and print out altitude and temperature
+     */
+    baro_data = evbBaro->getAllData(false);
+    baro_data._baro /= 4096;				// convert 32 bit signed to 20 bit signed value
+    num_whole = baro_data._baro / 16;		//	18 bit signed significant integer
+    num_frac = (baro_data._baro & 0xF) * 625 / 100;		// 4 bit fractional .0625 per bit
+    sprintf(txtstr,"Alti=%ld.%03d m", num_whole, num_frac);
+    evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
+    num_whole = baro_data._temp / 16;		// 8 bit signed significant integer
+    num_frac = (baro_data._temp & 0x0F) * 625 / 100;		// 4 bit fractional .0625 per bit
+    sensor.temperature = num_whole  + ((float)num_frac / 100);
+    sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
+    evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
+
+    /*
+     * retrieve and print out Ambient Light level
+     */
+    lux_data = evbAmbLight->getData();
+    num_whole = lux_data * 24 / 100;		// 16000 lux full scale .24 lux per bit
+    num_frac = lux_data * 24 % 100;
+    sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
+    evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
+
+    evbLCD->endUpdate();
+    printf("finished iteration %d\n\r",(++i));
+}
+
+uint32_t PrepareFrame(std::vector<uint8_t> frame, BoardSensorData &data)
+{
+    if (i % pckt_time != 0) 
+        return 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);
+    /*frame.push_back(0x0E);			// key for Current Acceleration 3-Axis Value
+    converts.f_s = accel_data._x *4;		// shift data 2 bits while retaining sign
+    frame.push_back(converts.t_u[1]);	// get 8 MSB of 14 bit value
+    converts.f_s = accel_data._y * 4;		// shift data 2 bits while retaining sign
+    frame.push_back(converts.t_u[1]);	// get 8 MSB of 14 bit value
+    converts.f_s = accel_data._z * 4;		// shift data 2 bits while retaining sign
+    frame.push_back(converts.t_u[1]);	// get 8 MSB of 14 bit value
+    */
+    /*
+    frame.push_back(0x08);			// key for Current Pressure Value
+    convertl.f_u = pressure;				// pressure data is 20 bits unsigned
+    frame.push_back(convertl.t_u[2]);
+    frame.push_back(convertl.t_u[1]);
+    frame.push_back(convertl.t_u[0]);
+    frame.push_back(0x05);			// key for Current Ambient Light Value
+    converts.f_u = lux_data;				// data is 16 bits unsigned
+    frame.push_back(converts.t_u[1]);
+    frame.push_back(converts.t_u[0]);
+    frame.push_back(0x0B);			// key for Current Temperature Value
+    converts.f_s = baro_data._temp;		// temperature is signed 12 bit
+    frame.push_back(converts.t_u[1]);
+    frame.push_back(converts.t_u[0]);
+*/
+
+    if((reflected_value != position_value)||(position_changed)||(0 == (i%100)))
+    {
+    }
+}
+
+#elif defined(MTDOT_UDK)
+
+void BoardInit()
+{ 
+    debugUART.baud(115200); 
+
+    // ST X-NUCLEO-IKS01A1 MEMS Shield
+    mems_shield = X_NUCLEO_IKS01A1::Instance(); 
+}
+
+void PostJoinInit() { }
+
+
+void ReadSensors(BoardSensorData &data)
+{
+    uint32_t ret = 0;
+    int32_t  accel_data[3];
+    
+   // Temperature
+   ret |= (!CALL_METH(mems_shield->pt_sensor, GetTemperature, &data.temperature, 0.0f) ? 0x0 : 0x1);
+
+   // Pressure
+   ret |= (!CALL_METH(mems_shield->pt_sensor, GetPressure, &data.pressure, 0.0f) ? 0x0 : 0x1);
+
+   // Accelerometer
+   MotionSensor *motionSensor = mems_shield->GetAccelerometer();
+   if( motionSensor != NULL)
+   {
+       motionSensor->Get_X_Axes(accel_data);
+
+       data.accel_x = accel_data[0];
+       data.accel_y = accel_data[1];
+       data.accel_z = accel_data[2];
+   }
+
+   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);
+
+   osDelay(5000);
+
+}
+
+uint32_t PrepareFrame(std::vector<uint8_t> frame, BoardSensorData &data)
+{
+    static uint8_t buffer[64];
+    uint16_t xyz_mask = 0;
+
+    // Sensor packet type serialized to the LMIC frame buffer
+    SensorPacket packet(buffer, sizeof(frame));
+
+    packet.setPrimarySensor(xyz_mask);
+    packet.setTemperature(data.temperature);
+    packet.setPressure(data.pressure);
+            
+    // Serialize  packet to LMIC transmit buffer
+    packet.serialize();
+
+    frame.assign(packet.payload(), packet.payload() + packet.length());
+
+    return frame.size();
+}
+
+
+
+#else
+#error Board type not defined!
+#endif
+
+void mDotConfigureAndJoin()
+{ 
+    bool ok;
+    
+    // get mDot handle
+    mdot_radio = mDot::getInstance();
+    if(mdot_radio == NULL)
+    { 
+        while(1) {
+            printf("radio setup failed\n\r");
+            osDelay(1000);
+        }
+    }
+
+    do{
+        ok = true; 
+
+        printf("\n\r setup mdot\n\r"); 
+        
+        // reset to default config so we know what state we're in
+        mdot_radio->resetConfig();
+        mdot_radio->setLogLevel(6);
+
+        mdot_radio->setAntennaGain(-3);
+
+        // Setting up LED1 as activity LED
+#ifdef MDOT_EVB
+        mdot_radio->setActivityLedPin(PB_0);
+        mdot_radio->setActivityLedEnable(true);
+#endif
+
+        // Read node ID
+        std::vector<uint8_t> mdot_EUI;
+        mdot_EUI = mdot_radio->getDeviceId();
+        printf("mDot EUI = ");
+
+        for (uint8_t i=0; i<mdot_EUI.size(); i++) {
+            printf("%02x ", mdot_EUI[i]);
+        }
+        printf("\n\r");
+
+
+// Setting up the mDot with network information.
+
+    /*
+     * This call sets up private or public mode on the MTDOT. Set the function to true if
+     * connecting to a public network
+     */
+       printf("setting Public Network Mode\r\n");
+       if ((mdot_ret = mdot_radio->setPublicNetwork(true)) != mDot::MDOT_OK) {
+           log_error(mdot_radio, "failed to set Public Network Mode", mdot_ret);
+       }
+       mdot_radio->setTxDataRate(mDot::DR0);
+       mdot_radio->setTxPower(14);
+       mdot_radio->setJoinRetries(1);
+       mdot_radio->setJoinMode(mDot::OTA);
+
+    /*
+     * Frequency sub-band is valid for NAM only and for Private networks should be set to a value
+     * between 1-8 that matches the the LoRa gateway setting. Public networks use sub-band 0 only.
+     * This function can be commented out for EU networks
+     */
+       printf("setting frequency sub band\r\n");
+        if ((mdot_ret = mdot_radio->setFrequencySubBand(config_frequency_sub_band)) != mDot::MDOT_OK) {
+            log_error(mdot_radio, "failed to set frequency sub band", mdot_ret);
+            ok = false;
+        }
+        
+        printf("setting ADR\r\n");
+        if ((mdot_ret = mdot_radio->setAdr(config_adr_on)) != mDot::MDOT_OK) {
+            log_error(mdot_radio, "failed to set ADR", mdot_ret);
+            ok = false;
+        }
+    /*
+     * setNetworkName is used for private networks.
+     * Use setNetworkID(AppID) for public networks
+     */ 
+        printf("setting network name\r\n");
+        if ((mdot_ret = mdot_radio->setNetworkId(config_app_id)) != mDot::MDOT_OK) {
+            log_error(mdot_radio, "failed to set network name", mdot_ret);
+            ok = false;
+        }
+
+    /*
+     * setNetworkPassphrase is used for private networks
+     * Use setNetworkKey for public networks
+     */ 
+        printf("setting network password\r\n");
+        if ((mdot_ret = mdot_radio->setNetworkKey(config_app_key)) != mDot::MDOT_OK) {
+            log_error(mdot_radio, "failed to set network password", mdot_ret);
+            ok = false;
+        } 
+    }while(ok == false);
+  
+  // attempt to join the network
+  printf("joining network\r\n");
+  while (((mdot_ret = mdot_radio->joinNetwork()) != mDot::MDOT_OK) && (!exit_program)) {
+      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;
+      } 
+
+      printf("delay = %lu\n\r",mdot_ret);
+      osDelay(mdot_ret + 10000);
+  } 
+}
+
+int main()
+{
+    BoardSensorData sensorData;
+    
+    // Board specific initialization
+    BoardInit(); 
+
+    // mDot configuration and join
+    //mDotConfigureAndJoin();
+
+    PostJoinInit();
+
+  /*
+   * Check for PB1 press during network join attempt
+   */
+  if (exit_program) {
+      printf("Exiting program\n\r");
+
+#ifdef MDOT_EVB
+      evbLCD->clearBuffer();
+      sprintf(txtstr,"Exiting Program");
+      evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
+#endif
+      exit(1);
+  } 
 
     /*
      * Main data acquisition loop
      */
-    pckt_time = 10;
-    i = 0;
-
     do {
-        evbLCD->startUpdate();
-        evbLCD->clearBuffer();
-
-        /*
-         * Test Accelerometer XYZ data ready bit to see if acquisition complete
-         */
-        do {
-            osDelay(100);			// allows other threads to process
-            result = evbAccel->getStatus();
-        } while ((result & MMA845x::XYZDR) == 0 );
-
-        /*
-         * Retrieve and print out accelerometer data
-         */
-        accel_data = evbAccel->getXYZ();
-
-        sprintf(txtstr,"Accelerometer");
-        evbLCD->writeText(0,0,font_6x8,txtstr,strlen(txtstr));
-        sprintf(txtstr, "x = %d", accel_data._x);
-        evbLCD->writeText(20,1,font_6x8,txtstr,strlen(txtstr));
-        sprintf(txtstr, "y = %d", accel_data._y);
-        evbLCD->writeText(20,2,font_6x8,txtstr,strlen(txtstr));
-        sprintf(txtstr, "z = %d", accel_data._z );
-        evbLCD->writeText(20,3,font_6x8,txtstr,strlen(txtstr));
-        // convert to simple position value for use in send/recv
-		if((accel_data._x > 500)&&(accel_data._z < 500))
-		{
-			if(position_value != 0x02)
-				position_changed = true;
-			position_value = 0x02;
-		}
-		else if((accel_data._x < 500)&&(accel_data._z > 500))
-		{
-			if(position_value != 0x01)
-				position_changed = true;
-			position_value = 0x01;
-		}
-		else
-		{
-			if(position_value != 0x00)
-				position_changed = true;
-			position_value= 0x00;
-		}
-		if(position_changed)
-			evbBackLight->setLEDCurrent(0);
-		
-        /*
-         * Trigger a Pressure reading
-         */
-        evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_BAROMETER, MPL3115A2::OR_16,
-                               MPL3115A2::AT_1);
-        evbBaro->triggerOneShot();
-
-        /*
-         * Test barometer device status to see if acquisition is complete
-         */
-        do {
-            osDelay(100);			// allows other threads to process
-            result = evbBaro->getStatus();
-        } while ((result & MPL3115A2::PTDR) == 0 );
-
-        /*
-         * Retrieve and print out barometric pressure
-         */
-        pressure = evbBaro->getBaroData() >> 12; // convert 32 bit signed to 20 bit unsigned value
-        num_whole = pressure >> 2;			// 18 bit integer significant
-        num_frac = (pressure & 0x3) * 25;		// 2 bit fractional  0.25 per bit
-        sprintf(txtstr,"Press=%ld.%02d Pa", num_whole, num_frac);
-        evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
-
-        /*
-         * Trigger a Altitude reading
-         */
-        evbBaro->setParameters(MPL3115A2::DATA_NORMAL, MPL3115A2::DM_ALTIMETER, MPL3115A2::OR_16,
-                               MPL3115A2::AT_1);
-        evbBaro->triggerOneShot();
+        std::vector<uint8_t> frame;
+        
+        // Acquire sensor values
+        ReadSensors(sensorData);
+        
+        // Send sensor packets
+        if( PrepareFrame(frame, sensorData) > 0 ){
+            SendFrame( frame );
+        }
 
-        /*
-         * Test barometer device status to see if acquisition is complete
-         */
-        do {
-            osDelay(100);			// allows other threads to process
-            result = evbBaro->getStatus();
-        } while ((result & MPL3115A2::PTDR) == 0 );
+    } while(!exit_program);
 
-        /*
-         * Retrieve and print out altitude and temperature
-         */
-        baro_data = evbBaro->getAllData(false);
-        baro_data._baro /= 4096;				// convert 32 bit signed to 20 bit signed value
-        num_whole = baro_data._baro / 16;		//	18 bit signed significant integer
-        num_frac = (baro_data._baro & 0xF) * 625 / 100;		// 4 bit fractional .0625 per bit
-        sprintf(txtstr,"Alti=%ld.%03d m", num_whole, num_frac);
-        evbLCD->writeText(0,5,font_6x8,txtstr,strlen(txtstr));
-        num_whole = baro_data._temp / 16;		// 8 bit signed significant integer
-        num_frac = (baro_data._temp & 0x0F) * 625 / 100;		// 4 bit fractional .0625 per bit
-        sprintf(txtstr,"Temp=%ld.%03d C", num_whole, num_frac);
-        evbLCD->writeText(0,6,font_6x8,txtstr,strlen(txtstr));
-
-        /*
-         * retrieve and print out Ambient Light level
-         */
-        lux_data = evbAmbLight->getData();
-        num_whole = lux_data * 24 / 100;		// 16000 lux full scale .24 lux per bit
-        num_frac = lux_data * 24 % 100;
-        sprintf(txtstr, "Light=%ld.%02d lux", num_whole, num_frac );
-        evbLCD->writeText(0,7,font_6x8,txtstr,strlen(txtstr));
-
-        evbLCD->endUpdate();
-        printf("finished iteration %d\n\r",(++i));
 
-        if (i % pckt_time == 0) { // check packet counter will send packet every 2-5-10 data collection loops
-            mdot_data.clear();
-            // we will send a simple byte descriptor of the current position of the device: 01 is laying flat, 02 is vertically oriented
-            mdot_data.push_back(0x00);
-            mdot_data.push_back(position_value);
-			/*mdot_data.push_back(0x0E);			// key for Current Acceleration 3-Axis Value
-            converts.f_s = accel_data._x *4;		// shift data 2 bits while retaining sign
-            mdot_data.push_back(converts.t_u[1]);	// get 8 MSB of 14 bit value
-            converts.f_s = accel_data._y * 4;		// shift data 2 bits while retaining sign
-            mdot_data.push_back(converts.t_u[1]);	// get 8 MSB of 14 bit value
-            converts.f_s = accel_data._z * 4;		// shift data 2 bits while retaining sign
-            mdot_data.push_back(converts.t_u[1]);	// get 8 MSB of 14 bit value
-            */
-            /*
-            mdot_data.push_back(0x08);			// key for Current Pressure Value
-            convertl.f_u = pressure;				// pressure data is 20 bits unsigned
-            mdot_data.push_back(convertl.t_u[2]);
-            mdot_data.push_back(convertl.t_u[1]);
-            mdot_data.push_back(convertl.t_u[0]);
-            mdot_data.push_back(0x05);			// key for Current Ambient Light Value
-            converts.f_u = lux_data;				// data is 16 bits unsigned
-            mdot_data.push_back(converts.t_u[1]);
-            mdot_data.push_back(converts.t_u[0]);
-            mdot_data.push_back(0x0B);			// key for Current Temperature Value
-            converts.f_s = baro_data._temp;		// temperature is signed 12 bit
-            mdot_data.push_back(converts.t_u[1]);
-            mdot_data.push_back(converts.t_u[0]);
-*/
-			if((reflected_value  != position_value)||(position_changed)||(0 == (i%100)))
-			{
-	            if ((mdot_ret = mdot_radio->send(mdot_data)) != mDot::MDOT_OK) {
-	                log_error(mdot_radio, "failed to send", mdot_ret);
-	            } else {
-	                printf("successfully sent data to gateway\r\n");
-	                mdot_data.clear();
-	                if ((mdot_ret = mdot_radio->recv(mdot_data)) != mDot::MDOT_OK) {
-		                log_error(mdot_radio,"failed to recv:", mdot_ret);
-		            } else {
-		                printf("recv data: ");
-		                for(int i = 0;i < mdot_data.size();i++)
-		                	printf("%02X",mdot_data[i]);
-	                	printf("\r\n");
-	                	reflected_value = mdot_data[0];
-	                	if(reflected_value == position_value)
-	                	{
-	                		evbBackLight->setLEDCurrent(16);
-	                		position_changed = false;
-                		}
-	                	else
-	                		evbBackLight->setLEDCurrent(0);
-	                }
-	            }
-            }
-        }
-    } while(!exit_program /*&& (i < 65000)*/);
-
+#ifdef MDOT_EVB
     evbBaro->triggerOneShot();
-
     do {
         osDelay(200);			// allows other threads to process
         result = evbBaro->getStatus();
@@ -594,15 +773,15 @@
     baro_data = evbBaro->getAllData(true);
     printf ("minBaro=%ld maxBaro=%ld minTemp=%d maxTemp=%d\n\r", baro_data._minbaro, baro_data._maxbaro,
             baro_data._mintemp, baro_data._maxtemp);
-
-    printf("End of Test\n\r");
-
     evbLCD->clearBuffer();
     sprintf(txtstr,"Exiting Program");
     evbLCD->writeText(0,4,font_6x8,txtstr,strlen(txtstr));
+#endif
 
+    printf("End of Test\n\r");
 }
 
+#ifdef MDOT_EVB
 /*
  * Sets pb1_low flag. Slag is cleared in pb1_debounce thread
  */
@@ -677,6 +856,7 @@
         Thread::wait(5);
  	}
  }
+#endif
 
 /*
  *  Function that print clear text verion of mDot errors