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

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;