A program for IoT demonstration with mbed, EnOcean and MQTT.

Dependencies:   IBMIoTClientEthernetExample C12832 EthernetInterface MQTT USB400Serial USBHost mbed

Fork of IBMIoTClientEthernetExample by IBM Watson IoT

Revision:
12:354dbc33ecc0
Parent:
11:7a6df9a2dcdc
--- a/main.cpp	Tue Mar 10 08:24:52 2015 +0000
+++ b/main.cpp	Sat Aug 08 04:23:12 2015 +0000
@@ -21,10 +21,9 @@
  *
  *******************************************************************************/
 
-#include "LM75B.h"
-#include "MMA7660.h"
 #include "MQTTClient.h"
 #include "MQTTEthernet.h"
+#include "USB400Serial.h"
 #include "C12832.h"
 #include "Arial12x12.h"
 #include "rtos.h"
@@ -33,10 +32,10 @@
 #define __APP_SW_REVISION__ "10"
 
 // Configuration values needed to connect to IBM IoT Cloud
-#define ORG "quickstart"             // For a registered connection, replace with your org
-#define ID ""                        // For a registered connection, replace with your id
-#define AUTH_TOKEN ""                // For a registered connection, replace with your auth-token
-#define TYPE DEFAULT_TYPE_NAME       // For a registered connection, replace with your type
+#define ORG "CHANGE_THIS"               // For a registered connection, replace with your org
+#define ID "CHANGE_THIS"                // For a registered connection, replace with your id
+#define AUTH_TOKEN "CHANGE_THIS"        // For a registered connection, replace with your auth-token
+#define TYPE "CHANGE_THIS"              // For a registered connection, replace with your type
 
 #define MQTT_PORT 1883
 #define MQTT_TLS_PORT 8883
@@ -55,7 +54,7 @@
 #include "K64F.h"
 #endif
 
-bool quickstartMode = true;
+bool quickstartMode = false;
 char org[11] = ORG;  
 char type[30] = TYPE;
 char id[30] = ID;                 // mac without colons
@@ -65,6 +64,46 @@
 char* joystickPos = "CENTRE";
 int blink_interval = 0;
 
+int sensor = 0;
+int humidity = 0;
+int temperature = 0;
+
+uint8_t u8CRC8Table[256] = {
+    0x00, 0x07, 0x0e, 0x09, 0x1c, 0x1b, 0x12, 0x15,
+    0x38, 0x3f, 0x36, 0x31, 0x24, 0x23, 0x2a, 0x2d,
+    0x70, 0x77, 0x7e, 0x79, 0x6c, 0x6b, 0x62, 0x65,
+    0x48, 0x4f, 0x46, 0x41, 0x54, 0x53, 0x5a, 0x5d,
+    0xe0, 0xe7, 0xee, 0xe9, 0xfc, 0xfb, 0xf2, 0xf5,
+    0xd8, 0xdf, 0xd6, 0xd1, 0xc4, 0xc3, 0xca, 0xcd,
+    0x90, 0x97, 0x9e, 0x99, 0x8c, 0x8b, 0x82, 0x85,
+    0xa8, 0xaf, 0xa6, 0xa1, 0xb4, 0xb3, 0xba, 0xbd,
+    0xc7, 0xc0, 0xc9, 0xce, 0xdb, 0xdc, 0xd5, 0xd2,
+    0xff, 0xf8, 0xf1, 0xf6, 0xe3, 0xe4, 0xed, 0xea,
+    0xb7, 0xb0, 0xb9, 0xbe, 0xab, 0xac, 0xa5, 0xa2,
+    0x8f, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9d, 0x9a,
+    0x27, 0x20, 0x29, 0x2e, 0x3b, 0x3c, 0x35, 0x32,
+    0x1f, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0d, 0x0a,
+    0x57, 0x50, 0x59, 0x5e, 0x4b, 0x4c, 0x45, 0x42,
+    0x6f, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7d, 0x7a,
+    0x89, 0x8e, 0x87, 0x80, 0x95, 0x92, 0x9b, 0x9c,
+    0xb1, 0xb6, 0xbf, 0xb8, 0xad, 0xaa, 0xa3, 0xa4,
+    0xf9, 0xfe, 0xf7, 0xf0, 0xe5, 0xe2, 0xeb, 0xec,
+    0xc1, 0xc6, 0xcf, 0xc8, 0xdd, 0xda, 0xd3, 0xd4,
+    0x69, 0x6e, 0x67, 0x60, 0x75, 0x72, 0x7b, 0x7c,
+    0x51, 0x56, 0x5f, 0x58, 0x4d, 0x4a, 0x43, 0x44,
+    0x19, 0x1e, 0x17, 0x10, 0x05, 0x02, 0x0b, 0x0c,
+    0x21, 0x26, 0x2f, 0x28, 0x3d, 0x3a, 0x33, 0x34,
+    0x4e, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5c, 0x5b,
+    0x76, 0x71, 0x78, 0x7f, 0x6A, 0x6d, 0x64, 0x63,
+    0x3e, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2c, 0x2b,
+    0x06, 0x01, 0x08, 0x0f, 0x1a, 0x1d, 0x14, 0x13,
+    0xae, 0xa9, 0xa0, 0xa7, 0xb2, 0xb5, 0xbc, 0xbb,
+    0x96, 0x91, 0x98, 0x9f, 0x8a, 0x8D, 0x84, 0x83,
+    0xde, 0xd9, 0xd0, 0xd7, 0xc2, 0xc5, 0xcc, 0xcb,
+    0xe6, 0xe1, 0xe8, 0xef, 0xfa, 0xfd, 0xf4, 0xf3
+};
+
+#define proccrc8(u8CRC, u8Data) (u8CRC8Table[u8CRC ^ u8Data])
 
 void off()
 {
@@ -116,68 +155,6 @@
     }
 }
 
-
-void printMenu(int menuItem) 
-{
-    lcd.cls();
-    lcd.locate(0,0);
-    switch (menuItem)
-    {
-        case 0:
-            lcd.printf("IBM IoT Cloud");
-            lcd.locate(0,16);
-            lcd.printf("Scroll with joystick");
-            break;
-        case 1:
-            lcd.printf("Go to:");
-            lcd.locate(0,16);
-            lcd.printf("http://ibm.biz/iotqstart");
-            break;
-        case 2:
-            lcd.printf("Device Identity:");
-            lcd.locate(0,16);
-            lcd.printf("%s", id);
-            break;
-        case 3:
-            lcd.printf("Status:");
-            lcd.locate(0,16);
-            lcd.printf(connected ? "Connected" : "Disconnected");
-            break;
-        case 4:
-            lcd.printf("App version:");
-            lcd.locate(0,16);
-            lcd.printf("%s",__APP_SW_REVISION__);
-            break;
-    }
-}
-
-
-void setMenu()
-{
-    static int menuItem = 0;
-    if (Down)
-    {
-        joystickPos = "DOWN";
-        if (menuItem >= 0 && menuItem < 4)
-            printMenu(++menuItem);
-    } 
-    else if (Left)
-        joystickPos = "LEFT";
-    else if (Click)
-        joystickPos = "CLICK";
-    else if (Up)
-    {
-        joystickPos = "UP";
-        if (menuItem <= 4 && menuItem > 0)
-            printMenu(--menuItem);
-    }
-    else if (Right)
-        joystickPos = "RIGHT";
-    else
-        joystickPos = "CENTRE";
-}
-
-
 /**
  * Display a message on the LCD screen prefixed with IBM IoT Cloud
  */
@@ -197,7 +174,7 @@
     
     char hostname[strlen(org) + strlen(iot_ibm) + 1];
     sprintf(hostname, "%s%s", org, iot_ibm);
-    DEBUG("hostname is %s\n", hostname);
+//    DEBUG("hostname is %s\n", hostname);
     int rc = ipstack->connect(hostname, IBM_IOT_PORT);
     if (rc != 0)
         return rc;
@@ -205,7 +182,7 @@
     // Construct clientId - d:org:type:id
     char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
     sprintf(clientId, "d:%s:%s:%s", org, type, id);
-    DEBUG("clientid is %s\n", clientId);
+//    DEBUG("clientid is %s\n", clientId);
     
     // MQTT Connect
     MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
@@ -223,9 +200,7 @@
         connected = true;
         green();    
         displayMessage("Connected");
-        wait(2);
-        displayMessage("Scroll with joystick");
-    }
+  }
     return rc;
 }
 
@@ -247,7 +222,7 @@
         wait(1.0f);
         WARN("Ethernet link not present. Check cable connection\n");
     }
-        
+    
     while (connect(client, ipstack) != 0) 
     {    
 #if defined(TARGET_K64F)
@@ -276,9 +251,12 @@
     char* pubTopic = "iot-2/evt/status/fmt/json";
             
     char buf[250];
+//    sprintf(buf,
+//     "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
+//            MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read());
     sprintf(buf,
-     "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
-            MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read());
+     "{\"d\":{\"sensor\":\"%02X\",\"hum\":%3.1f,\"temp\":%2.2f}}",
+            sensor, humidity*0.4, temperature*0.16);
     message.qos = MQTT::QOS0;
     message.retained = false;
     message.dup = false;
@@ -289,42 +267,6 @@
     return client->publish(pubTopic, message);
 }
 
-
-#if defined(TARGET_K64F)
-int getUUID48(char* buf, int buflen) 
-{
-    unsigned int UUID_LOC_WORD0 = 0x40048060;
-    unsigned int UUID_LOC_WORD1 = 0x4004805C;
- 
-    // Fetch word 0
-    uint32_t word0 = *(uint32_t *)UUID_LOC_WORD0;
- 
-    // Fetch word 1
-    // we only want bottom 16 bits of word1 (MAC bits 32-47)
-    // and bit 9 forced to 1, bit 8 forced to 0
-    // Locally administered MAC, reduced conflicts
-    // http://en.wikipedia.org/wiki/MAC_address
-    uint32_t word1 = *(uint32_t *)UUID_LOC_WORD1;
-    word1 |= 0x00000200;
-    word1 &= 0x0000FEFF;
- 
-    int rc = snprintf(buf, buflen, "%4x%08x", word1, word0);   // Device id must be in lower case
-    
-    return rc;
-}
-#else
-char* getMac(EthernetInterface& eth, char* buf, int buflen)    // Obtain MAC address
-{   
-    strncpy(buf, eth.getMACAddress(), buflen);
-
-    char* pos;                                                 // Remove colons from mac address
-    while ((pos = strchr(buf, ':')) != NULL)
-        memmove(pos, pos + 1, strlen(pos) + 1);
-    return buf;
-}
-#endif
-
-
 void messageArrived(MQTT::MessageData& md)
 {
     MQTT::Message &message = md.message;
@@ -358,16 +300,13 @@
         WARN("Unsupported command: %.*s\n", len, start);
 }
 
-
 int main()
-{    
-    quickstartMode = (strcmp(org, "quickstart") == 0);
+{
+//    quickstartMode = (strcmp(org, "quickstart") == 0);
+    lcd.set_font((unsigned char*) Arial12x12);  // Set a nice font for the LCD screen
+    led2 = LED2_OFF; // K64F: turn off the main board LED 
+    displayMessage("Connecting");
 
-    lcd.set_font((unsigned char*) Arial12x12);  // Set a nice font for the LCD screen
-    
-    led2 = LED2_OFF; // K64F: turn off the main board LED 
-    
-    displayMessage("Connecting");
 #if defined(TARGET_K64F)
     yellow();  // Don't flash on the K64F, because starting a thread causes the EthernetInterface init call to hang
 #else
@@ -376,7 +315,7 @@
     
     MQTTEthernet ipstack;
     MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
-    
+/*
     if (quickstartMode)
     {
 #if defined(TARGET_K64F)
@@ -385,33 +324,91 @@
         getMac(ipstack.getEth(), id, sizeof(id));
 #endif
     }
-    
+*/    
     attemptConnect(&client, &ipstack);
-    
-    if (!quickstartMode) 
-    {
+
+//    if (!quickstartMode) 
+//    {
         int rc = 0;
         if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0)
             WARN("rc from MQTT subscribe is %d\n", rc); 
-    }
+//    }
+
+    USB400Serial usb400;
+    int i;
+    int dataLength;
+    int optionalLength;
+    uint8_t c;
+    uint8_t crc;
     
-    blink_interval = 0;
-    int count = 0;
-    while (true)
-    {
-        if (++count == 100)
-        {               // Publish a message every second
-            if (publish(&client, &ipstack) != 0) 
-                attemptConnect(&client, &ipstack);   // if we have lost the connection
-            count = 0;
+    while(1) {
+
+        while(!usb400.connect())
+            wait(0.5);
+
+        while (1) {
+            if (!usb400.connected())
+                break;
+
+            if (usb400.available()) {
+                c = usb400.getc();
+
+                if (c == 0x55) {
+                    crc = 0;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c);
+                    dataLength = c;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c);
+                    dataLength = (dataLength << 8) | c;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c);
+                    optionalLength = c;
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c); // packet type
+
+                    c = usb400.getc();
+                    crc = proccrc8(crc, c); // CRC
+
+                    if (crc == 0) {
+                        crc = 0;
+
+                        for (i = 0; i < dataLength; i++) {
+                            c = usb400.getc();
+                            crc = proccrc8(crc, c);
+
+                            if (i == 4) {
+//                                printf("Sensor: %02X ", c);
+                                sensor = c;
+                            }
+                            //A5-04-01
+                            if (i == 6) {
+                                humidity = c;
+                            }
+                            if (i == 7) {
+                                temperature = c;
+                            }
+                        }
+//                        printf("hum:%3.1f%% temp:%2.2fC\r\n", humidity*0.4, temperature*0.16);
+                        
+                        if (publish(&client, &ipstack) != 0) 
+                        attemptConnect(&client, &ipstack);   // if we have lost the connection
+
+                        for (i = 0; i < optionalLength; i++) {
+                            c = usb400.getc();
+                            crc = proccrc8(crc, c);
+                        }
+
+                        c = usb400.getc();
+                        crc = proccrc8(crc, c);
+
+                    }
+                }
+            }
         }
-        
-        if (blink_interval == 0)
-            led2 = LED2_OFF;
-        else if (count % blink_interval == 0)
-            led2 = !led2;
-        if (count % 20 == 0)
-            setMenu();
-        client.yield(10);  // allow the MQTT client to receive messages
-    }
+    }    
 }