Version FC

Dependencies:   DmTftLibrary eeprom SX1280Lib filesystem mbed

Fork of MSNV2-Terminal_V1-5 by Francis CHATAIN

Committer:
lo
Date:
Tue Sep 04 20:29:31 2018 +0000
Revision:
25:d29a462afefd
Parent:
20:b0281e8a375a
fixes

Who changed what in which revision?

UserRevisionLine numberNew 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__