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
Diff: Blynk/BlynkParam.h
- Revision:
- 9:7369ec77a3ea
- Parent:
- 7:8879692d4e6c
- Child:
- 13:ed6276c0afb7
--- a/Blynk/BlynkParam.h Wed Oct 12 10:38:37 2016 +0300 +++ b/Blynk/BlynkParam.h Thu Jan 05 14:55:36 2017 +0200 @@ -33,6 +33,7 @@ const char* asString() const { return ptr; } int asInt() const { return atoi(ptr); } long asLong() const { return atol(ptr); } + //long long asLongLong() const { return atoll(ptr); } #ifndef BLYNK_NO_FLOAT double asDouble() const { return atof(ptr); } float asFloat() const { return atof(ptr); } @@ -66,6 +67,7 @@ const char* asString() const { return buff; } int asInt() const { return atoi(buff); } long asLong() const { return atol(buff); } + //long long asLongLong() const { return atoll(buff); } #ifndef BLYNK_NO_FLOAT double asDouble() const { return atof(buff); } float asFloat() const { return atof(buff); } @@ -86,6 +88,8 @@ void add(unsigned int value); void add(long value); void add(unsigned long value); + void add(long long value); + void add(unsigned long long value); #ifndef BLYNK_NO_FLOAT void add(float value); void add(double value); @@ -94,9 +98,22 @@ void add(const void* b, size_t l); #if defined(ARDUINO) || defined(SPARK) || defined(PARTICLE) void add(const String& str); - void add(String& str); +#if defined(BLYNK_HAS_PROGMEM) + void add(const __FlashStringHelper* str); +#endif #endif + template<typename T, typename... Args> + void add_multi(T last) { + add(last); + } + + template<typename T, typename... Args> + void add_multi(T head, Args... tail) { + add(head); + add_multi(tail...); + } + template <typename TV> void add_key(const char* key, const TV& val) { add(key); @@ -104,22 +121,22 @@ } protected: - char* buff; - size_t len; - size_t buff_size; + char* buff; + size_t len; + size_t buff_size; }; class BlynkParamAllocated - : public BlynkParam + : public BlynkParam { public: - BlynkParamAllocated(size_t size) - : BlynkParam(malloc(size), 0, size) - {} - ~BlynkParamAllocated() { - free(buff); - } + BlynkParamAllocated(size_t size) + : BlynkParam(malloc(size), 0, size) + {} + ~BlynkParamAllocated() { + free(buff); + } }; inline @@ -167,31 +184,42 @@ inline void BlynkParam::add(const String& str) { +#if defined(ARDUINO_AVR_DIGISPARK) \ + || defined(__ARDUINO_X86__) \ + || defined(__RFduino__) + size_t len = str.length()+1; char buff[len]; -#if defined(ARDUINO_AVR_DIGISPARK) const_cast<String&>(str).toCharArray(buff, len); + add(buff, len); #else - str.toCharArray(buff, len); + add(str.c_str()); #endif - BlynkParam::add(buff, len); } +#if defined(BLYNK_HAS_PROGMEM) + inline -void BlynkParam::add(String& str) +void BlynkParam::add(const __FlashStringHelper* ifsh) { - size_t len = str.length()+1; - char buff[len]; - str.toCharArray(buff, len); - BlynkParam::add(buff, len); + PGM_P p = reinterpret_cast<PGM_P>(ifsh); + size_t l = strlen_P(p) + 1; + if (len + l > buff_size) + return; + memcpy_P(buff+len, p, l); + len += l; + buff[len] = '\0'; } + +#endif + #endif #if defined(__AVR__) || defined (ARDUINO_ARCH_ARC32) #include <stdlib.h> - inline + inline void BlynkParam::add(int value) { char str[2 + 8 * sizeof(value)]; @@ -199,7 +227,7 @@ add(str); } - inline + inline void BlynkParam::add(unsigned int value) { char str[1 + 8 * sizeof(value)]; @@ -207,7 +235,7 @@ add(str); } - inline + inline void BlynkParam::add(long value) { char str[2 + 8 * sizeof(value)]; @@ -215,7 +243,7 @@ add(str); } - inline + inline void BlynkParam::add(unsigned long value) { char str[1 + 8 * sizeof(value)]; @@ -223,9 +251,25 @@ add(str); } + inline + void BlynkParam::add(long long value) // TODO: this currently adds just a long + { + char str[2 + 8 * sizeof(value)]; + ltoa(value, str, 10); + add(str); + } + + inline + void BlynkParam::add(unsigned long long value) // TODO: this currently adds just a long + { + char str[1 + 8 * sizeof(value)]; + ultoa(value, str, 10); + add(str); + } + #ifndef BLYNK_NO_FLOAT - inline + inline void BlynkParam::add(float value) { char str[33]; @@ -233,7 +277,7 @@ add(str); } - inline + inline void BlynkParam::add(double value) { char str[33]; @@ -246,37 +290,49 @@ #include <stdio.h> - inline + inline void BlynkParam::add(int value) { len += snprintf(buff+len, buff_size-len, "%i", value)+1; } - inline + inline void BlynkParam::add(unsigned int value) { len += snprintf(buff+len, buff_size-len, "%u", value)+1; } - inline + inline void BlynkParam::add(long value) { len += snprintf(buff+len, buff_size-len, "%li", value)+1; } - inline + inline void BlynkParam::add(unsigned long value) { len += snprintf(buff+len, buff_size-len, "%lu", value)+1; } + inline + void BlynkParam::add(long long value) + { + len += snprintf(buff+len, buff_size-len, "%lli", value)+1; + } + + inline + void BlynkParam::add(unsigned long long value) + { + len += snprintf(buff+len, buff_size-len, "%llu", value)+1; + } + #ifndef BLYNK_NO_FLOAT #if defined(ESP8266) - extern char* dtostrf_internal(double number, signed char width, unsigned char prec, char *s); + extern char* dtostrf_internal(double number, signed char width, unsigned char prec, char *s); - inline + inline void BlynkParam::add(float value) { char str[33]; @@ -284,7 +340,7 @@ add(str); } - inline + inline void BlynkParam::add(double value) { char str[33]; @@ -294,13 +350,13 @@ #else - inline + inline void BlynkParam::add(float value) { len += snprintf(buff+len, buff_size-len, "%2.3f", value)+1; } - inline + inline void BlynkParam::add(double value) { len += snprintf(buff+len, buff_size-len, "%2.3f", value)+1;