Merge branch 'development' into dev-raspberrypi

This commit is contained in:
Marcelo Aquino
2016-09-29 22:40:33 -03:00
31 changed files with 637 additions and 494 deletions
+38 -17
View File
@@ -153,14 +153,22 @@
// #define MY_REPEATER_FEATURE // #define MY_REPEATER_FEATURE
/** /**
* @def MY_SMART_SLEEP_WAIT_DURATION * @def MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS
* @brief The wait period before going to sleep when using smartSleep-functions. * @brief Timeout (in ms) to re-establish link if node is send to sleep and transport is not ready.
*/
#ifndef MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS
#define MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS (10*1000ul)
#endif
/**
* @def MY_SMART_SLEEP_WAIT_DURATION_MS
* @brief The wait period (in ms) before going to sleep when using smartSleep-functions.
* *
* This period has to be long enough for controller to be able to send out * This period has to be long enough for controller to be able to send out
* potential buffered messages. * potential buffered messages.
*/ */
#ifndef MY_SMART_SLEEP_WAIT_DURATION #ifndef MY_SMART_SLEEP_WAIT_DURATION_MS
#define MY_SMART_SLEEP_WAIT_DURATION 500 #define MY_SMART_SLEEP_WAIT_DURATION_MS (500ul)
#endif #endif
/********************************** /**********************************
@@ -223,25 +231,22 @@
/********************************** /**********************************
* Information LEDs blinking * Information LEDs blinking
***********************************/ ***********************************/
// This feature enables LEDs blinking on message receive, transmit // If one of the following is defined here, or in the sketch, the pin will be used for the
// or if some error occurred. This was commonly used only in gateways, // corresponding led function.
// but now can be used in any sensor node. Also the LEDs can now be // They have to be enabled here (or in your sketch). Replace x with the pin number you have the LED on.
// disabled in the gateway. //
// NOTE!! that on some platforms (for example sensebender GW) the hardware variant can enable LEDs by default,
// These defaults can be overridden by defining one of these.
//#define MY_DEFAULT_ERR_LED_PIN x
//#define MY_DEFAULT_TX_LED_PIN x
//#define MY_DEFAULT_RX_LED_PIN x
//#define MY_LEDS_BLINKING_FEATURE // The following setting allows you to inverse the LED blinking
// The following setting allows you to inverse the blinking feature MY_LEDS_BLINKING_FEATURE
// When MY_WITH_LEDS_BLINKING_INVERSE is enabled LEDSs are normally turned on and switches // When MY_WITH_LEDS_BLINKING_INVERSE is enabled LEDSs are normally turned on and switches
// off when blinking // off when blinking
//#define MY_WITH_LEDS_BLINKING_INVERSE //#define MY_WITH_LEDS_BLINKING_INVERSE
// The following defines can be used to set the port pin, that the LED is connected to
// If one of the following is defined here, or in the sketch, MY_LEDS_BLINKING_FEATURE will be
// enabled by default. (Replace x with the pin number you have the LED on)
//#define MY_DEFAULT_ERR_LED_PIN x
//#define MY_DEFAULT_TX_LED_PIN x
//#define MY_DEFAULT_RX_LED_PIN x
/********************************************** /**********************************************
* Gateway inclusion button/mode configuration * Gateway inclusion button/mode configuration
@@ -711,6 +716,20 @@
#endif #endif
/** @}*/ // Node lock group /** @}*/ // Node lock group
/**********************************
* ESP8266 Defaults
***********************************/
/**
* @def MY_ESP8266_SERIAL_MODE
* @brief Serial modes: SERIAL_FULL, SERIAL_RX_ONLY, SERIAL_TX_ONLY
*
* SERIAL_FULL: Default mode.
* SERIAL_TX_ONLY: allows to use RX (GPIO3) as a general purpose input/output.
* SERIAL_RX_ONLY: allows to use TX (GPIO1) as a general purpose input/output.
*/
#ifndef MY_ESP8266_SERIAL_MODE
#define MY_ESP8266_SERIAL_MODE SERIAL_FULL
#endif #endif
/************************************** /**************************************
@@ -757,6 +776,8 @@
#define MY_LINUX_CONFIG_FILE "/etc/mysensors.dat" #define MY_LINUX_CONFIG_FILE "/etc/mysensors.dat"
#endif #endif
#endif // MyConfig_h
// Doxygen specific constructs, not included when built normally // Doxygen specific constructs, not included when built normally
// This is used to enable disabled macros/definitions to be included in the documentation as well. // This is used to enable disabled macros/definitions to be included in the documentation as well.
#if DOXYGEN #if DOXYGEN
+14 -47
View File
@@ -102,17 +102,12 @@
#define MY_DEFAULT_RX_LED_PIN MY_HW_TX_LED_PIN #define MY_DEFAULT_RX_LED_PIN MY_HW_TX_LED_PIN
#endif #endif
// Not necessary to include blinking feature if no LED's are defined! #if defined(MY_LEDS_BLINKING_FEATURE)
#if defined(MY_LEDS_BLINKING_FEATURE) && !defined(MY_DEFAULT_RX_LED_PIN) && !defined(MY_DEFAULT_TX_LED_PIN) && !defined(MY_ERR_LED_PIN) #error MY_LEDS_BLINKING_FEATURE is now removed from MySensors core,\
#undef MY_LEDS_BLINKING_FEATURE define MY_DEFAULT_ERR_LED_PIN, MY_DEFAULT_TX_LED_PIN or\
MY_DEFAULT_RX_LED_PIN in your sketch instead to enable LEDs
#endif #endif
// Enable LED BLINKING FEATURE, if there are any LEDs defined.
#if defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_ERR_LED) || defined(MY_DEFAULT_TX_LED_PIN)
#define MY_LEDS_BLINKING_FEATURE
#endif
/** /**
* @def MY_DEFAULT_LED_BLINK_PERIOD * @def MY_DEFAULT_LED_BLINK_PERIOD
* @brief Default LEDs blinking period in milliseconds. * @brief Default LEDs blinking period in milliseconds.
@@ -120,41 +115,8 @@
#ifndef MY_DEFAULT_LED_BLINK_PERIOD #ifndef MY_DEFAULT_LED_BLINK_PERIOD
#define MY_DEFAULT_LED_BLINK_PERIOD 300 #define MY_DEFAULT_LED_BLINK_PERIOD 300
#endif #endif
/**
* @def MY_DEFAULT_RX_LED_PIN
* @brief The RX LED default pin.
*/
#ifndef MY_DEFAULT_RX_LED_PIN
#if defined(ARDUINO_ARCH_ESP8266)
#define MY_DEFAULT_RX_LED_PIN 8
#else
#define MY_DEFAULT_RX_LED_PIN 6
#endif
#endif
/**
* @def MY_DEFAULT_TX_LED_PIN
* @brief The TX LED default pin.
*/
#ifndef MY_DEFAULT_TX_LED_PIN
#if defined(ARDUINO_ARCH_ESP8266)
#define MY_DEFAULT_TX_LED_PIN 9
#else
#define MY_DEFAULT_TX_LED_PIN 5
#endif
#endif
/**
* @def MY_DEFAULT_ERR_LED_PIN
* @brief The Error LED default pin.
*/
#ifndef MY_DEFAULT_ERR_LED_PIN
#if defined(ARDUINO_ARCH_ESP8266)
#define MY_DEFAULT_ERR_LED_PIN 7
#else
#define MY_DEFAULT_ERR_LED_PIN 4
#endif
#endif
#if defined(MY_LEDS_BLINKING_FEATURE) #if defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
#include "core/MyLeds.cpp" #include "core/MyLeds.cpp"
#else #else
#include "core/MyLeds.h" #include "core/MyLeds.h"
@@ -197,6 +159,13 @@
#endif #endif
// GATEWAY - TRANSPORT // GATEWAY - TRANSPORT
#if defined(MY_CONTROLLER_IP_ADDRESS) || defined(MY_CONTROLLER_URL_ADDRESS)
#define MY_GATEWAY_CLIENT_MODE
#endif
#if defined(MY_USE_UDP) && !defined(MY_GATEWAY_CLIENT_MODE)
#error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS for UDP
#endif
#if defined(MY_GATEWAY_MQTT_CLIENT) #if defined(MY_GATEWAY_MQTT_CLIENT)
#if defined(MY_RADIO_FEATURE) #if defined(MY_RADIO_FEATURE)
// We assume that a gateway having a radio also should act as repeater // We assume that a gateway having a radio also should act as repeater
@@ -204,7 +173,7 @@
#endif #endif
// GATEWAY - COMMON FUNCTIONS // GATEWAY - COMMON FUNCTIONS
// We support MQTT Client using W5100, ESP8266 and Linux // We support MQTT Client using W5100, ESP8266 and Linux
#if !(defined(MY_CONTROLLER_URL_ADDRESS) || defined(MY_CONTROLLER_IP_ADDRESS)) #if !defined(MY_GATEWAY_CLIENT_MODE)
#error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS #error You must specify MY_CONTROLLER_IP_ADDRESS or MY_CONTROLLER_URL_ADDRESS
#endif #endif
@@ -240,9 +209,6 @@
// We assume that a gateway having a radio also should act as repeater // We assume that a gateway having a radio also should act as repeater
#define MY_REPEATER_FEATURE #define MY_REPEATER_FEATURE
#endif #endif
#if defined(MY_CONTROLLER_IP_ADDRESS)
#define MY_GATEWAY_CLIENT_MODE
#endif
#if !defined(MY_PORT) #if !defined(MY_PORT)
#error You must define MY_PORT (controller or gatway port to open) #error You must define MY_PORT (controller or gatway port to open)
#endif #endif
@@ -348,4 +314,5 @@
// This is used to enable disabled macros/definitions to be included in the documentation as well. // This is used to enable disabled macros/definitions to be included in the documentation as well.
#if DOXYGEN #if DOXYGEN
#define MY_GATEWAY_FEATURE #define MY_GATEWAY_FEATURE
#define MY_LEDS_BLINKING_FEATURE //!< \deprecated use MY_DEFAULT_RX_LED_PIN, MY_DEFAULT_TX_LED_PIN and/or MY_DEFAULT_ERR_LED_PIN instead **** DEPRECATED, DO NOT USE ****
#endif #endif
+68 -23
View File
@@ -6,7 +6,7 @@
* network topology allowing messages to be routed to nodes. * network topology allowing messages to be routed to nodes.
* *
* Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Created by Henrik Ekblad <henrik.ekblad@mysensors.org>
* Copyright (C) 2013-2015 Sensnology AB * Copyright (C) 2013-2016 Sensnology AB
* Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors
* *
* Documentation: http://www.mysensors.org * Documentation: http://www.mysensors.org
@@ -17,28 +17,73 @@
* version 2 as published by the Free Software Foundation. * version 2 as published by the Free Software Foundation.
*/ */
/**
* @file MyEepromAddresses.h
* @brief Eeprom addresses for MySensors library data
*
* @defgroup MyEepromAddressesgrp MyEepromAddresses
* @ingroup internals
* @{
*
*/
#ifndef MyEepromAddresses_h #ifndef MyEepromAddresses_h
#define MyEepromAddresses_h #define MyEepromAddresses_h
// EEPROM start address for mysensors library data
#define EEPROM_START 0
// EEPROM location of node id
#define EEPROM_NODE_ID_ADDRESS EEPROM_START
// EEPROM location of parent id
#define EEPROM_PARENT_NODE_ID_ADDRESS (EEPROM_START+1)
// EEPROM location of distance to gateway
#define EEPROM_DISTANCE_ADDRESS (EEPROM_PARENT_NODE_ID_ADDRESS+1)
#define EEPROM_ROUTES_ADDRESS (EEPROM_DISTANCE_ADDRESS+1) // Where to start storing routing information in EEPROM. Will allocate 256 bytes.
#define EEPROM_CONTROLLER_CONFIG_ADDRESS (EEPROM_ROUTES_ADDRESS+256) // Location of controller sent configuration (we allow one payload of config data from controller)
#define EEPROM_FIRMWARE_TYPE_ADDRESS (EEPROM_CONTROLLER_CONFIG_ADDRESS+24)
#define EEPROM_FIRMWARE_VERSION_ADDRESS (EEPROM_FIRMWARE_TYPE_ADDRESS+2)
#define EEPROM_FIRMWARE_BLOCKS_ADDRESS (EEPROM_FIRMWARE_VERSION_ADDRESS+2)
#define EEPROM_FIRMWARE_CRC_ADDRESS (EEPROM_FIRMWARE_BLOCKS_ADDRESS+2)
#define EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS (EEPROM_FIRMWARE_CRC_ADDRESS+2)
#define EEPROM_WHITELIST_REQUIREMENT_TABLE_ADDRESS (EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS+32)
#define EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS (EEPROM_WHITELIST_REQUIREMENT_TABLE_ADDRESS+32) // This is set with SecurityPersonalizer.ino
#define EEPROM_SIGNING_SOFT_SERIAL_ADDRESS (EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS+32) // This is set with SecurityPersonalizer.ino
#define EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS (EEPROM_SIGNING_SOFT_SERIAL_ADDRESS+9) // This is set with SecurityPersonalizer.ino
#define EEPROM_NODE_LOCK_COUNTER (EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS+16)
#define EEPROM_LOCAL_CONFIG_ADDRESS (EEPROM_NODE_LOCK_COUNTER+1) // First free address for sketch static configuration
#endif // EEPROM variable sizes, in bytes
#define SIZE_NODE_ID (1) //!< Size node ID
#define SIZE_PARENT_NODE_ID (1) //!< Size parent node ID
#define SIZE_DISTANCE (1) //!< Size GW distance
#define SIZE_ROUTES (256) //!< Size routing table
#define SIZE_CONTROLLER_CONFIG (24) //!< Size controller config
#define SIZE_FIRMWARE_TYPE (2) //!< Size firmware type
#define SIZE_FIRMWARE_VERSION (2) //!< Size firmware version
#define SIZE_FIRMWARE_BLOCKS (2) //!< Size firmware blocks
#define SIZE_FIRMWARE_CRC (2) //!< Size firmware CRC
#define SIZE_SIGNING_REQUIREMENT_TABLE (32) //!< Size signing requirement table
#define SIZE_WHITELIST_REQUIREMENT_TABLE (32) //!< Size whitelist requirement table
#define SIZE_SIGNING_SOFT_HMAC_KEY (32) //!< Size soft signing HMAC key
#define SIZE_SIGNING_SOFT_SERIAL (9) //!< Size soft signing serial
#define SIZE_RF_ENCRYPTION_AES_KEY (16) //!< Size RF AES encryption key
#define SIZE_NODE_LOCK_COUNTER (1) //!< Size node lock counter
/** @brief EEPROM start address */
#define EEPROM_START 0
/** @brief Address node ID */
#define EEPROM_NODE_ID_ADDRESS EEPROM_START
/** @brief Address parent node ID */
#define EEPROM_PARENT_NODE_ID_ADDRESS (EEPROM_NODE_ID_ADDRESS + SIZE_NODE_ID)
/** @brief Address distance to GW */
#define EEPROM_DISTANCE_ADDRESS (EEPROM_PARENT_NODE_ID_ADDRESS + SIZE_PARENT_NODE_ID)
/** @brief Address routing table */
#define EEPROM_ROUTES_ADDRESS (EEPROM_DISTANCE_ADDRESS + SIZE_DISTANCE)
/** @brief Address configuration bytes sent by controller */
#define EEPROM_CONTROLLER_CONFIG_ADDRESS (EEPROM_ROUTES_ADDRESS + SIZE_ROUTES)
/** @brief Address firmware type */
#define EEPROM_FIRMWARE_TYPE_ADDRESS (EEPROM_CONTROLLER_CONFIG_ADDRESS + SIZE_CONTROLLER_CONFIG)
/** @brief Address firmware version */
#define EEPROM_FIRMWARE_VERSION_ADDRESS (EEPROM_FIRMWARE_TYPE_ADDRESS + SIZE_FIRMWARE_TYPE)
/** @brief Address firmware blocks */
#define EEPROM_FIRMWARE_BLOCKS_ADDRESS (EEPROM_FIRMWARE_VERSION_ADDRESS + SIZE_FIRMWARE_VERSION)
/** @brief Address firmware CRC */
#define EEPROM_FIRMWARE_CRC_ADDRESS (EEPROM_FIRMWARE_BLOCKS_ADDRESS + SIZE_FIRMWARE_BLOCKS)
/** @brief Address signing requirement table */
#define EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS (EEPROM_FIRMWARE_CRC_ADDRESS + SIZE_FIRMWARE_CRC)
/** @brief Address whitelist requirement table */
#define EEPROM_WHITELIST_REQUIREMENT_TABLE_ADDRESS (EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS + SIZE_SIGNING_REQUIREMENT_TABLE)
/** @brief Address soft signing HMAC key. This is set with @ref SecurityPersonalizer.ino */
#define EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS (EEPROM_WHITELIST_REQUIREMENT_TABLE_ADDRESS + SIZE_WHITELIST_REQUIREMENT_TABLE)
/** @brief Address soft signing serial key. This is set with @ref SecurityPersonalizer.ino */
#define EEPROM_SIGNING_SOFT_SERIAL_ADDRESS (EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS + SIZE_SIGNING_SOFT_HMAC_KEY)
/** @brief Address RF AES encryption key. This is set with @ref SecurityPersonalizer.ino */
#define EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS (EEPROM_SIGNING_SOFT_SERIAL_ADDRESS + SIZE_SIGNING_SOFT_SERIAL)
/** @brief Address node lock couner. This is set with @ref SecurityPersonalizer.ino */
#define EEPROM_NODE_LOCK_COUNTER (EEPROM_RF_ENCRYPTION_AES_KEY_ADDRESS + SIZE_RF_ENCRYPTION_AES_KEY)
/** @brief First free address for sketch static configuration */
#define EEPROM_LOCAL_CONFIG_ADDRESS (EEPROM_NODE_LOCK_COUNTER + SIZE_NODE_LOCK_COUNTER)
#endif // MyEepromAddresses_h
/** @}*/
+83 -32
View File
@@ -22,7 +22,6 @@
// global variables // global variables
extern MyMessage _msgTmp; extern MyMessage _msgTmp;
#if defined(MY_CONTROLLER_IP_ADDRESS) #if defined(MY_CONTROLLER_IP_ADDRESS)
IPAddress _ethernetControllerIP(MY_CONTROLLER_IP_ADDRESS); IPAddress _ethernetControllerIP(MY_CONTROLLER_IP_ADDRESS);
#endif #endif
@@ -58,12 +57,16 @@ typedef struct
EthernetUDP _ethernetServer; EthernetUDP _ethernetServer;
#elif defined(MY_GATEWAY_LINUX) #elif defined(MY_GATEWAY_LINUX)
EthernetServer _ethernetServer(_ethernetGatewayPort, MY_GATEWAY_MAX_CLIENTS); EthernetServer _ethernetServer(_ethernetGatewayPort, MY_GATEWAY_MAX_CLIENTS);
#elif defined(MY_GATEWAY_CLIENT_MODE)
// Nothing to do here
#else #else
EthernetServer _ethernetServer(_ethernetGatewayPort); EthernetServer _ethernetServer(_ethernetGatewayPort);
#endif #endif
#if defined(MY_GATEWAY_CLIENT_MODE)
#if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_LINUX) static EthernetClient client = EthernetClient();
static inputBuffer inputString;
#elif defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_LINUX)
static EthernetClient clients[MY_GATEWAY_MAX_CLIENTS]; static EthernetClient clients[MY_GATEWAY_MAX_CLIENTS];
static bool clientsConnected[MY_GATEWAY_MAX_CLIENTS]; static bool clientsConnected[MY_GATEWAY_MAX_CLIENTS];
static inputBuffer inputString[MY_GATEWAY_MAX_CLIENTS]; static inputBuffer inputString[MY_GATEWAY_MAX_CLIENTS];
@@ -72,7 +75,6 @@ typedef struct
static inputBuffer inputString; static inputBuffer inputString;
#endif #endif
#ifndef MY_IP_ADDRESS #ifndef MY_IP_ADDRESS
void gatewayTransportRenewIP(); void gatewayTransportRenewIP();
#endif #endif
@@ -99,8 +101,6 @@ typedef struct
#define _w5100_spi_en(x) #define _w5100_spi_en(x)
#endif #endif
bool gatewayTransportInit() { bool gatewayTransportInit() {
_w5100_spi_en(true); _w5100_spi_en(true);
#if defined(MY_GATEWAY_ESP8266) #if defined(MY_GATEWAY_ESP8266)
@@ -140,10 +140,25 @@ bool gatewayTransportInit() {
MY_SERIALDEVICE.println(Ethernet.localIP()); MY_SERIALDEVICE.println(Ethernet.localIP());
// give the Ethernet interface a second to initialize // give the Ethernet interface a second to initialize
delay(1000); delay(1000);
#endif #endif /* MY_GATEWAY_ESP8266 */
#ifdef MY_USE_UDP #ifdef MY_USE_UDP
_ethernetServer.begin(_ethernetGatewayPort); _ethernetServer.begin(_ethernetGatewayPort);
#elif defined(MY_GATEWAY_CLIENT_MODE)
#if defined(MY_CONTROLLER_URL_ADDRESS)
if (client.connect(MY_CONTROLLER_URL_ADDRESS, MY_PORT)) {
#else
if (client.connect(_ethernetControllerIP, MY_PORT)) {
#endif
debug(PSTR("Eth: connect\n"));
_w5100_spi_en(false);
gatewayTransportSend(buildGw(_msgTmp, I_GATEWAY_READY).set("Gateway startup complete."));
_w5100_spi_en(true);
presentNode();
} else {
client.stop();
debug(PSTR("Eth: Failed to connect\n"));
}
#else #else
#if defined(MY_GATEWAY_LINUX) && defined(MY_IP_ADDRESS) #if defined(MY_GATEWAY_LINUX) && defined(MY_IP_ADDRESS)
_ethernetServer.begin(_ethernetGatewayIP); _ethernetServer.begin(_ethernetGatewayIP);
@@ -158,31 +173,43 @@ bool gatewayTransportInit() {
bool gatewayTransportSend(MyMessage &message) bool gatewayTransportSend(MyMessage &message)
{ {
bool ret = true; int nbytes = 0;
char *_ethernetMsg = protocolFormat(message); char *_ethernetMsg = protocolFormat(message);
setIndication(INDICATION_GW_TX); setIndication(INDICATION_GW_TX);
_w5100_spi_en(true); _w5100_spi_en(true);
#if defined(MY_CONTROLLER_IP_ADDRESS) #if defined(MY_GATEWAY_CLIENT_MODE)
#if defined(MY_USE_UDP) #if defined(MY_USE_UDP)
_ethernetServer.beginPacket(_ethernetControllerIP, MY_PORT); #if defined(MY_CONTROLLER_URL_ADDRESS)
_ethernetServer.beginPacket(MY_CONTROLLER_URL_ADDRESS, MY_PORT);
#else
_ethernetServer.beginPacket(_ethernetControllerIP, MY_PORT);
#endif
_ethernetServer.write(_ethernetMsg, strlen(_ethernetMsg)); _ethernetServer.write(_ethernetMsg, strlen(_ethernetMsg));
// returns 1 if the packet was sent successfully // returns 1 if the packet was sent successfully
ret = _ethernetServer.endPacket(); nbytes = _ethernetServer.endPacket();
#else #else
EthernetClient client; if (!client.connected()) {
client.stop();
#if defined(MY_CONTROLLER_URL_ADDRESS) #if defined(MY_CONTROLLER_URL_ADDRESS)
if (client.connected() || client.connect(MY_CONTROLLER_URL_ADDRESS, MY_PORT)) { if (client.connect(MY_CONTROLLER_URL_ADDRESS, MY_PORT)) {
#else #else
if (client.connected() || client.connect(_ethernetControllerIP, MY_PORT)) { if (client.connect(_ethernetControllerIP, MY_PORT)) {
#endif #endif
client.write(_ethernetMsg, strlen(_ethernetMsg)); debug(PSTR("Eth: connect\n"));
} _w5100_spi_en(false);
else { gatewayTransportSend(buildGw(_msgTmp, I_GATEWAY_READY).set("Gateway startup complete."));
_w5100_spi_en(true);
presentNode();
} else {
// connecting to the server failed! // connecting to the server failed!
ret = false; debug(PSTR("Eth: Failed to connect\n"));
_w5100_spi_en(false);
return false;
} }
}
nbytes = client.write(_ethernetMsg, strlen(_ethernetMsg));
#endif #endif
#else #else
// Send message to connected clients // Send message to connected clients
@@ -191,20 +218,18 @@ bool gatewayTransportSend(MyMessage &message)
{ {
if (clients[i] && clients[i].connected()) if (clients[i] && clients[i].connected())
{ {
clients[i].write((uint8_t*)_ethernetMsg, strlen(_ethernetMsg)); nbytes += clients[i].write((uint8_t*)_ethernetMsg, strlen(_ethernetMsg));
} }
} }
#else #else
_ethernetServer.write(_ethernetMsg); nbytes = _ethernetServer.write(_ethernetMsg);
#endif #endif
#endif #endif /* MY_GATEWAY_CLIENT_MODE */
_w5100_spi_en(false); _w5100_spi_en(false);
return ret; return (nbytes > 0);
} }
#if (defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_LINUX)) && !defined(MY_GATEWAY_CLIENT_MODE)
#if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_LINUX)
bool _readFromClient(uint8_t i) { bool _readFromClient(uint8_t i) {
while (clients[i].connected() && clients[i].available()) { while (clients[i].connected() && clients[i].available()) {
char inChar = clients[i].read(); char inChar = clients[i].read();
@@ -274,24 +299,51 @@ bool gatewayTransportAvailable()
#endif #endif
#ifdef MY_USE_UDP #ifdef MY_USE_UDP
int packet_size = _ethernetServer.parsePacket(); int packet_size = _ethernetServer.parsePacket();
if (packet_size) { if (packet_size) {
//debug(PSTR("UDP packet available. Size:%d\n"), packet_size); //debug(PSTR("UDP packet available. Size:%d\n"), packet_size);
setIndication(INDICATION_GW_RX);
#if defined(MY_GATEWAY_ESP8266) #if defined(MY_GATEWAY_ESP8266)
_ethernetServer.read(inputString[0].string, MY_GATEWAY_MAX_RECEIVE_LENGTH); _ethernetServer.read(inputString[0].string, MY_GATEWAY_MAX_RECEIVE_LENGTH);
inputString[0].string[packet_size] = 0; inputString[0].string[packet_size] = 0;
debug(PSTR("UDP packet received: %s\n"), inputString[0].string); debug(PSTR("UDP packet received: %s\n"), inputString[0].string);
return protocolParse(_ethernetMsg, inputString[0].string); const bool ok = protocolParse(_ethernetMsg, inputString[0].string);
#else #else
_ethernetServer.read(inputString.string, MY_GATEWAY_MAX_RECEIVE_LENGTH); _ethernetServer.read(inputString.string, MY_GATEWAY_MAX_RECEIVE_LENGTH);
inputString.string[packet_size] = 0; inputString.string[packet_size] = 0;
debug(PSTR("UDP packet received: %s\n"), inputString.string); debug(PSTR("UDP packet received: %s\n"), inputString.string);
_w5100_spi_en(false); _w5100_spi_en(false);
return protocolParse(_ethernetMsg, inputString.string); const bool ok = protocolParse(_ethernetMsg, inputString.string);
#endif #endif
if (ok)
{
setIndication(INDICATION_GW_RX);
}
return ok;
}
#elif defined(MY_GATEWAY_CLIENT_MODE)
if (!client.connected()) {
client.stop();
#if defined(MY_CONTROLLER_URL_ADDRESS)
if (client.connect(MY_CONTROLLER_URL_ADDRESS, MY_PORT)) {
#else
if (client.connect(_ethernetControllerIP, MY_PORT)) {
#endif
debug(PSTR("Eth: connect\n"));
_w5100_spi_en(false);
gatewayTransportSend(buildGw(_msgTmp, I_GATEWAY_READY).set("Gateway startup complete."));
_w5100_spi_en(true);
presentNode();
} else {
debug(PSTR("Eth: Failed to connect\n"));
_w5100_spi_en(false);
return false;
}
}
if (_readFromClient()) {
setIndication(INDICATION_GW_RX);
_w5100_spi_en(false);
return true;
} }
#else #else
#if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_LINUX) #if defined(MY_GATEWAY_ESP8266) || defined(MY_GATEWAY_LINUX)
@@ -359,7 +411,7 @@ bool gatewayTransportAvailable()
} }
} }
} }
#endif #endif /* MY_GATEWAY_ESP8266 */
#endif #endif
_w5100_spi_en(false); _w5100_spi_en(false);
return false; return false;
@@ -371,7 +423,6 @@ MyMessage& gatewayTransportReceive()
return _ethernetMsg; return _ethernetMsg;
} }
#if !defined(MY_IP_ADDRESS) && !defined(MY_GATEWAY_ESP8266) && !defined(MY_GATEWAY_LINUX) #if !defined(MY_IP_ADDRESS) && !defined(MY_GATEWAY_ESP8266) && !defined(MY_GATEWAY_LINUX)
void gatewayTransportRenewIP() void gatewayTransportRenewIP()
{ {
@@ -396,4 +447,4 @@ void gatewayTransportRenewIP()
_w5100_spi_en(false); _w5100_spi_en(false);
next_time = now + MY_IP_RENEWAL_INTERVAL; next_time = now + MY_IP_RENEWAL_INTERVAL;
} }
#endif /* IP_ADDRESS_DHCP */ #endif
-1
View File
@@ -144,7 +144,6 @@ bool gatewayTransportInit() {
} }
bool gatewayTransportAvailable() { bool gatewayTransportAvailable() {
if (_MQTT_connecting) if (_MQTT_connecting)
return false; return false;
+5 -1
View File
@@ -55,7 +55,11 @@ bool gatewayTransportAvailable() {
if (inChar == '\n') { if (inChar == '\n') {
_serialInputString[_serialInputPos] = 0; _serialInputString[_serialInputPos] = 0;
bool ok = protocolParse(_serialMsg, _serialInputString); bool ok = protocolParse(_serialMsg, _serialInputString);
_serialInputPos = 0; if (ok)
{
setIndication(INDICATION_GW_RX);
}
_serialInputPos = 0;
return ok; return ok;
} else { } else {
// add it to the inputString: // add it to the inputString:
+3 -3
View File
@@ -21,7 +21,7 @@
#include "MyHwATMega328.h" #include "MyHwATMega328.h"
#define INVALID_INTERRUPT_NUM (0xFFu) #define INVALID_INTERRUPT_NUM (0xFFu)
volatile uint8_t _wokeUpByInterrupt = INVALID_INTERRUPT_NUM; // Interrupt number that woke the mcu. volatile uint8_t _wokeUpByInterrupt = INVALID_INTERRUPT_NUM; // Interrupt number that woke the mcu.
volatile uint8_t _wakeUp1Interrupt = INVALID_INTERRUPT_NUM; // Interrupt number for wakeUp1-callback. volatile uint8_t _wakeUp1Interrupt = INVALID_INTERRUPT_NUM; // Interrupt number for wakeUp1-callback.
@@ -105,7 +105,7 @@ void hwInternalSleep(unsigned long ms) {
int8_t hwSleep(unsigned long ms) { int8_t hwSleep(unsigned long ms) {
hwInternalSleep(ms); hwInternalSleep(ms);
return -1; return MY_WAKE_UP_BY_TIMER;
} }
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
@@ -131,7 +131,7 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo
} }
// Return what woke the mcu. // Return what woke the mcu.
int ret = -1; // default: no interrupt triggered, timer wake up int8_t ret = MY_WAKE_UP_BY_TIMER; // default: no interrupt triggered, timer wake up
if (interruptWakeUp()) ret = static_cast<int8_t>(_wokeUpByInterrupt); if (interruptWakeUp()) ret = static_cast<int8_t>(_wokeUpByInterrupt);
// Clear woke-up-by-interrupt flag, so next sleeps won't return immediately. // Clear woke-up-by-interrupt flag, so next sleeps won't return immediately.
+1
View File
@@ -69,6 +69,7 @@ do { \
#define hwWatchdogReset() wdt_reset() #define hwWatchdogReset() wdt_reset()
#define hwReboot() wdt_enable(WDTO_15MS); while (1) #define hwReboot() wdt_enable(WDTO_15MS); while (1)
#define hwMillis() millis() #define hwMillis() millis()
#define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN))
#define hwReadConfig(__pos) (eeprom_read_byte((uint8_t*)(__pos))) #define hwReadConfig(__pos) (eeprom_read_byte((uint8_t*)(__pos)))
#ifndef eeprom_update_byte #ifndef eeprom_update_byte
+3 -3
View File
@@ -93,7 +93,7 @@ void hwWriteConfig(int adr, uint8_t value)
int8_t hwSleep(unsigned long ms) { int8_t hwSleep(unsigned long ms) {
// TODO: Not supported! // TODO: Not supported!
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
@@ -101,7 +101,7 @@ int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
(void)interrupt; (void)interrupt;
(void)mode; (void)mode;
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
@@ -111,7 +111,7 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo
(void)interrupt2; (void)interrupt2;
(void)mode2; (void)mode2;
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
ADC_MODE(ADC_VCC); ADC_MODE(ADC_VCC);
+3 -2
View File
@@ -39,12 +39,13 @@
#if defined(MY_DISABLED_SERIAL) #if defined(MY_DISABLED_SERIAL)
#define hwInit() #define hwInit()
#else #else
#define hwInit() MY_SERIALDEVICE.begin(MY_BAUD_RATE); MY_SERIALDEVICE.setDebugOutput(true) #define hwInit() MY_SERIALDEVICE.begin(MY_BAUD_RATE, SERIAL_8N1, MY_ESP8266_SERIAL_MODE, 1); MY_SERIALDEVICE.setDebugOutput(true)
#endif #endif
#define hwWatchdogReset() wdt_reset() #define hwWatchdogReset() wdt_reset()
#define hwReboot() ESP.restart(); #define hwReboot() ESP.restart()
#define hwMillis() millis() #define hwMillis() millis()
#define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN))
void hwReadConfigBlock(void* buf, void* adr, size_t length); void hwReadConfigBlock(void* buf, void* adr, size_t length);
void hwWriteConfigBlock(void* buf, void* adr, size_t length); void hwWriteConfigBlock(void* buf, void* adr, size_t length);
+3 -3
View File
@@ -135,7 +135,7 @@ int8_t hwSleep(unsigned long ms)
{ {
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
// Not supported! // Not supported!
@@ -145,7 +145,7 @@ int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms)
(void)mode; (void)mode;
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
// Not supported! // Not supported!
@@ -157,7 +157,7 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo
(void)mode2; (void)mode2;
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
uint16_t hwCPUVoltage() uint16_t hwCPUVoltage()
+3 -3
View File
@@ -117,7 +117,7 @@ void hwReboot() {
int8_t hwSleep(unsigned long ms) { int8_t hwSleep(unsigned long ms) {
// TODO: Not supported! // TODO: Not supported!
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
@@ -125,7 +125,7 @@ int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
(void)interrupt; (void)interrupt;
(void)mode; (void)mode;
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
@@ -135,7 +135,7 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo
(void)interrupt2; (void)interrupt2;
(void)mode2; (void)mode2;
(void)ms; (void)ms;
return -2; return MY_SLEEP_NOT_POSSIBLE;
} }
uint16_t hwCPUVoltage() { uint16_t hwCPUVoltage() {
+1
View File
@@ -43,6 +43,7 @@ void hwInit();
void hwWatchdogReset(); void hwWatchdogReset();
void hwReboot(); void hwReboot();
#define hwMillis() millis() #define hwMillis() millis()
#define hwRandomNumberInit() randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN))
void hwReadConfigBlock(void* buf, void* adr, size_t length); void hwReadConfigBlock(void* buf, void* adr, size_t length);
void hwWriteConfigBlock(void* buf, void* adr, size_t length); void hwWriteConfigBlock(void* buf, void* adr, size_t length);
+10 -4
View File
@@ -18,20 +18,26 @@
*/ */
#include "MyIndication.h" #include "MyIndication.h"
#ifdef MY_LEDS_BLINKING_FEATURE #if defined(MY_DEFAULT_TX_LED_PIN)|| defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
#include "MyLeds.h" #include "MyLeds.h"
#endif #endif
void setIndication( const indication_t ind ) void setIndication( const indication_t ind )
{ {
#ifdef MY_LEDS_BLINKING_FEATURE #if defined(MY_DEFAULT_TX_LED_PIN)
if ((INDICATION_TX == ind) || (INDICATION_GW_TX == ind)) if ((INDICATION_TX == ind) || (INDICATION_GW_TX == ind))
{ {
ledsBlinkTx(1); ledsBlinkTx(1);
} else if ((INDICATION_RX == ind) || (INDICATION_GW_RX == ind)) } else
#endif
#if defined(MY_DEFAULT_RX_LED_PIN)
if ((INDICATION_RX == ind) || (INDICATION_GW_RX == ind))
{ {
ledsBlinkRx(1); ledsBlinkRx(1);
} else if (ind > INDICATION_ERR_START) } else
#endif
#if defined(MY_DEFAULT_ERR_LED_PIN)
if (ind > INDICATION_ERR_START)
{ {
// Number of blinks indicates which error occurred. // Number of blinks indicates which error occurred.
ledsBlinkErr(ind-INDICATION_ERR_START); ledsBlinkErr(ind-INDICATION_ERR_START);
+12 -2
View File
@@ -37,10 +37,15 @@ inline void ledsInit()
countErr = 0; countErr = 0;
// Setup led pins // Setup led pins
#if defined(MY_DEFAULT_RX_LED_PIN)
pinMode(MY_DEFAULT_RX_LED_PIN, OUTPUT); pinMode(MY_DEFAULT_RX_LED_PIN, OUTPUT);
#endif
#if defined(MY_DEFAULT_TX_LED_PIN)
pinMode(MY_DEFAULT_TX_LED_PIN, OUTPUT); pinMode(MY_DEFAULT_TX_LED_PIN, OUTPUT);
#endif
#if defined(MY_DEFAULT_ERR_LED_PIN)
pinMode(MY_DEFAULT_ERR_LED_PIN, OUTPUT); pinMode(MY_DEFAULT_ERR_LED_PIN, OUTPUT);
#endif
ledsProcess(); ledsProcess();
} }
@@ -55,17 +60,23 @@ void ledsProcess() {
// For an On/Off ratio of 4, the pattern repeated will be [on, on, on, off] // For an On/Off ratio of 4, the pattern repeated will be [on, on, on, off]
// until the counter becomes 0. // until the counter becomes 0.
#if defined(MY_DEFAULT_RX_LED_PIN)
state = (countRx & (LED_ON_OFF_RATIO-1)) ? LED_ON : LED_OFF; state = (countRx & (LED_ON_OFF_RATIO-1)) ? LED_ON : LED_OFF;
hwDigitalWrite(MY_DEFAULT_RX_LED_PIN, state); hwDigitalWrite(MY_DEFAULT_RX_LED_PIN, state);
if (countRx) --countRx; if (countRx) --countRx;
#endif
#if defined(MY_DEFAULT_TX_LED_PIN)
state = (countTx & (LED_ON_OFF_RATIO-1)) ? LED_ON : LED_OFF; state = (countTx & (LED_ON_OFF_RATIO-1)) ? LED_ON : LED_OFF;
hwDigitalWrite(MY_DEFAULT_TX_LED_PIN, state); hwDigitalWrite(MY_DEFAULT_TX_LED_PIN, state);
if (countTx) --countTx; if (countTx) --countTx;
#endif
#if defined(MY_DEFAULT_ERR_LED_PIN)
state = (countErr & (LED_ON_OFF_RATIO-1)) ? LED_ON : LED_OFF; state = (countErr & (LED_ON_OFF_RATIO-1)) ? LED_ON : LED_OFF;
hwDigitalWrite(MY_DEFAULT_ERR_LED_PIN, state); hwDigitalWrite(MY_DEFAULT_ERR_LED_PIN, state);
if (countErr) --countErr; if (countErr) --countErr;
#endif
} }
void ledsBlinkRx(uint8_t cnt) { void ledsBlinkRx(uint8_t cnt) {
@@ -79,4 +90,3 @@ void ledsBlinkTx(uint8_t cnt) {
void ledsBlinkErr(uint8_t cnt) { void ledsBlinkErr(uint8_t cnt) {
if(!countErr) { countErr = cnt*LED_ON_OFF_RATIO; } if(!countErr) { countErr = cnt*LED_ON_OFF_RATIO; }
} }
+1 -1
View File
@@ -29,7 +29,7 @@
#define LED_OFF 0x1 #define LED_OFF 0x1
#endif #endif
#ifdef MY_LEDS_BLINKING_FEATURE #if defined(MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
#define ledBlinkTx(x,...) ledsBlinkTx(x) #define ledBlinkTx(x,...) ledsBlinkTx(x)
#define ledBlinkRx(x,...) ledsBlinkRx(x) #define ledBlinkRx(x,...) ledsBlinkRx(x)
#define ledBlinkErr(x,...) ledsBlinkErr(x) #define ledBlinkErr(x,...) ledsBlinkErr(x)
+99 -86
View File
@@ -35,7 +35,7 @@ void (*_timeCallback)(unsigned long); // Callback for requested time messages
void _process() { void _process() {
hwWatchdogReset(); hwWatchdogReset();
#if defined (MY_LEDS_BLINKING_FEATURE) #if defined (MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
ledsProcess(); ledsProcess();
#endif #endif
@@ -62,7 +62,7 @@ void _infiniteLoop() {
#if defined(ARDUINO_ARCH_ESP8266) #if defined(ARDUINO_ARCH_ESP8266)
yield(); yield();
#endif #endif
#if defined (MY_LEDS_BLINKING_FEATURE) #if defined (MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
ledsProcess(); ledsProcess();
#endif #endif
#if defined(__linux__) #if defined(__linux__)
@@ -85,7 +85,7 @@ void _begin() {
before(); before();
} }
#if defined(MY_LEDS_BLINKING_FEATURE) #if defined(MY_DEFAULT_TX_LED_PIN) || defined(MY_DEFAULT_RX_LED_PIN) || defined(MY_DEFAULT_ERR_LED_PIN)
ledsInit(); ledsInit();
#endif #endif
@@ -284,12 +284,10 @@ void sendBatteryLevel(uint8_t value, bool enableAck) {
} }
void sendHeartbeat(void) { void sendHeartbeat(void) {
#if defined(MY_RADIO_NRF24) || defined(MY_RADIO_RFM69) || defined(MY_RS485) #if defined(MY_RADIO_FEATURE)
uint32_t heartbeat = transportGetHeartbeat(); uint32_t heartbeat = transportGetHeartbeat();
#else _sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_HEARTBEAT_RESPONSE, false).set(heartbeat));
uint32_t heartbeat = hwMillis();
#endif #endif
_sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID, C_INTERNAL, I_HEARTBEAT_RESPONSE, false).set(heartbeat));
} }
void present(uint8_t childSensorId, uint8_t sensorType, const char *description, bool enableAck) { void present(uint8_t childSensorId, uint8_t sensorType, const char *description, bool enableAck) {
@@ -448,104 +446,118 @@ bool wait(unsigned long ms, uint8_t cmd, uint8_t msgtype) {
return expectedResponse; return expectedResponse;
} }
int8_t _sleep(const uint32_t ms, const bool smartSleep, const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2, const uint8_t mode2) {
int8_t sleep(unsigned long ms) { debug(PSTR("MCO:SLP:MS=%lu,SMS=%d,I1=%d,M1=%d,I2=%d,M2=%d\n"), ms, smartSleep, interrupt1, mode1, interrupt2, mode2);
// OTA FW feature: do not sleep if FW update ongoing
#if defined(MY_OTA_FIRMWARE_FEATURE) #if defined(MY_OTA_FIRMWARE_FEATURE)
if (_fwUpdateOngoing) { if (_fwUpdateOngoing) {
// Do not sleep node while fw update is ongoing debug(PSTR("!MCO:SLP:FWUPD\n")); // sleeping not possible, FW update ongoing
wait(ms); wait(ms);
return -1; return MY_SLEEP_NOT_POSSIBLE;
} }
#endif #endif
// if repeater, do not sleep // repeater feature: sleeping not possible
#if defined(MY_REPEATER_FEATURE) #if defined(MY_REPEATER_FEATURE)
wait(ms); (void)smartSleep;
return -1;
#else
#if defined(MY_RADIO_FEATURE)
transportPowerDown();
#endif
setIndication(INDICATION_SLEEP);
const int8_t res = hwSleep(ms);
setIndication(INDICATION_WAKEUP);
return res;
#endif
}
int8_t smartSleep(unsigned long ms) {
// notify controller about going to sleep
sendHeartbeat();
// listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION);
return sleep(ms);
}
int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
#if defined(MY_OTA_FIRMWARE_FEATURE)
if (_fwUpdateOngoing) {
// not supported
return -2;
}
#endif
#if defined(MY_REPEATER_FEATURE)
// not supported
(void)interrupt;
(void)mode;
(void)ms;
return -2;
#else
#if defined(MY_RADIO_FEATURE)
transportPowerDown();
#endif
setIndication(INDICATION_SLEEP);
const int8_t res = hwSleep(interrupt, mode, ms);
setIndication(INDICATION_WAKEUP);
return res;
#endif
}
int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
// notify controller about going to sleep
sendHeartbeat();
// listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION);
return sleep(interrupt, mode, ms);
}
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
#if defined(MY_OTA_FIRMWARE_FEATURE)
if (_fwUpdateOngoing) {
// not supported
return -2;
}
#endif
#if defined(MY_REPEATER_FEATURE)
// not supported
(void)interrupt1; (void)interrupt1;
(void)mode1; (void)mode1;
(void)interrupt2; (void)interrupt2;
(void)mode2; (void)mode2;
(void)ms;
return -2; debug(PSTR("!MCO:SLP:REP\n")); // sleeping not possible, repeater feature enabled
wait(ms);
return MY_SLEEP_NOT_POSSIBLE;
#else #else
uint32_t sleepingTime = ms;
#if defined(MY_RADIO_FEATURE) #if defined(MY_RADIO_FEATURE)
// Do not sleep if transport not ready
if (!isTransportReady()) {
debug(PSTR("!MCO:SLP:TNR\n")); // sleeping not possible, transport not ready
uint32_t sleepEnter = hwMillis();
uint32_t sleepDelta = 0;
while (!isTransportReady() && (sleepDelta < sleepingTime) && (sleepDelta < MY_SLEEP_TRANSPORT_RECONNECT_TIMEOUT_MS)) {
_process();
#if defined(ARDUINO_ARCH_ESP8266)
yield();
#endif
sleepDelta = hwMillis() - sleepEnter;
}
// sleep remainder
if (sleepDelta < sleepingTime) {
sleepingTime -= sleepDelta; // calculate remaining sleeping time
debug(PSTR("MCO:SLP:MS=%lu\n"), sleepingTime);
}
else {
// no sleeping time left
return MY_SLEEP_NOT_POSSIBLE;
}
}
#endif
if (smartSleep) {
// notify controller about going to sleep
sendHeartbeat();
wait(MY_SMART_SLEEP_WAIT_DURATION_MS); // listen for incoming messages
}
#if defined(MY_RADIO_FEATURE)
debug(PSTR("MCO:SLP:TPD\n")); // sleep, power down transport
transportPowerDown(); transportPowerDown();
#endif #endif
setIndication(INDICATION_SLEEP); setIndication(INDICATION_SLEEP);
const int8_t res = hwSleep(interrupt1, mode1, interrupt2, mode2, ms);
int8_t res = MY_SLEEP_NOT_POSSIBLE; // default
if (interrupt1 != INTERRUPT_NOT_DEFINED && interrupt2 != INTERRUPT_NOT_DEFINED) {
// both IRQs
res = hwSleep(interrupt1, mode1, interrupt2, mode2, sleepingTime);
}
else if (interrupt1 != INTERRUPT_NOT_DEFINED && interrupt2 == INTERRUPT_NOT_DEFINED) {
// one IRQ
res = hwSleep(interrupt1, mode1, sleepingTime);
}
else if (interrupt1 == INTERRUPT_NOT_DEFINED && interrupt2 == INTERRUPT_NOT_DEFINED) {
// no IRQ
res = hwSleep(sleepingTime);
}
setIndication(INDICATION_WAKEUP); setIndication(INDICATION_WAKEUP);
debug(PSTR("MCO:SLP:WUP=%d\n"), res); // sleep wake-up
return res; return res;
#endif #endif
} }
int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { // sleep functions
// notify controller about going to sleep int8_t sleep(const uint32_t ms, const bool smartSleep) {
sendHeartbeat(); return _sleep(ms, smartSleep);
// listen for incoming messages
wait(MY_SMART_SLEEP_WAIT_DURATION);
return sleep(interrupt1, mode1, interrupt2, mode2, ms);
} }
int8_t sleep(const uint8_t interrupt, const uint8_t mode, const uint32_t ms, const bool smartSleep) {
return _sleep(ms, smartSleep, interrupt, mode);
}
int8_t sleep(const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2, const uint8_t mode2, const uint32_t ms, const bool smartSleep) {
return _sleep(ms, smartSleep, interrupt1, mode1, interrupt2, mode2);
}
// deprecated smartSleep() functions
int8_t smartSleep(const uint32_t ms) {
// compatibility
return _sleep(ms, true);
}
int8_t smartSleep(const uint8_t interrupt, const uint8_t mode, const uint32_t ms) {
// compatibility
return _sleep(ms, true, interrupt, mode);
}
int8_t smartSleep(const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2, const uint8_t mode2, const uint32_t ms) {
// compatibility
return _sleep(ms, true, interrupt1, mode1, interrupt2, mode2);
}
#ifdef MY_NODE_LOCK_FEATURE #ifdef MY_NODE_LOCK_FEATURE
void nodeLock(const char* str) { void nodeLock(const char* str) {
// Make sure EEPROM is updated to locked status // Make sure EEPROM is updated to locked status
@@ -559,6 +571,7 @@ void nodeLock(const char* str) {
_sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID,C_INTERNAL, I_LOCKED, false).set(str)); _sendRoute(build(_msgTmp, _nc.nodeId, GATEWAY_ADDRESS, NODE_SENSOR_ID,C_INTERNAL, I_LOCKED, false).set(str));
#if defined(MY_RADIO_FEATURE) #if defined(MY_RADIO_FEATURE)
transportPowerDown(); transportPowerDown();
debug(PSTR("MCO:NLK:TPD\n")); // power down transport
#endif #endif
setIndication(INDICATION_SLEEP); setIndication(INDICATION_SLEEP);
(void)hwSleep((unsigned long)1000*60*30); // Sleep for 30 min before resending LOCKED message (void)hwSleep((unsigned long)1000*60*30); // Sleep for 30 min before resending LOCKED message
+78 -42
View File
@@ -37,20 +37,26 @@
* *
* MySensorsCore debug log messages: * MySensorsCore debug log messages:
* *
* |E| SYS | SUB | Message | Comment * |E| SYS | SUB | Message | Comment
* |-|------|-------|-------------------------------------------|---------------------------------------------------------------------------- * |-|------|-------|-----------------------------------------------|----------------------------------------------------------------------------
* | | MCO | BGN | INIT %%s,CP=%%s,LIB=%%s | Core initialization, capabilities (CP), library version (VER) * | | MCO | BGN | INIT %%s,CP=%%s,LIB=%%s | Core initialization, capabilities (CP), library version (VER)
* | | MCO | BGN | BFR | Callback before() * | | MCO | BGN | BFR | Callback before()
* | | MCO | BGN | STP | Callback setup() * | | MCO | BGN | STP | Callback setup()
* | | MCO | BGN | INIT OK,ID=%%d,PAR=%%d,DIS=%%d,REG=%%d | Core initialized, parent ID (PAR), distance to GW (DIS), registration (REG) * | | MCO | BGN | INIT OK,ID=%%d,PAR=%%d,DIS=%%d,REG=%%d | Core initialized, parent ID (PAR), distance to GW (DIS), registration (REG)
* | | MCO | BGN | NODE UNLOCKED | Node successfully unlocked (see signing chapter) * | | MCO | BGN | NODE UNLOCKED | Node successfully unlocked (see signing chapter)
* |!| MCO | BGN | TSP FAIL | Transport initialization failed * |!| MCO | BGN | TSP FAIL | Transport initialization failed
* | | MCO | REG | REQ | Registration request * | | MCO | REG | REQ | Registration request
* | | MCO | REG | NOT NEEDED | No registration needed (i.e. GW) * | | MCO | REG | NOT NEEDED | No registration needed (i.e. GW)
* |!| MCO | SND | NODE NOT REG | Node is not registered, cannot send message * |!| MCO | SND | NODE NOT REG | Node is not registered, cannot send message
* | | MCO | PIM | NODE REG=%%d | Registration response received, registration status (REG) * | | MCO | PIM | NODE REG=%%d | Registration response received, registration status (REG)
* | | MCO | PIM | ROUTE N=%%d,R=%%d | Routing table, messages to node (N) are routed via node (R) * | | MCO | PIM | ROUTE N=%%d,R=%%d | Routing table, messages to node (N) are routed via node (R)
* | | MCO | NLK | NODE LOCKED. UNLOCK: GND PIN %%d AND RESET| Node locked during booting, see signing chapter for additional information * | | MCO | SLP | MS=%%lu,SMS=%%d,I1=%%d,M1=%%d,I2=%%d,M2=%%d | Sleep node, time (MS), smartSleep (SMS), Int1/M1, Int2/M2
* | | MCO | SLP | TPD | Sleep node, powerdown transport
* | | MCO | SLP | WUP=%%d | Node woke-up, reason/IRQ (WUP)
* |!| MCO | SLP | FWUPD | Sleeping not possible, FW update ongoing
* |!| MCO | SLP | REP | Sleeping not possible, repeater feature enabled
* | | MCO | NLK | NODE LOCKED. UNLOCK: GND PIN %%d AND RESET | Node locked during booting, see signing chapter for additional information
* | | MCO | NLK | TPD | Powerdown transport
* *
* *
* @brief API declaration for MySensorsCore * @brief API declaration for MySensorsCore
@@ -67,10 +73,16 @@
#include <stddef.h> #include <stddef.h>
#include <stdarg.h> #include <stdarg.h>
#define GATEWAY_ADDRESS ((uint8_t)0) //!< Node ID for GW sketch #define GATEWAY_ADDRESS ((uint8_t)0) //!< Node ID for GW sketch
#define NODE_SENSOR_ID 0xFF //!< Node child is always created/presented when a node is started #define NODE_SENSOR_ID ((uint8_t)255) //!< Node child is always created/presented when a node is started
#define MY_CORE_VERSION ((uint8_t)2) //!< core version #define MY_CORE_VERSION ((uint8_t)2) //!< core version
#define MY_CORE_MIN_VERSION ((uint8_t)2) //!< min core version required for compatibility #define MY_CORE_MIN_VERSION ((uint8_t)2) //!< min core version required for compatibility
#define MY_WAKE_UP_BY_TIMER ((int8_t)-1) //!< Sleeping wake up by timer
#define MY_SLEEP_NOT_POSSIBLE ((int8_t)-2) //!< Sleeping not possible
#define INTERRUPT_NOT_DEFINED ((uint8_t)255) //!< _sleep() param: no interrupt defined
#define MODE_NOT_DEFINED ((uint8_t)255) //!< _sleep() param: no mode defined
#ifdef MY_DEBUG #ifdef MY_DEBUG
#define debug(x,...) hwDebugPrint(x, ##__VA_ARGS__) //!< debug #define debug(x,...) hwDebugPrint(x, ##__VA_ARGS__) //!< debug
@@ -232,16 +244,10 @@ bool wait(unsigned long ms, uint8_t cmd, uint8_t msgtype);
/** /**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer. * Sleep (PowerDownMode) the MCU and radio. Wake up on timer.
* @param ms Number of milliseconds to sleep. * @param ms Number of milliseconds to sleep.
* @return -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update) * @param smartSleep Set True if sending heartbeat and process incoming messages before going to sleep.
* @return @ref MY_WAKE_UP_BY_TIMER if timer woke it up, @ref MY_SLEEP_NOT_POSSIBLE if not possible (e.g. ongoing FW update)
*/ */
int8_t sleep(unsigned long ms); int8_t sleep(const uint32_t ms, const bool smartSleep = false);
/**
* Same as sleep(), send heartbeat and process incoming messages before going to sleep.
* Specify the time to wait for incoming messages by defining MY_SMART_SLEEP_WAIT_DURATION to a time (ms).
* @param ms Number of milliseconds to sleep.
* @return -1 if timer woke it up, -2 if not possible (e.g. ongoing FW update)
*/
int8_t smartSleep(unsigned long ms);
/** /**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change. * Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change.
@@ -250,18 +256,10 @@ int8_t smartSleep(unsigned long ms);
* @param interrupt Interrupt that should trigger the wakeup * @param interrupt Interrupt that should trigger the wakeup
* @param mode RISING, FALLING, CHANGE * @param mode RISING, FALLING, CHANGE
* @param ms Number of milliseconds to sleep or 0 to sleep forever * @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return Interrupt number if wake up was triggered by pin change, -1 if wake up was triggered by timer, -2 if sleep was not possible (e.g. ongoing FW update) * @param smartSleep Set True if sending heartbeat and process incoming messages before going to sleep
* @return Interrupt number if wake up was triggered by pin change, @ref MY_WAKE_UP_BY_TIMER if wake up was triggered by timer, @ref MY_SLEEP_NOT_POSSIBLE if sleep was not possible (e.g. ongoing FW update)
*/ */
int8_t sleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0); int8_t sleep(const uint8_t interrupt, const uint8_t mode, const uint32_t ms=0, const bool smartSleep = false);
/**
* Same as sleep(), send heartbeat and process incoming messages before going to sleep.
* Specify the time to wait for incoming messages by defining MY_SMART_SLEEP_WAIT_DURATION to a time (ms).
* @param interrupt Interrupt that should trigger the wakeup
* @param mode RISING, FALLING, CHANGE
* @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return Interrupt number if wake up was triggered by pin change, -1 if wake up was triggered by timer, -2 if sleep was not possible (e.g. ongoing FW update)
*/
int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
/** /**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change for two separate interrupts. * Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change for two separate interrupts.
@@ -272,10 +270,33 @@ int8_t smartSleep(uint8_t interrupt, uint8_t mode, unsigned long ms=0);
* @param interrupt2 Second interrupt that should trigger the wakeup * @param interrupt2 Second interrupt that should trigger the wakeup
* @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE) * @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE)
* @param ms Number of milliseconds to sleep or 0 to sleep forever * @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return Interrupt number if wake up was triggered by pin change, -1 if wake up was triggered by timer, -2 if sleep was not possible (e.g. ongoing FW update) * @param smartSleep Set True if sending heartbeat and process incoming messages before going to sleep.
* @return Interrupt number if wake up was triggered by pin change, @ref MY_WAKE_UP_BY_TIMER if wake up was triggered by timer, @ref MY_SLEEP_NOT_POSSIBLE if sleep was not possible (e.g. ongoing FW update)
*/ */
int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0); int8_t sleep(const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2, const uint8_t mode2, const uint32_t ms=0, const bool smartSleep = false);
/** /**
* \deprecated Use sleep(ms, true) instead
* Same as sleep(), send heartbeat and process incoming messages before going to sleep.
* Specify the time to wait for incoming messages by defining MY_SMART_SLEEP_WAIT_DURATION to a time (ms).
* @param ms Number of milliseconds to sleep.
* @return @ref MY_WAKE_UP_BY_TIMER if timer woke it up, @ref MY_SLEEP_NOT_POSSIBLE if not possible (e.g. ongoing FW update)
*/
int8_t smartSleep(const uint32_t ms);
/**
* \deprecated Use sleep(interrupt, mode, ms, true) instead
* Same as sleep(), send heartbeat and process incoming messages before going to sleep.
* Specify the time to wait for incoming messages by defining MY_SMART_SLEEP_WAIT_DURATION to a time (ms).
* @param interrupt Interrupt that should trigger the wakeup
* @param mode RISING, FALLING, CHANGE
* @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return Interrupt number if wake up was triggered by pin change, @ref MY_WAKE_UP_BY_TIMER if wake up was triggered by timer, @ref MY_SLEEP_NOT_POSSIBLE if sleep was not possible (e.g. ongoing FW update)
*/
int8_t smartSleep(const uint8_t interrupt, const uint8_t mode, const uint32_t ms = 0);
/**
* \deprecated Use sleep(interrupt1, mode1, interrupt2, mode2, ms, true) instead
* Same as sleep(), send heartbeat and process incoming messages before going to sleep. * Same as sleep(), send heartbeat and process incoming messages before going to sleep.
* Specify the time to wait for incoming messages by defining MY_SMART_SLEEP_WAIT_DURATION to a time (ms). * Specify the time to wait for incoming messages by defining MY_SMART_SLEEP_WAIT_DURATION to a time (ms).
* @param interrupt1 First interrupt that should trigger the wakeup * @param interrupt1 First interrupt that should trigger the wakeup
@@ -283,9 +304,24 @@ int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode
* @param interrupt2 Second interrupt that should trigger the wakeup * @param interrupt2 Second interrupt that should trigger the wakeup
* @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE) * @param mode2 Mode for second interrupt (RISING, FALLING, CHANGE)
* @param ms Number of milliseconds to sleep or 0 to sleep forever * @param ms Number of milliseconds to sleep or 0 to sleep forever
* @return Interrupt number if wake up was triggered by pin change, -1 if wake up was triggered by timer, -2 if sleep was not possible (e.g. ongoing FW update) * @return Interrupt number if wake up was triggered by pin change, @ref MY_WAKE_UP_BY_TIMER if wake up was triggered by timer, @ref MY_SLEEP_NOT_POSSIBLE if sleep was not possible (e.g. ongoing FW update)
*/ */
int8_t smartSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0); int8_t smartSleep(const uint8_t interrupt1, const uint8_t mode1, const uint8_t interrupt2, const uint8_t mode2, const uint32_t ms=0);
/**
* Sleep (PowerDownMode) the MCU and radio. Wake up on timer or pin change for two separate interrupts.
* See: http://arduino.cc/en/Reference/attachInterrupt for details on modes and which pin
* is assigned to what interrupt. On Nano/Pro Mini: 0=Pin2, 1=Pin3
* @param ms Number of milliseconds to sleep or 0 to sleep forever
* @param interrupt1 (optional) First interrupt that should trigger the wakeup
* @param mode1 (optional) Mode for first interrupt (RISING, FALLING, CHANGE)
* @param interrupt2 (optional) Second interrupt that should trigger the wakeup
* @param mode2 (optional) Mode for second interrupt (RISING, FALLING, CHANGE)
* @param smartSleep (optional) Set True if sending heartbeat and process incoming messages before going to sleep.
* @return Interrupt number if wake up was triggered by pin change, @ref MY_WAKE_UP_BY_TIMER if wake up was triggered by timer, @ref MY_SLEEP_NOT_POSSIBLE if sleep was not possible (e.g. ongoing FW update)
*/
int8_t _sleep(const uint32_t ms, const bool smartSleep = false, const uint8_t interrupt1 = INTERRUPT_NOT_DEFINED, const uint8_t mode1 = MODE_NOT_DEFINED, const uint8_t interrupt2 = INTERRUPT_NOT_DEFINED, const uint8_t mode2 = MODE_NOT_DEFINED);
#ifdef MY_NODE_LOCK_FEATURE #ifdef MY_NODE_LOCK_FEATURE
/** /**
+1 -1
View File
@@ -92,7 +92,7 @@ static void DEBUG_SIGNING_PRINTBUF(const __FlashStringHelper* str, uint8_t* buf,
void signerAtsha204SoftInit(void) { void signerAtsha204SoftInit(void) {
// initialize pseudo-RNG // initialize pseudo-RNG
randomSeed(analogRead(MY_SIGNING_SOFT_RANDOMSEED_PIN)); hwRandomNumberInit();
// Set secrets // Set secrets
hwReadConfigBlock((void*)_signing_hmac_key, (void*)EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS, 32); hwReadConfigBlock((void*)_signing_hmac_key, (void*)EEPROM_SIGNING_SOFT_HMAC_KEY_ADDRESS, 32);
hwReadConfigBlock((void*)_signing_node_serial_info, (void*)EEPROM_SIGNING_SOFT_SERIAL_ADDRESS, 9); hwReadConfigBlock((void*)_signing_node_serial_info, (void*)EEPROM_SIGNING_SOFT_SERIAL_ADDRESS, 9);
+2 -6
View File
@@ -33,7 +33,7 @@
* E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003 * E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003
* *
* LED purposes: * LED purposes:
* - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs in your sketch, only the LEDs that is defined is used.
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error * - ERR (red) - fast blink on error during transmission error or recieve crc error
@@ -116,11 +116,10 @@
#define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_INCLUSION_MODE_BUTTON_PIN 3
// Flash leds on rx/tx/err
// #define MY_LEDS_BLINKING_FEATURE
// Set blinking period // Set blinking period
// #define MY_DEFAULT_LED_BLINK_PERIOD 300 // #define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
// Led pins used if blinking feature is enabled above // Led pins used if blinking feature is enabled above
#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin #define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin #define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
@@ -145,6 +144,3 @@ void presentation() {
void loop() { void loop() {
// Send locally attached sensors data here // Send locally attached sensors data here
} }
@@ -26,7 +26,7 @@
* The node also listens to MY_MQTT_TOPIC_PREFIX and sends out those messages to the radio network * The node also listens to MY_MQTT_TOPIC_PREFIX and sends out those messages to the radio network
* *
* LED purposes: * LED purposes:
* - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs in your sketch
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error * - ERR (red) - fast blink on error during transmission error or recieve crc error
@@ -105,11 +105,6 @@
#define MY_PORT 1883 #define MY_PORT 1883
/* /*
// Flash leds on rx/tx/err
#define MY_LEDS_BLINKING_FEATURE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Enable inclusion mode // Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE #define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway // Enable Inclusion mode button on gateway
@@ -119,6 +114,10 @@
// Digital pin used for inclusion mode button // Digital pin used for inclusion mode button
#define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin #define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin #define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
#define MY_DEFAULT_TX_LED_PIN 16 // the PCB, on board LED #define MY_DEFAULT_TX_LED_PIN 16 // the PCB, on board LED
@@ -138,6 +137,3 @@ void presentation() {
void loop() { void loop() {
// Send locally attech sensors data here // Send locally attech sensors data here
} }
@@ -118,11 +118,10 @@
#define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_INCLUSION_MODE_BUTTON_PIN 3
// Flash leds on rx/tx/err
// #define MY_LEDS_BLINKING_FEATURE
// Set blinking period // Set blinking period
// #define MY_DEFAULT_LED_BLINK_PERIOD 300 // #define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
// Led pins used if blinking feature is enabled above // Led pins used if blinking feature is enabled above
#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin #define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin #define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
@@ -171,7 +170,3 @@ void loop() {
// Send locally attech sensors data here // Send locally attech sensors data here
ArduinoOTA.handle(); ArduinoOTA.handle();
} }
+8 -14
View File
@@ -29,7 +29,7 @@
* - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
* *
* LEDs (OPTIONAL): * LEDs (OPTIONAL):
* - To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error * - ERR (red) - fast blink on error during transmission error or recieve crc error
@@ -56,14 +56,6 @@
#define MY_BAUD_RATE 38400 #define MY_BAUD_RATE 38400
#endif #endif
// Flash leds on rx/tx/err
#define MY_LEDS_BLINKING_FEATURE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Inverses the behavior of leds
//#define MY_WITH_LEDS_BLINKING_INVERSE
// Enable inclusion mode // Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE #define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway // Enable Inclusion mode button on gateway
@@ -77,6 +69,13 @@
// Digital pin used for inclusion mode button // Digital pin used for inclusion mode button
//#define MY_INCLUSION_MODE_BUTTON_PIN 3 //#define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Inverses the behavior of leds
//#define MY_WITH_LEDS_BLINKING_INVERSE
// Flash leds on rx/tx/err
// Uncomment to override default HW configurations // Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin
@@ -95,8 +94,3 @@ void presentation() {
void loop() { void loop() {
// Send locally attached sensor data here // Send locally attached sensor data here
} }
@@ -28,7 +28,6 @@
* - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
* *
* LEDs (OPTIONAL): * LEDs (OPTIONAL):
* - To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error * - ERR (red) - fast blink on error during transmission error or recieve crc error
@@ -64,10 +63,6 @@
// Enable serial gateway // Enable serial gateway
#define MY_GATEWAY_SERIAL #define MY_GATEWAY_SERIAL
// Flash leds on rx/tx/err
#define MY_LEDS_BLINKING_FEATURE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Enable inclusion mode // Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE #define MY_INCLUSION_MODE_FEATURE
@@ -78,6 +73,10 @@
// Digital pin used for inclusion mode button // Digital pin used for inclusion mode button
#define MY_INCLUSION_MODE_BUTTON_PIN 3 #define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin #define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin #define MY_DEFAULT_RX_LED_PIN 5 // Receive led pin
#define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED #define MY_DEFAULT_TX_LED_PIN 6 // the PCB, on board LED
@@ -95,8 +94,3 @@ void presentation() {
void loop() { void loop() {
// Send locally attached sensor data here // Send locally attached sensor data here
} }
+4 -6
View File
@@ -90,11 +90,6 @@
// Note that most of the Ardunio examples use "DEAD BEEF FEED" for the MAC address. // Note that most of the Ardunio examples use "DEAD BEEF FEED" for the MAC address.
#define MY_MAC_ADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED #define MY_MAC_ADDRESS 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
// Flash leds on rx/tx/err
#define MY_LEDS_BLINKING_FEATURE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Enable inclusion mode // Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE #define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway // Enable Inclusion mode button on gateway
@@ -104,6 +99,10 @@
// Digital pin used for inclusion mode button // Digital pin used for inclusion mode button
//#define MY_INCLUSION_MODE_BUTTON_PIN 3 //#define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
// Uncomment to override default HW configurations // Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 7 // Error led pin //#define MY_DEFAULT_ERR_LED_PIN 7 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 8 // Receive led pin //#define MY_DEFAULT_RX_LED_PIN 8 // Receive led pin
@@ -123,4 +122,3 @@ void setup()
void loop() { void loop() {
} }
@@ -114,11 +114,6 @@
#define MY_PORT 1883 #define MY_PORT 1883
/* /*
// Flash leds on rx/tx/err
#define MY_LEDS_BLINKING_FEATURE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Enable inclusion mode // Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE #define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway // Enable Inclusion mode button on gateway
@@ -128,6 +123,10 @@
// Digital pin used for inclusion mode button // Digital pin used for inclusion mode button
//#define MY_INCLUSION_MODE_BUTTON_PIN 3 //#define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Flash leds on rx/tx/err
// Uncomment to override default HW configurations // Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin //#define MY_DEFAULT_ERR_LED_PIN 16 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin //#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
@@ -148,6 +147,3 @@ void presentation() {
void loop() { void loop() {
// Send locally attached sensors data here // Send locally attached sensors data here
} }
+2 -2
View File
@@ -65,7 +65,7 @@ void presentation()
for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) { for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
// Register all sensors to gw (they will be created as child devices) // Register all sensors to gw (they will be created as child devices)
present(sensor, S_LIGHT); present(sensor, S_BINARY);
} }
} }
@@ -77,7 +77,7 @@ void loop()
void receive(const MyMessage &message) { void receive(const MyMessage &message) {
// We only expect one type of message from controller. But we better check anyway. // We only expect one type of message from controller. But we better check anyway.
if (message.type==V_LIGHT) { if (message.type==V_STATUS) {
// Change relay state // Change relay state
digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF); digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
// Store state in eeprom // Store state in eeprom
@@ -22,6 +22,8 @@
* The ArduinoGateway prints data received from sensors on the serial link. * The ArduinoGateway prints data received from sensors on the serial link.
* The gateway accepts input on seral which will be sent out on radio network. * The gateway accepts input on seral which will be sent out on radio network.
* *
the last one is meant for the end user to break up into the various connectors used on the board.
* This GW code is designed for Sensebender GateWay / Arduino Zero * This GW code is designed for Sensebender GateWay / Arduino Zero
* *
* Wire connections (OPTIONAL): * Wire connections (OPTIONAL):
@@ -29,14 +31,14 @@
* - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series * - RX/TX/ERR leds need to be connected between +5V (anode) and digital pin 6/5/4 with resistor 270-330R in a series
* *
* LEDs (OPTIONAL): * LEDs (OPTIONAL):
* - To use the feature, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h * - To use the feature, uncomment any of the MY_DEFAULT_xx_LED_PINs
* - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved * - RX (green) - blink fast on radio message recieved. In inclusion mode will blink fast only on presentation recieved
* - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly * - TX (yellow) - blink fast on radio message transmitted. In inclusion mode will blink slowly
* - ERR (red) - fast blink on error during transmission error or recieve crc error * - ERR (red) - fast blink on error during transmission error or recieve crc error
* *
*/ */
#define SKETCH_VERSION "0.1" #define SKETCH_VERSION "0.2"
// Enable debug prints to serial monitor // Enable debug prints to serial monitor
#define MY_DEBUG #define MY_DEBUG
@@ -56,14 +58,6 @@
#define MY_BAUD_RATE 38400 #define MY_BAUD_RATE 38400
#endif #endif
// Flash leds on rx/tx/err
#define MY_LEDS_BLINKING_FEATURE
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Inverses the behavior of leds
//#define MY_WITH_LEDS_BLINKING_INVERSE
// Enable inclusion mode // Enable inclusion mode
#define MY_INCLUSION_MODE_FEATURE #define MY_INCLUSION_MODE_FEATURE
// Enable Inclusion mode button on gateway // Enable Inclusion mode button on gateway
@@ -77,6 +71,13 @@
// Digital pin used for inclusion mode button // Digital pin used for inclusion mode button
//#define MY_INCLUSION_MODE_BUTTON_PIN 3 //#define MY_INCLUSION_MODE_BUTTON_PIN 3
// Set blinking period
#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Inverses the behavior of leds
//#define MY_WITH_LEDS_BLINKING_INVERSE
// Flash leds on rx/tx/err
// Uncomment to override default HW configurations // Uncomment to override default HW configurations
//#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin //#define MY_DEFAULT_ERR_LED_PIN 4 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin //#define MY_DEFAULT_RX_LED_PIN 6 // Receive led pin
@@ -125,6 +126,7 @@ void preHwInit() {
delay(500); delay(500);
} // Wait for USB to be connected, before spewing out data. } // Wait for USB to be connected, before spewing out data.
} }
digitalWrite(LED_BLUE, LOW);
if (Serial) { if (Serial) {
Serial.println("Sensebender GateWay test routine"); Serial.println("Sensebender GateWay test routine");
Serial.print("Mysensors core version : "); Serial.print("Mysensors core version : ");
@@ -147,7 +149,11 @@ void preHwInit() {
digitalWrite(LED_ORANGE, HIGH); digitalWrite(LED_ORANGE, HIGH);
tests++; tests++;
} }
if (tests == 3) { if (testAnalog()) {
digitalWrite(LED_BLUE, HIGH);
tests++;
}
if (tests == 4) {
while(1) { while(1) {
for (int i=0; i<num_of_leds; i++) { for (int i=0; i<num_of_leds; i++) {
digitalWrite(leds[i], HIGH); digitalWrite(leds[i], HIGH);
@@ -250,3 +256,17 @@ bool testEEProm() {
SerialUSB.println("FAILED!"); SerialUSB.println("FAILED!");
return false; return false;
} }
bool testAnalog() {
int bat_detect = analogRead(MY_BAT_DETECT);
Serial.print("-> analog : ");
Serial.print(bat_detect);
if (bat_detect < 400 || bat_detect > 650) {
Serial.println(" Failed");
return false;
}
Serial.println(" Passed");
return true;
}
+3 -8
View File
@@ -51,16 +51,11 @@
//#define MY_MQTT_PASSWORD "password" //#define MY_MQTT_PASSWORD "password"
// Flash leds on rx/tx/err // Flash leds on rx/tx/err
//#define MY_LEDS_BLINKING_FEATURE //#define MY_DEFAULT_ERR_LED_PIN 12 // Error led pin
//#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
//#define MY_DEFAULT_TX_LED_PIN 18 // the PCB, on board
// Inverse the blinking feature // Inverse the blinking feature
//#define MY_WITH_LEDS_BLINKING_INVERSE //#define MY_WITH_LEDS_BLINKING_INVERSE
// Set blinking period
//#define MY_DEFAULT_LED_BLINK_PERIOD 300
// Led pins used if blinking feature is enabled above
#define MY_DEFAULT_ERR_LED_PIN 12 // Error led pin
#define MY_DEFAULT_RX_LED_PIN 16 // Receive led pin
#define MY_DEFAULT_TX_LED_PIN 18 // the PCB, on board
#include <MySensors.h> #include <MySensors.h>
+1 -1
View File
@@ -52,7 +52,6 @@ MY_PARENT_NODE_IS_STATIC LITERAL1
MY_OTA_FIRMWARE_FEATURE LITERAL1 MY_OTA_FIRMWARE_FEATURE LITERAL1
MY_OTA_FLASH_SS LITERAL1 MY_OTA_FLASH_SS LITERAL1
MY_OTA_FLASH_JDECID LITERAL1 MY_OTA_FLASH_JDECID LITERAL1
MY_LEDS_BLINKING_FEATURE LITERAL1
MY_WITH_LEDS_BLINKING_INVERSE LITERAL1 MY_WITH_LEDS_BLINKING_INVERSE LITERAL1
MY_DEFAULT_LED_BLINK_PERIOD LITERAL1 MY_DEFAULT_LED_BLINK_PERIOD LITERAL1
MY_WITH_LEDS_BLINKING_INVERSE LITERAL1 MY_WITH_LEDS_BLINKING_INVERSE LITERAL1
@@ -108,6 +107,7 @@ MY_GATEWAY_MAX_RECEIVE_LENGTH LITERAL1
MY_ESP8266_SSID LITERAL1 MY_ESP8266_SSID LITERAL1
MY_ESP8266_PASSWORD LITERAL1 MY_ESP8266_PASSWORD LITERAL1
MY_ESP8266_HOSTNAME LITERAL1 MY_ESP8266_HOSTNAME LITERAL1
MY_ESP8266_SERIAL_MODE LITERAL1
MY_IP_GATEWAY_ADDRESS LITERAL1 MY_IP_GATEWAY_ADDRESS LITERAL1
MY_IP_SUBNET_ADDRESS LITERAL1 MY_IP_SUBNET_ADDRESS LITERAL1
MY_W5100_SPI_EN LITERAL1 MY_W5100_SPI_EN LITERAL1
+5 -1
View File
@@ -9,7 +9,11 @@
}, },
"version": "2.0.1-beta", "version": "2.0.1-beta",
"frameworks": "arduino", "frameworks": "arduino",
"platforms": "*", "platforms": [
"atmelavr",
"atmelsam",
"espressif"
],
"exclude": [ "exclude": [
"tests", "tests",
"Documentation" "Documentation"