GDP group 24 node core

Dependencies:   EthernetInterface SDFileSystem mbed-rtos mbed snail MbedJSONValue

sensorinterface.cpp

Committer:
Trumple
Date:
2014-11-18
Revision:
1:27b35752c5d0
Parent:
0:fcab3b154e49
Child:
3:71b090ec5c69

File content as of revision 1:27b35752c5d0:

#include "sensorinterface.h"
 
sensorinterface::sensorinterface() : i2c(p28,p27), readyLine(p30)
{
    readyLine.fall(this, &sensorinterface::readyTrigger);
    
    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.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()
{
    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::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;
}