From e16cb028e97986dd0c5d77200fda733c975f74a6 Mon Sep 17 00:00:00 2001 From: Tomas Hozza Date: Sat, 23 May 2015 23:16:24 +0200 Subject: [PATCH] Rework Ethernet Gateway to use MyGatewayTransportEthernet Signed-off-by: Tomas Hozza --- .../EthernetGateway/EthernetGateway.ino | 184 ++++++------------ .../examples/EthernetGateway/GatewayUtil.h | 125 ------------ 2 files changed, 57 insertions(+), 252 deletions(-) delete mode 100644 libraries/MySensors/examples/EthernetGateway/GatewayUtil.h diff --git a/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino b/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino index dbfdcd6..6b38f89 100644 --- a/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino +++ b/libraries/MySensors/examples/EthernetGateway/EthernetGateway.ino @@ -20,67 +20,60 @@ * * REVISION HISTORY * Version 1.0 - Henrik EKblad - * Contribution by a-lurker and Anticimex, + * Contribution by a-lurker and Anticimex, * Contribution by Norbert Truchsess + * Contribution by Tomas Hozza + * * - * * DESCRIPTION - * The EthernetGateway sends data received from sensors to the ethernet link. + * The EthernetGateway sends data received from sensors to the ethernet link. * The gateway also accepts input on ethernet interface, which is then sent out to the radio network. * * The GW code is designed for Arduino 328p / 16MHz. ATmega168 does not have enough memory to run this program. - * + * * * COMPILING WIZNET (W5100) ETHERNET MODULE * > Edit MyConfig.h in (libraries\MySensors\) to enable softspi (remove // before "#define SOFTSPI"). * * COMPILING ENC28J60 ETHERNET MODULE - * > Use Arduino IDE 1.5.7 (or later) - * > Disable DEBUG in Sensor.h before compiling this sketch. Othervise the sketch will probably not fit in program space when downloading. - * > Remove Ethernet.h include below and include UIPEthernet.h - * > Remove DigitalIO include + * > Use Arduino IDE 1.5.7 (or later) + * > Disable DEBUG in Sensor.h before compiling this sketch. Othervise the sketch will probably not fit in program space when downloading. + * > Remove Ethernet.h include below and include UIPEthernet.h + * > Remove DigitalIO include * Note that I had to disable UDP and DHCP support in uipethernet-conf.h to reduce space. (which means you have to choose a static IP for that module) * * VERA CONFIGURATION: - * Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin. + * Enter "ip-number:port" in the ip-field of the Arduino GW device. This will temporarily override any serial configuration for the Vera plugin. * 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 - * + * - ERR (red) - fast blink on error during transmission error or recieve crc error + * * See http://www.mysensors.org/build/ethernet_gateway for wiring instructions. * */ -#define NO_PORTB_PINCHANGES #include // This include can be removed when using UIPEthernet module -#include +#include #include +#include +#include #include #include #include -#include -#include -#include -#include -#include -#include -#include "GatewayUtil.h" +#include +#include +#include +// needed due to Arduino IDE +#include -// Use this if you have attached a Ethernet ENC28J60 shields -// #include - -// Use this for WizNET W5100 module and Arduino Ethernet Shield -#include - - -#define INCLUSION_MODE_TIME 1 // Number of minutes inclusion mode is enabled +#define INCLUSION_MODE_TIME 60 // Number of minutes inclusion mode is enabled #define INCLUSION_MODE_PIN 3 // Digital pin used for inclusion mode button #define RADIO_CE_PIN 5 // radio chip enable @@ -90,6 +83,11 @@ #define RADIO_RX_LED_PIN 8 // Receive led pin #define RADIO_TX_LED_PIN 9 // the PCB, on board LED +#define IP_PORT 5003 // The port you want to open +#ifndef IP_ADDRESS_DHCP +// Gateway IP address if not using DHCP +IPAddress myIp (192, 168, 178, 66); // Configure your static ip-address here COMPILE ERROR HERE? Use Arduino IDE 1.5.7 or later! +#endif /* IP_ADDRESS_DHCP */ // NRFRF24L01 radio driver (set low transmit power by default) MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); @@ -100,117 +98,49 @@ MyTransportNRF24 transport(RF24_CE_PIN, RF24_CS_PIN, RF24_PA_LEVEL_GW); //MySigningAtsha204Soft signer; //MySigningAtsha204 signer; -// Hardware profile +// Hardware profile MyHwATMega328 hw; -// Construct MySensors library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h) -// To use LEDs blinking, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h -#ifdef MY_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 -IPAddress myIp (192, 168, 178, 66); // Configure your static ip-address here COMPILE ERROR HERE? Use Arduino IDE 1.5.7 or later! +// Controller protocol +MyProtocolDefault protocol; // The MAC address can be anything you want but should be unique on your network. // Newer boards have a MAC address printed on the underside of the PCB, which you can (optionally) use. // Note that most of the Ardunio examples use "DEAD BEEF FEED" for the MAC address. byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // DEAD BEEF FEED -// a R/W server on the port -EthernetServer server = EthernetServer(IP_PORT); -// handle to open connection -EthernetClient client = EthernetClient(); +// Controller IP +IPAddress controllerIP = IPAddress(192, 168, 178, 254); -char inputString[MAX_RECEIVE_LENGTH] = ""; // A string to hold incoming commands from serial/ethernet interface -int inputPos = 0; -bool sentReady = false; +// Gateway transport driver +#ifdef IP_ADDRESS_DHCP +MyGatewayTransportEthernet ctrlTransport(protocol, mac, /* gw port */ CONTROLLER_PORT, IP_RENEWAL_INTERVAL, controllerIP, CONTROLLER_PORT); +#else +MyGatewayTransportEthernet ctrlTransport(protocol, mac, myIp, /* gw port */ CONTROLLER_PORT, controllerIP, CONTROLLER_PORT); +#endif -void output(const char *fmt, ... ) { - va_list args; - va_start (args, fmt ); - vsnprintf_P(serialBuffer, MAX_SEND_LENGTH, fmt, args); - va_end (args); - Serial.print(serialBuffer); - client.write(serialBuffer); + +// Construct MyGateway library (signer needed if MY_SIGNING_FEATURE is turned on in MyConfig.h) +// To use LEDs blinking, uncomment MY_LEDS_BLINKING_FEATURE in MyConfig.h +#ifdef MY_WITH_LEDS_BLINKING +MyGateway gw(ctrlTransport, transport, hw /*, signer*/, RADIO_RX_LED_PIN, RADIO_TX_LED_PIN, RADIO_ERROR_LED_PIN); +#else +MyGateway gw(ctrlTransport, transport, hw /*, signer*/); +#endif + +void setup() +{ + gw.begin(NULL +#ifdef MY_INCLUSION_MODE_FEATURE + , INCLUSION_MODE_TIME +#ifdef MY_INCLUSION_BUTTON_FEATURE + , INCLUSION_MODE_PIN +#endif +#endif + ); } -void setup() -{ - Ethernet.begin(mac, myIp); - - setupGateway(INCLUSION_MODE_PIN, INCLUSION_MODE_TIME, output); - - // Add interrupt for inclusion button to pin - PCintPort::attachInterrupt(pinInclusion, startInclusionInterrupt, RISING); - - // give the Ethernet interface a second to initialize - delay(1000); - - // Initialize gateway at maximum PA level, channel 70 and callback for write operations - gw.begin(incomingMessage, 0, true, 0); - - - // start listening for clients - server.begin(); - -} - - void loop() { - gw.process(); - - checkButtonTriggeredInclusion(); - checkInclusionFinished(); - - // if an incoming client connects, there will be - // bytes available to read via the client object - EthernetClient newclient = server.available(); - // if a new client connects make sure to dispose any previous existing sockets - if (newclient) { - if (client != newclient) { - client.stop(); - client = newclient; - output(PSTR("0;0;%d;0;%d;Gateway startup complete.\n"), C_INTERNAL, I_GATEWAY_READY); - } - } - - if (client) { - if (!client.connected()) { - client.stop(); - } else if (client.available()) { - // read the bytes incoming from the client - char inChar = client.read(); - if (inputPos - - -#ifdef ARDUINO - - -uint8_t inclusionTime = 1; // Number of minutes inclusion mode is enabled -uint8_t pinInclusion = 3; // Input pin that should trigger inclusion mode - -#define MAX_RECEIVE_LENGTH 100 // Max buffersize needed for messages coming from controller -#define MAX_SEND_LENGTH 120 // Max buffersize needed for messages destined for controller - -volatile boolean buttonTriggeredInclusion; -boolean inclusionMode; // Keeps track on inclusion mode -void (*serial)(const char *fmt, ... ); - -MyProtocolDefault protocol; - -void setInclusionMode(boolean newMode); - -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 _inc, uint8_t _incTime, void (* _serial)(const char *, ... )) { - inclusionMode = 0; - buttonTriggeredInclusion = false; - serial = _serial; - - pinInclusion = _inc; - inclusionTime = _incTime; - - // Setup digital in that triggers inclusion mode - pinMode(pinInclusion, INPUT); - digitalWrite(pinInclusion, HIGH); -} - - - -void startInclusionInterrupt() { - buttonTriggeredInclusion = true; -} - -void incomingMessage(const MyMessage &message) { -// 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)); -} - - - -void checkButtonTriggeredInclusion() { - if (buttonTriggeredInclusion) { - // Ok, someone pressed the inclusion button on the gateway - // start inclusion mode for 1 munute. -#ifdef DEBUG - serial(PSTR("0;0;%d;0;%d;Inclusion started by button.\n"), C_INTERNAL, I_LOG_MESSAGE); -#endif - buttonTriggeredInclusion = false; - setInclusionMode(true); - } -} - -void checkInclusionFinished() { - if (inclusionMode && millis()-inclusionStartTime>60000UL*inclusionTime) { - // inclusionTimeInMinutes minute(s) has passed.. stop inclusion mode - setInclusionMode(false); - } -} - -void parseAndSend(MySensor &gw, char *commandBuffer) { - boolean ok; - MyMessage &msg = gw.getLastMessage(); - - if (protocol.parse(msg, commandBuffer)) { - uint8_t command = mGetCommand(msg); - - if (msg.destination==GATEWAY_ADDRESS && command==C_INTERNAL) { - // Handle messages directed to gateway - if (msg.type == I_VERSION) { - // Request for version - serial(PSTR("0;0;%d;0;%d;%s\n"), C_INTERNAL, I_VERSION, LIBRARY_VERSION); - } else if (msg.type == I_INCLUSION_MODE) { - // Request to change inclusion mode - setInclusionMode(atoi(msg.data) == 1); - } - } else { - #ifdef MY_LEDS_BLINKING_FEATURE - gw.txBlink(1); - #endif - ok = gw.sendRoute(msg); - if (!ok) { - #ifdef MY_LEDS_BLINKING_FEATURE - gw.errBlink(1); - #endif - } - } - } -} - -void setInclusionMode(boolean newMode) { - if (newMode != inclusionMode) { - inclusionMode = newMode; - // Send back mode change on serial line to ack command - serial(PSTR("0;0;%d;0;%d;%d\n"), C_INTERNAL, I_INCLUSION_MODE, inclusionMode?1:0); - - if (inclusionMode) { - inclusionStartTime = millis(); - } - } -} - - -#else -#error This example is only for use on Arduino. -#endif // ARDUINO - -#endif