GDP group 24 node core

Dependencies:   EthernetInterface SDFileSystem mbed-rtos mbed snail MbedJSONValue

sensorinterface.cpp

Committer:
Trumple
Date:
2015-01-28
Revision:
31:9cf3f1e5ad68
Parent:
20:fb2a9f4d2de7

File content as of revision 31:9cf3f1e5ad68:

#include "sensorinterface.h"
 
sensorinterface::sensorinterface() : i2c(p28,p27), readyLine(p29)
{ 
    readyLine.fall(this, &sensorinterface::readySet);
    readyLine.rise(this, &sensorinterface::readyUnset);
    
    this->ready = false;
    
    char buffer[255];
    
    #ifdef DEBUG
        printf("[SIF] Scanning for devices...\r\n");
    #endif
    
    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 = findType(newSensor, 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()
{
    if (sensors.size() > 0)
    {
        currentSensor = sensors.begin();
        
        #ifdef DEBUG
            printf("[SIF] Beginning device query chain from 0x%.2X\r\n", currentSensor->first);
        #endif
        
        sendRequest(currentSensor->first);
    }
    else
    {
        #ifdef DEBUG
            printf("[SIF] Data requested, but no devices present\r\n");
        #endif
    }
}

void sensorinterface::readySet()
{
    this->ready = true;
}

void sensorinterface::readyUnset()
{
    this->ready = false;
}

#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 = findType(newSensor, 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;
}
 
 
sensor& sensorinterface::findType(sensor& s, int address)
{
    char response[I2C_TYPE_PACKET_SIZE];
    char cmd[1] = {I2C_TYPE_HEADER};
 
    this->i2c.write(address, cmd, 1);
    int type_timeout = 10;
    i2c.stop();
    i2c.start();
    while( (this->i2c.read(address, response, I2C_TYPE_PACKET_SIZE)) && (type_timeout) )
    {
        --type_timeout;
        if (type_timeout == 2)
        {
            #ifdef DEBUG
                error(3);
            #endif
            return s;
        }
    }

    if (response[0] != I2C_TYPE_HEADER)
    {
        #ifdef DEBUG
            error(1);
        #endif
    }

    s.type = response[1];
    s.packetSize = response[2];
    s.readingSize = response[3]; 
    return s;
}
 
int sensorinterface::sendRequest(char address)
{
    char cmd[1] = {I2C_REQUEST_HEADER};
 
    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] = {I2C_DATA_HEADER};
    char bufSize = currentSensor->second.packetSize + 2;
    char buffer[bufSize];
    this->i2c.write(address, cmd, 1);
    wait(0.01);
    this->i2c.read(address, buffer, bufSize);
    
    d_reply reply;
    
    reply.type = currentSensor->second.type;
    
    for (int i = 2; i < bufSize; i += currentSensor->second.readingSize)
    {
        int r = 0;
        for (int j = 0; j < currentSensor->second.readingSize; j++)
        {
            r = r << 8;
            r += buffer[i+j];
        }
        reply.readings.push_back(r);
    }
 
    if (buffer[0] != I2C_DATA_HEADER)
    {
        //if it doesn't send the correct header bit, something has gone wrong
        #ifdef DEBUG
            error(0);
        #endif
    }
    
    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;
}