Version FC
Dependencies: DmTftLibrary eeprom SX1280Lib filesystem mbed
Fork of MSNV2-Terminal_V1-5 by
Service.hpp@25:d29a462afefd, 2018-09-04 (annotated)
- Committer:
- lo
- Date:
- Tue Sep 04 20:29:31 2018 +0000
- Revision:
- 25:d29a462afefd
- Parent:
- 20:b0281e8a375a
fixes
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
patrick_duc | 20:b0281e8a375a | 1 | #ifndef __SERVICE_HPP__ |
patrick_duc | 20:b0281e8a375a | 2 | #define __SERVICE_HPP__ |
patrick_duc | 13:5414193da1de | 3 | |
patrick_duc | 20:b0281e8a375a | 4 | #include "Context.h" |
patrick_duc | 20:b0281e8a375a | 5 | |
patrick_duc | 20:b0281e8a375a | 6 | #ifndef TEST_ENVIRONMENT |
patrick_duc | 13:5414193da1de | 7 | #include "mbed.h" |
patrick_duc | 20:b0281e8a375a | 8 | #endif |
patrick_duc | 20:b0281e8a375a | 9 | |
patrick_duc | 13:5414193da1de | 10 | #include <iostream> |
patrick_duc | 20:b0281e8a375a | 11 | #include <sstream> |
patrick_duc | 13:5414193da1de | 12 | #include <string> |
patrick_duc | 20:b0281e8a375a | 13 | |
patrick_duc | 20:b0281e8a375a | 14 | |
patrick_duc | 20:b0281e8a375a | 15 | namespace misnet { |
patrick_duc | 20:b0281e8a375a | 16 | class Service; |
patrick_duc | 20:b0281e8a375a | 17 | } |
patrick_duc | 13:5414193da1de | 18 | |
patrick_duc | 13:5414193da1de | 19 | |
patrick_duc | 20:b0281e8a375a | 20 | class misnet::Service { |
patrick_duc | 13:5414193da1de | 21 | |
patrick_duc | 13:5414193da1de | 22 | public: |
patrick_duc | 20:b0281e8a375a | 23 | enum VALUE_TYPE { |
patrick_duc | 20:b0281e8a375a | 24 | NOT_SET = 0 , // Not initialised |
patrick_duc | 20:b0281e8a375a | 25 | BOOLEAN = 1 , // Who knows ? |
patrick_duc | 20:b0281e8a375a | 26 | CHAR = 2 , // Single character |
patrick_duc | 20:b0281e8a375a | 27 | UINT8_T = 3 , |
patrick_duc | 20:b0281e8a375a | 28 | INT8_T = 4 , |
patrick_duc | 20:b0281e8a375a | 29 | UINT16_T = 5 , |
patrick_duc | 20:b0281e8a375a | 30 | INT16_T = 6 , |
patrick_duc | 20:b0281e8a375a | 31 | UINT32_T = 7 , |
patrick_duc | 20:b0281e8a375a | 32 | INT32_T = 8 , |
patrick_duc | 20:b0281e8a375a | 33 | FLOAT = 9 , // Floating value on 32 bits |
patrick_duc | 20:b0281e8a375a | 34 | DOUBLE = 10 , // Floating value on 64 bits |
lo | 25:d29a462afefd | 35 | TIME = 11 // Unix time [MBED time?] |
patrick_duc | 20:b0281e8a375a | 36 | } ; |
patrick_duc | 20:b0281e8a375a | 37 | |
patrick_duc | 20:b0281e8a375a | 38 | typedef struct { |
patrick_duc | 20:b0281e8a375a | 39 | union { |
patrick_duc | 20:b0281e8a375a | 40 | bool bool_value; |
patrick_duc | 20:b0281e8a375a | 41 | char char_value; |
patrick_duc | 20:b0281e8a375a | 42 | uint8_t uint8_value; |
patrick_duc | 20:b0281e8a375a | 43 | int8_t int8_value; |
patrick_duc | 20:b0281e8a375a | 44 | uint16_t uint16_value; |
patrick_duc | 20:b0281e8a375a | 45 | int16_t int16_value; |
patrick_duc | 20:b0281e8a375a | 46 | uint32_t uint32_value; |
patrick_duc | 20:b0281e8a375a | 47 | int32_t int32_value; |
patrick_duc | 20:b0281e8a375a | 48 | float float_value; |
patrick_duc | 20:b0281e8a375a | 49 | double double_value; |
patrick_duc | 20:b0281e8a375a | 50 | uint32_t time_value; |
patrick_duc | 20:b0281e8a375a | 51 | } value; |
patrick_duc | 20:b0281e8a375a | 52 | VALUE_TYPE type; |
patrick_duc | 20:b0281e8a375a | 53 | } GENERIC_VALUE; |
patrick_duc | 20:b0281e8a375a | 54 | |
patrick_duc | 13:5414193da1de | 55 | typedef uint8_t MISNET_CODE ; |
patrick_duc | 13:5414193da1de | 56 | |
patrick_duc | 13:5414193da1de | 57 | enum DEVICE_TYPE { |
patrick_duc | 13:5414193da1de | 58 | SENSOR = 1, |
patrick_duc | 13:5414193da1de | 59 | ACTUATOR = 2, |
patrick_duc | 13:5414193da1de | 60 | RECORDER = 3 |
patrick_duc | 13:5414193da1de | 61 | } ; |
patrick_duc | 13:5414193da1de | 62 | |
patrick_duc | 13:5414193da1de | 63 | // A compléter au fur et a mesure et remonter l'info sur les centres applicatifs |
patrick_duc | 13:5414193da1de | 64 | enum DEVICE_ID { |
patrick_duc | 13:5414193da1de | 65 | NOT_IDENTIFIED = 0 , // Configuration nouvelle ou non référencée |
patrick_duc | 13:5414193da1de | 66 | IKS01A2 = 1 , // Liste des composants |
patrick_duc | 13:5414193da1de | 67 | SMART_TERMINAL = 2 // BME280 + .... |
patrick_duc | 13:5414193da1de | 68 | } ; |
patrick_duc | 13:5414193da1de | 69 | |
patrick_duc | 13:5414193da1de | 70 | typedef uint8_t GROUP ; |
patrick_duc | 13:5414193da1de | 71 | |
patrick_duc | 20:b0281e8a375a | 72 | //typedef uint8_t VALUE_TYPE ; |
patrick_duc | 13:5414193da1de | 73 | |
patrick_duc | 13:5414193da1de | 74 | enum STATE { |
patrick_duc | 20:b0281e8a375a | 75 | ENABLED = 1, // ACTIVE |
patrick_duc | 20:b0281e8a375a | 76 | DISABLED = 0 // ASLEEP |
patrick_duc | 13:5414193da1de | 77 | } ; |
patrick_duc | 13:5414193da1de | 78 | |
patrick_duc | 13:5414193da1de | 79 | enum ACCESS_TYPE { |
patrick_duc | 13:5414193da1de | 80 | GPIO_ = 1, |
patrick_duc | 13:5414193da1de | 81 | I2C_ = 2, |
patrick_duc | 13:5414193da1de | 82 | SPI_ = 3, |
patrick_duc | 13:5414193da1de | 83 | UART_ = 4 |
patrick_duc | 13:5414193da1de | 84 | } ; |
patrick_duc | 13:5414193da1de | 85 | |
patrick_duc | 13:5414193da1de | 86 | typedef uint8_t ACCESS_PIN ; |
patrick_duc | 13:5414193da1de | 87 | |
patrick_duc | 13:5414193da1de | 88 | enum UP_MODE { |
patrick_duc | 13:5414193da1de | 89 | BY_VALUE = 1, // wakeup by irq |
patrick_duc | 13:5414193da1de | 90 | BY_THRESHOLD = 2 // wakeup by watchdog timer |
patrick_duc | 13:5414193da1de | 91 | } ; |
patrick_duc | 13:5414193da1de | 92 | |
patrick_duc | 13:5414193da1de | 93 | enum REQUEST_MODE { |
patrick_duc | 13:5414193da1de | 94 | IRQ_ = 1, // wakeup by irq |
patrick_duc | 13:5414193da1de | 95 | TIME_ = 2 // wakeup by watchdog timer |
patrick_duc | 13:5414193da1de | 96 | } ; |
patrick_duc | 13:5414193da1de | 97 | |
patrick_duc | 13:5414193da1de | 98 | uint32_t TIMER_DIVIDER ; |
patrick_duc | 13:5414193da1de | 99 | |
patrick_duc | 13:5414193da1de | 100 | typedef float THRESHOLD_DELTA ; |
patrick_duc | 13:5414193da1de | 101 | typedef float THRESHOLD_UP ; |
patrick_duc | 13:5414193da1de | 102 | typedef float THRESHOLD_DOWN ; |
patrick_duc | 13:5414193da1de | 103 | |
patrick_duc | 13:5414193da1de | 104 | enum ACTION { |
patrick_duc | 13:5414193da1de | 105 | MESSAGE = 1, // Send Message |
patrick_duc | 13:5414193da1de | 106 | MESSAGERELAY = 2 // Send Message + ON/OFF internal relay |
patrick_duc | 13:5414193da1de | 107 | } ; |
patrick_duc | 13:5414193da1de | 108 | |
patrick_duc | 13:5414193da1de | 109 | enum OUTPUT_MODE { |
patrick_duc | 13:5414193da1de | 110 | IO = 1, // ON/OFF |
patrick_duc | 13:5414193da1de | 111 | PWD = 2 // PWD modulation |
patrick_duc | 13:5414193da1de | 112 | } ; |
patrick_duc | 13:5414193da1de | 113 | |
patrick_duc | 13:5414193da1de | 114 | // Constructor |
patrick_duc | 19:4b147d8f9164 | 115 | Service( DEVICE_TYPE type, |
patrick_duc | 13:5414193da1de | 116 | MISNET_CODE misnet_code, |
patrick_duc | 13:5414193da1de | 117 | STATE state, |
patrick_duc | 13:5414193da1de | 118 | ACCESS_TYPE access_type, |
patrick_duc | 13:5414193da1de | 119 | REQUEST_MODE request_mode, |
patrick_duc | 13:5414193da1de | 120 | UP_MODE up_mode, |
patrick_duc | 13:5414193da1de | 121 | ACCESS_PIN access_pins[6], |
patrick_duc | 20:b0281e8a375a | 122 | uint32_t subsample_rate, |
patrick_duc | 13:5414193da1de | 123 | ACTION action, |
patrick_duc | 13:5414193da1de | 124 | OUTPUT_MODE output_mode, |
patrick_duc | 13:5414193da1de | 125 | std::string comment); |
patrick_duc | 13:5414193da1de | 126 | |
patrick_duc | 13:5414193da1de | 127 | DEVICE_TYPE getDeviceType() { |
patrick_duc | 13:5414193da1de | 128 | return this->device_type; |
patrick_duc | 13:5414193da1de | 129 | } |
patrick_duc | 13:5414193da1de | 130 | |
patrick_duc | 13:5414193da1de | 131 | MISNET_CODE getMisnetCode() { |
patrick_duc | 13:5414193da1de | 132 | return this->misnet_code; |
patrick_duc | 13:5414193da1de | 133 | } |
patrick_duc | 13:5414193da1de | 134 | |
patrick_duc | 13:5414193da1de | 135 | STATE getState() { |
patrick_duc | 13:5414193da1de | 136 | return this->state; |
patrick_duc | 13:5414193da1de | 137 | } |
patrick_duc | 13:5414193da1de | 138 | |
patrick_duc | 13:5414193da1de | 139 | ACCESS_TYPE getAccessType() { |
patrick_duc | 13:5414193da1de | 140 | return this->access_type; |
patrick_duc | 13:5414193da1de | 141 | } |
patrick_duc | 13:5414193da1de | 142 | |
patrick_duc | 13:5414193da1de | 143 | REQUEST_MODE getRequestMode() { |
patrick_duc | 13:5414193da1de | 144 | return this->request_mode; |
patrick_duc | 13:5414193da1de | 145 | } |
patrick_duc | 13:5414193da1de | 146 | |
patrick_duc | 13:5414193da1de | 147 | UP_MODE getUpMode() { |
patrick_duc | 13:5414193da1de | 148 | return this->up_mode; |
patrick_duc | 13:5414193da1de | 149 | } |
patrick_duc | 13:5414193da1de | 150 | |
patrick_duc | 13:5414193da1de | 151 | ACCESS_PIN* getAccessPins() { |
patrick_duc | 13:5414193da1de | 152 | return this->access_pins; |
patrick_duc | 13:5414193da1de | 153 | } |
patrick_duc | 13:5414193da1de | 154 | |
patrick_duc | 13:5414193da1de | 155 | ACCESS_PIN getAccessPin(short index) { |
patrick_duc | 20:b0281e8a375a | 156 | return this->access_pins[index - 1]; |
patrick_duc | 20:b0281e8a375a | 157 | } |
patrick_duc | 13:5414193da1de | 158 | |
patrick_duc | 20:b0281e8a375a | 159 | uint32_t getSubsampleRate() { |
patrick_duc | 20:b0281e8a375a | 160 | return this->subsample_rate; |
patrick_duc | 13:5414193da1de | 161 | } |
patrick_duc | 13:5414193da1de | 162 | |
patrick_duc | 13:5414193da1de | 163 | ACTION getAction() { |
patrick_duc | 13:5414193da1de | 164 | return this->action; |
patrick_duc | 13:5414193da1de | 165 | } |
patrick_duc | 13:5414193da1de | 166 | |
patrick_duc | 13:5414193da1de | 167 | OUTPUT_MODE getOutputMode() { |
patrick_duc | 13:5414193da1de | 168 | return this->output_mode; |
patrick_duc | 13:5414193da1de | 169 | } |
patrick_duc | 13:5414193da1de | 170 | |
patrick_duc | 13:5414193da1de | 171 | std::string getComment() { |
patrick_duc | 13:5414193da1de | 172 | return this->comment; |
patrick_duc | 13:5414193da1de | 173 | } |
patrick_duc | 13:5414193da1de | 174 | |
patrick_duc | 20:b0281e8a375a | 175 | uint32_t getActivationNb() { |
patrick_duc | 20:b0281e8a375a | 176 | return this->activation_nb; |
patrick_duc | 20:b0281e8a375a | 177 | } |
patrick_duc | 20:b0281e8a375a | 178 | |
patrick_duc | 20:b0281e8a375a | 179 | // This method is used to check whether the service is ready to be sampled |
patrick_duc | 20:b0281e8a375a | 180 | // (ENABLED state and subsampling rate OK) |
patrick_duc | 20:b0281e8a375a | 181 | bool readyToSample() const { |
patrick_duc | 20:b0281e8a375a | 182 | return ((this->activation_nb + 1) == this->subsample_rate); |
patrick_duc | 20:b0281e8a375a | 183 | } |
patrick_duc | 20:b0281e8a375a | 184 | |
patrick_duc | 20:b0281e8a375a | 185 | // This method is used to process a heartbeat : it checks whether the service |
patrick_duc | 20:b0281e8a375a | 186 | // is ready to be sampled, and updates accordingly the service activation number |
patrick_duc | 20:b0281e8a375a | 187 | // (reset to 0 if the service is ready ti be sampled, otherwise increments it) |
patrick_duc | 20:b0281e8a375a | 188 | bool processHeartbeat(); |
patrick_duc | 20:b0281e8a375a | 189 | |
patrick_duc | 20:b0281e8a375a | 190 | void incrementActivationNb() { |
patrick_duc | 20:b0281e8a375a | 191 | ++(this->activation_nb); |
patrick_duc | 20:b0281e8a375a | 192 | } |
patrick_duc | 20:b0281e8a375a | 193 | |
patrick_duc | 20:b0281e8a375a | 194 | void resetActivationNb() { |
patrick_duc | 20:b0281e8a375a | 195 | this->activation_nb = 0; |
patrick_duc | 20:b0281e8a375a | 196 | } |
patrick_duc | 20:b0281e8a375a | 197 | |
patrick_duc | 20:b0281e8a375a | 198 | // This method writes the value passed as argument in the value field of the service. |
patrick_duc | 20:b0281e8a375a | 199 | // The caller must write the value in "value" field of the srtucture AND set the |
patrick_duc | 20:b0281e8a375a | 200 | // value of the "type" field of this structure. |
patrick_duc | 20:b0281e8a375a | 201 | void setValue(GENERIC_VALUE& value) { |
patrick_duc | 20:b0281e8a375a | 202 | this->previous_value = this->current_value; |
patrick_duc | 20:b0281e8a375a | 203 | this->current_value = value; |
patrick_duc | 20:b0281e8a375a | 204 | } |
patrick_duc | 20:b0281e8a375a | 205 | |
patrick_duc | 20:b0281e8a375a | 206 | // This other method returns the address of the area where sensor values must be written. |
patrick_duc | 20:b0281e8a375a | 207 | // The caller must write the value in "value" field of the structure AND set the |
patrick_duc | 20:b0281e8a375a | 208 | // value of the "type" field of this structure. |
patrick_duc | 20:b0281e8a375a | 209 | // This method is quicker than the previous one since there is no neeed to copy the value |
patrick_duc | 20:b0281e8a375a | 210 | // as in the previous method. |
patrick_duc | 20:b0281e8a375a | 211 | // Drawback : the next method (savePreviousValue) must be called before this one, |
patrick_duc | 20:b0281e8a375a | 212 | // so that the previous value may be saved. This is necessary when the UP_MODE is BY_THRESHOLD |
patrick_duc | 20:b0281e8a375a | 213 | // and the threshold_delta field is not empty. |
patrick_duc | 20:b0281e8a375a | 214 | GENERIC_VALUE & getValueAddress() { |
patrick_duc | 20:b0281e8a375a | 215 | return this->current_value; |
patrick_duc | 20:b0281e8a375a | 216 | } |
patrick_duc | 20:b0281e8a375a | 217 | |
patrick_duc | 20:b0281e8a375a | 218 | void savePreviousValue() { |
patrick_duc | 20:b0281e8a375a | 219 | this->previous_value = this->current_value; |
patrick_duc | 20:b0281e8a375a | 220 | } |
patrick_duc | 20:b0281e8a375a | 221 | |
patrick_duc | 20:b0281e8a375a | 222 | std::string toString() { |
patrick_duc | 20:b0281e8a375a | 223 | std::ostringstream stringStream; |
patrick_duc | 20:b0281e8a375a | 224 | stringStream << "Device type : " << this->device_type << ", MISNet code : " << (int) this->misnet_code; |
patrick_duc | 20:b0281e8a375a | 225 | return stringStream.str(); |
patrick_duc | 20:b0281e8a375a | 226 | } |
patrick_duc | 20:b0281e8a375a | 227 | |
patrick_duc | 20:b0281e8a375a | 228 | // Returns a string representing a value. Used to build messages and to debug. |
patrick_duc | 20:b0281e8a375a | 229 | std::string getValueAsString(GENERIC_VALUE& value); |
patrick_duc | 20:b0281e8a375a | 230 | |
patrick_duc | 20:b0281e8a375a | 231 | // Returns a string representing the current value. |
patrick_duc | 20:b0281e8a375a | 232 | std::string getCurrentValueAsString() { |
patrick_duc | 20:b0281e8a375a | 233 | return this->getValueAsString(this->current_value); |
patrick_duc | 20:b0281e8a375a | 234 | } |
patrick_duc | 20:b0281e8a375a | 235 | |
patrick_duc | 20:b0281e8a375a | 236 | // Returns a string representing the previous value. |
patrick_duc | 20:b0281e8a375a | 237 | std::string getPreviousValueAsString() { |
patrick_duc | 20:b0281e8a375a | 238 | return this->getValueAsString(this->previous_value); |
patrick_duc | 20:b0281e8a375a | 239 | } |
patrick_duc | 13:5414193da1de | 240 | |
patrick_duc | 13:5414193da1de | 241 | |
patrick_duc | 13:5414193da1de | 242 | private: |
patrick_duc | 13:5414193da1de | 243 | DEVICE_TYPE device_type; |
patrick_duc | 13:5414193da1de | 244 | MISNET_CODE misnet_code; |
patrick_duc | 13:5414193da1de | 245 | STATE state; |
patrick_duc | 13:5414193da1de | 246 | ACCESS_TYPE access_type; |
patrick_duc | 13:5414193da1de | 247 | ACCESS_PIN access_pins[6]; |
patrick_duc | 13:5414193da1de | 248 | REQUEST_MODE request_mode; |
patrick_duc | 13:5414193da1de | 249 | UP_MODE up_mode; |
patrick_duc | 20:b0281e8a375a | 250 | uint32_t subsample_rate; |
patrick_duc | 20:b0281e8a375a | 251 | uint32_t threshold_delta; |
patrick_duc | 20:b0281e8a375a | 252 | uint32_t threshold_up; |
patrick_duc | 20:b0281e8a375a | 253 | uint32_t threshold_down; |
patrick_duc | 13:5414193da1de | 254 | ACTION action; |
patrick_duc | 13:5414193da1de | 255 | OUTPUT_MODE output_mode; |
patrick_duc | 13:5414193da1de | 256 | std::string comment; |
patrick_duc | 20:b0281e8a375a | 257 | |
patrick_duc | 20:b0281e8a375a | 258 | uint32_t activation_nb; |
patrick_duc | 20:b0281e8a375a | 259 | |
patrick_duc | 20:b0281e8a375a | 260 | GENERIC_VALUE current_value; |
patrick_duc | 20:b0281e8a375a | 261 | GENERIC_VALUE previous_value; |
patrick_duc | 13:5414193da1de | 262 | }; |
patrick_duc | 13:5414193da1de | 263 | |
patrick_duc | 20:b0281e8a375a | 264 | #endif // __SERVICE_HPP__ |