Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

src/ConfigurationHandler/Controls/SetpointControl.cpp

Committer:
jmarkel44
Date:
2016-09-14
Revision:
56:225786c56315
Parent:
51:66b820f203a5
Child:
70:7427f4959201

File content as of revision 56:225786c56315:

/******************************************************************************
 *
 * File:                SetpointControl.cpp
 * Desciption:          ICE Setpoint Control Class implementation
 *
 *****************************************************************************/
#include "SetpointControl.h"
#include "mDot.h"
#include "MbedJSONValue.h"
#include "global.h"
#include <string>

extern mDot *GLOBAL_mdot;

// Method:          load
// Description:     open the configuration file and assign data to the
//                  setpoint control object
//
// @param           controlFile -> name of the control file
// @return          true if data is assigned; false on error

bool SetpointControl::load(string _controlFile)
{
    MbedJSONValue json_value;           // JSON parsing element
    controlFile = _controlFile;

    // open and read from the control file
    mDot::mdot_file file = GLOBAL_mdot->openUserFile(controlFile.c_str(), mDot::FM_RDONLY);
    if ( file.fd < 0 )
        return false;

    // read the data into a buffer
    char dataBuf[1024];

    int bytes_read = GLOBAL_mdot->readUserFile(file, (void *)dataBuf, sizeof(dataBuf));
    if ( bytes_read != sizeof(dataBuf) ) {
        logError("%s: failed to read %d bytes from %s", __func__, sizeof(dataBuf), controlFile.c_str());
        // we can't throw exceptions in mbed, so just return false. the calling function will
        // destroy the object
        return false;
    }

    // close the file
    GLOBAL_mdot->closeUserFile(file);

    // parse the json data
    parse(json_value, dataBuf);

    id              = json_value["id"].get<string>();
    name            = json_value["name"].get<string>();
    priority        = atoi(json_value["priority"].get<string>().c_str());
    input           = json_value["input"].get<string>();
    output          = json_value["output"].get<string>();
    productFactor   = atof(json_value["prodfact"].get<string>().c_str());
    highAlert       = atof(json_value["halert"].get<string>().c_str());
    lowAlert        = atof(json_value["lalert"].get<string>().c_str());
    highFailsafe    = atof(json_value["hfs"].get<string>().c_str());
    lowFailsafe     = atof(json_value["lfs"].get<string>().c_str());
    tol             = atof(json_value["tol"].get<string>().c_str());

    return true;        // object created successfully
}

// Method:          registerControl
// Description:     register the setpoint control with the output task
//
// @param           none
// @return          none

void SetpointControl::registerControl(void)
{
    if ( GLOBAL_outputTask_thread ) {
        // register our priority with the output master
    }
}

// Method:          start
// Description:     start the setpoint control
//
// @param           none
// @return          none

void SetpointControl::start(void)
{
    // this is the initial state; what else needs to be done??
    this->currentState = STATE_STARTUP;
}

// Method:          update
// Description:     based on the state of the control, check for
//                  under limit and over limit values, adjust the
//                  state accordingly
//
// @param           none
// @return          none

void SetpointControl::update(void)
{
    switch (this->currentState) {
        case STATE_STARTUP:
            if ( this->underLimit() ) {
                // start the feed right away
                this->startFeed();
                this->currentState = STATE_CONTROL_ON;
            } else {
                this->currentState = STATE_CONTROL_OFF;
            }
            break;
        case STATE_CONTROL_ON:
            if ( this->overLimit() ) {
                // stop the feed
                this->stopFeed();
                this->currentState = STATE_CONTROL_OFF;
            } else {
                // do nothing
            }
            break;
        case STATE_CONTROL_OFF:
            if ( this->underLimit() ) {
                // start the feed
                this->startFeed();
                this->currentState = STATE_CONTROL_ON;
            } else {
                // do nothing
            }
            break;
            //case STATE_CONTROL_DISABLED:
            //case STATE_CONTROL_PAUSED:
        default:
            break;
    }
}

// Method:              overLimit
// Description:         (see @return)
//
// @param               none
// @return              true if product is over the upper limit for normal mode
//                      or under the limit for reverse mode; false otherwise

bool SetpointControl::overLimit(void)
{
    // stubbed for now
    return false;
}

// Method:              underLimit
// Description:         (see @return)
//
// @param               none
// @return              true if product is under lower limit for normal mode or
//                      over the upper limit for reverse mode; false otherwise

bool SetpointControl::underLimit(void)
{
    // stubbed for now
    return false;
}

// Method:              startFeed()
// Description:         send ON indication to Output Master for this control's
//                      relay
//
// @param               none
// @return              none

void SetpointControl::startFeed(void)
{
    logInfo("%s: %s attempting to start feed on relay %s\n",
            __func__, controlFile.c_str(), output.c_str());

    OutputControlReq_t *msg  = OutputMasterMailBox.alloc();

    // construct the ON message
    msg->relay      = this->output;
    msg->state      = ON;
    msg->priority = this->priority;

    // ship it
    OutputMasterMailBox.put(msg);

}

// Method:              stopFeed
// Description:         send OFF indication to Output Master for this control's
//                      relay
//
// @param               none
// @return              none

void SetpointControl::stopFeed(void)
{
    logInfo("%s: %s attempting to start feed on relay %s\n",
            __func__, controlFile.c_str(), output.c_str());

    OutputControlReq_t *msg  = OutputMasterMailBox.alloc();

    // construct the OFF message
    msg->relay      = this->output;
    msg->state      = OFF;
    msg->priority   = this->priority;

    // ship it
    OutputMasterMailBox.put(msg);
}