Microduino

Dependencies:   mbed

Fork of Io_moon by Li Weiyi

Revision:
0:740c1eb2df13
diff -r 000000000000 -r 740c1eb2df13 Blynk_v0_3_7/Blynk/BlynkApiMbed.h
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Blynk_v0_3_7/Blynk/BlynkApiMbed.h	Thu Jun 23 11:16:14 2016 +0000
@@ -0,0 +1,240 @@
+/**
+ * @file       BlynkApiArduino.h
+ * @author     Volodymyr Shymanskyy
+ * @license    This project is released under the MIT License (MIT)
+ * @copyright  Copyright (c) 2015 Volodymyr Shymanskyy
+ * @date       Mar 2015
+ * @brief
+ *
+ */
+
+#ifndef BlynkApiMbed_1_h
+#define BlynkApiMbed_1_h
+
+#include "mbed.h"
+#include <Blynk/BlynkApi.h>
+#include "microduino_util.h"
+
+Timer g_BlynkTimer;
+extern Serial pc;
+
+template<class Proto>
+void BlynkApi<Proto>::Init()
+{
+    g_BlynkTimer.start();
+    //pc.printf("Enter BlynkApi<Proto>::Init()\r\n");
+}
+
+template<class Proto>
+BLYNK_FORCE_INLINE
+millis_time_t BlynkApi<Proto>::getMillis()
+{
+// TODO: Remove workaround for Intel Curie
+// https://forum.arduino.cc/index.php?topic=391836.0
+#ifdef ARDUINO_ARCH_ARC32
+    noInterrupts();
+    uint64_t t = millis();
+    interrupts();
+    return t;
+#else
+    return g_BlynkTimer.read_ms();
+#endif
+}
+
+#ifdef BLYNK_NO_INFO
+ffff
+template<class Proto>
+BLYNK_FORCE_INLINE
+void BlynkApi<Proto>::sendInfo() {}
+
+#else
+
+template<class Proto>
+BLYNK_FORCE_INLINE
+void BlynkApi<Proto>::sendInfo()
+{
+    static const char profile[] BLYNK_PROGMEM =
+        BLYNK_PARAM_KV("ver"    , BLYNK_VERSION)
+        BLYNK_PARAM_KV("h-beat" , TOSTRING(BLYNK_HEARTBEAT))
+        BLYNK_PARAM_KV("buff-in", TOSTRING(BLYNK_MAX_READBYTES))
+#ifdef BLYNK_INFO_DEVICE
+        BLYNK_PARAM_KV("dev"    , BLYNK_INFO_DEVICE)
+#endif
+#ifdef BLYNK_INFO_CPU
+        BLYNK_PARAM_KV("cpu"    , BLYNK_INFO_CPU)
+#endif
+#ifdef BLYNK_INFO_CONNECTION
+        BLYNK_PARAM_KV("con"    , BLYNK_INFO_CONNECTION)
+#endif
+        BLYNK_PARAM_KV("build"  , __DATE__ " " __TIME__)
+        ;
+    const size_t profile_len = sizeof(profile)-1;
+
+#ifdef BLYNK_HAS_PROGMEM
+    char mem[profile_len];
+    memcpy_P(mem, profile, profile_len);
+    static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_HARDWARE_INFO, 0, mem, profile_len);
+#else
+    static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_HARDWARE_INFO, 0, profile, profile_len);
+#endif
+    return;
+}
+
+#endif
+
+static gpio_t g_gpio;
+static analogin_t _adc;
+//dac_t _dac;
+template<class Proto>
+BLYNK_FORCE_INLINE
+void BlynkApi<Proto>::processCmd(const void* buff, size_t len)
+{
+    BlynkParam param((void*)buff, len);
+    BlynkParam::iterator it = param.begin();
+    if (it >= param.end())
+        return;
+    const char* cmd = it.asStr();
+#if defined(MPIDE)
+    uint16_t cmd16;
+    memcpy(&cmd16, cmd, sizeof(cmd16));
+#else
+    const uint16_t cmd16 = *(uint16_t*)cmd;
+#endif
+    if (++it >= param.end())
+        return;
+
+#if defined(analogInputToDigitalPin)
+    // Good! Analog pins can be referenced on this device by name.
+    const uint8_t pin = (it.asStr()[0] == 'A') ?
+                        analogInputToDigitalPin(atoi(it.asStr()+1)) :
+                        it.asInt();
+#else
+#warning "analogInputToDigitalPin not defined => Named analog pins will not work"
+    //const uint8_t pin = it.asInt();
+    const uint16_t pin = MUtil::getRealPin(it.asInt());
+    const uint8_t pin1 = it.asInt();
+#endif
+
+    switch(cmd16) {
+#ifndef BLYNK_NO_BUILTIN
+        case BLYNK_HW_PM: {
+            while (it < param.end()) {
+                ++it;
+                if (!strcmp(it.asStr(), "in")) {
+                    //pinMode(pin, INPUT);
+                    gpio_init_in(&g_gpio, (PinName)pin);
+                } else if (!strcmp(it.asStr(), "out") || !strcmp(it.asStr(), "pwm")) {
+                    //pinMode(pin, OUTPUT);
+                    gpio_init_out(&g_gpio, (PinName)pin);
+#ifdef INPUT_PULLUP
+                } else if (!strcmp(it.asStr(), "pu")) {
+                    //pinMode(pin, INPUT_PULLUP);
+                    gpio_init_in_ex(&g_gpio, pin, PullUp);
+#endif
+#ifdef INPUT_PULLDOWN
+                } else if (!strcmp(it.asStr(), "pd")) {
+                    //pinMode(pin, INPUT_PULLDOWN);
+                    gpio_init_in_ex(&g_gpio, pin, PullDown);
+#endif
+                } else {
+#ifdef BLYNK_DEBUG
+                    BLYNK_LOG4(BLYNK_F("Invalid pin "), pin, BLYNK_F(" mode "), it.asStr());
+#endif
+                }
+                ++it;
+            }
+        }
+        break;
+        
+        case BLYNK_HW_DR: {
+            //DigitalIn p((PinName)pin);
+            char mem[16];
+            BlynkParam rsp(mem, 0, sizeof(mem));
+            rsp.add("dw");
+            rsp.add(pin1);
+            //rsp.add(int(p));
+            rsp.add(gpio_read(&g_gpio));
+            static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_HARDWARE, 0, rsp.getBuffer(), rsp.getLength()-1);
+        }
+        break;
+        
+        case BLYNK_HW_DW: {
+            // Should be 1 parameter (value)
+            if (++it >= param.end())
+                return;
+
+#ifdef ESP8266
+            // Disable PWM...
+            analogWrite(pin, 0);
+#endif
+#ifndef BLYNK_MINIMIZE_PINMODE_USAGE
+            //pinMode(pin, OUTPUT);
+            gpio_init_out(&g_gpio, (PinName)pin);
+#endif
+            //digitalWrite(pin, it.asInt() ? HIGH : LOW);
+            gpio_write(&g_gpio, it.asInt() ? 1 : 0);
+        }
+        break;
+        
+        case BLYNK_HW_AR: {
+            analogin_init(&_adc, (PinName)pin);
+            char mem[16];
+            BlynkParam rsp(mem, 0, sizeof(mem));
+            rsp.add("aw");
+            rsp.add(pin1);
+            //rsp.add(analogRead(pin));
+            rsp.add(int(analogin_read(&_adc)*1024));
+            static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_HARDWARE, 0, rsp.getBuffer(), rsp.getLength()-1);
+        }
+        break;
+        
+        case BLYNK_HW_AW: {
+            #if 0 // TODO: Not supported yet
+            analogout_init(&_dac, pin);
+            // Should be 1 parameter (value)
+            if (++it >= param.end())
+                return;
+
+#ifndef BLYNK_MINIMIZE_PINMODE_USAGE
+            //pinMode(pin, OUTPUT);
+#endif
+            //analogWrite(pin, it.asInt());
+            analogout_write(&_dac, float(it.asInt()/1024));
+            #endif
+        }
+        break;
+#endif
+
+        case BLYNK_HW_VR: {
+            BlynkReq req = { pin };
+            WidgetReadHandler handler = GetReadHandler(pin);
+            if (handler && (handler != BlynkWidgetRead)) {
+                handler(req);
+            } else {
+                BlynkWidgetReadDefault(req);
+            }
+        }
+        break;
+        
+        case BLYNK_HW_VW: {
+            ++it;
+            char* start = (char*)it.asStr();
+            BlynkParam param2(start, len - (start - (char*)buff));
+            BlynkReq req = { pin };
+            WidgetWriteHandler handler = GetWriteHandler(pin);
+            if (handler && (handler != BlynkWidgetWrite)) {
+                handler(req, param2);
+            } else {
+                BlynkWidgetWriteDefault(req, param2);
+            }
+        }
+        break;
+        
+        default:
+            BLYNK_LOG2(BLYNK_F("Invalid HW cmd: "), cmd);
+            static_cast<Proto*>(this)->sendCmd(BLYNK_CMD_RESPONSE, static_cast<Proto*>(this)->currentMsgId, NULL, BLYNK_ILLEGAL_COMMAND);
+    }
+}
+
+#endif
+