Blynk library for embedded hardware. Works with Arduino, ESP8266, Raspberry Pi, Intel Edison/Galileo, LinkIt ONE, Particle Core/Photon, Energia, ARM mbed, etc. http://www.blynk.cc/

Dependents:   Blynk_RBL_BLE_Nano Blynk_MicroBit Blynk_Serial Blynk_RBL_BLE_Nano

Committer:
Volodymyr Shymanskyy
Date:
Wed Oct 12 09:18:39 2016 +0300
Revision:
7:8879692d4e6c
Parent:
0:58b20b438383
Child:
9:7369ec77a3ea
Update library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vshymanskyy 0:58b20b438383 1 /**
vshymanskyy 0:58b20b438383 2 * @file BlynkParam.h
vshymanskyy 0:58b20b438383 3 * @author Volodymyr Shymanskyy
vshymanskyy 0:58b20b438383 4 * @license This project is released under the MIT License (MIT)
vshymanskyy 0:58b20b438383 5 * @copyright Copyright (c) 2015 Volodymyr Shymanskyy
vshymanskyy 0:58b20b438383 6 * @date Jan 2015
vshymanskyy 0:58b20b438383 7 * @brief Container for handler parameters
vshymanskyy 0:58b20b438383 8 *
vshymanskyy 0:58b20b438383 9 */
vshymanskyy 0:58b20b438383 10
vshymanskyy 0:58b20b438383 11 #ifndef BlynkParam_h
vshymanskyy 0:58b20b438383 12 #define BlynkParam_h
vshymanskyy 0:58b20b438383 13
vshymanskyy 0:58b20b438383 14 #include <string.h>
vshymanskyy 0:58b20b438383 15 #include <stdlib.h>
vshymanskyy 0:58b20b438383 16 #include <Blynk/BlynkConfig.h>
vshymanskyy 0:58b20b438383 17 #include <Blynk/BlynkDebug.h>
vshymanskyy 0:58b20b438383 18
vshymanskyy 0:58b20b438383 19 #define BLYNK_PARAM_KV(k, v) k "\0" v "\0"
vshymanskyy 0:58b20b438383 20
vshymanskyy 0:58b20b438383 21 class BlynkParam
vshymanskyy 0:58b20b438383 22 {
vshymanskyy 0:58b20b438383 23 public:
vshymanskyy 0:58b20b438383 24 class iterator
vshymanskyy 0:58b20b438383 25 {
vshymanskyy 0:58b20b438383 26 public:
vshymanskyy 0:58b20b438383 27 iterator(char* c) : ptr(c) {}
vshymanskyy 0:58b20b438383 28 static iterator invalid() { return iterator(NULL); }
vshymanskyy 0:58b20b438383 29
vshymanskyy 0:58b20b438383 30 operator const char* () const { return asStr(); }
vshymanskyy 0:58b20b438383 31 operator int () const { return asInt(); }
vshymanskyy 0:58b20b438383 32 const char* asStr() const { return ptr; }
vshymanskyy 0:58b20b438383 33 const char* asString() const { return ptr; }
vshymanskyy 0:58b20b438383 34 int asInt() const { return atoi(ptr); }
vshymanskyy 0:58b20b438383 35 long asLong() const { return atol(ptr); }
vshymanskyy 0:58b20b438383 36 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 37 double asDouble() const { return atof(ptr); }
Volodymyr Shymanskyy 7:8879692d4e6c 38 float asFloat() const { return atof(ptr); }
vshymanskyy 0:58b20b438383 39 #endif
vshymanskyy 0:58b20b438383 40 bool isValid() const { return ptr != NULL; }
Volodymyr Shymanskyy 7:8879692d4e6c 41 bool isEmpty() const { return *ptr == '\0'; }
vshymanskyy 0:58b20b438383 42
vshymanskyy 0:58b20b438383 43 bool operator < (const iterator& it) const { return ptr < it.ptr; }
vshymanskyy 0:58b20b438383 44 bool operator >= (const iterator& it) const { return ptr >= it.ptr; }
vshymanskyy 0:58b20b438383 45
vshymanskyy 0:58b20b438383 46 iterator& operator ++() {
vshymanskyy 0:58b20b438383 47 ptr += strlen(ptr)+1;
vshymanskyy 0:58b20b438383 48 return *this;
vshymanskyy 0:58b20b438383 49 }
vshymanskyy 0:58b20b438383 50 private:
vshymanskyy 0:58b20b438383 51 const char* ptr;
vshymanskyy 0:58b20b438383 52 };
vshymanskyy 0:58b20b438383 53
vshymanskyy 0:58b20b438383 54 public:
vshymanskyy 0:58b20b438383 55 explicit
vshymanskyy 0:58b20b438383 56 BlynkParam(void* addr, size_t length)
vshymanskyy 0:58b20b438383 57 : buff((char*)addr), len(length), buff_size(length)
vshymanskyy 0:58b20b438383 58 {}
vshymanskyy 0:58b20b438383 59
vshymanskyy 0:58b20b438383 60 explicit
vshymanskyy 0:58b20b438383 61 BlynkParam(void* addr, size_t length, size_t buffsize)
vshymanskyy 0:58b20b438383 62 : buff((char*)addr), len(length), buff_size(buffsize)
vshymanskyy 0:58b20b438383 63 {}
vshymanskyy 0:58b20b438383 64
vshymanskyy 0:58b20b438383 65 const char* asStr() const { return buff; }
vshymanskyy 0:58b20b438383 66 const char* asString() const { return buff; }
vshymanskyy 0:58b20b438383 67 int asInt() const { return atoi(buff); }
vshymanskyy 0:58b20b438383 68 long asLong() const { return atol(buff); }
vshymanskyy 0:58b20b438383 69 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 70 double asDouble() const { return atof(buff); }
Volodymyr Shymanskyy 7:8879692d4e6c 71 float asFloat() const { return atof(buff); }
vshymanskyy 0:58b20b438383 72 #endif
Volodymyr Shymanskyy 7:8879692d4e6c 73 bool isEmpty() const { return *buff == '\0'; }
vshymanskyy 0:58b20b438383 74
vshymanskyy 0:58b20b438383 75 iterator begin() const { return iterator(buff); }
vshymanskyy 0:58b20b438383 76 iterator end() const { return iterator(buff+len); }
vshymanskyy 0:58b20b438383 77
vshymanskyy 0:58b20b438383 78 iterator operator[](int index) const;
vshymanskyy 0:58b20b438383 79 iterator operator[](const char* key) const;
vshymanskyy 0:58b20b438383 80
vshymanskyy 0:58b20b438383 81 void* getBuffer() const { return (void*)buff; }
vshymanskyy 0:58b20b438383 82 size_t getLength() const { return len; }
vshymanskyy 0:58b20b438383 83
vshymanskyy 0:58b20b438383 84 // Modification
vshymanskyy 0:58b20b438383 85 void add(int value);
vshymanskyy 0:58b20b438383 86 void add(unsigned int value);
vshymanskyy 0:58b20b438383 87 void add(long value);
vshymanskyy 0:58b20b438383 88 void add(unsigned long value);
vshymanskyy 0:58b20b438383 89 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 90 void add(float value);
vshymanskyy 0:58b20b438383 91 void add(double value);
vshymanskyy 0:58b20b438383 92 #endif
vshymanskyy 0:58b20b438383 93 void add(const char* str);
vshymanskyy 0:58b20b438383 94 void add(const void* b, size_t l);
vshymanskyy 0:58b20b438383 95 #if defined(ARDUINO) || defined(SPARK) || defined(PARTICLE)
vshymanskyy 0:58b20b438383 96 void add(const String& str);
vshymanskyy 0:58b20b438383 97 void add(String& str);
vshymanskyy 0:58b20b438383 98 #endif
vshymanskyy 0:58b20b438383 99
vshymanskyy 0:58b20b438383 100 template <typename TV>
vshymanskyy 0:58b20b438383 101 void add_key(const char* key, const TV& val) {
vshymanskyy 0:58b20b438383 102 add(key);
vshymanskyy 0:58b20b438383 103 add(val);
vshymanskyy 0:58b20b438383 104 }
vshymanskyy 0:58b20b438383 105
Volodymyr Shymanskyy 7:8879692d4e6c 106 protected:
vshymanskyy 0:58b20b438383 107 char* buff;
vshymanskyy 0:58b20b438383 108 size_t len;
vshymanskyy 0:58b20b438383 109 size_t buff_size;
vshymanskyy 0:58b20b438383 110 };
vshymanskyy 0:58b20b438383 111
Volodymyr Shymanskyy 7:8879692d4e6c 112
Volodymyr Shymanskyy 7:8879692d4e6c 113 class BlynkParamAllocated
Volodymyr Shymanskyy 7:8879692d4e6c 114 : public BlynkParam
Volodymyr Shymanskyy 7:8879692d4e6c 115 {
Volodymyr Shymanskyy 7:8879692d4e6c 116 public:
Volodymyr Shymanskyy 7:8879692d4e6c 117 BlynkParamAllocated(size_t size)
Volodymyr Shymanskyy 7:8879692d4e6c 118 : BlynkParam(malloc(size), 0, size)
Volodymyr Shymanskyy 7:8879692d4e6c 119 {}
Volodymyr Shymanskyy 7:8879692d4e6c 120 ~BlynkParamAllocated() {
Volodymyr Shymanskyy 7:8879692d4e6c 121 free(buff);
Volodymyr Shymanskyy 7:8879692d4e6c 122 }
Volodymyr Shymanskyy 7:8879692d4e6c 123 };
Volodymyr Shymanskyy 7:8879692d4e6c 124
vshymanskyy 0:58b20b438383 125 inline
vshymanskyy 0:58b20b438383 126 BlynkParam::iterator BlynkParam::operator[](int index) const
vshymanskyy 0:58b20b438383 127 {
vshymanskyy 0:58b20b438383 128 const iterator e = end();
vshymanskyy 0:58b20b438383 129 for (iterator it = begin(); it < e; ++it) {
vshymanskyy 0:58b20b438383 130 if (!index--) {
vshymanskyy 0:58b20b438383 131 return it;
vshymanskyy 0:58b20b438383 132 }
vshymanskyy 0:58b20b438383 133 }
vshymanskyy 0:58b20b438383 134 return iterator::invalid();
vshymanskyy 0:58b20b438383 135 }
vshymanskyy 0:58b20b438383 136
vshymanskyy 0:58b20b438383 137 inline
vshymanskyy 0:58b20b438383 138 BlynkParam::iterator BlynkParam::operator[](const char* key) const
vshymanskyy 0:58b20b438383 139 {
vshymanskyy 0:58b20b438383 140 const iterator e = end();
vshymanskyy 0:58b20b438383 141 for (iterator it = begin(); it < e; ++it) {
vshymanskyy 0:58b20b438383 142 if (!strcmp(it.asStr(), key)) {
vshymanskyy 0:58b20b438383 143 return ++it;
vshymanskyy 0:58b20b438383 144 }
vshymanskyy 0:58b20b438383 145 ++it;
vshymanskyy 0:58b20b438383 146 if (it >= e) break;
vshymanskyy 0:58b20b438383 147 }
vshymanskyy 0:58b20b438383 148 return iterator::invalid();
vshymanskyy 0:58b20b438383 149 }
vshymanskyy 0:58b20b438383 150
vshymanskyy 0:58b20b438383 151 inline
vshymanskyy 0:58b20b438383 152 void BlynkParam::add(const void* b, size_t l)
vshymanskyy 0:58b20b438383 153 {
vshymanskyy 0:58b20b438383 154 if (len + l > buff_size)
vshymanskyy 0:58b20b438383 155 return;
vshymanskyy 0:58b20b438383 156 memcpy(buff+len, b, l);
vshymanskyy 0:58b20b438383 157 len += l;
vshymanskyy 0:58b20b438383 158 }
vshymanskyy 0:58b20b438383 159
vshymanskyy 0:58b20b438383 160 inline
vshymanskyy 0:58b20b438383 161 void BlynkParam::add(const char* str)
vshymanskyy 0:58b20b438383 162 {
vshymanskyy 0:58b20b438383 163 add(str, strlen(str)+1);
vshymanskyy 0:58b20b438383 164 }
vshymanskyy 0:58b20b438383 165
vshymanskyy 0:58b20b438383 166 #if defined(ARDUINO) || defined(SPARK) || defined(PARTICLE)
vshymanskyy 0:58b20b438383 167 inline
vshymanskyy 0:58b20b438383 168 void BlynkParam::add(const String& str)
vshymanskyy 0:58b20b438383 169 {
vshymanskyy 0:58b20b438383 170 size_t len = str.length()+1;
vshymanskyy 0:58b20b438383 171 char buff[len];
vshymanskyy 0:58b20b438383 172 #if defined(ARDUINO_AVR_DIGISPARK)
vshymanskyy 0:58b20b438383 173 const_cast<String&>(str).toCharArray(buff, len);
vshymanskyy 0:58b20b438383 174 #else
vshymanskyy 0:58b20b438383 175 str.toCharArray(buff, len);
vshymanskyy 0:58b20b438383 176 #endif
vshymanskyy 0:58b20b438383 177 BlynkParam::add(buff, len);
vshymanskyy 0:58b20b438383 178 }
vshymanskyy 0:58b20b438383 179
vshymanskyy 0:58b20b438383 180 inline
vshymanskyy 0:58b20b438383 181 void BlynkParam::add(String& str)
vshymanskyy 0:58b20b438383 182 {
vshymanskyy 0:58b20b438383 183 size_t len = str.length()+1;
vshymanskyy 0:58b20b438383 184 char buff[len];
vshymanskyy 0:58b20b438383 185 str.toCharArray(buff, len);
vshymanskyy 0:58b20b438383 186 BlynkParam::add(buff, len);
vshymanskyy 0:58b20b438383 187 }
vshymanskyy 0:58b20b438383 188 #endif
vshymanskyy 0:58b20b438383 189
vshymanskyy 0:58b20b438383 190 #if defined(__AVR__) || defined (ARDUINO_ARCH_ARC32)
vshymanskyy 0:58b20b438383 191
vshymanskyy 0:58b20b438383 192 #include <stdlib.h>
vshymanskyy 0:58b20b438383 193
vshymanskyy 0:58b20b438383 194 inline
vshymanskyy 0:58b20b438383 195 void BlynkParam::add(int value)
vshymanskyy 0:58b20b438383 196 {
vshymanskyy 0:58b20b438383 197 char str[2 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 198 itoa(value, str, 10);
vshymanskyy 0:58b20b438383 199 add(str);
vshymanskyy 0:58b20b438383 200 }
vshymanskyy 0:58b20b438383 201
vshymanskyy 0:58b20b438383 202 inline
vshymanskyy 0:58b20b438383 203 void BlynkParam::add(unsigned int value)
vshymanskyy 0:58b20b438383 204 {
vshymanskyy 0:58b20b438383 205 char str[1 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 206 utoa(value, str, 10);
vshymanskyy 0:58b20b438383 207 add(str);
vshymanskyy 0:58b20b438383 208 }
vshymanskyy 0:58b20b438383 209
vshymanskyy 0:58b20b438383 210 inline
vshymanskyy 0:58b20b438383 211 void BlynkParam::add(long value)
vshymanskyy 0:58b20b438383 212 {
vshymanskyy 0:58b20b438383 213 char str[2 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 214 ltoa(value, str, 10);
vshymanskyy 0:58b20b438383 215 add(str);
vshymanskyy 0:58b20b438383 216 }
vshymanskyy 0:58b20b438383 217
vshymanskyy 0:58b20b438383 218 inline
vshymanskyy 0:58b20b438383 219 void BlynkParam::add(unsigned long value)
vshymanskyy 0:58b20b438383 220 {
vshymanskyy 0:58b20b438383 221 char str[1 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 222 ultoa(value, str, 10);
vshymanskyy 0:58b20b438383 223 add(str);
vshymanskyy 0:58b20b438383 224 }
vshymanskyy 0:58b20b438383 225
vshymanskyy 0:58b20b438383 226 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 227
vshymanskyy 0:58b20b438383 228 inline
vshymanskyy 0:58b20b438383 229 void BlynkParam::add(float value)
vshymanskyy 0:58b20b438383 230 {
vshymanskyy 0:58b20b438383 231 char str[33];
vshymanskyy 0:58b20b438383 232 dtostrf(value, 5, 3, str);
vshymanskyy 0:58b20b438383 233 add(str);
vshymanskyy 0:58b20b438383 234 }
vshymanskyy 0:58b20b438383 235
vshymanskyy 0:58b20b438383 236 inline
vshymanskyy 0:58b20b438383 237 void BlynkParam::add(double value)
vshymanskyy 0:58b20b438383 238 {
vshymanskyy 0:58b20b438383 239 char str[33];
vshymanskyy 0:58b20b438383 240 dtostrf(value, 5, 3, str);
vshymanskyy 0:58b20b438383 241 add(str);
vshymanskyy 0:58b20b438383 242 }
vshymanskyy 0:58b20b438383 243 #endif
vshymanskyy 0:58b20b438383 244
vshymanskyy 0:58b20b438383 245 #else
vshymanskyy 0:58b20b438383 246
vshymanskyy 0:58b20b438383 247 #include <stdio.h>
vshymanskyy 0:58b20b438383 248
vshymanskyy 0:58b20b438383 249 inline
vshymanskyy 0:58b20b438383 250 void BlynkParam::add(int value)
vshymanskyy 0:58b20b438383 251 {
vshymanskyy 0:58b20b438383 252 len += snprintf(buff+len, buff_size-len, "%i", value)+1;
vshymanskyy 0:58b20b438383 253 }
vshymanskyy 0:58b20b438383 254
vshymanskyy 0:58b20b438383 255 inline
vshymanskyy 0:58b20b438383 256 void BlynkParam::add(unsigned int value)
vshymanskyy 0:58b20b438383 257 {
vshymanskyy 0:58b20b438383 258 len += snprintf(buff+len, buff_size-len, "%u", value)+1;
vshymanskyy 0:58b20b438383 259 }
vshymanskyy 0:58b20b438383 260
vshymanskyy 0:58b20b438383 261 inline
vshymanskyy 0:58b20b438383 262 void BlynkParam::add(long value)
vshymanskyy 0:58b20b438383 263 {
vshymanskyy 0:58b20b438383 264 len += snprintf(buff+len, buff_size-len, "%li", value)+1;
vshymanskyy 0:58b20b438383 265 }
vshymanskyy 0:58b20b438383 266
vshymanskyy 0:58b20b438383 267 inline
vshymanskyy 0:58b20b438383 268 void BlynkParam::add(unsigned long value)
vshymanskyy 0:58b20b438383 269 {
vshymanskyy 0:58b20b438383 270 len += snprintf(buff+len, buff_size-len, "%lu", value)+1;
vshymanskyy 0:58b20b438383 271 }
vshymanskyy 0:58b20b438383 272
vshymanskyy 0:58b20b438383 273 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 274
vshymanskyy 0:58b20b438383 275 #if defined(ESP8266)
vshymanskyy 0:58b20b438383 276
vshymanskyy 0:58b20b438383 277 extern char* dtostrf_internal(double number, signed char width, unsigned char prec, char *s);
vshymanskyy 0:58b20b438383 278
vshymanskyy 0:58b20b438383 279 inline
vshymanskyy 0:58b20b438383 280 void BlynkParam::add(float value)
vshymanskyy 0:58b20b438383 281 {
vshymanskyy 0:58b20b438383 282 char str[33];
vshymanskyy 0:58b20b438383 283 dtostrf_internal(value, 5, 3, str);
vshymanskyy 0:58b20b438383 284 add(str);
vshymanskyy 0:58b20b438383 285 }
vshymanskyy 0:58b20b438383 286
vshymanskyy 0:58b20b438383 287 inline
vshymanskyy 0:58b20b438383 288 void BlynkParam::add(double value)
vshymanskyy 0:58b20b438383 289 {
vshymanskyy 0:58b20b438383 290 char str[33];
vshymanskyy 0:58b20b438383 291 dtostrf_internal(value, 5, 3, str);
vshymanskyy 0:58b20b438383 292 add(str);
vshymanskyy 0:58b20b438383 293 }
vshymanskyy 0:58b20b438383 294
vshymanskyy 0:58b20b438383 295 #else
vshymanskyy 0:58b20b438383 296
vshymanskyy 0:58b20b438383 297 inline
vshymanskyy 0:58b20b438383 298 void BlynkParam::add(float value)
vshymanskyy 0:58b20b438383 299 {
vshymanskyy 0:58b20b438383 300 len += snprintf(buff+len, buff_size-len, "%2.3f", value)+1;
vshymanskyy 0:58b20b438383 301 }
vshymanskyy 0:58b20b438383 302
vshymanskyy 0:58b20b438383 303 inline
vshymanskyy 0:58b20b438383 304 void BlynkParam::add(double value)
vshymanskyy 0:58b20b438383 305 {
vshymanskyy 0:58b20b438383 306 len += snprintf(buff+len, buff_size-len, "%2.3f", value)+1;
vshymanskyy 0:58b20b438383 307 }
vshymanskyy 0:58b20b438383 308
vshymanskyy 0:58b20b438383 309 #endif
vshymanskyy 0:58b20b438383 310
vshymanskyy 0:58b20b438383 311 #endif
vshymanskyy 0:58b20b438383 312
vshymanskyy 0:58b20b438383 313 #endif
vshymanskyy 0:58b20b438383 314
vshymanskyy 0:58b20b438383 315
vshymanskyy 0:58b20b438383 316 #endif