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