Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FXOS8700CQ MODSERIAL mbed
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();