From 58efd872f41742c1bd4cc20019dda24b98ac8ab8 Mon Sep 17 00:00:00 2001 From: Tomas Hozza Date: Sun, 19 Apr 2015 20:51:48 +0200 Subject: [PATCH 1/4] Add LED blinking support into MySensor without any library dependency Signed-off-by: Tomas Hozza --- libraries/MySensors/MyConfig.h | 20 ++++++++ libraries/MySensors/MySensor.cpp | 86 ++++++++++++++++++++++++++++++++ libraries/MySensors/MySensor.h | 29 +++++++++++ 3 files changed, 135 insertions(+) diff --git a/libraries/MySensors/MyConfig.h b/libraries/MySensors/MyConfig.h index 437ef3e..c2148ab 100644 --- a/libraries/MySensors/MyConfig.h +++ b/libraries/MySensors/MyConfig.h @@ -45,6 +45,26 @@ #define MY_OTA_FLASH_JDECID 0x1F65 +/********************************** +* Information LEDs blinking +***********************************/ +// This feature enables LEDs blinking on message receive, transmit +// or if some error occured. This was commonly used only in gateways, +// but now can be used in any sensor node. Also the LEDs can now be +// disabled in the gateway. + +// #define WITH_LEDS_BLINKING + +// default LEDs blinking period in milliseconds +#define DEFAULT_LED_BLINK_PERIOD 300 +// The RX LED default pin +#define DEFAULT_RX_LED_PIN 8 +// The TX LED default pin +#define DEFAULT_TX_LED_PIN 9 +// The Error LED default pin +#define DEFAULT_ERR_LED_PIN 7 + + /********************************** * Message Signing Settings ***********************************/ diff --git a/libraries/MySensors/MySensor.cpp b/libraries/MySensors/MySensor.cpp index 837ffd6..f059b9e 100644 --- a/libraries/MySensors/MySensor.cpp +++ b/libraries/MySensors/MySensor.cpp @@ -52,6 +52,9 @@ static inline bool isValidDistance( const uint8_t distance ) { MySensor::MySensor(MyTransport &_radio, MyHw &_hw #ifdef MY_SIGNING_FEATURE , MySigning &_signer +#endif +#ifdef WITH_LEDS_BLINKING + , uint8_t _rx, uint8_t _tx, uint8_t _er, unsigned long _blink_period #endif ) : @@ -59,6 +62,9 @@ MySensor::MySensor(MyTransport &_radio, MyHw &_hw #ifdef MY_SIGNING_FEATURE signer(_signer), #endif +#ifdef WITH_LEDS_BLINKING + pinRx(_rx), pinTx(_tx), pinEr(_er), ledBlinkPeriod(_blink_period), +#endif #ifdef MY_OTA_FIRMWARE_FEATURE flash(MY_OTA_FLASH_SS, MY_OTA_FLASH_JDECID), #endif @@ -90,6 +96,64 @@ bool MySensor::isValidFirmware() { #endif +#ifdef WITH_LEDS_BLINKING +void MySensor::handleLedsBlinking() { + static unsigned long next_time = hw_millis() + ledBlinkPeriod; + + // Just return if it is not the time... + // http://playground.arduino.cc/Code/TimingRollover + if ((long)(hw_millis() - next_time) < 0) + return; + else + next_time = hw_millis() + ledBlinkPeriod; + + // do the actual blinking + if(countRx && countRx != 255) { + // switch led on + digitalWrite(pinRx, LOW); + } + else if(!countRx) { + // switching off + digitalWrite(pinRx, HIGH); + } + if(countRx != 255) + --countRx; + + if(countTx && countTx != 255) { + // switch led on + digitalWrite(pinTx, LOW); + } + else if(!countTx) { + // switching off + digitalWrite(pinTx, HIGH); + } + if(countTx != 255) + --countTx; + + if(countErr && countErr != 255) { + // switch led on + digitalWrite(pinEr, LOW); + } + else if(!countErr) { + // switching off + digitalWrite(pinEr, HIGH); + } + if(countErr != 255) + --countErr; +} + +void MySensor::rxBlink(uint8_t cnt) { + if(countRx == 255) { countRx = cnt; } +} + +void MySensor::txBlink(uint8_t cnt) { + if(countTx == 255) { countTx = cnt; } +} + +void MySensor::errBlink(uint8_t cnt) { + if(countErr == 255) { countErr = cnt; } +} +#endif void MySensor::begin(void (*_msgCallback)(const MyMessage &), uint8_t _nodeId, boolean _repeaterMode, uint8_t _parentNodeId) { hw_init(); @@ -111,6 +175,23 @@ void MySensor::begin(void (*_msgCallback)(const MyMessage &), uint8_t _nodeId, b hw_readConfigBlock((void*)doSign, (void*)EEPROM_SIGNING_REQUIREMENT_TABLE_ADDRESS, sizeof(doSign)); #endif +#ifdef WITH_LEDS_BLINKING + // Setup led pins + pinMode(pinRx, OUTPUT); + pinMode(pinTx, OUTPUT); + pinMode(pinEr, OUTPUT); + + // Set initial state of leds + digitalWrite(pinRx, HIGH); + digitalWrite(pinTx, HIGH); + digitalWrite(pinEr, HIGH); + + // initialize counters + countRx = 0; + countTx = 0; + countErr = 0; +#endif + if (isGateway) { // Set configuration for gateway nc.parentNodeId = GATEWAY_ADDRESS; @@ -408,6 +489,11 @@ void MySensor::requestTime(void (* _timeCallback)(unsigned long)) { boolean MySensor::process() { hw_watchdogReset(); + +#ifdef WITH_LEDS_BLINKING + handleLedsBlinking(); +#endif + uint8_t to = 0; if (!radio.available(&to)) { diff --git a/libraries/MySensors/MySensor.h b/libraries/MySensors/MySensor.h index 0081b90..9917b66 100644 --- a/libraries/MySensors/MySensor.h +++ b/libraries/MySensors/MySensor.h @@ -145,6 +145,12 @@ class MySensor MySensor(MyTransport &radio =*new MyTransportNRF24(), MyHw &hw=*new MyHwDriver() #ifdef MY_SIGNING_FEATURE , MySigning &signer=*new MySigningNone() +#endif +#ifdef WITH_LEDS_BLINKING + , uint8_t _rx=DEFAULT_RX_LED_PIN, + uint8_t _tx=DEFAULT_TX_LED_PIN, + uint8_t _er=DEFAULT_ERR_LED_PIN, + unsigned long _blink_period=DEFAULT_LED_BLINK_PERIOD #endif ); @@ -299,6 +305,15 @@ class MySensor */ int8_t sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms=0); +#ifdef WITH_LEDS_BLINKING + /** + * Blink with LEDs + * @param cnt how many blink cycles to keep the LED on. Default cycle is 300ms + */ + void rxBlink(uint8_t cnt); + void txBlink(uint8_t cnt); + void errBlink(uint8_t cnt); +#endif protected: NodeConfig nc; // Essential settings for node to work @@ -324,6 +339,20 @@ class MySensor MySigning& signer; #endif +#ifdef WITH_LEDS_BLINKING + uint8_t pinRx; // Rx led pin + uint8_t pinTx; // Tx led pin + uint8_t pinEr; // Err led pin + + // these variables don't need to be volatile, since we are not using interrupts + uint8_t countRx; + uint8_t countTx; + uint8_t countErr; + + unsigned long ledBlinkPeriod; + void handleLedsBlinking(); // do the actual blinking +#endif + MyTransport& radio; MyHw& hw; From 24464a6255988819d8ed4f87b1163d25d9ff1495 Mon Sep 17 00:00:00 2001 From: Tomas Hozza Date: Sun, 19 Apr 2015 21:07:03 +0200 Subject: [PATCH 2/4] Use LED blinking in MySensor where appropriate Signed-off-by: Tomas Hozza --- libraries/MySensors/MySensor.cpp | 33 ++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/libraries/MySensors/MySensor.cpp b/libraries/MySensors/MySensor.cpp index f059b9e..cb0e026 100644 --- a/libraries/MySensors/MySensor.cpp +++ b/libraries/MySensors/MySensor.cpp @@ -327,12 +327,18 @@ boolean MySensor::sendRoute(MyMessage &message) { // If we still don't have any parent id, re-request and skip this message. if (nc.parentNodeId == AUTO) { findParentNode(); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } // If we still don't have any node id, re-request and skip this message. if (nc.nodeId == AUTO) { requestNodeId(); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } @@ -369,10 +375,16 @@ boolean MySensor::sendRoute(MyMessage &message) { } if (hw_millis() - enter > MY_VERIFICATION_TIMEOUT_MS) { debug(PSTR("nonce tmo\n")); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } if (!signOk) { debug(PSTR("sign fail\n")); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } // After this point, only the 'last' member of the message structure is allowed to be altered if the message has been signed, @@ -431,6 +443,9 @@ boolean MySensor::sendRoute(MyMessage &message) { if (!ok) { // Failure when sending to parent node. The parent node might be down and we // need to find another route to gateway. +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif failedTransmissions++; if (autoFindParent && failedTransmissions > SEARCH_FAILURES) { findParentNode(); @@ -445,6 +460,9 @@ boolean MySensor::sendWrite(uint8_t to, MyMessage &message) { mSetVersion(message, PROTOCOL_VERSION); uint8_t length = mGetSigned(message) ? MAX_MESSAGE_LENGTH : mGetLength(message); message.last = nc.nodeId; +#ifdef WITH_LEDS_BLINKING + txBlink(1); +#endif bool ok = radio.send(to, &message, min(MAX_MESSAGE_LENGTH, HEADER_SIZE + length)); debug(PSTR("send: %d-%d-%d-%d s=%d,c=%d,t=%d,pt=%d,l=%d,sg=%d,st=%s:%s\n"), @@ -504,6 +522,9 @@ boolean MySensor::process() { debug(PSTR("fw upd fail\n")); // Give up. We have requested MY_OTA_RETRY times without any packet in return. fwUpdateOngoing = false; +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } fwRetry--; @@ -525,6 +546,9 @@ boolean MySensor::process() { #endif uint8_t len = radio.receive((uint8_t *)&msg); +#ifdef WITH_LEDS_BLINKING + rxBlink(1); +#endif #ifdef MY_SIGNING_FEATURE // Before processing message, reject unsigned messages if signing is required and check signature (if it is signed and addressed to us) @@ -537,10 +561,16 @@ boolean MySensor::process() { if (!mGetSigned(msg)) { // Got unsigned message that should have been signed debug(PSTR("no sign\n")); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } else if (!signer.verifyMsg(msg)) { debug(PSTR("verify fail\n")); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; // This signed message has been tampered with! } } @@ -554,6 +584,9 @@ boolean MySensor::process() { if(!(mGetVersion(msg) == PROTOCOL_VERSION)) { debug(PSTR("ver mismatch\n")); +#ifdef WITH_LEDS_BLINKING + errBlink(1); +#endif return false; } From 0d6da230c5236daacb6375b6d04b30a3e91b90dc Mon Sep 17 00:00:00 2001 From: Tomas Hozza Date: Wed, 6 May 2015 21:30:49 +0200 Subject: [PATCH 3/4] SerialGateway: Use internal LEDs feature for blinking Signed-off-by: Tomas Hozza --- .../examples/SerialGateway/GatewayUtil.h | 97 +++---------------- .../examples/SerialGateway/SerialGateway.ino | 15 +-- 2 files changed, 21 insertions(+), 91 deletions(-) diff --git a/libraries/MySensors/examples/SerialGateway/GatewayUtil.h b/libraries/MySensors/examples/SerialGateway/GatewayUtil.h index 532d9ca..bf24038 100644 --- a/libraries/MySensors/examples/SerialGateway/GatewayUtil.h +++ b/libraries/MySensors/examples/SerialGateway/GatewayUtil.h @@ -27,9 +27,6 @@ #ifdef ARDUINO -uint8_t pinRx = 8; // Rx led pin -uint8_t pinTx = 9; // Tx led pin -uint8_t pinEr = 7; // Err led pin uint8_t inclusionTime = 1; // Number of minutes inclusion mode is enabled uint8_t pinInclusion = 3; // Input pin that should trigger inclusion mode @@ -37,56 +34,28 @@ uint8_t pinInclusion = 3; // Input pin that should trigger inclusion mode #define MAX_SEND_LENGTH 120 // Max buffersize needed for messages destined for controller volatile boolean buttonTriggeredInclusion; -volatile uint8_t countRx; -volatile uint8_t countTx; -volatile uint8_t countErr; boolean inclusionMode; // Keeps track on inclusion mode void (*serial)(const char *fmt, ... ); MyParserSerial parser; void setInclusionMode(boolean newMode); -void txBlink(uint8_t cnt); -void rxBlink(uint8_t cnt); -void errBlink(uint8_t cnt); char convBuf[MAX_PAYLOAD*2+1]; char serialBuffer[MAX_SEND_LENGTH]; // Buffer for building string when sending data to vera unsigned long inclusionStartTime; -void setupGateway(uint8_t _rx, uint8_t _tx, uint8_t _er, uint8_t _inc, uint8_t _incTime, void (* _serial)(const char *, ... )) { +void setupGateway(uint8_t _inc, uint8_t _incTime, void (* _serial)(const char *, ... )) { inclusionMode = 0; buttonTriggeredInclusion = false; serial = _serial; - pinRx = _rx; - pinTx = _tx; - pinEr = _er; pinInclusion = _inc; inclusionTime = _incTime; - countRx = 0; - countTx = 0; - countErr = 0; - - - // Setup led pins - pinMode(pinRx, OUTPUT); - pinMode(pinTx, OUTPUT); - pinMode(pinEr, OUTPUT); - digitalWrite(pinRx, LOW); - digitalWrite(pinTx, LOW); - digitalWrite(pinEr, LOW); - // Setup digital in that triggers inclusion mode pinMode(pinInclusion, INPUT); digitalWrite(pinInclusion, HIGH); - - // Set initial state of leds - digitalWrite(pinRx, HIGH); - digitalWrite(pinTx, HIGH); - digitalWrite(pinEr, HIGH); - } @@ -96,11 +65,11 @@ void startInclusionInterrupt() { } void incomingMessage(const MyMessage &message) { - if (mGetCommand(message) == C_PRESENTATION && inclusionMode) { - rxBlink(3); - } else { - rxBlink(1); - } +// if (mGetCommand(message) == C_PRESENTATION && inclusionMode) { +// gw.rxBlink(3); +// } else { +// gw.rxBlink(1); +// } // Pass along the message from sensors to serial line serial(PSTR("%d;%d;%d;%d;%d;%s\n"),message.sender, message.sensor, mGetCommand(message), mGetAck(message), message.type, message.getString(convBuf)); } @@ -126,7 +95,7 @@ void checkInclusionFinished() { } } -void parseAndSend(MySensor gw, char *commandBuffer) { +void parseAndSend(MySensor &gw, char *commandBuffer) { boolean ok; MyMessage &msg = gw.getLastMessage(); @@ -143,10 +112,14 @@ void parseAndSend(MySensor gw, char *commandBuffer) { setInclusionMode(atoi(msg.data) == 1); } } else { - txBlink(1); + #ifdef WITH_LEDS_BLINKING + gw.txBlink(1); + #endif ok = gw.sendRoute(msg); if (!ok) { - errBlink(1); + #ifdef WITH_LEDS_BLINKING + gw.errBlink(1); + #endif } } } @@ -165,50 +138,6 @@ void setInclusionMode(boolean newMode) { } - - -void ledTimersInterrupt() { - if(countRx && countRx != 255) { - // switch led on - digitalWrite(pinRx, LOW); - } else if(!countRx) { - // switching off - digitalWrite(pinRx, HIGH); - } - if(countRx != 255) { countRx--; } - - if(countTx && countTx != 255) { - // switch led on - digitalWrite(pinTx, LOW); - } else if(!countTx) { - // switching off - digitalWrite(pinTx, HIGH); - } - if(countTx != 255) { countTx--; } - else if(inclusionMode) { countTx = 8; } - - if(countErr && countErr != 255) { - // switch led on - digitalWrite(pinEr, LOW); - } else if(!countErr) { - // switching off - digitalWrite(pinEr, HIGH); - } - if(countErr != 255) { countErr--; } -} - -void rxBlink(uint8_t cnt) { - if(countRx == 255) { countRx = cnt; } -} -void txBlink(uint8_t cnt) { - if(countTx == 255 && !inclusionMode) { countTx = cnt; } -} -void errBlink(uint8_t cnt) { - if(countErr == 255) { countErr = cnt; } -} - - - #else #error This example is only for use on Arduino. #endif // ARDUINO diff --git a/libraries/MySensors/examples/SerialGateway/SerialGateway.ino b/libraries/MySensors/examples/SerialGateway/SerialGateway.ino index 9bfa910..7478665 100644 --- a/libraries/MySensors/examples/SerialGateway/SerialGateway.ino +++ b/libraries/MySensors/examples/SerialGateway/SerialGateway.ino @@ -29,6 +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 * * LEDs (OPTIONAL): + * - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h * - 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 * - ERR (red) - fast blink on error during transmission error or recieve crc error @@ -48,7 +49,6 @@ #include #include #include -#include #include #include "GatewayUtil.h" @@ -59,7 +59,7 @@ #define RADIO_TX_LED_PIN 5 // the PCB, on board LED // NRFRF24L01 radio driver (set low transmit power by default) -MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); +MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); //MyTransportRFM69 transport; // Message signing driver (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h) @@ -71,7 +71,12 @@ MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); MyHwATMega328 hw; // Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h) +// To use LEDs blinking, uncomment WITH_LEDS_BLINKING in MyConfig.h +#ifdef WITH_LEDS_BLINKING +MySensor gw(transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN); +#else MySensor gw(transport, hw /*, signer*/); +#endif char inputString[MAX_RECEIVE_LENGTH] = ""; // A string to hold incoming commands from serial/ethernet interface int inputPos = 0; @@ -92,11 +97,7 @@ void setup() { gw.begin(incomingMessage, 0, true, 0); - setupGateway(RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN, INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output); - - // Add led timer interrupt - MsTimer2::set(300, ledTimersInterrupt); - MsTimer2::start(); + setupGateway(INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output); // Add interrupt for inclusion button to pin PCintPort::attachInterrupt(pinInclusion, startInclusionInterrupt, RISING); From 29b86801fbffa7853ea68eeba8a86a31c0f8f81f Mon Sep 17 00:00:00 2001 From: Tomas Hozza Date: Wed, 6 May 2015 21:41:54 +0200 Subject: [PATCH 4/4] EthernetGateway: Use internal LEDs feature for blinking Signed-off-by: Tomas Hozza --- .../EthernetGateway/EthernetGateway.ino | 12 ++- .../examples/EthernetGateway/GatewayUtil.h | 97 +++---------------- 2 files changed, 20 insertions(+), 89 deletions(-) diff --git a/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino b/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino index 562b28d..383cbdf 100644 --- a/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino +++ b/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino @@ -46,6 +46,7 @@ * E.g. If you want to use the defualt values in this sketch enter: 192.168.178.66:5003 * * LED purposes: + * - To use the feature, uncomment WITH_LEDS_BLINKING in MyConfig.h * - 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 * - ERR (red) - fast blink on error during transmission error or recieve crc error @@ -68,7 +69,6 @@ #include #include #include -#include #include #include "GatewayUtil.h" @@ -104,7 +104,12 @@ MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); MyHwATMega328 hw; // Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h) +// To use LEDs blinking, uncomment WITH_LEDS_BLINKING in MyConfig.h +#ifdef WITH_LEDS_BLINKING +MySensor gw(transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN); +#else MySensor gw(transport, hw /*, signer*/); +#endif #define IP_PORT 5003 // The port you want to open @@ -136,11 +141,8 @@ void output(const char *fmt, ... ) { void setup() { Ethernet.begin(mac, myIp); - setupGateway(RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN, INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output); - // Add led timer interrupt - MsTimer2::set(300, ledTimersInterrupt); - MsTimer2::start(); + setupGateway(INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output); // Add interrupt for inclusion button to pin PCintPort::attachInterrupt(pinInclusion, startInclusionInterrupt, RISING); diff --git a/libraries/MySensors/examples/EthernetGateway/GatewayUtil.h b/libraries/MySensors/examples/EthernetGateway/GatewayUtil.h index 2c1b22c..64730f2 100644 --- a/libraries/MySensors/examples/EthernetGateway/GatewayUtil.h +++ b/libraries/MySensors/examples/EthernetGateway/GatewayUtil.h @@ -7,9 +7,6 @@ #ifdef ARDUINO -uint8_t pinRx = 8; // Rx led pin -uint8_t pinTx = 9; // Tx led pin -uint8_t pinEr = 7; // Err led pin uint8_t inclusionTime = 1; // Number of minutes inclusion mode is enabled uint8_t pinInclusion = 3; // Input pin that should trigger inclusion mode @@ -17,56 +14,28 @@ uint8_t pinInclusion = 3; // Input pin that should trigger inclusion mode #define MAX_SEND_LENGTH 120 // Max buffersize needed for messages destined for controller volatile boolean buttonTriggeredInclusion; -volatile uint8_t countRx; -volatile uint8_t countTx; -volatile uint8_t countErr; boolean inclusionMode; // Keeps track on inclusion mode void (*serial)(const char *fmt, ... ); MyParserSerial parser; void setInclusionMode(boolean newMode); -void txBlink(uint8_t cnt); -void rxBlink(uint8_t cnt); -void errBlink(uint8_t cnt); char convBuf[MAX_PAYLOAD*2+1]; char serialBuffer[MAX_SEND_LENGTH]; // Buffer for building string when sending data to vera unsigned long inclusionStartTime; -void setupGateway(uint8_t _rx, uint8_t _tx, uint8_t _er, uint8_t _inc, uint8_t _incTime, void (* _serial)(const char *, ... )) { +void setupGateway(uint8_t _inc, uint8_t _incTime, void (* _serial)(const char *, ... )) { inclusionMode = 0; buttonTriggeredInclusion = false; serial = _serial; - pinRx = _rx; - pinTx = _tx; - pinEr = _er; pinInclusion = _inc; inclusionTime = _incTime; - countRx = 0; - countTx = 0; - countErr = 0; - - - // Setup led pins - pinMode(pinRx, OUTPUT); - pinMode(pinTx, OUTPUT); - pinMode(pinEr, OUTPUT); - digitalWrite(pinRx, LOW); - digitalWrite(pinTx, LOW); - digitalWrite(pinEr, LOW); - // Setup digital in that triggers inclusion mode pinMode(pinInclusion, INPUT); digitalWrite(pinInclusion, HIGH); - - // Set initial state of leds - digitalWrite(pinRx, HIGH); - digitalWrite(pinTx, HIGH); - digitalWrite(pinEr, HIGH); - } @@ -76,11 +45,11 @@ void startInclusionInterrupt() { } void incomingMessage(const MyMessage &message) { - if (mGetCommand(message) == C_PRESENTATION && inclusionMode) { - rxBlink(3); - } else { - rxBlink(1); - } +// if (mGetCommand(message) == C_PRESENTATION && inclusionMode) { +// gw.rxBlink(3); +// } else { +// gw.rxBlink(1); +// } // Pass along the message from sensors to serial line serial(PSTR("%d;%d;%d;%d;%d;%s\n"),message.sender, message.sensor, mGetCommand(message), mGetAck(message), message.type, message.getString(convBuf)); } @@ -106,7 +75,7 @@ void checkInclusionFinished() { } } -void parseAndSend(MySensor gw, char *commandBuffer) { +void parseAndSend(MySensor &gw, char *commandBuffer) { boolean ok; MyMessage &msg = gw.getLastMessage(); @@ -123,10 +92,14 @@ void parseAndSend(MySensor gw, char *commandBuffer) { setInclusionMode(atoi(msg.data) == 1); } } else { - txBlink(1); + #ifdef WITH_LEDS_BLINKING + gw.txBlink(1); + #endif ok = gw.sendRoute(msg); if (!ok) { - errBlink(1); + #ifdef WITH_LEDS_BLINKING + gw.errBlink(1); + #endif } } } @@ -145,50 +118,6 @@ void setInclusionMode(boolean newMode) { } - - -void ledTimersInterrupt() { - if(countRx && countRx != 255) { - // switch led on - digitalWrite(pinRx, LOW); - } else if(!countRx) { - // switching off - digitalWrite(pinRx, HIGH); - } - if(countRx != 255) { countRx--; } - - if(countTx && countTx != 255) { - // switch led on - digitalWrite(pinTx, LOW); - } else if(!countTx) { - // switching off - digitalWrite(pinTx, HIGH); - } - if(countTx != 255) { countTx--; } - else if(inclusionMode) { countTx = 8; } - - if(countErr && countErr != 255) { - // switch led on - digitalWrite(pinEr, LOW); - } else if(!countErr) { - // switching off - digitalWrite(pinEr, HIGH); - } - if(countErr != 255) { countErr--; } -} - -void rxBlink(uint8_t cnt) { - if(countRx == 255) { countRx = cnt; } -} -void txBlink(uint8_t cnt) { - if(countTx == 255 && !inclusionMode) { countTx = cnt; } -} -void errBlink(uint8_t cnt) { - if(countErr == 255) { countErr = cnt; } -} - - - #else #error This example is only for use on Arduino. #endif // ARDUINO