Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: NaturalTinyShell_ice libmDot-12Sept mbed-rtos mbed
Fork of ICE by
src/ConfigurationHandler/Controls/FailsafeControl.cpp@250:1cd8ec63e9e9, 2016-10-21 (annotated)
- Committer:
- jmarkel44
- Date:
- Fri Oct 21 11:42:24 2016 +0000
- Revision:
- 250:1cd8ec63e9e9
- Child:
- 252:3c9863f951b7
working on failsafes;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
jmarkel44 | 250:1cd8ec63e9e9 | 1 | /****************************************************************************** |
jmarkel44 | 250:1cd8ec63e9e9 | 2 | * |
jmarkel44 | 250:1cd8ec63e9e9 | 3 | * File: CompositeControl.cpp |
jmarkel44 | 250:1cd8ec63e9e9 | 4 | * Desciption: ICE Composite Control Class implementation |
jmarkel44 | 250:1cd8ec63e9e9 | 5 | * |
jmarkel44 | 250:1cd8ec63e9e9 | 6 | *****************************************************************************/ |
jmarkel44 | 250:1cd8ec63e9e9 | 7 | #include "FailsafeControl.h" |
jmarkel44 | 250:1cd8ec63e9e9 | 8 | #include "cJSON.h" |
jmarkel44 | 250:1cd8ec63e9e9 | 9 | #include "mDot.h" |
jmarkel44 | 250:1cd8ec63e9e9 | 10 | #include "global.h" |
jmarkel44 | 250:1cd8ec63e9e9 | 11 | #include <string> |
jmarkel44 | 250:1cd8ec63e9e9 | 12 | #include <iostream> |
jmarkel44 | 250:1cd8ec63e9e9 | 13 | #include <iomanip> |
jmarkel44 | 250:1cd8ec63e9e9 | 14 | |
jmarkel44 | 250:1cd8ec63e9e9 | 15 | extern mDot *GLOBAL_mdot; |
jmarkel44 | 250:1cd8ec63e9e9 | 16 | |
jmarkel44 | 250:1cd8ec63e9e9 | 17 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 18 | // method: load |
jmarkel44 | 250:1cd8ec63e9e9 | 19 | // description: load a composite control |
jmarkel44 | 250:1cd8ec63e9e9 | 20 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 21 | // @param none |
jmarkel44 | 250:1cd8ec63e9e9 | 22 | // @return none |
jmarkel44 | 250:1cd8ec63e9e9 | 23 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 24 | bool FailsafeControl::load(std::string _controlFile) |
jmarkel44 | 250:1cd8ec63e9e9 | 25 | { |
jmarkel44 | 250:1cd8ec63e9e9 | 26 | controlFile = _controlFile; |
jmarkel44 | 250:1cd8ec63e9e9 | 27 | |
jmarkel44 | 250:1cd8ec63e9e9 | 28 | // open and read from the control file |
jmarkel44 | 250:1cd8ec63e9e9 | 29 | mDot::mdot_file file = GLOBAL_mdot->openUserFile(controlFile.c_str(), mDot::FM_RDONLY); |
jmarkel44 | 250:1cd8ec63e9e9 | 30 | if ( file.fd < 0 ) { |
jmarkel44 | 250:1cd8ec63e9e9 | 31 | logError("%s: failed to open %s\n", __func__, controlFile.c_str()); |
jmarkel44 | 250:1cd8ec63e9e9 | 32 | return false; |
jmarkel44 | 250:1cd8ec63e9e9 | 33 | } |
jmarkel44 | 250:1cd8ec63e9e9 | 34 | |
jmarkel44 | 250:1cd8ec63e9e9 | 35 | // read the data into a buffer |
jmarkel44 | 250:1cd8ec63e9e9 | 36 | char dataBuf[MAX_FILE_SIZE]; |
jmarkel44 | 250:1cd8ec63e9e9 | 37 | |
jmarkel44 | 250:1cd8ec63e9e9 | 38 | int bytes_read = GLOBAL_mdot->readUserFile(file, (void *)dataBuf, sizeof(dataBuf)); |
jmarkel44 | 250:1cd8ec63e9e9 | 39 | if ( bytes_read != sizeof(dataBuf) ) { |
jmarkel44 | 250:1cd8ec63e9e9 | 40 | logError("%s: failed to read %d bytes from %s", __func__, sizeof(dataBuf), controlFile.c_str()); |
jmarkel44 | 250:1cd8ec63e9e9 | 41 | // caller should destroy the object |
jmarkel44 | 250:1cd8ec63e9e9 | 42 | return false; |
jmarkel44 | 250:1cd8ec63e9e9 | 43 | } |
jmarkel44 | 250:1cd8ec63e9e9 | 44 | |
jmarkel44 | 250:1cd8ec63e9e9 | 45 | // close the file |
jmarkel44 | 250:1cd8ec63e9e9 | 46 | GLOBAL_mdot->closeUserFile(file); |
jmarkel44 | 250:1cd8ec63e9e9 | 47 | |
jmarkel44 | 250:1cd8ec63e9e9 | 48 | // parse the data |
jmarkel44 | 250:1cd8ec63e9e9 | 49 | cJSON * root = cJSON_Parse(dataBuf); |
jmarkel44 | 250:1cd8ec63e9e9 | 50 | |
jmarkel44 | 250:1cd8ec63e9e9 | 51 | id = cJSON_GetObjectItem(root, "id")->valuestring; |
jmarkel44 | 250:1cd8ec63e9e9 | 52 | priority = atoi(cJSON_GetObjectItem(root, "priority")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 53 | input = cJSON_GetObjectItem(root, "input")->valuestring; |
jmarkel44 | 250:1cd8ec63e9e9 | 54 | output = cJSON_GetObjectItem(root, "output")->valuestring; |
jmarkel44 | 250:1cd8ec63e9e9 | 55 | |
jmarkel44 | 250:1cd8ec63e9e9 | 56 | hfs_data.value = atof(cJSON_GetObjectItem(root, "hfsValue")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 57 | hfs_data.dutyCycle = atoi(cJSON_GetObjectItem(root, "hfsDutyCycle")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 58 | hfs_data.interval = atoi(cJSON_GetObjectItem(root, "hfsInterval")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 59 | |
jmarkel44 | 250:1cd8ec63e9e9 | 60 | lfs_data.value = atof(cJSON_GetObjectItem(root, "lfsValue")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 61 | lfs_data.dutyCycle = atoi(cJSON_GetObjectItem(root, "lfsDutyCycle")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 62 | lfs_data.interval = atoi(cJSON_GetObjectItem(root, "lfsInterval")->valuestring); |
jmarkel44 | 250:1cd8ec63e9e9 | 63 | |
jmarkel44 | 250:1cd8ec63e9e9 | 64 | return true; |
jmarkel44 | 250:1cd8ec63e9e9 | 65 | } |
jmarkel44 | 250:1cd8ec63e9e9 | 66 | |
jmarkel44 | 250:1cd8ec63e9e9 | 67 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 68 | // method: start |
jmarkel44 | 250:1cd8ec63e9e9 | 69 | // description: start the failsafe control |
jmarkel44 | 250:1cd8ec63e9e9 | 70 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 71 | // @param none |
jmarkel44 | 250:1cd8ec63e9e9 | 72 | // @return none |
jmarkel44 | 250:1cd8ec63e9e9 | 73 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 74 | void FailsafeControl::start(void) |
jmarkel44 | 250:1cd8ec63e9e9 | 75 | { |
jmarkel44 | 250:1cd8ec63e9e9 | 76 | currentState = STATE_START; |
jmarkel44 | 250:1cd8ec63e9e9 | 77 | } |
jmarkel44 | 250:1cd8ec63e9e9 | 78 | |
jmarkel44 | 250:1cd8ec63e9e9 | 79 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 80 | // method: update |
jmarkel44 | 250:1cd8ec63e9e9 | 81 | // description: update the faisafe control |
jmarkel44 | 250:1cd8ec63e9e9 | 82 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 83 | // @param none |
jmarkel44 | 250:1cd8ec63e9e9 | 84 | // @return none |
jmarkel44 | 250:1cd8ec63e9e9 | 85 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 86 | void FailsafeControl::update(void) |
jmarkel44 | 250:1cd8ec63e9e9 | 87 | { |
jmarkel44 | 250:1cd8ec63e9e9 | 88 | switch ( this->currentState ) { |
jmarkel44 | 250:1cd8ec63e9e9 | 89 | case STATE_INIT: |
jmarkel44 | 250:1cd8ec63e9e9 | 90 | // do nothing |
jmarkel44 | 250:1cd8ec63e9e9 | 91 | break; |
jmarkel44 | 250:1cd8ec63e9e9 | 92 | case STATE_START: |
jmarkel44 | 250:1cd8ec63e9e9 | 93 | case STATE_CONTROL_OFF: |
jmarkel44 | 250:1cd8ec63e9e9 | 94 | case STATE_CONTROL_LFS_ON: |
jmarkel44 | 250:1cd8ec63e9e9 | 95 | case STATE_CONTROL_LFS_OFF: |
jmarkel44 | 250:1cd8ec63e9e9 | 96 | case STATE_CONTROL_HFS_ON: |
jmarkel44 | 250:1cd8ec63e9e9 | 97 | case STATE_CONTROL_HFS_OFF: |
jmarkel44 | 250:1cd8ec63e9e9 | 98 | default: |
jmarkel44 | 250:1cd8ec63e9e9 | 99 | break; |
jmarkel44 | 250:1cd8ec63e9e9 | 100 | } |
jmarkel44 | 250:1cd8ec63e9e9 | 101 | } |
jmarkel44 | 250:1cd8ec63e9e9 | 102 | |
jmarkel44 | 250:1cd8ec63e9e9 | 103 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 104 | // method: display |
jmarkel44 | 250:1cd8ec63e9e9 | 105 | // description: display the pertinents |
jmarkel44 | 250:1cd8ec63e9e9 | 106 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 107 | // @param none |
jmarkel44 | 250:1cd8ec63e9e9 | 108 | // @return none |
jmarkel44 | 250:1cd8ec63e9e9 | 109 | // |
jmarkel44 | 250:1cd8ec63e9e9 | 110 | void FailsafeControl::display(void) |
jmarkel44 | 250:1cd8ec63e9e9 | 111 | { |
jmarkel44 | 250:1cd8ec63e9e9 | 112 | const char *mapper[] = { "INIT", |
jmarkel44 | 250:1cd8ec63e9e9 | 113 | "START", |
jmarkel44 | 250:1cd8ec63e9e9 | 114 | "CONTROL_OFF", |
jmarkel44 | 250:1cd8ec63e9e9 | 115 | "LFS_ON", |
jmarkel44 | 250:1cd8ec63e9e9 | 116 | "LFS_OFF", |
jmarkel44 | 250:1cd8ec63e9e9 | 117 | "HFS_ON", |
jmarkel44 | 250:1cd8ec63e9e9 | 118 | "HFS_OFF", |
jmarkel44 | 250:1cd8ec63e9e9 | 119 | "invalid" |
jmarkel44 | 250:1cd8ec63e9e9 | 120 | }; |
jmarkel44 | 250:1cd8ec63e9e9 | 121 | |
jmarkel44 | 250:1cd8ec63e9e9 | 122 | printf("\r\n"); |
jmarkel44 | 250:1cd8ec63e9e9 | 123 | std::cout << left << setw(10) << setfill(' ') << "failsafe: "; |
jmarkel44 | 250:1cd8ec63e9e9 | 124 | std::cout << left << setw(32) << setfill(' ') << controlFile; |
jmarkel44 | 250:1cd8ec63e9e9 | 125 | std::cout << left << setw(20) << setfill(' ') << id; |
jmarkel44 | 250:1cd8ec63e9e9 | 126 | std::cout << left << setw(6) << setfill(' ') << priority; |
jmarkel44 | 250:1cd8ec63e9e9 | 127 | std::cout << left << setw(20) << setfill(' ') << input; |
jmarkel44 | 250:1cd8ec63e9e9 | 128 | std::cout << left << setw(20) << setfill(' ') << output; |
jmarkel44 | 250:1cd8ec63e9e9 | 129 | std::cout << left << setw(16) << setfill(' ') << mapper[currentState]; |
jmarkel44 | 250:1cd8ec63e9e9 | 130 | std::cout << left << setw(12) << setfill(' ') << "lfs-> " << lfs_data.value << ":" << lfs_data.dutyCycle << ":" << lfs_data.interval; |
jmarkel44 | 250:1cd8ec63e9e9 | 131 | std::cout << right << setw(12) << setfill(' ') << "hfs-> " << hfs_data.value << ":" << hfs_data.dutyCycle << ":" << hfs_data.interval; |
jmarkel44 | 250:1cd8ec63e9e9 | 132 | |
jmarkel44 | 250:1cd8ec63e9e9 | 133 | std::cout.flush(); |
jmarkel44 | 250:1cd8ec63e9e9 | 134 | } |