GDP group 24 node core

Dependencies:   EthernetInterface SDFileSystem mbed-rtos mbed snail MbedJSONValue

Revision:
0:fcab3b154e49
Child:
1:27b35752c5d0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sensorinterface.cpp	Tue Nov 11 17:33:41 2014 +0000
@@ -0,0 +1,200 @@
+#include "sensorinterface.h"
+ 
+sensorinterface::sensorinterface() : i2c(p28,p27), readyLine(p30)
+{
+    readyLine.fall(this, &sensorinterface::readyTrigger);
+    
+    this->ready = false;
+    
+    char buffer[255];
+    
+    for (char i=1; i<=254; i=i+2)
+    {
+        //last bit determines read/write not actual address
+        if (this->i2c.read(i, &buffer[0], 1) ==0)
+        {
+            //returns 0 if ack i.e. a device is found
+            sensor newSensor;
+            newSensor.type = findType(i);
+            this->sensors[i] = newSensor;
+            #ifdef DEBUG
+                printf("[SIF] Device found at 0x%.2X, device count: %i\r\n", i, this->sensors.size());
+            #endif
+        }
+    }
+}
+
+bool sensorinterface::isDataWaiting()
+{
+    return this->ready;
+}
+
+void sensorinterface::requestData()
+{
+    currentSensor = sensors.begin();
+    
+    #ifdef DEBUG
+        printf("[SIF] Beginning device query chain from 0x%.2X\r\n", currentSensor->first);
+    #endif
+    
+    sendRequest(currentSensor->first);
+}
+
+void sensorinterface::readyTrigger()
+{
+    this->ready = true;
+}
+
+#ifdef DEBUG
+void sensorinterface::error(int e_num)
+{
+    printf("[SIF] Error %i\r",e_num);
+}
+#endif
+ 
+int sensorinterface::update()
+{
+    char buffer[255];
+    
+    for (char i=1; i<=254; i=i+2)
+    {
+        //last bit determines read/write not actual address
+        
+        bool connected = (this->i2c.read(i, &buffer[0], 1) == 0);
+        bool registered = (this->sensors.count(i) > 0);
+        
+        if (connected)
+        {
+            if (!registered)
+            {
+                //device added
+                #ifdef DEBUG
+                    printf("[SIF] Device added at %i\r\n", i);
+                #endif
+                sensor newSensor;
+                newSensor.type = findType(i);
+                this->sensors[i] = newSensor;
+            }
+        }
+        else if (registered)
+        {
+            if (!connected)
+            {
+                //device removed
+                #ifdef DEBUG
+                    printf("[SIF] Device removed at %i\r\n", i);
+                #endif
+                this->sensors.erase(i);
+            }
+        }
+    }
+    
+    return 1;
+}
+ 
+ 
+char sensorinterface::findType(int address)
+{
+    char temp[3];
+    char cmd[1] = {0x54};
+ 
+    this->i2c.write(address, cmd, 1);
+    int type_timeout = 10;
+    i2c.stop();
+    i2c.start();
+    while( (this->i2c.read(address, temp, 3)) && (type_timeout) )
+    {
+        --type_timeout;
+        if (type_timeout == 2)
+        {
+            #ifdef DEBUG
+                error(3);
+            #endif
+            return 1;
+        }
+    }
+
+    if (temp[0] != 'T')
+    {
+        #ifdef DEBUG
+            error(1);
+        #endif
+    }
+    else
+    {
+        //seperate the incoming bits
+        if ((temp[1] != 0x00) && (temp[1] != 0x01) && (temp[1] != 0x02))
+        {
+            //if its not a recognised type
+            #ifdef DEBUG
+                error(2);
+            #endif
+        }
+    }
+    return temp[1];
+}
+ 
+int sensorinterface::sendRequest(char address)
+{
+    char cmd[1] = {0x52};
+ 
+    this->i2c.write(address, cmd, 1);
+    
+    return 1;
+}
+ 
+d_reply sensorinterface::readData()
+{
+    #ifdef DEBUG
+        printf("[SIF] Reading data from current device (0x%.2X)\r\n", currentSensor->first);
+    #endif
+    char address = currentSensor->first;
+    char cmd[1] = {0x44};
+    char buffer [18] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
+    this->i2c.write(address, cmd, 1);
+    wait(0.01);
+    this->i2c.read(address, buffer, 18);
+    
+    d_reply reply;
+    
+    reply.type = currentSensor->second.type;
+    
+    for (int i = 2; i <= 17; i += 2)
+    {
+        uint16_t reading = buffer[i];
+        reading = reading << 8;
+        reading |= buffer[i+1];
+        reply.readings.push_back(reading);
+    }
+ 
+    if (buffer[0] != 'D')
+    {
+        //if it doesn't send the correct header bit, something has gone wrong
+        #ifdef DEBUG
+            error(0);
+        #endif
+    }
+    else
+    {
+        
+    }
+    
+    this->ready = false;
+    
+    if (currentSensor != sensors.end() && sensors.size() > 1 )
+    {
+        #ifdef DEBUG
+            printf("[SIF] Continuing chain of devices, just read from device: 0x%.2X\r\n", currentSensor->first);
+        #endif
+        currentSensor++;
+        sendRequest(currentSensor->first);
+    }
+    #ifdef DEBUG
+    else
+    {
+        printf("[SIF] All devices have been read from, end of chain\r\n");
+    }
+    #endif
+    
+    return reply;
+}
\ No newline at end of file