From ef8386f0a04de520a043edf0bcb04efd26e30ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Courr=C3=A8ges?= Date: Mon, 12 Jan 2015 19:32:48 +0900 Subject: [PATCH 1/2] Added options to customize the LED behavior and enable/disable cloud control, through config.h. --- firmware/src/IRKit/FullColorLed.cpp | 29 +++++------ firmware/src/IRKit/FullColorLed.h | 24 +++++++-- firmware/src/IRKit/IRKit.ino | 67 ++++++++++++++++++------- firmware/src/IRKit/IRKitHTTPHandler.cpp | 7 +++ firmware/src/IRKit/config.h | 46 +++++++++++++++++ 5 files changed, 136 insertions(+), 37 deletions(-) create mode 100644 firmware/src/IRKit/config.h diff --git a/firmware/src/IRKit/FullColorLed.cpp b/firmware/src/IRKit/FullColorLed.cpp index 460055c..391cbdf 100644 --- a/firmware/src/IRKit/FullColorLed.cpp +++ b/firmware/src/IRKit/FullColorLed.cpp @@ -23,38 +23,31 @@ FullColorLed::FullColorLed(int pinR, int pinG, int pinB) : pinG_(pinG), pinB_(pinB), blinkOn_(0), - isBlinking_(false), + blinkMode_(ALWAYS_ON), blink_timer_(TIMER_OFF) { } -void FullColorLed::setLedColor(bool colorR, bool colorG, bool colorB) { - setLedColor(colorR, colorG, colorB, false); -} - -void FullColorLed::setLedColor(bool colorR, bool colorG, bool colorB, bool blink) { +void FullColorLed::setLedColor(bool colorR, bool colorG, bool colorB, LightMode lightMode, uint8_t blinkTimeout) { colorR_ = colorR; colorG_ = colorG; colorB_ = colorB; - isBlinking_ = blink; + blinkMode_ = lightMode; blink_timer_ = TIMER_OFF; -} - -void FullColorLed::setLedColor(bool colorR, bool colorG, bool colorB, bool blink, uint8_t blink_timeout) { - setLedColor( colorR, colorG, colorB, blink ); - - TIMER_START(blink_timer_, blink_timeout); + if (blinkTimeout > 0) { + TIMER_START(blink_timer_, blinkTimeout); + } } void FullColorLed::off() { - setLedColor( 0, 0, 0, false ); + setLedColor( 0, 0, 0 ); } void FullColorLed::onTimer() { blinkOn_ = ! blinkOn_; - if ( blinkOn_ || ! isBlinking_ ) { + if ( blinkOn_ || (blinkMode_ == ALWAYS_ON) ) { // not blinking = always on digitalWrite(pinR_, colorR_); digitalWrite(pinG_, colorG_); @@ -69,6 +62,10 @@ void FullColorLed::onTimer() { TIMER_TICK(blink_timer_); if (TIMER_FIRED(blink_timer_)) { TIMER_STOP(blink_timer_); - isBlinking_ = false; + if (blinkMode_ == BLINK_THEN_OFF) { + off(); + } else if (blinkMode_ == BLINK_THEN_ON) { + blinkMode_ = ALWAYS_ON; + } } } diff --git a/firmware/src/IRKit/FullColorLed.h b/firmware/src/IRKit/FullColorLed.h index 039e3f0..46d2228 100644 --- a/firmware/src/IRKit/FullColorLed.h +++ b/firmware/src/IRKit/FullColorLed.h @@ -20,11 +20,27 @@ class FullColorLed { public: + + // The different modes for lighting the LED + typedef enum { + ALWAYS_ON = 0, // LED stays always on. + BLINK_THEN_ON = 1, // LED blinks, then stays on. + BLINK_THEN_OFF = 2 // LED blinks, then turns off. + } LightMode; + FullColorLed(int pinR, int pinG, int pinB); - void setLedColor(bool colorR, bool colorG, bool colorB); - void setLedColor(bool colorR, bool colorG, bool colorB, bool blink); - void setLedColor(bool colorR, bool colorG, bool colorB, bool blink, uint8_t blink_timeout); + + // Lights-up the LED with a specific color, with optional blinking parameters. + void setLedColor( + bool colorR, + bool colorG, + bool colorB, + LightMode lightMode = ALWAYS_ON, + uint8_t blinkTimeout = 0); + + // Turns-off the LED void off(); + void onTimer(); private: @@ -34,7 +50,7 @@ class FullColorLed bool colorR_; bool colorG_; bool colorB_; - bool isBlinking_; // defaults to off + LightMode blinkMode_; // defaults to ALWAYS_ON volatile bool blinkOn_; // altered inside timer ISR volatile uint8_t blink_timer_; }; diff --git a/firmware/src/IRKit/IRKit.ino b/firmware/src/IRKit/IRKit.ino index 0a4c6a5..6c55bc0 100644 --- a/firmware/src/IRKit/IRKit.ino +++ b/firmware/src/IRKit/IRKit.ino @@ -31,6 +31,7 @@ #include "commands.h" #include "version.h" #include "log.h" +#include "config.h" static struct long_press_button_state_t long_press_button_state; static volatile uint8_t reconnect_timer = TIMER_OFF; @@ -59,7 +60,9 @@ void setup() { pinMode(FULLCOLOR_LED_R, OUTPUT); pinMode(FULLCOLOR_LED_G, OUTPUT); pinMode(FULLCOLOR_LED_B, OUTPUT); - color.setLedColor( 1, 0, 0, false ); // red: error + if (config::ledFeedback < config::LED_OFF) { + color.setLedColor( 1, 0, 0, FullColorLed::ALWAYS_ON ); // red: error + } //--- initialize long press button @@ -163,7 +166,7 @@ void wifi_hardware_reset () { } void long_pressed() { - color.setLedColor( 1, 0, 0, false ); // red: error + color.setLedColor( 1, 0, 0, FullColorLed::ALWAYS_ON ); // red: error keys.clear(); keys.save(); @@ -211,7 +214,14 @@ void process_commands() { } void on_irkit_ready() { - color.setLedColor( 0, 0, 1, false ); // blue: ready + // blue: ready + if (config::ledFeedback <= config::LED_VERBOSE) { + color.setLedColor( 0, 0, 1, FullColorLed::ALWAYS_ON ); + } else if (config::ledFeedback <= config::LED_QUIET) { + color.setLedColor( 0, 0, 1, FullColorLed::BLINK_THEN_OFF, 1); + } else { + color.off(); + } } void on_ir_receive() { @@ -226,14 +236,24 @@ void on_ir_receive() { } int8_t cid = irkit_httpclient_post_messages(); if (cid >= 0) { - color.setLedColor( 0, 0, 1, true, 1 ); // received: blue blink for 1sec + if (config::ledFeedback <= config::LED_QUIET) { + FullColorLed::LightMode lightMode = (config::ledFeedback == config::LED_VERBOSE)? FullColorLed::BLINK_THEN_ON : FullColorLed::BLINK_THEN_OFF; + color.setLedColor( 0, 0, 1, lightMode, 1 ); // received: blue blink for 1sec + } else { + color.off(); + } } } } void on_ir_xmit() { MAINLOG_PRINTLN("i>"); - color.setLedColor( 0, 0, 1, true, 1 ); // xmit: blue blink for 1sec + if (config::ledFeedback <= config::LED_QUIET) { + FullColorLed::LightMode lightMode = (config::ledFeedback == config::LED_VERBOSE)? FullColorLed::BLINK_THEN_ON : FullColorLed::BLINK_THEN_OFF; + color.setLedColor( 0, 0, 1, lightMode, 1 ); // xmit: blue blink for 1sec + } else { + color.off(); + } } // inside ISR, be careful @@ -272,7 +292,9 @@ void connect() { keys.load(); if (keys.isWifiCredentialsSet()) { - color.setLedColor( 0, 1, 0, true ); // green blink: connecting + if (config::ledFeedback < config::LED_OFF) { + color.setLedColor( 0, 1, 0, FullColorLed::BLINK_THEN_ON ); // green blink: connecting + } gs.join(keys.getSecurity(), keys.getSSID(), @@ -280,7 +302,9 @@ void connect() { } if (gs.isJoined()) { - color.setLedColor( 0, 1, 1, true ); // cyan blink: setting up + if (config::ledFeedback < config::LED_OFF) { + color.setLedColor( 0, 1, 1, FullColorLed::BLINK_THEN_ON ); // cyan blink: setting up + } keys.setWifiWasValid(true); keys.save(); @@ -290,16 +314,23 @@ void connect() { } if (gs.isListening()) { - // start mDNS - gs.setupMDNS(); - - if (keys.isAPIKeySet() && ! keys.isValid()) { - irkit_httpclient_post_door(); - } - else if (keys.isValid()) { + + if (!config::useCloudControl) { + // No WAN access, we don't need to validate key, we're ready. IR_state( IR_IDLE ); - ring_put( &commands, COMMAND_START_POLLING ); on_irkit_ready(); + } else { + // start mDNS + gs.setupMDNS(); + + if (keys.isAPIKeySet() && ! keys.isValid()) { + irkit_httpclient_post_door(); + } + else if (keys.isValid()) { + IR_state( IR_IDLE ); + ring_put( &commands, COMMAND_START_POLLING ); + on_irkit_ready(); + } } } else { @@ -307,12 +338,14 @@ void connect() { if (keys.wasWifiValid()) { // retry - color.setLedColor( 1, 0, 0, false ); // red: error + if (config::ledFeedback < config::LED_OFF) { + color.setLedColor( 1, 0, 0, FullColorLed::ALWAYS_ON ); // red: error + } TIMER_START(reconnect_timer, 5); } else { keys.clear(); - color.setLedColor( 1, 0, 0, true ); // red blink: listening for POST /wifi + color.setLedColor( 1, 0, 0, FullColorLed::BLINK_THEN_ON ); // red blink: listening for POST /wifi gs.startLimitedAP(); if (gs.isLimitedAP()) { gs.listen(); diff --git a/firmware/src/IRKit/IRKitHTTPHandler.cpp b/firmware/src/IRKit/IRKitHTTPHandler.cpp index df31e70..a3dd2ce 100644 --- a/firmware/src/IRKit/IRKitHTTPHandler.cpp +++ b/firmware/src/IRKit/IRKitHTTPHandler.cpp @@ -23,6 +23,7 @@ #include "timer.h" #include "commands.h" #include "log.h" +#include "config.h" extern GSwifi gs; extern Keys keys; @@ -480,6 +481,12 @@ void irkit_http_on_timer() { } void irkit_http_loop() { + + if (!config::useCloudControl) { + // Cloud control is currently disabled. No polling loop. + return; + } + // long poll if (TIMER_FIRED(polling_timer)) { TIMER_STOP(polling_timer); diff --git a/firmware/src/IRKit/config.h b/firmware/src/IRKit/config.h new file mode 100644 index 0000000..2888117 --- /dev/null +++ b/firmware/src/IRKit/config.h @@ -0,0 +1,46 @@ +/* + Copyright (C) 2013-2014 Masakazu Ohtsuka + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +#ifndef __CONFIG_H__ +#define __CONFIG_H__ + +/* + * Exposes some general options for your IRKit device. + */ +namespace config { + + // Different modes for the LED feedback. + typedef enum { + LED_VERBOSE = 0, // LED almost always-on to indicate the device status. + LED_QUIET = 1, // LED on during setup and blinks when receiving/sending commands. Off when the device is idle. + LED_SETUP_ONLY = 2, // LED on only during the setup, then always-off. + LED_OFF = 3 // /!\ This disables the LED completely. + } LedFeedbackProfile; + + // Defines what kind of LED profile you want. + const LedFeedbackProfile ledFeedback = LED_QUIET; + + // Enables/disables cloud-control through the "deviceapi.getirkit.com" server. + // If you use your IRKit device exclusively over your LAN, you can disable + // this option: the device won't send regular polling requests to the cloud server. + // This also lets you setup your device without internet access (no need for a valid device key). + const bool useCloudControl = true; + +} + +#endif // __CONFIG_H__ + + From cac325a3051122020f27d6b7d1055abcf8d5e44f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Courr=C3=A8ges?= Date: Sun, 8 Feb 2015 17:27:04 +0900 Subject: [PATCH 2/2] Cut SRAM usage by 6 bytes. --- firmware/src/IRKit/FullColorLed.cpp | 18 ++++++++---------- firmware/src/IRKit/FullColorLed.h | 5 +---- firmware/src/IRKit/IRKit.ino | 2 +- 3 files changed, 10 insertions(+), 15 deletions(-) diff --git a/firmware/src/IRKit/FullColorLed.cpp b/firmware/src/IRKit/FullColorLed.cpp index 391cbdf..00ab808 100644 --- a/firmware/src/IRKit/FullColorLed.cpp +++ b/firmware/src/IRKit/FullColorLed.cpp @@ -17,11 +17,9 @@ #include #include "FullColorLed.h" #include "timer.h" +#include "pins.h" -FullColorLed::FullColorLed(int pinR, int pinG, int pinB) : - pinR_(pinR), - pinG_(pinG), - pinB_(pinB), +FullColorLed::FullColorLed() : blinkOn_(0), blinkMode_(ALWAYS_ON), blink_timer_(TIMER_OFF) @@ -49,14 +47,14 @@ void FullColorLed::onTimer() { if ( blinkOn_ || (blinkMode_ == ALWAYS_ON) ) { // not blinking = always on - digitalWrite(pinR_, colorR_); - digitalWrite(pinG_, colorG_); - digitalWrite(pinB_, colorB_); + digitalWrite(FULLCOLOR_LED_R, colorR_); + digitalWrite(FULLCOLOR_LED_G, colorG_); + digitalWrite(FULLCOLOR_LED_B, colorB_); } else { - digitalWrite(pinR_, LOW); - digitalWrite(pinG_, LOW); - digitalWrite(pinB_, LOW); + digitalWrite(FULLCOLOR_LED_R, LOW); + digitalWrite(FULLCOLOR_LED_G, LOW); + digitalWrite(FULLCOLOR_LED_B, LOW); } TIMER_TICK(blink_timer_); diff --git a/firmware/src/IRKit/FullColorLed.h b/firmware/src/IRKit/FullColorLed.h index 46d2228..297e01a 100644 --- a/firmware/src/IRKit/FullColorLed.h +++ b/firmware/src/IRKit/FullColorLed.h @@ -28,7 +28,7 @@ class FullColorLed BLINK_THEN_OFF = 2 // LED blinks, then turns off. } LightMode; - FullColorLed(int pinR, int pinG, int pinB); + FullColorLed(); // Lights-up the LED with a specific color, with optional blinking parameters. void setLedColor( @@ -44,9 +44,6 @@ class FullColorLed void onTimer(); private: - int pinR_; - int pinG_; - int pinB_; bool colorR_; bool colorG_; bool colorB_; diff --git a/firmware/src/IRKit/IRKit.ino b/firmware/src/IRKit/IRKit.ino index 6c55bc0..2351b59 100644 --- a/firmware/src/IRKit/IRKit.ino +++ b/firmware/src/IRKit/IRKit.ino @@ -36,7 +36,7 @@ static struct long_press_button_state_t long_press_button_state; static volatile uint8_t reconnect_timer = TIMER_OFF; static char commands_data[COMMAND_QUEUE_SIZE]; -static FullColorLed color( FULLCOLOR_LED_R, FULLCOLOR_LED_G, FULLCOLOR_LED_B ); +static FullColorLed color; struct RingBuffer commands; GSwifi gs(&Serial1X);