pwm period is now 200us instead of the default 20ms veml6040 config is now AF_BIT | TRIG_BIT

Dependencies:   mbed MMA8451Q USBDevice WakeUp vt100

Fork of afero_node_suntory_2017_06_15 by Orefatoi

spi/AferoCommHndlr.cpp

Committer:
wataloh
Date:
2017-05-16
Revision:
14:b205267fa5f6
Parent:
13:c7d1ef8c57b3
Child:
15:2c2c0a7c50c1

File content as of revision 14:b205267fa5f6:

#include "AferoCommHndlr.h"

static AferoCommHndlr *self = NULL;

AferoCommHndlr::AferoCommHndlr() : flowControlEnabled(false)
{
    deathWish = new Timeout();
    setAttrCmpDelay = new Timeout();
    _onGetTodoP = &AferoCommHndlr::_onGetTodo;
}

void
AferoCommHndlr::kick_the_bucket()
{
    SERIAL_PRINT_DBG("bucket kicked!!\n");
    wtd.kick_the_bucket();   
}

void
AferoCommHndlr::loop()
{
    piafLib->loop();
    todoQ->loop();
}

AferoCommHndlr*
AferoCommHndlr::create(Timer *timer, mbedSPI *spi)
{
     SERIAL_PRINT_DBG("HELLO\n");
     self = new AferoCommHndlr();
     self->timer = timer;
     self->piafLib = iafLib::create((PinName)PINS::ASR_1::SPI::SR,
       AferoCommHndlr::fco_irq_fall,
       AferoCommHndlr::myOnAttributeSet,
       AferoCommHndlr::myOnAttributeSetComplete, spi);
     self->todoQ = ToDoQ::create(AferoCommHndlr::onGetTodo);
     SERIAL_PRINT_DBG("AferoCommHndlr init done\n");
     self->piafLib->setAttribute8(1,1) != afSUCCESS ? SERIAL_PRINT_DBG("set attr failed!!\n") : NULL ;
     
     return self;
}

void
AferoCommHndlr::myOnAttributeSet(
    const uint8_t requestId,
    const uint16_t attributeId,
    const uint16_t valueLen,
    const uint8_t *value)
{
    self->piafLib->setAttributeComplete(requestId, attributeId, valueLen, value) != afSUCCESS ? SERIAL_PRINT_DBG("set attr failed!!\n") : NULL ;
}

int32_t
AferoCommHndlr::sanitizeSensingInterval(uint16_t attributeId, int32_t interval)
{
    if(interval < 5)
    {
        interval = 5;
        self->piafLib->setAttribute32(attributeId, interval) != afSUCCESS ? SERIAL_PRINT_DBG("set attr failed!!\n") : NULL ;
    }
    return interval;
}

void
AferoCommHndlr::myOnAttributeSetComplete(
    const uint8_t requestId,
    const uint16_t attributeId,
    const uint16_t valueLen,
    const uint8_t *value)
{
    self->_myOnAttributeSetComplete(requestId,attributeId,valueLen,value);
}

void
AferoCommHndlr::_myOnAttributeSetComplete(
    const uint8_t requestId,
    const uint16_t attributeId,
    const uint16_t valueLen,
    const uint8_t *value)
{
    int32_t sensing_interval;
    char *buf = NULL;
    if(attributeId >= 4 && attributeId <= 8)
    {
        sensing_interval = *((int32_t*)value);
    }
    
    if(attributeId==2)
    {
        PREFERENCES::CRC32.ui32 = *((uint32_t*)value);
    }
    else if(attributeId==4)
    {
        buf = "PREFERENCES::SENSING_INTERVAL[SENSORS::ACCELEROMETER]";
        PREFERENCES::SENSING_INTERVAL[SENSORS::ACCELEROMETER] = sanitizeSensingInterval(attributeId,sensing_interval);
    }
    else if(attributeId==5)
    {
        buf = "PREFERENCES::SENSING_INTERVAL[SENSORS::COLOR]";
        PREFERENCES::SENSING_INTERVAL[SENSORS::COLOR] = sanitizeSensingInterval(attributeId,sensing_interval);
    }
    else if(attributeId==6)
    {
        buf = "PREFERENCES::SENSING_INTERVAL[SENSORS::PRESSURE]";
        PREFERENCES::SENSING_INTERVAL[SENSORS::PRESSURE] = sanitizeSensingInterval(attributeId,sensing_interval);
    }
    else if(attributeId==7)
    {
        buf = "PREFERENCES::SENSING_INTERVAL[SENSORS::CURRENT_TRANS]";
        PREFERENCES::SENSING_INTERVAL[SENSORS::CURRENT_TRANS] = sanitizeSensingInterval(attributeId,sensing_interval);
    }
    else if(attributeId==8)
    {
        buf = "PREFERENCES::SENSING_INTERVAL[SENSORS::TEMPERATURE]";
        PREFERENCES::SENSING_INTERVAL[SENSORS::TEMPERATURE] = sanitizeSensingInterval(attributeId,sensing_interval);
    }
    else if(attributeId==9)
    {
        SERIAL_PRINT_DBG("time stamp:%ld\n", *((uint32_t*)value));
        time_t t;
        RTC_GET_UTC(t);
        if(*((uint32_t*)value) > ((uint32_t)t))
        {
            RTC_Handler::getInstance()->setUTC(*((uint32_t*)value));
        }
    }
    else if(attributeId==1024)
    {
    }
    
    if(attributeId >= 4 && attributeId <= 8)
    {
        SERIAL_PRINT_DBG("%s=%ld\n",buf,sensing_interval);
    }
    //_onGetTodoP = &AferoCommHndlr::_onGetTodo;
    setAttrCmpDelay->attach(&onSetAttrCmpDelay,1);
}

void
AferoCommHndlr::fco_irq_fall()
{
    if(self->piafLib)
    {
        self->piafLib->mcuISR();
    }
}

bool
AferoCommHndlr::_onGetTodo(ToDo *todo)
{
    _onGetTodoP = &AferoCommHndlr::_onGetTodoFalsy;
    char buf[255];
    memset(buf,'\0',sizeof(buf));
    if(todo!=NULL)
    {
        if(PREFERENCES::FLOW_CONTROL==true)
        {
            PREFERENCES::_crc32 crc32;
            todo->toBASE64(buf,&crc32);
            if(piafLib->setAttribute(ATTR_ID_SENSE_VAL,strlen(buf),buf) != afSUCCESS)
            {
                SERIAL_PRINT_DBG("set attr failed!!\n");
                return false;
            }
            if(piafLib->setAttribute64(3,crc32.ui32) != afSUCCESS)
            {
                SERIAL_PRINT_DBG("set attr failed!!\n");
                return false;
            }
        }
        else
        {
            todo->toJSON(buf);
            int ret = afSUCCESS;
            if((ret=piafLib->setAttribute(ATTR_ID_SENSE_VAL,strlen(buf),buf)) != afSUCCESS)
            {
                SERIAL_PRINT_DBG("set attr failed!! : %d\n", ret);
                todo->error_count_inc();
                return false;
            }
            else
            {
                SERIAL_PRINT_DBG("set attr success!! : %d\n", ret);
                SERIAL_PRINT_DBG("%s\n",buf);
                todo->error_count_clear();
                return true;
            }
        }
    }
    return true;
}

bool
AferoCommHndlr::_onGetTodoFalsy(ToDo *todo)
{
    return false;
}

bool
AferoCommHndlr::onGetTodo(ToDo *todo)
{
    return (self->*(self->_onGetTodoP))(todo);
}

void
AferoCommHndlr::onSetAttrCmpDelay()
{
    SERIAL_PRINT_DBG("onSetAttrCmpDelay triggered\n");
    self->_onGetTodoP = &AferoCommHndlr::_onGetTodo;
}