
HIT Project #3 https://community.freescale.com/docs/DOC-99621
Dependencies: EthernetInterface WebSocketClient mbed-rtos mbed
MonkeyDo!
These are the demo files for Freescale HIT project #3: Monkey Do. It uses a FRDM-AUTO + a FRDM-K64F to demo websockets for a simple IoT application.
See the main MonkeyDo page for all of the schematics, videos, GitHub links, etc for everything else!
https://community.freescale.com/docs/DOC-99621
Diff: main.cpp
- Revision:
- 0:29f58b9daa2c
- Child:
- 1:d87a428e88ee
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Fri Jul 04 22:55:47 2014 +0000 @@ -0,0 +1,142 @@ +#include "System.h" + +char StringBuffer[256]; + + +#define TEMPERATURE_FILTER_SIZE 16 + +float TemperatureFilterBuffer[TEMPERATURE_FILTER_SIZE] = {0}; + +uint32_t TemperatureFilterIndex = 0; + +float Temperature = 0; + +Ticker SystemTicker; + +volatile uint32_t SensorUpdateTicker = 0; + +//This is used for some general purpose timing in the main loop +void SystemTick() +{ + if(SensorUpdateTicker < 0xFFFFFFFF) + SensorUpdateTicker++; +} + +int main() +{ + uint32_t i; + + DISABLE_HIGH_CURRENT_RELAY; + DISABLE_LOW_CURRENT_RELAY; + + InitTerminal(); //Initialize the Terminal State machine + + // enable the usb uart rx fifo + // UART_PFIFO_REG(UART0) |= 0x08; + + //Setup ouur ticker for 1mS + SystemTicker.attach_us(SystemTick,1000); + + PC.printf("\r\n\r\nMonkey Do!\r\n"); + + + PC.printf("Ethernet Init!\r\n"); + eth.init(); //Use DHCP + eth.connect(); + PC.printf("IP Address is %s\r\n", eth.getIPAddress()); + + Websocket ws("ws://sockets.mbed.org:443/ws/emh203/rw"); + + ws.connect(); + + while (1) { + + //Send sensor data to the websocket every second + if(SensorUpdateTicker >= 1000) + { + SensorUpdateTicker = 0; + + Temperature = 0; + + //Take a bunch of measurements and average to help with Data converter Noise + + for(i=0;i<TEMPERATURE_FILTER_SIZE;i++) + { + Temperature += ((TempSensor.read() * 3.3)// * //convert to volts + - 0.500) // subtract off 0c offset .... you may need to calibrate... see MCP9700A-E/TO data sheet + * 100; // Scale to Degrees C + } + Temperature = Temperature / TEMPERATURE_FILTER_SIZE; + + sprintf(StringBuffer,"temp %.1f\r\n",Temperature); + ws.send(StringBuffer); + } + + //See if we have an incoming command, if so process it + if(ws.read(StringBuffer) == true) + { + //our command structure is a simple ascii string. + // + //Cmd arg1 arg2 ..... + // + //The command is the 1st string. Each argument is separated by white space + // + //for example: + // + //ssr 1 0 + // + //is the "ssr" command with 2 arguments: 1 and 0 + // + // + //There are many ways to process a command but I will use my "Terminal" processor + //It normally is used to emulated a basic command line terminal from a serial port but it + //can easily process ourwebsocket data. + // + // + + + + //see if this is the command we sent out. The Mbed Websocket server sends input messagest + //to all who are attached. This means we get our own messages back. + + if(strncmp(StringBuffer,"temp",4) == 0) + { + //this means we go the temp message back, do nothing + } + else + { + //The first thing to do is copy the data into the terminal input queue + ByteArrayEnqueue(&TERMINAL_INPUT_QUEUE,(uint8_t *)StringBuffer,strlen(StringBuffer)); + //We also need a put in a new line character so the terminal will think a new command has been entered + ByteEnqueue(&TERMINAL_INPUT_QUEUE,'\r'); + } + + //Now that the data is in the terminal input queue, the ProcessTerminal() function will do the rest + } + + //This will process any incoming data to the terminal + ProcessTerminal(); + + //In addition to the websocket interface, we will also have a simple virtual command line terminal over the USB virtual com port. + //As of 2014-06-24 the Serial IRQ routines are not function in the mbed libraries for the FRDM-K64. For the mean time + //We will just manually shuffle data in and out of the terminal queues. The baud rate is slow enough in that the main loop will have plenty of time to + //move everything. Ideally I would want interrupts to keep everything flowing but this will be good enough for now. + + + if(PC.readable()) { + ByteEnqueue(&TERMINAL_INPUT_QUEUE,PC.getc()); + } + if(BytesInQueue(&TERMINAL_OUTPUT_QUEUE)>0) { + if(PC.writeable()) { + PC.putc(ForcedByteDequeue(&TERMINAL_OUTPUT_QUEUE)); + } + } + + } + + + +} + + +