Erick / Mbed 2 deprecated ICE_BLE_TEST

Dependencies:   NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed

Fork of ICE by Erick

Committer:
jmarkel44
Date:
Fri Oct 07 17:41:23 2016 +0000
Revision:
205:3c84af5f711f
Parent:
195:21df85341cb3
Child:
217:d5a2ff093319
updated timers;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmarkel44 96:807f04bd5256 1 /******************************************************************************
jmarkel44 96:807f04bd5256 2 *
jmarkel44 96:807f04bd5256 3 * File: ManualControl.cpp
jmarkel44 96:807f04bd5256 4 * Desciption: ICE Manual Control Class implementation
jmarkel44 96:807f04bd5256 5 *
jmarkel44 96:807f04bd5256 6 *****************************************************************************/
jmarkel44 96:807f04bd5256 7 #include "ManualControl.h"
jmarkel44 96:807f04bd5256 8 #include "mDot.h"
jmarkel44 96:807f04bd5256 9 #include "MbedJSONValue.h"
jmarkel44 96:807f04bd5256 10 #include "ModbusMasterApi.h"
jmarkel44 96:807f04bd5256 11 #include "global.h"
jmarkel44 96:807f04bd5256 12 #include <string>
jmarkel44 205:3c84af5f711f 13 #include <iostream>
jmarkel44 205:3c84af5f711f 14 #include <iomanip>
jmarkel44 96:807f04bd5256 15
jmarkel44 96:807f04bd5256 16 extern mDot *GLOBAL_mdot;
jmarkel44 96:807f04bd5256 17
jmarkel44 192:052a419837fa 18 // method: load
jmarkel44 192:052a419837fa 19 // description: open the configuration file and assign data to the
jmarkel44 96:807f04bd5256 20 // setpoint control object
jmarkel44 96:807f04bd5256 21 //
jmarkel44 96:807f04bd5256 22 // @param controlFile -> name of the control file
jmarkel44 96:807f04bd5256 23 // @return true if data is assigned; false on error
jmarkel44 96:807f04bd5256 24
jmarkel44 96:807f04bd5256 25 bool ManualControl::load(string _controlFile)
jmarkel44 96:807f04bd5256 26 {
jmarkel44 97:5cf6ab71dcd0 27 MbedJSONValue json_value;
jmarkel44 97:5cf6ab71dcd0 28 controlFile = _controlFile;
jmarkel44 97:5cf6ab71dcd0 29
jmarkel44 97:5cf6ab71dcd0 30 // open and read from the control file
jmarkel44 97:5cf6ab71dcd0 31 mDot::mdot_file file = GLOBAL_mdot->openUserFile(controlFile.c_str(), mDot::FM_RDONLY);
jmarkel44 97:5cf6ab71dcd0 32 if ( file.fd < 0 )
jmarkel44 97:5cf6ab71dcd0 33 return false;
jmarkel44 97:5cf6ab71dcd0 34
jmarkel44 97:5cf6ab71dcd0 35 // read the data into a buffer
jmarkel44 177:9ec90c8e3ce1 36 char dataBuf[MAX_FILE_SIZE];
jmarkel44 97:5cf6ab71dcd0 37
jmarkel44 97:5cf6ab71dcd0 38 int bytes_read = GLOBAL_mdot->readUserFile(file, (void *)dataBuf, sizeof(dataBuf));
jmarkel44 97:5cf6ab71dcd0 39 if ( bytes_read != sizeof(dataBuf) ) {
jmarkel44 97:5cf6ab71dcd0 40 logError("%s: failed to read %d bytes from %s", __func__, sizeof(dataBuf), controlFile.c_str());
jmarkel44 97:5cf6ab71dcd0 41 // caller should destroy the object
jmarkel44 97:5cf6ab71dcd0 42 return false;
jmarkel44 97:5cf6ab71dcd0 43 }
jmarkel44 97:5cf6ab71dcd0 44
jmarkel44 97:5cf6ab71dcd0 45 // close the file
jmarkel44 97:5cf6ab71dcd0 46 GLOBAL_mdot->closeUserFile(file);
jmarkel44 97:5cf6ab71dcd0 47
jmarkel44 97:5cf6ab71dcd0 48 // parse the json data
jmarkel44 97:5cf6ab71dcd0 49 parse(json_value, dataBuf);
jmarkel44 195:21df85341cb3 50
jmarkel44 192:052a419837fa 51 if ( !json_value.hasMember("id") ||
jmarkel44 192:052a419837fa 52 !json_value.hasMember("output") ||
jmarkel44 192:052a419837fa 53 !json_value.hasMember("type") ||
jmarkel44 192:052a419837fa 54 !json_value.hasMember("priority") ||
jmarkel44 192:052a419837fa 55 !json_value.hasMember("duration") ||
jmarkel44 192:052a419837fa 56 !json_value.hasMember("setpoint") ||
jmarkel44 192:052a419837fa 57 !json_value.hasMember("state") ||
jmarkel44 192:052a419837fa 58 !json_value.hasMember("percent") ) {
jmarkel44 192:052a419837fa 59 logError("Manual Control file is missing expected tags");
jmarkel44 192:052a419837fa 60 return false;
jmarkel44 192:052a419837fa 61 }
jmarkel44 192:052a419837fa 62
jmarkel44 98:8eab18d03ac2 63 id = json_value ["id"].get<string>();
jmarkel44 98:8eab18d03ac2 64 output = json_value ["output"].get<string>();
jmarkel44 97:5cf6ab71dcd0 65 type = atoi(json_value["type"].get<string>().c_str());
jmarkel44 97:5cf6ab71dcd0 66 priority = atoi(json_value["priority"].get<string>().c_str());
jmarkel44 97:5cf6ab71dcd0 67 duration = atoi(json_value["duration"].get<string>().c_str());
jmarkel44 97:5cf6ab71dcd0 68 setpoint = atof(json_value["setpoint"].get<string>().c_str());
jmarkel44 97:5cf6ab71dcd0 69 state = atoi(json_value["state"].get<string>().c_str());
jmarkel44 97:5cf6ab71dcd0 70 percent = atoi(json_value["percent"].get<string>().c_str());
jmarkel44 97:5cf6ab71dcd0 71
jmarkel44 96:807f04bd5256 72 return true;
jmarkel44 96:807f04bd5256 73 }
jmarkel44 96:807f04bd5256 74
jmarkel44 192:052a419837fa 75 // method: start
jmarkel44 192:052a419837fa 76 // description: start the manual control
jmarkel44 96:807f04bd5256 77 //
jmarkel44 96:807f04bd5256 78 // @param none
jmarkel44 96:807f04bd5256 79 // @return none
jmarkel44 96:807f04bd5256 80
jmarkel44 97:5cf6ab71dcd0 81 void ManualControl::start(void)
jmarkel44 96:807f04bd5256 82 {
jmarkel44 97:5cf6ab71dcd0 83 currentState = STATE_STARTUP;
jmarkel44 96:807f04bd5256 84 }
jmarkel44 96:807f04bd5256 85
jmarkel44 192:052a419837fa 86 // method: update
jmarkel44 195:21df85341cb3 87 // description: the setpoint control's state machine
jmarkel44 96:807f04bd5256 88 //
jmarkel44 96:807f04bd5256 89 // @param none
jmarkel44 96:807f04bd5256 90 // @return none
jmarkel44 96:807f04bd5256 91
jmarkel44 96:807f04bd5256 92 int ManualControl::update(void)
jmarkel44 96:807f04bd5256 93 {
jmarkel44 97:5cf6ab71dcd0 94 int rc = 0;
jmarkel44 97:5cf6ab71dcd0 95 switch ( this->currentState ) {
jmarkel44 131:a290a3934132 96 case STATE_INIT:
jmarkel44 131:a290a3934132 97 // do nothing
jmarkel44 131:a290a3934132 98 break;
jmarkel44 97:5cf6ab71dcd0 99 case STATE_STARTUP:
jmarkel44 97:5cf6ab71dcd0 100 if ( state ) {
jmarkel44 97:5cf6ab71dcd0 101 this->currentState = STATE_CONTROL_ON;
jmarkel44 97:5cf6ab71dcd0 102 } else {
jmarkel44 97:5cf6ab71dcd0 103 this->currentState = STATE_CONTROL_OFF;
jmarkel44 97:5cf6ab71dcd0 104 }
jmarkel44 164:7cecd731882e 105 this->powerOutput();
jmarkel44 97:5cf6ab71dcd0 106 break;
jmarkel44 97:5cf6ab71dcd0 107 case STATE_CONTROL_ON:
jmarkel44 97:5cf6ab71dcd0 108 if ( !state ) {
jmarkel44 97:5cf6ab71dcd0 109 this->currentState = STATE_CONTROL_OFF;
jmarkel44 164:7cecd731882e 110 this->powerOutput();
jmarkel44 97:5cf6ab71dcd0 111 }
jmarkel44 97:5cf6ab71dcd0 112 break;
jmarkel44 97:5cf6ab71dcd0 113 case STATE_CONTROL_OFF:
jmarkel44 97:5cf6ab71dcd0 114 if ( state ) {
jmarkel44 97:5cf6ab71dcd0 115 this->currentState = STATE_CONTROL_ON;
jmarkel44 164:7cecd731882e 116 this->powerOutput();
jmarkel44 97:5cf6ab71dcd0 117 }
jmarkel44 97:5cf6ab71dcd0 118 break;
jmarkel44 97:5cf6ab71dcd0 119 default:
jmarkel44 97:5cf6ab71dcd0 120 logError("%s unknown state %d\n", __func__, this->currentState);
jmarkel44 97:5cf6ab71dcd0 121 rc = -1;
jmarkel44 97:5cf6ab71dcd0 122 break;
jmarkel44 97:5cf6ab71dcd0 123 }
jmarkel44 97:5cf6ab71dcd0 124 return rc;
jmarkel44 96:807f04bd5256 125 }
jmarkel44 96:807f04bd5256 126
jmarkel44 192:052a419837fa 127 // method: unregisterControl
jmarkel44 192:052a419837fa 128 // description: unregister this control with the output master
jmarkel44 96:807f04bd5256 129 //
jmarkel44 96:807f04bd5256 130 // @param none
jmarkel44 96:807f04bd5256 131 // @return none
jmarkel44 96:807f04bd5256 132 int ManualControl::unregisterControl(void)
jmarkel44 96:807f04bd5256 133 {
jmarkel44 115:1558e01d04c6 134 logInfo("%s: Attempting to unregister %s\n",
jmarkel44 115:1558e01d04c6 135 __func__, controlFile.c_str());
jmarkel44 97:5cf6ab71dcd0 136
jmarkel44 97:5cf6ab71dcd0 137 OutputControlMsg_t *output_mail = OutputMasterMailBox.alloc();
jmarkel44 97:5cf6ab71dcd0 138 memset(output_mail, 0, sizeof(OutputControlMsg_t));
jmarkel44 192:052a419837fa 139
jmarkel44 121:650205ffa656 140 output_mail->controlType = CONTROL_MANUAL;
jmarkel44 121:650205ffa656 141 output_mail->action = ACTION_CONTROL_UNREGISTER;
jmarkel44 121:650205ffa656 142 output_mail->priority = this->priority;
jmarkel44 115:1558e01d04c6 143 strncpy(output_mail->output_tag, this->output.c_str(), sizeof(output_mail->output_tag)-1);
jmarkel44 97:5cf6ab71dcd0 144 strncpy(output_mail->id, this->id.c_str(), sizeof(output_mail->id)-1);
jmarkel44 192:052a419837fa 145
jmarkel44 97:5cf6ab71dcd0 146 OutputMasterMailBox.put(output_mail);
jmarkel44 97:5cf6ab71dcd0 147 return 0;
jmarkel44 97:5cf6ab71dcd0 148 }
jmarkel44 97:5cf6ab71dcd0 149
jmarkel44 192:052a419837fa 150 //
jmarkel44 192:052a419837fa 151 // method: powerOutput
jmarkel44 192:052a419837fa 152 // description: send a message to the output thread to power the relay
jmarkel44 192:052a419837fa 153 //
jmarkel44 192:052a419837fa 154 // @param none
jmarkel44 192:052a419837fa 155 // @return -1 on error; 0 otherwise
jmarkel44 192:052a419837fa 156 //
jmarkel44 164:7cecd731882e 157 int ManualControl::powerOutput(void)
jmarkel44 97:5cf6ab71dcd0 158 {
jmarkel44 97:5cf6ab71dcd0 159 printf("%s: %s attempting to manually turn %s relay %s\n",
jmarkel44 97:5cf6ab71dcd0 160 __func__, controlFile.c_str(), (state) ? "ON" : "OFF", id.c_str());
jmarkel44 97:5cf6ab71dcd0 161
jmarkel44 97:5cf6ab71dcd0 162 OutputControlMsg_t *output_mail = OutputMasterMailBox.alloc();
jmarkel44 97:5cf6ab71dcd0 163 memset(output_mail, 0, sizeof(OutputControlMsg_t));
jmarkel44 192:052a419837fa 164
jmarkel44 121:650205ffa656 165 output_mail->controlType = CONTROL_MANUAL;
jmarkel44 115:1558e01d04c6 166 output_mail->action = (state) ? ACTION_CONTROL_ON : ACTION_CONTROL_OFF;
jmarkel44 115:1558e01d04c6 167 output_mail->priority = this->priority;
jmarkel44 115:1558e01d04c6 168 strncpy(output_mail->output_tag, this->output.c_str(), sizeof(output_mail->output_tag)-1);
jmarkel44 97:5cf6ab71dcd0 169 strncpy(output_mail->id, this->id.c_str(), sizeof(output_mail->id)-1);
jmarkel44 192:052a419837fa 170
jmarkel44 97:5cf6ab71dcd0 171 OutputMasterMailBox.put(output_mail);
jmarkel44 96:807f04bd5256 172 return 0;
jmarkel44 96:807f04bd5256 173 }
jmarkel44 96:807f04bd5256 174
jmarkel44 192:052a419837fa 175 //
jmarkel44 192:052a419837fa 176 // method: display
jmarkel44 192:052a419837fa 177 // description: display the pertinents
jmarkel44 192:052a419837fa 178 //
jmarkel44 192:052a419837fa 179 // @param none
jmarkel44 192:052a419837fa 180 // @return none
jmarkel44 192:052a419837fa 181 //
jmarkel44 96:807f04bd5256 182 void ManualControl::display(void)
jmarkel44 96:807f04bd5256 183 {
jmarkel44 131:a290a3934132 184 string mapper[] = { "INIT",
jmarkel44 131:a290a3934132 185 "STARTUP",
jmarkel44 97:5cf6ab71dcd0 186 "CONTROL_ON",
jmarkel44 97:5cf6ab71dcd0 187 "CONTROL_OFF"
jmarkel44 97:5cf6ab71dcd0 188 };
jmarkel44 205:3c84af5f711f 189
jmarkel44 97:5cf6ab71dcd0 190 printf("\r\n");
jmarkel44 205:3c84af5f711f 191 std::cout << left << setw(10) << setfill(' ') << "manual: ";
jmarkel44 205:3c84af5f711f 192 std::cout << left << setw(32) << setfill(' ') << controlFile;
jmarkel44 205:3c84af5f711f 193 std::cout << left << setw(20) << setfill(' ') << id;
jmarkel44 205:3c84af5f711f 194 std::cout << left << setw(20) << setfill(' ') << output;
jmarkel44 205:3c84af5f711f 195 std::cout << left << setw(6) << setfill(' ') << type;
jmarkel44 205:3c84af5f711f 196 std::cout << left << setw(6) << setfill(' ') << priority;
jmarkel44 205:3c84af5f711f 197 std::cout << left << setw(8) << setfill(' ') << duration;
jmarkel44 205:3c84af5f711f 198 std::cout << left << setw(8) << setfill(' ') << percent;
jmarkel44 205:3c84af5f711f 199 std::cout << left << setw(16) << setfill(' ') << mapper[currentState];
jmarkel44 205:3c84af5f711f 200 std::cout.flush();
jmarkel44 96:807f04bd5256 201 }