UART Command Parser Time Manager Data Store for SD Card for stm32l476 [it's not Licensed as BSD/GPLx]
Dependencies: mbed SDFileSystem
common/DeviceRepeater.cpp@19:36072b9b79f3, 2019-07-05 (annotated)
- Committer:
- Inscape_ao
- Date:
- Fri Jul 05 01:26:19 2019 +0000
- Revision:
- 19:36072b9b79f3
- Parent:
- 17:c2709a9c0a68
add LICENSE.txt
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Inscape_ao | 7:9ab8809f9693 | 1 | /** --- Includes --- */ |
Inscape_ao | 7:9ab8809f9693 | 2 | #include "mbed.h" |
Inscape_ao | 7:9ab8809f9693 | 3 | #include "global.h" |
Inscape_ao | 7:9ab8809f9693 | 4 | #include "string.h" |
Inscape_ao | 7:9ab8809f9693 | 5 | #include "DeviceRepeater.h" |
Inscape_ao | 7:9ab8809f9693 | 6 | |
Inscape_ao | 7:9ab8809f9693 | 7 | void repeater_basetick(void) |
Inscape_ao | 7:9ab8809f9693 | 8 | { |
Inscape_ao | 7:9ab8809f9693 | 9 | pDevRept->tick(); |
Inscape_ao | 7:9ab8809f9693 | 10 | } |
Inscape_ao | 7:9ab8809f9693 | 11 | |
Inscape_ao | 10:db2be22bc2f9 | 12 | DeviceRepeater::DeviceRepeater(int setDeviceID, DeviceDriver *setDriver) |
Inscape_ao | 7:9ab8809f9693 | 13 | { |
Inscape_ao | 10:db2be22bc2f9 | 14 | deviceID = setDeviceID; |
Inscape_ao | 7:9ab8809f9693 | 15 | pClock = new Ticker(); |
Inscape_ao | 7:9ab8809f9693 | 16 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 17 | pDriver = setDriver; |
Inscape_ao | 7:9ab8809f9693 | 18 | stat = DEV_NOT_INIT; |
Inscape_ao | 7:9ab8809f9693 | 19 | repeat_max_count = DEFAULT_REPEAT_MAX_COUNT; |
Inscape_ao | 7:9ab8809f9693 | 20 | repeat_stride_sec = DEFAULT_REPEAT_STRIDE; |
Inscape_ao | 17:c2709a9c0a68 | 21 | repeat_singleshot = DEFAULT_REPEAT_SINGLESHOT; |
Inscape_ao | 7:9ab8809f9693 | 22 | } |
Inscape_ao | 7:9ab8809f9693 | 23 | |
Inscape_ao | 7:9ab8809f9693 | 24 | bool DeviceRepeater::readyToStart(void) |
Inscape_ao | 7:9ab8809f9693 | 25 | { |
Inscape_ao | 7:9ab8809f9693 | 26 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 27 | switch(stat) { |
Inscape_ao | 7:9ab8809f9693 | 28 | case DEV_READY: |
Inscape_ao | 7:9ab8809f9693 | 29 | ret = true; |
Inscape_ao | 7:9ab8809f9693 | 30 | break; |
Inscape_ao | 7:9ab8809f9693 | 31 | case DEV_NOT_INIT: |
Inscape_ao | 7:9ab8809f9693 | 32 | ret = true; |
Inscape_ao | 7:9ab8809f9693 | 33 | break; |
Inscape_ao | 7:9ab8809f9693 | 34 | case DEV_RUNNING: |
Inscape_ao | 7:9ab8809f9693 | 35 | ret = false; |
Inscape_ao | 7:9ab8809f9693 | 36 | break; |
Inscape_ao | 7:9ab8809f9693 | 37 | default: |
Inscape_ao | 7:9ab8809f9693 | 38 | ret = false; |
Inscape_ao | 7:9ab8809f9693 | 39 | break; |
Inscape_ao | 7:9ab8809f9693 | 40 | } |
Inscape_ao | 7:9ab8809f9693 | 41 | return ret; |
Inscape_ao | 7:9ab8809f9693 | 42 | } |
Inscape_ao | 7:9ab8809f9693 | 43 | |
Inscape_ao | 7:9ab8809f9693 | 44 | bool DeviceRepeater::setRepeatCount(int maxcount) |
Inscape_ao | 7:9ab8809f9693 | 45 | { |
Inscape_ao | 7:9ab8809f9693 | 46 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 47 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 48 | return false; |
Inscape_ao | 7:9ab8809f9693 | 49 | } |
Inscape_ao | 7:9ab8809f9693 | 50 | /* invalid arguments */ |
Inscape_ao | 7:9ab8809f9693 | 51 | if (maxcount < 0) { |
Inscape_ao | 7:9ab8809f9693 | 52 | return false; |
Inscape_ao | 7:9ab8809f9693 | 53 | } |
Inscape_ao | 7:9ab8809f9693 | 54 | repeat_max_count = maxcount; |
Inscape_ao | 7:9ab8809f9693 | 55 | return true; |
Inscape_ao | 7:9ab8809f9693 | 56 | } |
Inscape_ao | 7:9ab8809f9693 | 57 | |
Inscape_ao | 7:9ab8809f9693 | 58 | bool DeviceRepeater::setRepeatStride(int sec) |
Inscape_ao | 7:9ab8809f9693 | 59 | { |
Inscape_ao | 7:9ab8809f9693 | 60 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 61 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 62 | return false; |
Inscape_ao | 7:9ab8809f9693 | 63 | } |
Inscape_ao | 7:9ab8809f9693 | 64 | /* invalid arguments */ |
Inscape_ao | 7:9ab8809f9693 | 65 | if (sec < 0) { |
Inscape_ao | 7:9ab8809f9693 | 66 | return false; |
Inscape_ao | 7:9ab8809f9693 | 67 | } else if (sec == 0) { |
Inscape_ao | 7:9ab8809f9693 | 68 | return false; |
Inscape_ao | 7:9ab8809f9693 | 69 | } |
Inscape_ao | 7:9ab8809f9693 | 70 | repeat_stride_sec = sec; |
Inscape_ao | 7:9ab8809f9693 | 71 | return true; |
Inscape_ao | 7:9ab8809f9693 | 72 | } |
Inscape_ao | 7:9ab8809f9693 | 73 | |
Inscape_ao | 17:c2709a9c0a68 | 74 | bool DeviceRepeater::setRepeatSingleShot(bool setMode) |
Inscape_ao | 17:c2709a9c0a68 | 75 | { |
Inscape_ao | 17:c2709a9c0a68 | 76 | /* never accept in Not Ready To Run */ |
Inscape_ao | 17:c2709a9c0a68 | 77 | if (!this->readyToStart()) { |
Inscape_ao | 17:c2709a9c0a68 | 78 | return false; |
Inscape_ao | 17:c2709a9c0a68 | 79 | } |
Inscape_ao | 17:c2709a9c0a68 | 80 | /* TODO */ |
Inscape_ao | 17:c2709a9c0a68 | 81 | repeat_singleshot = setMode; |
Inscape_ao | 17:c2709a9c0a68 | 82 | return true; |
Inscape_ao | 17:c2709a9c0a68 | 83 | } |
Inscape_ao | 17:c2709a9c0a68 | 84 | |
Inscape_ao | 7:9ab8809f9693 | 85 | bool DeviceRepeater::start(void) |
Inscape_ao | 7:9ab8809f9693 | 86 | { |
Inscape_ao | 7:9ab8809f9693 | 87 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 88 | switch(stat) { |
Inscape_ao | 7:9ab8809f9693 | 89 | case DEV_READY: |
Inscape_ao | 7:9ab8809f9693 | 90 | break; |
Inscape_ao | 7:9ab8809f9693 | 91 | case DEV_NOT_INIT: |
Inscape_ao | 7:9ab8809f9693 | 92 | ret = this->init(); |
Inscape_ao | 7:9ab8809f9693 | 93 | if (ret != true) { |
Inscape_ao | 7:9ab8809f9693 | 94 | return false; |
Inscape_ao | 7:9ab8809f9693 | 95 | } |
Inscape_ao | 7:9ab8809f9693 | 96 | break; |
Inscape_ao | 7:9ab8809f9693 | 97 | case DEV_RUNNING: |
Inscape_ao | 7:9ab8809f9693 | 98 | return false; |
Inscape_ao | 7:9ab8809f9693 | 99 | case DEV_FATAL: |
Inscape_ao | 7:9ab8809f9693 | 100 | default: |
Inscape_ao | 7:9ab8809f9693 | 101 | return false; |
Inscape_ao | 7:9ab8809f9693 | 102 | } |
Inscape_ao | 7:9ab8809f9693 | 103 | // Device is in DEV_READY |
Inscape_ao | 7:9ab8809f9693 | 104 | |
Inscape_ao | 8:b18a8764ecae | 105 | /* TODO - add callback for changing READY to RUNNING */ |
Inscape_ao | 9:c81d0df866f5 | 106 | pDriver->ready2run(); |
Inscape_ao | 16:602bc04e3cb5 | 107 | pSds->syncFile(); |
Inscape_ao | 8:b18a8764ecae | 108 | |
Inscape_ao | 7:9ab8809f9693 | 109 | // start Runnig |
Inscape_ao | 7:9ab8809f9693 | 110 | // Device is in DEV_RUNNING |
Inscape_ao | 7:9ab8809f9693 | 111 | stat = DEV_RUNNING; |
Inscape_ao | 7:9ab8809f9693 | 112 | repeat_remain_cnt = repeat_max_count; |
Inscape_ao | 7:9ab8809f9693 | 113 | repeat_remain_sec = repeat_stride_sec; |
Inscape_ao | 7:9ab8809f9693 | 114 | pClock->attach(repeater_basetick, 1.0); |
Inscape_ao | 7:9ab8809f9693 | 115 | return true; |
Inscape_ao | 7:9ab8809f9693 | 116 | } |
Inscape_ao | 7:9ab8809f9693 | 117 | |
Inscape_ao | 7:9ab8809f9693 | 118 | bool DeviceRepeater::stop(void) |
Inscape_ao | 7:9ab8809f9693 | 119 | { |
Inscape_ao | 7:9ab8809f9693 | 120 | if (stat != DEV_RUNNING) { |
Inscape_ao | 7:9ab8809f9693 | 121 | return false; |
Inscape_ao | 7:9ab8809f9693 | 122 | } |
Inscape_ao | 7:9ab8809f9693 | 123 | |
Inscape_ao | 7:9ab8809f9693 | 124 | /* Delaied Stop */ |
Inscape_ao | 7:9ab8809f9693 | 125 | stat = DEV_REQ_STOP; |
Inscape_ao | 7:9ab8809f9693 | 126 | repeat_remain_sec = 0; |
Inscape_ao | 7:9ab8809f9693 | 127 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 128 | return true; |
Inscape_ao | 7:9ab8809f9693 | 129 | } |
Inscape_ao | 7:9ab8809f9693 | 130 | |
Inscape_ao | 7:9ab8809f9693 | 131 | void DeviceRepeater::tick(void) |
Inscape_ao | 7:9ab8809f9693 | 132 | { |
Inscape_ao | 7:9ab8809f9693 | 133 | if (stat != DEV_RUNNING) { |
Inscape_ao | 7:9ab8809f9693 | 134 | /* Delaied Stop */ |
Inscape_ao | 9:c81d0df866f5 | 135 | if (stat == DEV_REQ_STOP) { |
Inscape_ao | 8:b18a8764ecae | 136 | /*****************************************************/ |
Inscape_ao | 8:b18a8764ecae | 137 | /* TODO - add callback for changing RUNNING to READY */ |
Inscape_ao | 8:b18a8764ecae | 138 | /*****************************************************/ |
Inscape_ao | 9:c81d0df866f5 | 139 | pDriver->run2ready(); |
Inscape_ao | 16:602bc04e3cb5 | 140 | pSds->syncFile(); |
Inscape_ao | 7:9ab8809f9693 | 141 | repeat_remain_sec = 0; |
Inscape_ao | 7:9ab8809f9693 | 142 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 143 | return; |
Inscape_ao | 7:9ab8809f9693 | 144 | } |
Inscape_ao | 7:9ab8809f9693 | 145 | return; |
Inscape_ao | 7:9ab8809f9693 | 146 | } |
Inscape_ao | 7:9ab8809f9693 | 147 | if (repeat_remain_sec > 0) { |
Inscape_ao | 9:c81d0df866f5 | 148 | repeat_remain_sec--; |
Inscape_ao | 9:c81d0df866f5 | 149 | } |
Inscape_ao | 9:c81d0df866f5 | 150 | if (repeat_remain_sec == 0) { |
Inscape_ao | 17:c2709a9c0a68 | 151 | bool procRun; |
Inscape_ao | 12:a45a9c65dc03 | 152 | FILE *pSDFile = pSds->getFilePointer(); |
Inscape_ao | 8:b18a8764ecae | 153 | /*****************************************************/ |
Inscape_ao | 8:b18a8764ecae | 154 | /* TODO - kick Senser and send XFD/XDS Data */ |
Inscape_ao | 8:b18a8764ecae | 155 | /*****************************************************/ |
Inscape_ao | 7:9ab8809f9693 | 156 | /** Sensing and Sending Data **/ |
Inscape_ao | 17:c2709a9c0a68 | 157 | procRun = pDriver->exec(deviceID, pUR->getCurrentUart(), pSDFile); |
Inscape_ao | 16:602bc04e3cb5 | 158 | pSds->syncFile(); |
Inscape_ao | 17:c2709a9c0a68 | 159 | if (repeat_singleshot) { |
Inscape_ao | 17:c2709a9c0a68 | 160 | /* Check Exec Sigle On */ |
Inscape_ao | 17:c2709a9c0a68 | 161 | if (procRun == true) { |
Inscape_ao | 17:c2709a9c0a68 | 162 | /* Already - Executed Mesurement in exec */ |
Inscape_ao | 17:c2709a9c0a68 | 163 | /** GOTO Shutdown */ |
Inscape_ao | 17:c2709a9c0a68 | 164 | /* STOP ticking (0->1) */ |
Inscape_ao | 17:c2709a9c0a68 | 165 | /*****************************************************/ |
Inscape_ao | 17:c2709a9c0a68 | 166 | /* TODO - add callback for changing RUNNING to READY */ |
Inscape_ao | 17:c2709a9c0a68 | 167 | /*****************************************************/ |
Inscape_ao | 17:c2709a9c0a68 | 168 | repeat_remain_cnt = 0; |
Inscape_ao | 17:c2709a9c0a68 | 169 | pDriver->run2ready(); |
Inscape_ao | 17:c2709a9c0a68 | 170 | pSds->syncFile(); |
Inscape_ao | 17:c2709a9c0a68 | 171 | repeat_remain_sec = 0; |
Inscape_ao | 17:c2709a9c0a68 | 172 | stat = DEV_READY; |
Inscape_ao | 17:c2709a9c0a68 | 173 | pClock->detach(); |
Inscape_ao | 17:c2709a9c0a68 | 174 | return; |
Inscape_ao | 17:c2709a9c0a68 | 175 | } else { |
Inscape_ao | 17:c2709a9c0a68 | 176 | /* Not Yet - NO Execution in exec */ |
Inscape_ao | 17:c2709a9c0a68 | 177 | } |
Inscape_ao | 17:c2709a9c0a68 | 178 | } |
Inscape_ao | 7:9ab8809f9693 | 179 | } |
Inscape_ao | 7:9ab8809f9693 | 180 | if (repeat_remain_sec <= 0) { |
Inscape_ao | 7:9ab8809f9693 | 181 | if (repeat_remain_cnt > 0) { |
Inscape_ao | 7:9ab8809f9693 | 182 | repeat_remain_cnt--; |
Inscape_ao | 7:9ab8809f9693 | 183 | if (repeat_remain_cnt == 0) { |
Inscape_ao | 7:9ab8809f9693 | 184 | /* STOP ticking (0->1) */ |
Inscape_ao | 8:b18a8764ecae | 185 | /*****************************************************/ |
Inscape_ao | 8:b18a8764ecae | 186 | /* TODO - add callback for changing RUNNING to READY */ |
Inscape_ao | 8:b18a8764ecae | 187 | /*****************************************************/ |
Inscape_ao | 9:c81d0df866f5 | 188 | pDriver->run2ready(); |
Inscape_ao | 16:602bc04e3cb5 | 189 | pSds->syncFile(); |
Inscape_ao | 7:9ab8809f9693 | 190 | repeat_remain_sec = 0; |
Inscape_ao | 7:9ab8809f9693 | 191 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 192 | pClock->detach(); |
Inscape_ao | 7:9ab8809f9693 | 193 | return; |
Inscape_ao | 7:9ab8809f9693 | 194 | } |
Inscape_ao | 7:9ab8809f9693 | 195 | /* REFILL */ |
Inscape_ao | 7:9ab8809f9693 | 196 | } else if (repeat_remain_cnt == 0) { |
Inscape_ao | 7:9ab8809f9693 | 197 | /* REFILL */ |
Inscape_ao | 7:9ab8809f9693 | 198 | } else { |
Inscape_ao | 8:b18a8764ecae | 199 | /*****************************************************/ |
Inscape_ao | 7:9ab8809f9693 | 200 | /* TODO : FATAL */ |
Inscape_ao | 8:b18a8764ecae | 201 | /*****************************************************/ |
Inscape_ao | 7:9ab8809f9693 | 202 | while(1); |
Inscape_ao | 7:9ab8809f9693 | 203 | } |
Inscape_ao | 7:9ab8809f9693 | 204 | repeat_remain_sec = repeat_stride_sec; |
Inscape_ao | 7:9ab8809f9693 | 205 | } |
Inscape_ao | 7:9ab8809f9693 | 206 | } |
Inscape_ao | 7:9ab8809f9693 | 207 | |
Inscape_ao | 7:9ab8809f9693 | 208 | bool DeviceRepeater::init(void) |
Inscape_ao | 7:9ab8809f9693 | 209 | { |
Inscape_ao | 7:9ab8809f9693 | 210 | int ret; |
Inscape_ao | 7:9ab8809f9693 | 211 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 212 | ret = pDriver->init(); |
Inscape_ao | 7:9ab8809f9693 | 213 | if (ret == 0) { |
Inscape_ao | 7:9ab8809f9693 | 214 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 215 | } else { |
Inscape_ao | 7:9ab8809f9693 | 216 | stat = DEV_FATAL; |
Inscape_ao | 7:9ab8809f9693 | 217 | } |
Inscape_ao | 7:9ab8809f9693 | 218 | return (stat == DEV_READY)? true : false; |
Inscape_ao | 7:9ab8809f9693 | 219 | } |
Inscape_ao | 7:9ab8809f9693 | 220 | |
Inscape_ao | 7:9ab8809f9693 | 221 | bool DeviceRepeater::resetAllStatus(void) |
Inscape_ao | 7:9ab8809f9693 | 222 | { |
Inscape_ao | 7:9ab8809f9693 | 223 | /* TODO */ |
Inscape_ao | 7:9ab8809f9693 | 224 | int ret; |
Inscape_ao | 7:9ab8809f9693 | 225 | ret = pDriver->reset(); |
Inscape_ao | 7:9ab8809f9693 | 226 | if (ret == 0) { |
Inscape_ao | 7:9ab8809f9693 | 227 | /* SUCCESS */ |
Inscape_ao | 7:9ab8809f9693 | 228 | /* TODO */ |
Inscape_ao | 7:9ab8809f9693 | 229 | } else { |
Inscape_ao | 7:9ab8809f9693 | 230 | /* ERROR */ |
Inscape_ao | 7:9ab8809f9693 | 231 | /* TODO */ |
Inscape_ao | 7:9ab8809f9693 | 232 | } |
Inscape_ao | 7:9ab8809f9693 | 233 | return false; |
Inscape_ao | 7:9ab8809f9693 | 234 | } |
Inscape_ao | 7:9ab8809f9693 | 235 | |
Inscape_ao | 7:9ab8809f9693 | 236 | bool DeviceRepeater::setConfigId(int id) |
Inscape_ao | 7:9ab8809f9693 | 237 | { |
Inscape_ao | 7:9ab8809f9693 | 238 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 239 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 240 | return false; |
Inscape_ao | 7:9ab8809f9693 | 241 | } |
Inscape_ao | 7:9ab8809f9693 | 242 | if (selected_id != NOT_ID_SELECTED) { |
Inscape_ao | 7:9ab8809f9693 | 243 | return false; |
Inscape_ao | 7:9ab8809f9693 | 244 | } |
Inscape_ao | 7:9ab8809f9693 | 245 | selected_id = id; |
Inscape_ao | 7:9ab8809f9693 | 246 | return true; |
Inscape_ao | 7:9ab8809f9693 | 247 | } |
Inscape_ao | 7:9ab8809f9693 | 248 | |
Inscape_ao | 7:9ab8809f9693 | 249 | bool DeviceRepeater::setConfigValue(int setValue) |
Inscape_ao | 7:9ab8809f9693 | 250 | { |
Inscape_ao | 7:9ab8809f9693 | 251 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 252 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 253 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 254 | return false; |
Inscape_ao | 7:9ab8809f9693 | 255 | } |
Inscape_ao | 7:9ab8809f9693 | 256 | /* not set config ID before Set */ |
Inscape_ao | 7:9ab8809f9693 | 257 | if (selected_id == NOT_ID_SELECTED) { |
Inscape_ao | 7:9ab8809f9693 | 258 | return false; |
Inscape_ao | 7:9ab8809f9693 | 259 | } |
Inscape_ao | 7:9ab8809f9693 | 260 | ret = pDriver->set_config(selected_id, setValue); |
Inscape_ao | 7:9ab8809f9693 | 261 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 262 | return ret; |
Inscape_ao | 7:9ab8809f9693 | 263 | } |
Inscape_ao | 7:9ab8809f9693 | 264 | |
Inscape_ao | 7:9ab8809f9693 | 265 | bool DeviceRepeater::getConfigValue(int *retValue) |
Inscape_ao | 7:9ab8809f9693 | 266 | { |
Inscape_ao | 7:9ab8809f9693 | 267 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 268 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 269 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 270 | return false; |
Inscape_ao | 7:9ab8809f9693 | 271 | } |
Inscape_ao | 7:9ab8809f9693 | 272 | /* not set config ID before Get */ |
Inscape_ao | 7:9ab8809f9693 | 273 | if (selected_id == NOT_ID_SELECTED) { |
Inscape_ao | 7:9ab8809f9693 | 274 | return false; |
Inscape_ao | 7:9ab8809f9693 | 275 | } |
Inscape_ao | 7:9ab8809f9693 | 276 | ret = pDriver->get_config(selected_id, retValue); |
Inscape_ao | 7:9ab8809f9693 | 277 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 278 | return ret; |
Inscape_ao | 7:9ab8809f9693 | 279 | } |