HIT Project #3 https://community.freescale.com/docs/DOC-99621

Dependencies:   EthernetInterface WebSocketClient mbed-rtos mbed

MonkeyDo!

/media/uploads/emh203/monkey-20plug2.png

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

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));
+            }
+        }
+
+    }
+
+
+
+}
+
+
+