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@12:a45a9c65dc03, 2019-05-22 (annotated)
- Committer:
- Inscape_ao
- Date:
- Wed May 22 09:10:18 2019 +0000
- Revision:
- 12:a45a9c65dc03
- Parent:
- 10:db2be22bc2f9
- Child:
- 16:602bc04e3cb5
update LED seq and USER_BUTTON
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 | 7:9ab8809f9693 | 21 | } |
Inscape_ao | 7:9ab8809f9693 | 22 | |
Inscape_ao | 7:9ab8809f9693 | 23 | bool DeviceRepeater::readyToStart(void) |
Inscape_ao | 7:9ab8809f9693 | 24 | { |
Inscape_ao | 7:9ab8809f9693 | 25 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 26 | switch(stat) { |
Inscape_ao | 7:9ab8809f9693 | 27 | case DEV_READY: |
Inscape_ao | 7:9ab8809f9693 | 28 | ret = true; |
Inscape_ao | 7:9ab8809f9693 | 29 | break; |
Inscape_ao | 7:9ab8809f9693 | 30 | case DEV_NOT_INIT: |
Inscape_ao | 7:9ab8809f9693 | 31 | ret = true; |
Inscape_ao | 7:9ab8809f9693 | 32 | break; |
Inscape_ao | 7:9ab8809f9693 | 33 | case DEV_RUNNING: |
Inscape_ao | 7:9ab8809f9693 | 34 | ret = false; |
Inscape_ao | 7:9ab8809f9693 | 35 | break; |
Inscape_ao | 7:9ab8809f9693 | 36 | default: |
Inscape_ao | 7:9ab8809f9693 | 37 | ret = false; |
Inscape_ao | 7:9ab8809f9693 | 38 | break; |
Inscape_ao | 7:9ab8809f9693 | 39 | } |
Inscape_ao | 7:9ab8809f9693 | 40 | return ret; |
Inscape_ao | 7:9ab8809f9693 | 41 | } |
Inscape_ao | 7:9ab8809f9693 | 42 | |
Inscape_ao | 7:9ab8809f9693 | 43 | bool DeviceRepeater::setRepeatCount(int maxcount) |
Inscape_ao | 7:9ab8809f9693 | 44 | { |
Inscape_ao | 7:9ab8809f9693 | 45 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 46 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 47 | return false; |
Inscape_ao | 7:9ab8809f9693 | 48 | } |
Inscape_ao | 7:9ab8809f9693 | 49 | /* invalid arguments */ |
Inscape_ao | 7:9ab8809f9693 | 50 | if (maxcount < 0) { |
Inscape_ao | 7:9ab8809f9693 | 51 | return false; |
Inscape_ao | 7:9ab8809f9693 | 52 | } |
Inscape_ao | 7:9ab8809f9693 | 53 | repeat_max_count = maxcount; |
Inscape_ao | 7:9ab8809f9693 | 54 | return true; |
Inscape_ao | 7:9ab8809f9693 | 55 | } |
Inscape_ao | 7:9ab8809f9693 | 56 | |
Inscape_ao | 7:9ab8809f9693 | 57 | bool DeviceRepeater::setRepeatStride(int sec) |
Inscape_ao | 7:9ab8809f9693 | 58 | { |
Inscape_ao | 7:9ab8809f9693 | 59 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 60 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 61 | return false; |
Inscape_ao | 7:9ab8809f9693 | 62 | } |
Inscape_ao | 7:9ab8809f9693 | 63 | /* invalid arguments */ |
Inscape_ao | 7:9ab8809f9693 | 64 | if (sec < 0) { |
Inscape_ao | 7:9ab8809f9693 | 65 | return false; |
Inscape_ao | 7:9ab8809f9693 | 66 | } else if (sec == 0) { |
Inscape_ao | 7:9ab8809f9693 | 67 | return false; |
Inscape_ao | 7:9ab8809f9693 | 68 | } |
Inscape_ao | 7:9ab8809f9693 | 69 | repeat_stride_sec = sec; |
Inscape_ao | 7:9ab8809f9693 | 70 | return true; |
Inscape_ao | 7:9ab8809f9693 | 71 | } |
Inscape_ao | 7:9ab8809f9693 | 72 | |
Inscape_ao | 7:9ab8809f9693 | 73 | bool DeviceRepeater::start(void) |
Inscape_ao | 7:9ab8809f9693 | 74 | { |
Inscape_ao | 7:9ab8809f9693 | 75 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 76 | switch(stat) { |
Inscape_ao | 7:9ab8809f9693 | 77 | case DEV_READY: |
Inscape_ao | 7:9ab8809f9693 | 78 | break; |
Inscape_ao | 7:9ab8809f9693 | 79 | case DEV_NOT_INIT: |
Inscape_ao | 7:9ab8809f9693 | 80 | ret = this->init(); |
Inscape_ao | 7:9ab8809f9693 | 81 | if (ret != true) { |
Inscape_ao | 7:9ab8809f9693 | 82 | return false; |
Inscape_ao | 7:9ab8809f9693 | 83 | } |
Inscape_ao | 7:9ab8809f9693 | 84 | break; |
Inscape_ao | 7:9ab8809f9693 | 85 | case DEV_RUNNING: |
Inscape_ao | 7:9ab8809f9693 | 86 | return false; |
Inscape_ao | 7:9ab8809f9693 | 87 | case DEV_FATAL: |
Inscape_ao | 7:9ab8809f9693 | 88 | default: |
Inscape_ao | 7:9ab8809f9693 | 89 | return false; |
Inscape_ao | 7:9ab8809f9693 | 90 | } |
Inscape_ao | 7:9ab8809f9693 | 91 | // Device is in DEV_READY |
Inscape_ao | 7:9ab8809f9693 | 92 | |
Inscape_ao | 8:b18a8764ecae | 93 | /* TODO - add callback for changing READY to RUNNING */ |
Inscape_ao | 9:c81d0df866f5 | 94 | pDriver->ready2run(); |
Inscape_ao | 8:b18a8764ecae | 95 | |
Inscape_ao | 7:9ab8809f9693 | 96 | // start Runnig |
Inscape_ao | 7:9ab8809f9693 | 97 | // Device is in DEV_RUNNING |
Inscape_ao | 7:9ab8809f9693 | 98 | stat = DEV_RUNNING; |
Inscape_ao | 7:9ab8809f9693 | 99 | repeat_remain_cnt = repeat_max_count; |
Inscape_ao | 7:9ab8809f9693 | 100 | repeat_remain_sec = repeat_stride_sec; |
Inscape_ao | 7:9ab8809f9693 | 101 | pClock->attach(repeater_basetick, 1.0); |
Inscape_ao | 7:9ab8809f9693 | 102 | return true; |
Inscape_ao | 7:9ab8809f9693 | 103 | } |
Inscape_ao | 7:9ab8809f9693 | 104 | |
Inscape_ao | 7:9ab8809f9693 | 105 | bool DeviceRepeater::stop(void) |
Inscape_ao | 7:9ab8809f9693 | 106 | { |
Inscape_ao | 7:9ab8809f9693 | 107 | if (stat != DEV_RUNNING) { |
Inscape_ao | 7:9ab8809f9693 | 108 | return false; |
Inscape_ao | 7:9ab8809f9693 | 109 | } |
Inscape_ao | 7:9ab8809f9693 | 110 | |
Inscape_ao | 7:9ab8809f9693 | 111 | /* Delaied Stop */ |
Inscape_ao | 7:9ab8809f9693 | 112 | stat = DEV_REQ_STOP; |
Inscape_ao | 7:9ab8809f9693 | 113 | repeat_remain_sec = 0; |
Inscape_ao | 7:9ab8809f9693 | 114 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 115 | return true; |
Inscape_ao | 7:9ab8809f9693 | 116 | } |
Inscape_ao | 7:9ab8809f9693 | 117 | |
Inscape_ao | 7:9ab8809f9693 | 118 | void DeviceRepeater::tick(void) |
Inscape_ao | 7:9ab8809f9693 | 119 | { |
Inscape_ao | 7:9ab8809f9693 | 120 | if (stat != DEV_RUNNING) { |
Inscape_ao | 7:9ab8809f9693 | 121 | /* Delaied Stop */ |
Inscape_ao | 9:c81d0df866f5 | 122 | if (stat == DEV_REQ_STOP) { |
Inscape_ao | 8:b18a8764ecae | 123 | /*****************************************************/ |
Inscape_ao | 8:b18a8764ecae | 124 | /* TODO - add callback for changing RUNNING to READY */ |
Inscape_ao | 8:b18a8764ecae | 125 | /*****************************************************/ |
Inscape_ao | 9:c81d0df866f5 | 126 | pDriver->run2ready(); |
Inscape_ao | 7:9ab8809f9693 | 127 | repeat_remain_sec = 0; |
Inscape_ao | 7:9ab8809f9693 | 128 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 129 | return; |
Inscape_ao | 7:9ab8809f9693 | 130 | } |
Inscape_ao | 7:9ab8809f9693 | 131 | return; |
Inscape_ao | 7:9ab8809f9693 | 132 | } |
Inscape_ao | 7:9ab8809f9693 | 133 | if (repeat_remain_sec > 0) { |
Inscape_ao | 9:c81d0df866f5 | 134 | repeat_remain_sec--; |
Inscape_ao | 9:c81d0df866f5 | 135 | } |
Inscape_ao | 9:c81d0df866f5 | 136 | if (repeat_remain_sec == 0) { |
Inscape_ao | 12:a45a9c65dc03 | 137 | FILE *pSDFile = pSds->getFilePointer(); |
Inscape_ao | 8:b18a8764ecae | 138 | /*****************************************************/ |
Inscape_ao | 8:b18a8764ecae | 139 | /* TODO - kick Senser and send XFD/XDS Data */ |
Inscape_ao | 8:b18a8764ecae | 140 | /*****************************************************/ |
Inscape_ao | 7:9ab8809f9693 | 141 | /** Sensing and Sending Data **/ |
Inscape_ao | 12:a45a9c65dc03 | 142 | pDriver->exec(deviceID, pUR->getCurrentUart(), pSDFile); |
Inscape_ao | 12:a45a9c65dc03 | 143 | if (pSDFile != NULL) { |
Inscape_ao | 12:a45a9c65dc03 | 144 | fflush(pSDFile); |
Inscape_ao | 12:a45a9c65dc03 | 145 | } |
Inscape_ao | 7:9ab8809f9693 | 146 | } |
Inscape_ao | 7:9ab8809f9693 | 147 | if (repeat_remain_sec <= 0) { |
Inscape_ao | 7:9ab8809f9693 | 148 | if (repeat_remain_cnt > 0) { |
Inscape_ao | 7:9ab8809f9693 | 149 | repeat_remain_cnt--; |
Inscape_ao | 7:9ab8809f9693 | 150 | if (repeat_remain_cnt == 0) { |
Inscape_ao | 7:9ab8809f9693 | 151 | /* STOP ticking (0->1) */ |
Inscape_ao | 8:b18a8764ecae | 152 | /*****************************************************/ |
Inscape_ao | 8:b18a8764ecae | 153 | /* TODO - add callback for changing RUNNING to READY */ |
Inscape_ao | 8:b18a8764ecae | 154 | /*****************************************************/ |
Inscape_ao | 9:c81d0df866f5 | 155 | pDriver->run2ready(); |
Inscape_ao | 7:9ab8809f9693 | 156 | repeat_remain_sec = 0; |
Inscape_ao | 7:9ab8809f9693 | 157 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 158 | pClock->detach(); |
Inscape_ao | 7:9ab8809f9693 | 159 | return; |
Inscape_ao | 7:9ab8809f9693 | 160 | } |
Inscape_ao | 7:9ab8809f9693 | 161 | /* REFILL */ |
Inscape_ao | 7:9ab8809f9693 | 162 | } else if (repeat_remain_cnt == 0) { |
Inscape_ao | 7:9ab8809f9693 | 163 | /* REFILL */ |
Inscape_ao | 7:9ab8809f9693 | 164 | } else { |
Inscape_ao | 8:b18a8764ecae | 165 | /*****************************************************/ |
Inscape_ao | 7:9ab8809f9693 | 166 | /* TODO : FATAL */ |
Inscape_ao | 8:b18a8764ecae | 167 | /*****************************************************/ |
Inscape_ao | 7:9ab8809f9693 | 168 | while(1); |
Inscape_ao | 7:9ab8809f9693 | 169 | } |
Inscape_ao | 7:9ab8809f9693 | 170 | repeat_remain_sec = repeat_stride_sec; |
Inscape_ao | 7:9ab8809f9693 | 171 | } |
Inscape_ao | 7:9ab8809f9693 | 172 | } |
Inscape_ao | 7:9ab8809f9693 | 173 | |
Inscape_ao | 7:9ab8809f9693 | 174 | bool DeviceRepeater::init(void) |
Inscape_ao | 7:9ab8809f9693 | 175 | { |
Inscape_ao | 7:9ab8809f9693 | 176 | int ret; |
Inscape_ao | 7:9ab8809f9693 | 177 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 178 | ret = pDriver->init(); |
Inscape_ao | 7:9ab8809f9693 | 179 | if (ret == 0) { |
Inscape_ao | 7:9ab8809f9693 | 180 | stat = DEV_READY; |
Inscape_ao | 7:9ab8809f9693 | 181 | } else { |
Inscape_ao | 7:9ab8809f9693 | 182 | stat = DEV_FATAL; |
Inscape_ao | 7:9ab8809f9693 | 183 | } |
Inscape_ao | 7:9ab8809f9693 | 184 | return (stat == DEV_READY)? true : false; |
Inscape_ao | 7:9ab8809f9693 | 185 | } |
Inscape_ao | 7:9ab8809f9693 | 186 | |
Inscape_ao | 7:9ab8809f9693 | 187 | bool DeviceRepeater::resetAllStatus(void) |
Inscape_ao | 7:9ab8809f9693 | 188 | { |
Inscape_ao | 7:9ab8809f9693 | 189 | /* TODO */ |
Inscape_ao | 7:9ab8809f9693 | 190 | int ret; |
Inscape_ao | 7:9ab8809f9693 | 191 | ret = pDriver->reset(); |
Inscape_ao | 7:9ab8809f9693 | 192 | if (ret == 0) { |
Inscape_ao | 7:9ab8809f9693 | 193 | /* SUCCESS */ |
Inscape_ao | 7:9ab8809f9693 | 194 | /* TODO */ |
Inscape_ao | 7:9ab8809f9693 | 195 | } else { |
Inscape_ao | 7:9ab8809f9693 | 196 | /* ERROR */ |
Inscape_ao | 7:9ab8809f9693 | 197 | /* TODO */ |
Inscape_ao | 7:9ab8809f9693 | 198 | } |
Inscape_ao | 7:9ab8809f9693 | 199 | return false; |
Inscape_ao | 7:9ab8809f9693 | 200 | } |
Inscape_ao | 7:9ab8809f9693 | 201 | |
Inscape_ao | 7:9ab8809f9693 | 202 | bool DeviceRepeater::setConfigId(int id) |
Inscape_ao | 7:9ab8809f9693 | 203 | { |
Inscape_ao | 7:9ab8809f9693 | 204 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 205 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 206 | return false; |
Inscape_ao | 7:9ab8809f9693 | 207 | } |
Inscape_ao | 7:9ab8809f9693 | 208 | if (selected_id != NOT_ID_SELECTED) { |
Inscape_ao | 7:9ab8809f9693 | 209 | return false; |
Inscape_ao | 7:9ab8809f9693 | 210 | } |
Inscape_ao | 7:9ab8809f9693 | 211 | selected_id = id; |
Inscape_ao | 7:9ab8809f9693 | 212 | return true; |
Inscape_ao | 7:9ab8809f9693 | 213 | } |
Inscape_ao | 7:9ab8809f9693 | 214 | |
Inscape_ao | 7:9ab8809f9693 | 215 | bool DeviceRepeater::setConfigValue(int setValue) |
Inscape_ao | 7:9ab8809f9693 | 216 | { |
Inscape_ao | 7:9ab8809f9693 | 217 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 218 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 219 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 220 | return false; |
Inscape_ao | 7:9ab8809f9693 | 221 | } |
Inscape_ao | 7:9ab8809f9693 | 222 | /* not set config ID before Set */ |
Inscape_ao | 7:9ab8809f9693 | 223 | if (selected_id == NOT_ID_SELECTED) { |
Inscape_ao | 7:9ab8809f9693 | 224 | return false; |
Inscape_ao | 7:9ab8809f9693 | 225 | } |
Inscape_ao | 7:9ab8809f9693 | 226 | ret = pDriver->set_config(selected_id, setValue); |
Inscape_ao | 7:9ab8809f9693 | 227 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 228 | return ret; |
Inscape_ao | 7:9ab8809f9693 | 229 | } |
Inscape_ao | 7:9ab8809f9693 | 230 | |
Inscape_ao | 7:9ab8809f9693 | 231 | bool DeviceRepeater::getConfigValue(int *retValue) |
Inscape_ao | 7:9ab8809f9693 | 232 | { |
Inscape_ao | 7:9ab8809f9693 | 233 | bool ret; |
Inscape_ao | 7:9ab8809f9693 | 234 | /* never accept in Not Ready To Run */ |
Inscape_ao | 7:9ab8809f9693 | 235 | if (!this->readyToStart()) { |
Inscape_ao | 7:9ab8809f9693 | 236 | return false; |
Inscape_ao | 7:9ab8809f9693 | 237 | } |
Inscape_ao | 7:9ab8809f9693 | 238 | /* not set config ID before Get */ |
Inscape_ao | 7:9ab8809f9693 | 239 | if (selected_id == NOT_ID_SELECTED) { |
Inscape_ao | 7:9ab8809f9693 | 240 | return false; |
Inscape_ao | 7:9ab8809f9693 | 241 | } |
Inscape_ao | 7:9ab8809f9693 | 242 | ret = pDriver->get_config(selected_id, retValue); |
Inscape_ao | 7:9ab8809f9693 | 243 | selected_id = NOT_ID_SELECTED; |
Inscape_ao | 7:9ab8809f9693 | 244 | return ret; |
Inscape_ao | 7:9ab8809f9693 | 245 | } |