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:
vshymanskyy
Date:
Sat May 07 08:02:50 2016 +0000
Revision:
0:58b20b438383
Child:
7:8879692d4e6c
First commit

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); }
vshymanskyy 0:58b20b438383 38 #endif
vshymanskyy 0:58b20b438383 39 bool isValid() const { return ptr != NULL; }
vshymanskyy 0:58b20b438383 40
vshymanskyy 0:58b20b438383 41 bool operator < (const iterator& it) const { return ptr < it.ptr; }
vshymanskyy 0:58b20b438383 42 bool operator >= (const iterator& it) const { return ptr >= it.ptr; }
vshymanskyy 0:58b20b438383 43
vshymanskyy 0:58b20b438383 44 iterator& operator ++() {
vshymanskyy 0:58b20b438383 45 ptr += strlen(ptr)+1;
vshymanskyy 0:58b20b438383 46 return *this;
vshymanskyy 0:58b20b438383 47 }
vshymanskyy 0:58b20b438383 48 private:
vshymanskyy 0:58b20b438383 49 const char* ptr;
vshymanskyy 0:58b20b438383 50 };
vshymanskyy 0:58b20b438383 51
vshymanskyy 0:58b20b438383 52 public:
vshymanskyy 0:58b20b438383 53 explicit
vshymanskyy 0:58b20b438383 54 BlynkParam(void* addr, size_t length)
vshymanskyy 0:58b20b438383 55 : buff((char*)addr), len(length), buff_size(length)
vshymanskyy 0:58b20b438383 56 {}
vshymanskyy 0:58b20b438383 57
vshymanskyy 0:58b20b438383 58 explicit
vshymanskyy 0:58b20b438383 59 BlynkParam(void* addr, size_t length, size_t buffsize)
vshymanskyy 0:58b20b438383 60 : buff((char*)addr), len(length), buff_size(buffsize)
vshymanskyy 0:58b20b438383 61 {}
vshymanskyy 0:58b20b438383 62
vshymanskyy 0:58b20b438383 63 const char* asStr() const { return buff; }
vshymanskyy 0:58b20b438383 64 const char* asString() const { return buff; }
vshymanskyy 0:58b20b438383 65 int asInt() const { return atoi(buff); }
vshymanskyy 0:58b20b438383 66 long asLong() const { return atol(buff); }
vshymanskyy 0:58b20b438383 67 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 68 double asDouble() const { return atof(buff); }
vshymanskyy 0:58b20b438383 69 #endif
vshymanskyy 0:58b20b438383 70
vshymanskyy 0:58b20b438383 71 iterator begin() const { return iterator(buff); }
vshymanskyy 0:58b20b438383 72 iterator end() const { return iterator(buff+len); }
vshymanskyy 0:58b20b438383 73
vshymanskyy 0:58b20b438383 74 iterator operator[](int index) const;
vshymanskyy 0:58b20b438383 75 iterator operator[](const char* key) const;
vshymanskyy 0:58b20b438383 76
vshymanskyy 0:58b20b438383 77 void* getBuffer() const { return (void*)buff; }
vshymanskyy 0:58b20b438383 78 size_t getLength() const { return len; }
vshymanskyy 0:58b20b438383 79
vshymanskyy 0:58b20b438383 80 // Modification
vshymanskyy 0:58b20b438383 81 void add(int value);
vshymanskyy 0:58b20b438383 82 void add(unsigned int value);
vshymanskyy 0:58b20b438383 83 void add(long value);
vshymanskyy 0:58b20b438383 84 void add(unsigned long value);
vshymanskyy 0:58b20b438383 85 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 86 void add(float value);
vshymanskyy 0:58b20b438383 87 void add(double value);
vshymanskyy 0:58b20b438383 88 #endif
vshymanskyy 0:58b20b438383 89 void add(const char* str);
vshymanskyy 0:58b20b438383 90 void add(const void* b, size_t l);
vshymanskyy 0:58b20b438383 91 #if defined(ARDUINO) || defined(SPARK) || defined(PARTICLE)
vshymanskyy 0:58b20b438383 92 void add(const String& str);
vshymanskyy 0:58b20b438383 93 void add(String& str);
vshymanskyy 0:58b20b438383 94 #endif
vshymanskyy 0:58b20b438383 95
vshymanskyy 0:58b20b438383 96 template <typename TV>
vshymanskyy 0:58b20b438383 97 void add_key(const char* key, const TV& val) {
vshymanskyy 0:58b20b438383 98 add(key);
vshymanskyy 0:58b20b438383 99 add(val);
vshymanskyy 0:58b20b438383 100 }
vshymanskyy 0:58b20b438383 101
vshymanskyy 0:58b20b438383 102 private:
vshymanskyy 0:58b20b438383 103 char* buff;
vshymanskyy 0:58b20b438383 104 size_t len;
vshymanskyy 0:58b20b438383 105 size_t buff_size;
vshymanskyy 0:58b20b438383 106 };
vshymanskyy 0:58b20b438383 107
vshymanskyy 0:58b20b438383 108 inline
vshymanskyy 0:58b20b438383 109 BlynkParam::iterator BlynkParam::operator[](int index) const
vshymanskyy 0:58b20b438383 110 {
vshymanskyy 0:58b20b438383 111 const iterator e = end();
vshymanskyy 0:58b20b438383 112 for (iterator it = begin(); it < e; ++it) {
vshymanskyy 0:58b20b438383 113 if (!index--) {
vshymanskyy 0:58b20b438383 114 return it;
vshymanskyy 0:58b20b438383 115 }
vshymanskyy 0:58b20b438383 116 }
vshymanskyy 0:58b20b438383 117 return iterator::invalid();
vshymanskyy 0:58b20b438383 118 }
vshymanskyy 0:58b20b438383 119
vshymanskyy 0:58b20b438383 120 inline
vshymanskyy 0:58b20b438383 121 BlynkParam::iterator BlynkParam::operator[](const char* key) const
vshymanskyy 0:58b20b438383 122 {
vshymanskyy 0:58b20b438383 123 const iterator e = end();
vshymanskyy 0:58b20b438383 124 for (iterator it = begin(); it < e; ++it) {
vshymanskyy 0:58b20b438383 125 if (!strcmp(it.asStr(), key)) {
vshymanskyy 0:58b20b438383 126 return ++it;
vshymanskyy 0:58b20b438383 127 }
vshymanskyy 0:58b20b438383 128 ++it;
vshymanskyy 0:58b20b438383 129 if (it >= e) break;
vshymanskyy 0:58b20b438383 130 }
vshymanskyy 0:58b20b438383 131 return iterator::invalid();
vshymanskyy 0:58b20b438383 132 }
vshymanskyy 0:58b20b438383 133
vshymanskyy 0:58b20b438383 134 inline
vshymanskyy 0:58b20b438383 135 void BlynkParam::add(const void* b, size_t l)
vshymanskyy 0:58b20b438383 136 {
vshymanskyy 0:58b20b438383 137 if (len + l > buff_size)
vshymanskyy 0:58b20b438383 138 return;
vshymanskyy 0:58b20b438383 139 memcpy(buff+len, b, l);
vshymanskyy 0:58b20b438383 140 len += l;
vshymanskyy 0:58b20b438383 141 }
vshymanskyy 0:58b20b438383 142
vshymanskyy 0:58b20b438383 143 inline
vshymanskyy 0:58b20b438383 144 void BlynkParam::add(const char* str)
vshymanskyy 0:58b20b438383 145 {
vshymanskyy 0:58b20b438383 146 add(str, strlen(str)+1);
vshymanskyy 0:58b20b438383 147 }
vshymanskyy 0:58b20b438383 148
vshymanskyy 0:58b20b438383 149 #if defined(ARDUINO) || defined(SPARK) || defined(PARTICLE)
vshymanskyy 0:58b20b438383 150 inline
vshymanskyy 0:58b20b438383 151 void BlynkParam::add(const String& str)
vshymanskyy 0:58b20b438383 152 {
vshymanskyy 0:58b20b438383 153 size_t len = str.length()+1;
vshymanskyy 0:58b20b438383 154 char buff[len];
vshymanskyy 0:58b20b438383 155 #if defined(ARDUINO_AVR_DIGISPARK)
vshymanskyy 0:58b20b438383 156 const_cast<String&>(str).toCharArray(buff, len);
vshymanskyy 0:58b20b438383 157 #else
vshymanskyy 0:58b20b438383 158 str.toCharArray(buff, len);
vshymanskyy 0:58b20b438383 159 #endif
vshymanskyy 0:58b20b438383 160 BlynkParam::add(buff, len);
vshymanskyy 0:58b20b438383 161 }
vshymanskyy 0:58b20b438383 162
vshymanskyy 0:58b20b438383 163 inline
vshymanskyy 0:58b20b438383 164 void BlynkParam::add(String& str)
vshymanskyy 0:58b20b438383 165 {
vshymanskyy 0:58b20b438383 166 size_t len = str.length()+1;
vshymanskyy 0:58b20b438383 167 char buff[len];
vshymanskyy 0:58b20b438383 168 str.toCharArray(buff, len);
vshymanskyy 0:58b20b438383 169 BlynkParam::add(buff, len);
vshymanskyy 0:58b20b438383 170 }
vshymanskyy 0:58b20b438383 171 #endif
vshymanskyy 0:58b20b438383 172
vshymanskyy 0:58b20b438383 173 #if defined(__AVR__) || defined (ARDUINO_ARCH_ARC32)
vshymanskyy 0:58b20b438383 174
vshymanskyy 0:58b20b438383 175 #include <stdlib.h>
vshymanskyy 0:58b20b438383 176
vshymanskyy 0:58b20b438383 177 inline
vshymanskyy 0:58b20b438383 178 void BlynkParam::add(int value)
vshymanskyy 0:58b20b438383 179 {
vshymanskyy 0:58b20b438383 180 char str[2 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 181 itoa(value, str, 10);
vshymanskyy 0:58b20b438383 182 add(str);
vshymanskyy 0:58b20b438383 183 }
vshymanskyy 0:58b20b438383 184
vshymanskyy 0:58b20b438383 185 inline
vshymanskyy 0:58b20b438383 186 void BlynkParam::add(unsigned int value)
vshymanskyy 0:58b20b438383 187 {
vshymanskyy 0:58b20b438383 188 char str[1 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 189 utoa(value, str, 10);
vshymanskyy 0:58b20b438383 190 add(str);
vshymanskyy 0:58b20b438383 191 }
vshymanskyy 0:58b20b438383 192
vshymanskyy 0:58b20b438383 193 inline
vshymanskyy 0:58b20b438383 194 void BlynkParam::add(long value)
vshymanskyy 0:58b20b438383 195 {
vshymanskyy 0:58b20b438383 196 char str[2 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 197 ltoa(value, str, 10);
vshymanskyy 0:58b20b438383 198 add(str);
vshymanskyy 0:58b20b438383 199 }
vshymanskyy 0:58b20b438383 200
vshymanskyy 0:58b20b438383 201 inline
vshymanskyy 0:58b20b438383 202 void BlynkParam::add(unsigned long value)
vshymanskyy 0:58b20b438383 203 {
vshymanskyy 0:58b20b438383 204 char str[1 + 8 * sizeof(value)];
vshymanskyy 0:58b20b438383 205 ultoa(value, str, 10);
vshymanskyy 0:58b20b438383 206 add(str);
vshymanskyy 0:58b20b438383 207 }
vshymanskyy 0:58b20b438383 208
vshymanskyy 0:58b20b438383 209 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 210
vshymanskyy 0:58b20b438383 211 inline
vshymanskyy 0:58b20b438383 212 void BlynkParam::add(float value)
vshymanskyy 0:58b20b438383 213 {
vshymanskyy 0:58b20b438383 214 char str[33];
vshymanskyy 0:58b20b438383 215 dtostrf(value, 5, 3, str);
vshymanskyy 0:58b20b438383 216 add(str);
vshymanskyy 0:58b20b438383 217 }
vshymanskyy 0:58b20b438383 218
vshymanskyy 0:58b20b438383 219 inline
vshymanskyy 0:58b20b438383 220 void BlynkParam::add(double value)
vshymanskyy 0:58b20b438383 221 {
vshymanskyy 0:58b20b438383 222 char str[33];
vshymanskyy 0:58b20b438383 223 dtostrf(value, 5, 3, str);
vshymanskyy 0:58b20b438383 224 add(str);
vshymanskyy 0:58b20b438383 225 }
vshymanskyy 0:58b20b438383 226 #endif
vshymanskyy 0:58b20b438383 227
vshymanskyy 0:58b20b438383 228 #else
vshymanskyy 0:58b20b438383 229
vshymanskyy 0:58b20b438383 230 #include <stdio.h>
vshymanskyy 0:58b20b438383 231
vshymanskyy 0:58b20b438383 232 inline
vshymanskyy 0:58b20b438383 233 void BlynkParam::add(int value)
vshymanskyy 0:58b20b438383 234 {
vshymanskyy 0:58b20b438383 235 len += snprintf(buff+len, buff_size-len, "%i", value)+1;
vshymanskyy 0:58b20b438383 236 }
vshymanskyy 0:58b20b438383 237
vshymanskyy 0:58b20b438383 238 inline
vshymanskyy 0:58b20b438383 239 void BlynkParam::add(unsigned int value)
vshymanskyy 0:58b20b438383 240 {
vshymanskyy 0:58b20b438383 241 len += snprintf(buff+len, buff_size-len, "%u", value)+1;
vshymanskyy 0:58b20b438383 242 }
vshymanskyy 0:58b20b438383 243
vshymanskyy 0:58b20b438383 244 inline
vshymanskyy 0:58b20b438383 245 void BlynkParam::add(long value)
vshymanskyy 0:58b20b438383 246 {
vshymanskyy 0:58b20b438383 247 len += snprintf(buff+len, buff_size-len, "%li", value)+1;
vshymanskyy 0:58b20b438383 248 }
vshymanskyy 0:58b20b438383 249
vshymanskyy 0:58b20b438383 250 inline
vshymanskyy 0:58b20b438383 251 void BlynkParam::add(unsigned long value)
vshymanskyy 0:58b20b438383 252 {
vshymanskyy 0:58b20b438383 253 len += snprintf(buff+len, buff_size-len, "%lu", value)+1;
vshymanskyy 0:58b20b438383 254 }
vshymanskyy 0:58b20b438383 255
vshymanskyy 0:58b20b438383 256 #ifndef BLYNK_NO_FLOAT
vshymanskyy 0:58b20b438383 257
vshymanskyy 0:58b20b438383 258 #if defined(ESP8266)
vshymanskyy 0:58b20b438383 259
vshymanskyy 0:58b20b438383 260 extern char* dtostrf_internal(double number, signed char width, unsigned char prec, char *s);
vshymanskyy 0:58b20b438383 261
vshymanskyy 0:58b20b438383 262 inline
vshymanskyy 0:58b20b438383 263 void BlynkParam::add(float value)
vshymanskyy 0:58b20b438383 264 {
vshymanskyy 0:58b20b438383 265 char str[33];
vshymanskyy 0:58b20b438383 266 dtostrf_internal(value, 5, 3, str);
vshymanskyy 0:58b20b438383 267 add(str);
vshymanskyy 0:58b20b438383 268 }
vshymanskyy 0:58b20b438383 269
vshymanskyy 0:58b20b438383 270 inline
vshymanskyy 0:58b20b438383 271 void BlynkParam::add(double value)
vshymanskyy 0:58b20b438383 272 {
vshymanskyy 0:58b20b438383 273 char str[33];
vshymanskyy 0:58b20b438383 274 dtostrf_internal(value, 5, 3, str);
vshymanskyy 0:58b20b438383 275 add(str);
vshymanskyy 0:58b20b438383 276 }
vshymanskyy 0:58b20b438383 277
vshymanskyy 0:58b20b438383 278 #else
vshymanskyy 0:58b20b438383 279
vshymanskyy 0:58b20b438383 280 inline
vshymanskyy 0:58b20b438383 281 void BlynkParam::add(float value)
vshymanskyy 0:58b20b438383 282 {
vshymanskyy 0:58b20b438383 283 len += snprintf(buff+len, buff_size-len, "%2.3f", value)+1;
vshymanskyy 0:58b20b438383 284 }
vshymanskyy 0:58b20b438383 285
vshymanskyy 0:58b20b438383 286 inline
vshymanskyy 0:58b20b438383 287 void BlynkParam::add(double value)
vshymanskyy 0:58b20b438383 288 {
vshymanskyy 0:58b20b438383 289 len += snprintf(buff+len, buff_size-len, "%2.3f", value)+1;
vshymanskyy 0:58b20b438383 290 }
vshymanskyy 0:58b20b438383 291
vshymanskyy 0:58b20b438383 292 #endif
vshymanskyy 0:58b20b438383 293
vshymanskyy 0:58b20b438383 294 #endif
vshymanskyy 0:58b20b438383 295
vshymanskyy 0:58b20b438383 296 #endif
vshymanskyy 0:58b20b438383 297
vshymanskyy 0:58b20b438383 298
vshymanskyy 0:58b20b438383 299 #endif