Remote I/O Sensor bus with AT&T flow and M2X cloud

Dependencies:   DHT11 FXOS8700CQ MODSERIAL mbed

Fork of Avnet_ATT_Cellular_IOT by Avnet

Revision:
55:3abf9e3f42e6
Parent:
11:e6602513730f
Child:
56:cb42ff383dab
--- a/sensors.cpp	Wed Jul 27 01:58:25 2016 +0000
+++ b/sensors.cpp	Thu Jul 28 15:52:37 2016 +0000
@@ -1,13 +1,11 @@
 #include "mbed.h"
+#include "hardware.h"
 #include "sensors.h"
 
 //I2C for pmod sensors:
 #define Si1145_PMOD_I2C_ADDR   0xC0 //this is for 7-bit addr 0x60 for the Si7020
 #define Si7020_PMOD_I2C_ADDR   0x80 //this is for 7-bit addr 0x4 for the Si7020
 
-#include "hardware.h"
-//I2C i2c(PTC11, PTC10); //SDA, SCL
-
 #include "FXOS8700CQ.h"
 // Pin names for the motion sensor FRDM-K64F board:
 FXOS8700CQ fxos(PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // SDA, SCL, (addr << 1)
@@ -354,8 +352,137 @@
     } //bMotionSensor_present
 } //read_motion_sensor
 
+
+#ifdef USE_VIRTUAL_SENSORS
+bool bUsbConnected = false;
+volatile uint8_t usb_uart_rx_buff[256];
+//volatile uint8_t usb_uart_tx_buff[256];
+volatile unsigned char usb_uart_rx_buff_putptr = 0;
+volatile unsigned char usb_uart_rx_buff_getptr = 0;
+//volatile unsigned char usb_uart_tx_buff_putptr = 0;
+//volatile unsigned char usb_uart_tx_buff_getptr = 0;
+char usbhost_rx_string[256];
+unsigned char usbhost_rxstring_index;
+char usbhost_tx_string[256];
+
+
+float f_sensor1_value = 12.3;
+float f_sensor2_value = 45.6;
+float f_sensor3_value = 78.9;
+float f_sensor4_value = 78.9;
+float f_sensor5_value = 78.9;
+float f_sensor6_value = 78.9;
+float f_sensor7_value = 78.9;
+float f_sensor8_value = 78.9;
+char usb_sensor_string[110];
+
+
+//********************************************************************************************************************************************
+//* Parse the input sensor data from the USB host
+//********************************************************************************************************************************************
+int parse_usbhost_message()
+{
+    //printf("String = %s\n", usbhost_rx_string); //test
+    uint8_t length;
+    uint8_t x ;
+    //It seems that sscanf needs 11 characters to store a 7-character number.  There must be some formatting and termination values...
+    char Record[8][11]; //There are 8 sensors with up to 7 characters each
+    char StringRecord[110]; //There are is a sensor "string" with up to 100 characters in it
+
+    // Data format is:  "S1:1234,S2:5678,S3:1234,S4:5678,S5:1234,S6:5678,S7:5678,S8:5678,S9:abcde...\n"
+    int args_assigned = sscanf(usbhost_rx_string, "%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^','],%[^\n]", Record[0], Record[1], Record[2], Record[3], Record[4], Record[5], Record[6], Record[7],  StringRecord);
+
+    //StringRecord[109] = '\0';
+    //printf("Last = %s\n", StringRecord); //test
+
+    if (args_assigned == 9)
+    { //sscanf was able to assign all 9 values
+        for (x=0; x < 8; x++)  // loop through the 8 sensors
+        {
+            // Strip the "Sx:" label characters from the field value
+            length = strlen(Record[x]);             // max of 7 characters but could be less
+            strncpy(Record[x], Record[x] + 3, length);
+            Record[x][length] = '\0';              // null termination character manually added
+        }
+        length = strlen(StringRecord);
+        strncpy(StringRecord, StringRecord + 3, length);
+        StringRecord[length] = '\0';   // null termination character manually added
+    
+        if ((usbhost_rx_string[0] == 'S') && (usbhost_rx_string[1] == '1')) //The message starts with "S1"
+        {
+            f_sensor1_value = atof(Record[0]);
+            f_sensor2_value = atof(Record[1]);
+            f_sensor3_value = atof(Record[2]);
+            f_sensor4_value = atof(Record[3]);
+            f_sensor5_value = atof(Record[4]);
+            f_sensor6_value = atof(Record[5]);
+            f_sensor7_value = atof(Record[6]);
+            f_sensor8_value = atof(Record[7]);
+            sprintf(usb_sensor_string,StringRecord);
+            //printf("Received = %s, %s, %s, %s, %s, %s, %s, %s, %s\n", Record[0], Record[1], Record[2], Record[3], Record[4], Record[5], Record[6], Record[7], usb_sensor_string); //test
+            sprintf(SENSOR_DATA.Virtual_Sensor1, "%s", Record[0]);
+            sprintf(SENSOR_DATA.Virtual_Sensor2, "%s", Record[1]);
+            sprintf(SENSOR_DATA.Virtual_Sensor3, "%s", Record[2]);
+            sprintf(SENSOR_DATA.Virtual_Sensor4, "%s", Record[3]);
+            sprintf(SENSOR_DATA.Virtual_Sensor5, "%s", Record[4]);
+            sprintf(SENSOR_DATA.Virtual_Sensor6, "%s", Record[5]);
+            sprintf(SENSOR_DATA.Virtual_Sensor7, "%s", Record[6]);
+            sprintf(SENSOR_DATA.Virtual_Sensor8, "%s", Record[7]);
+        }
+    } //sscanf was able to assign all values
+    return args_assigned;
+} //parse_usbhost_message()
+
+//********************************************************************************************************************************************
+//* Process any received message from the USB host
+//********************************************************************************************************************************************
+void process_usb_rx(unsigned char ucNewRxByte)
+{
+    if (ucNewRxByte == '?')
+    { //just pinging
+        usbhost_rxstring_index = 0;
+        return;
+    } //just pinging
+    usbhost_rx_string[usbhost_rxstring_index++] = ucNewRxByte;
+    if (ucNewRxByte == '\n')
+    { //end of message
+        usbhost_rx_string[usbhost_rxstring_index] = 0; //null terminate string
+        usbhost_rxstring_index = 0;
+        parse_usbhost_message();
+    } //end of message
+} //process_usb_rx()
+
+void ProcessUsbInterface(void)
+{
+    //Process the USB host UART receive commands:
+    if (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
+    {
+        bUsbConnected = true;
+        while (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
+        {
+            unsigned char ucByteFromHost = usb_uart_rx_buff[usb_uart_rx_buff_getptr++]; //Copy latest received byte
+            process_usb_rx(ucByteFromHost);
+        }  //while (usb_uart_rx_buff_getptr != usb_uart_rx_buff_putptr)
+    } // if there are USB UART bytes to receive
+    //USB host UART transmit:
+    //while (usb_uart_tx_buff_getptr != usb_uart_tx_buff_putptr)
+    //{
+        //pc.putc(usb_uart_tx_buff[usb_uart_tx_buff_getptr++]);
+    //}
+} //ProcessUsbInterface()
+
+void pcrx_callback() //Rx interrupt for USB serial port
+{
+    // Note: you need to actually read from the serial to clear the RX interrupt
+    usb_uart_rx_buff[usb_uart_rx_buff_putptr++] = pc.getc();
+}
+#endif
+ 
 void sensors_init(void)
 {
+#ifdef USE_VIRTUAL_SENSORS
+    pc.attach(&pcrx_callback);
+#endif
     Init_Si7020();
     Init_Si1145();
     init_motion_sensor();