Erick / Mbed 2 deprecated ICE-F412

Dependencies:   mbed-rtos mbed

ICE-Application/src/ConfigurationHandler/Controls/SensorErrorControl.h

Committer:
jmarkel44
Date:
2017-01-24
Revision:
0:61364762ee0e

File content as of revision 0:61364762ee0e:

#ifndef SENSORERRORCONTROL_H
#define SENSORERRORCONTROL_H

#include <stdio.h>
#include <string>
#include <time.h>

#include "global.h"

typedef enum {
    SENSOR_ERROR_CONTROL_OK,
    SENSOR_ERROR_CONTROL_UNK_STATE,
    SENSOR_ERROR_CONTROL_ERROR,
} SensorErrorControlError_t;

//! SensorErrorControl - implements a sensor error control by reading an input's
// error flag and manipulating an output (duty-cycle style)
class SensorErrorControl
{
private:
    std::string     controlFile;                // the control file
    std::string     id;                         // unique control identifier
    std::string     input;                      // sensor to read
    std::string     output;                     // output to manipulate
    unsigned int    priority;                   // control priority (typically  450)

    typedef struct dutyCycle_tag {
        unsigned int    dutyCycle;              // on-time (percentage)
        unsigned int    interval;               // in minutes
    } dutyCycle_t;

    dutyCycle_t     dutyCycle;

    typedef struct timer_tag {
        unsigned long   offTime;                // epoch time
        unsigned long   expirationTime;         // epoch time
    } Timer_t;

    Timer_t         duty_timer;                 // the duty timer

    enum State {
        STATE_INIT,                             // object instantiated
        STATE_START,                            // control has been started
        STATE_CONTROL_OFF,                      // control is not above/below limit
        STATE_DUTY_CYCLE_ON,                    // in sensor error, duty-cycle ON
        STATE_DUTY_CYCLE_OFF,                   // in sensor error, duty-cycle OFF
        STATE_MAX
    };

    State currentState;                         // current state
    bool  isVirtualOutput;                      // output is virtual

    bool validateControlData(const char *buf);  // validate JSON control data
    void copyControlData(const char *buf);      // copy JSON data to control data
    
    bool isSensorError(void);                   // input sig is in sensor error

    void startDutyTimer(void);                  // start the duty timer
    void stopDutyTimer(void);                   // stop the duty timer

    bool dutyOnExpired(void);                   // boolean check if duty ON-time expired
    bool dutyOffExpired(void);                  // boolean check if duty OFF-time expired
    
    void sendMailToOutput(OutputAction action);
public:
    /// Create a sensor-error control instance
    SensorErrorControl() {
        currentState = STATE_INIT;
        isVirtualOutput = false;
    }
    /// Destroy a sensor-error control instance
    ~SensorErrorControl() {
        // "erased...from existence!" -- Doc Brown
        printf("\r%s invoked\n", __func__);
    }

    /// load a sensor-error control instance with data from a JSON configuration file
    bool load(std::string filename);

    /// start a sensor-error control instance
    void start(void);

    /// update this sensor error control instance
    SensorErrorControlError_t update(void);

    /// unregister a failsafe control instance
    void unregisterControl(void);

    /// display the pertinent data of this sensor error  control instance
    void display(void);

    /// get control file
    std::string getControlFile() const {
        return controlFile;
    }

    /// get control identifier
    std::string getId() const {
        return id;
    }
};

#endif // SENSORERRORCONTROL_H