![](/media/cache/img/default_profile.jpg.50x50_q85.jpg)
Fork with SeeedStudio Xadow GPS v2 enabled
Dependencies: FXOS8700CQ MODSERIAL XadowGPS mbed
Fork of Avnet_ATT_Cellular_IOT by
Diff: sensors.cpp
- 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();