diff --git a/libraries/MySensors/MySensor.h b/libraries/MySensors/MySensor.h index 9426863..05464bf 100644 --- a/libraries/MySensors/MySensor.h +++ b/libraries/MySensors/MySensor.h @@ -19,10 +19,6 @@ #ifndef MySensor_h #define MySensor_h -/* { dg-warning "import is a deprecated GCC extension" "deprecated" {target *-*-* } 0 } */ - - - #include "MyConfig.h" #include "core/MySensorCore.h" @@ -239,6 +235,7 @@ extern "C" void setup() __attribute__((weak)); extern "C" void loop() __attribute__((weak)); extern "C" void loop2() __attribute__((weak)); + #include #if defined(MY_GATEWAY_ESP8266) diff --git a/libraries/MySensors/core/MyGatewayTransportEthernet.cpp b/libraries/MySensors/core/MyGatewayTransportEthernet.cpp index f06dbae..2d114ce 100644 --- a/libraries/MySensors/core/MyGatewayTransportEthernet.cpp +++ b/libraries/MySensors/core/MyGatewayTransportEthernet.cpp @@ -44,6 +44,7 @@ typedef struct // Some re-defines to make code more readable below #define EthernetServer WiFiServer #define EthernetClient WiFiClient + #define EthernetUDP WiFiUDP #if defined(MY_IP_ADDRESS) IPAddress gateway(MY_IP_GATEWAY_ADDRESS); @@ -55,11 +56,7 @@ typedef struct #if defined(MY_USE_UDP) - #if defined(MY_GATEWAY_ESP8266) - WiFiUDP _ethernetServer; - #else - EthernetUDP _ethernetServer; - #endif + EthernetUDP _ethernetServer; #else EthernetServer _ethernetServer(_ethernetGatewayPort); uint8_t _ethernetInputPos; @@ -165,8 +162,8 @@ bool gatewayTransportAvailable() int packet_size = _ethernetServer.parsePacket(); if (_ethernetServer.available()) { - _ethernetServer.read(inputString[0], MY_GATEWAY_MAX_RECEIVE_LENGTH); - return protocolParse(_ethernetMsg, inputString[0]); + _ethernetServer.read(inputString[0].string, MY_GATEWAY_MAX_RECEIVE_LENGTH); + return protocolParse(_ethernetMsg, inputString[0].string); } #else // Go over list of clients and stop any that are no longer connected. diff --git a/libraries/MySensors/core/MySensorCore.cpp b/libraries/MySensors/core/MySensorCore.cpp index ee3681d..55f88fb 100644 --- a/libraries/MySensors/core/MySensorCore.cpp +++ b/libraries/MySensors/core/MySensorCore.cpp @@ -70,8 +70,13 @@ void _begin() { // Setup radio if (!transportInit()) { - debug(PSTR("radio init fail\n")); - while(1); // Nothing more we can do + debug(PSTR("Radio init fail\n")); + // Nothing more we can do + while(1) { + #if defined(MY_GATEWAY_ESP8266) + yield(); + #endif + }; } #endif @@ -82,8 +87,13 @@ void _begin() { // initialize the transport driver if (!gatewayTransportInit()) { - debug(PSTR("transport driver init fail\n")); - while(1); // Nothing more we can do + debug(PSTR("Transport driver init fail\n")); + // Nothing more we can do + while(1) { + #if defined(MY_GATEWAY_ESP8266) + yield(); + #endif + } } #endif @@ -278,10 +288,14 @@ uint8_t loadState(uint8_t pos) { return hwReadConfig(EEPROM_LOCAL_CONFIG_ADDRESS+pos); } + void wait(unsigned long ms) { unsigned long enter = hwMillis(); while (hwMillis() - enter < ms) { _process(); + #if defined(ARDUINO_ARCH_ESP8266) + yield(); + #endif } } diff --git a/libraries/MySensors/core/MyTransport.cpp b/libraries/MySensors/core/MyTransport.cpp index 92df222..772cb27 100644 --- a/libraries/MySensors/core/MyTransport.cpp +++ b/libraries/MySensors/core/MyTransport.cpp @@ -339,10 +339,12 @@ bool transportIsValidFirmware() { boolean transportSendWrite(uint8_t to, MyMessage &message) { + mSetVersion(message, PROTOCOL_VERSION); uint8_t length = mGetSigned(message) ? MAX_MESSAGE_LENGTH : mGetLength(message); message.last = _nc.nodeId; ledBlinkTx(1); + bool ok = transportSend(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"), @@ -359,7 +361,6 @@ boolean transportSendRoute(MyMessage &message) { uint8_t last = message.last; bool ok; - // If we still don't have any parent id, re-request and skip this message. if (_nc.parentNodeId == AUTO) { transportFindParentNode(); @@ -417,6 +418,7 @@ boolean transportSendRoute(MyMessage &message) { #endif #if !defined(MY_REPEATER_FEATURE) + // None repeating node... We can only send to our parent ok = transportSendWrite(_nc.parentNodeId, message); #else @@ -467,11 +469,14 @@ boolean transportSendRoute(MyMessage &message) { // This message should be routed back towards sensor net gateway ok = transportSendWrite(_nc.parentNodeId, message); + // Add this child to our "routing table" if it not already exist hwWriteConfig(EEPROM_ROUTES_ADDRESS+sender, last); + #endif } #endif + if (!ok) { // Failure when sending to parent node. The parent node might be down and we // need to find another route to gateway. @@ -483,6 +488,7 @@ boolean transportSendRoute(MyMessage &message) { } else { _failedTransmissions = 0; } + return ok; } diff --git a/libraries/MySensors/core/MyTransportNRF24.cpp b/libraries/MySensors/core/MyTransportNRF24.cpp index 41cac2d..a9d0342 100644 --- a/libraries/MySensors/core/MyTransportNRF24.cpp +++ b/libraries/MySensors/core/MyTransportNRF24.cpp @@ -44,36 +44,33 @@ uint8_t _paLevel; bool transportInit() { // Start up the radio library - Serial.println("Radio1"); _rf24.begin(); - Serial.println("Radio2"); if (!_rf24.isPVariant()) { - Serial.println("Radio3"); - return false; } - Serial.println("Radio4"); _rf24.setAutoAck(1); _rf24.setAutoAck(BROADCAST_PIPE,false); // Turn off auto ack for broadcast _rf24.enableAckPayload(); _rf24.setChannel(MY_RF24_CHANNEL); _rf24.setPALevel(_paLevel); - _rf24.setDataRate(MY_RF24_DATARATE); + if (!_rf24.setDataRate(MY_RF24_DATARATE)) { + return false; + } _rf24.setRetries(5,15); _rf24.setCRCLength(RF24_CRC_16); _rf24.enableDynamicPayloads(); - Serial.println("Radio5"); // All nodes listen to broadcast pipe (for FIND_PARENT_RESPONSE messages) _rf24.openReadingPipe(BROADCAST_PIPE, TO_ADDR(BROADCAST_ADDRESS)); - Serial.println("Radio6"); #if defined(MY_RF24_ENABLE_ENCRYPTION) _aes.set_key(_psk, 16); //set up AES-key #endif + //_rf24.printDetails(); + return true; } @@ -98,6 +95,7 @@ bool transportSend(uint8_t to, const void* data, uint8_t len) { #endif // Make sure radio has powered up + _rf24.powerUp(); _rf24.stopListening(); _rf24.openWritingPipe(TO_ADDR(to)); @@ -113,6 +111,7 @@ bool transportSend(uint8_t to, const void* data, uint8_t len) { bool transportAvailable(uint8_t *to) { uint8_t pipe = 255; boolean avail = _rf24.available(&pipe); + (void)avail; //until somebody makes use of 'avail' if (pipe == CURRENT_NODE_PIPE) *to = _address; diff --git a/libraries/MySensors/drivers/RF24/RF24.cpp b/libraries/MySensors/drivers/RF24/RF24.cpp index d78c875..8831b62 100644 --- a/libraries/MySensors/drivers/RF24/RF24.cpp +++ b/libraries/MySensors/drivers/RF24/RF24.cpp @@ -645,6 +645,9 @@ bool RF24::write( const void* buf, uint8_t len, const bool multicast ) return 0; } #endif + #if defined(ARDUINO_ARCH_ESP8266) + yield(); + #endif } ce(LOW); diff --git a/libraries/MySensors/drivers/RF24/RF24_config.h b/libraries/MySensors/drivers/RF24/RF24_config.h index 23f78e4..72d25d0 100644 --- a/libraries/MySensors/drivers/RF24/RF24_config.h +++ b/libraries/MySensors/drivers/RF24/RF24_config.h @@ -23,7 +23,7 @@ /*** USER DEFINES: ***/ //#define FAILURE_HANDLING - //#define SERIAL_DEBUG + //#define SERIAL_DEBUG #define MINIMAL //#define SPI_UART // Requires library from https://github.com/TMRh20/Sketches/tree/master/SPI_UART //#define MY_SOFTSPI // Requires library from https://github.com/greiman/DigitalIO diff --git a/libraries/MySensors/examples/Esp8266Gateway/Esp8266Gateway.ino b/libraries/MySensors/examples/Esp8266Gateway/Esp8266Gateway.ino index 913a873..a8fb339 100644 --- a/libraries/MySensors/examples/Esp8266Gateway/Esp8266Gateway.ino +++ b/libraries/MySensors/examples/Esp8266Gateway/Esp8266Gateway.ino @@ -38,8 +38,7 @@ * - 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 * - * See http://www.mysensors.org/build/ethernet_gateway for wiring instructions. - * The ESP8266 however requires different wiring: + * See http://www.mysensors.org/build/esp8266_gateway for wiring instructions. * nRF24L01+ ESP8266 * VCC VCC * CE GPIO4 @@ -67,7 +66,6 @@ #include #include -#include // Enable debug prints to serial monitor #define MY_DEBUG @@ -79,18 +77,20 @@ #define MY_RADIO_NRF24 //#define MY_RADIO_RFM69 -// Gateway mode always enabled for ESP8266 +// Gateway mode always enabled for ESP8266. But we add this anyway ;) #define MY_GATEWAY_ESP8266 #define MY_ESP8266_SSID "MySSID" #define MY_ESP8266_PASSWORD "MyVerySecretPassword" - +// Enable communicate using UDP +//#define MY_USE_UDP // Enable MY_IP_ADDRESS here if you want a static ip address (no DHCP) -// #define MY_IP_ADDRESS 192,168,178,66 +//#define MY_IP_ADDRESS 192,168,98,87 + // If using static ip you need to define Gateway and Subnet address as well -#define MY_IP_GATEWAY_ADDRESS 192,168,0,1 +#define MY_IP_GATEWAY_ADDRESS 192,168,98,1 #define MY_IP_SUBNET_ADDRESS 255,255,255,0 // The port to keep open on node server mode @@ -99,9 +99,8 @@ // How many clients should be able to connect to this gateway (default 1) #define MY_GATEWAY_MAX_CLIENTS 2 -// Controller ip address (enables client mode). Undefine this to act as sever. - -// #define MY_CONTROLLER_IP_ADDRESS 192, 168, 178, 254 +// Controller ip address. Enables client mode. Enable this if MY_USE_UDP and you want sensor data sent somewhere. +//#define MY_CONTROLLER_IP_ADDRESS 192, 168, 178, 68 /* // Flash leds on rx/tx/err #define MY_LEDS_BLINKING_FEATURE @@ -122,6 +121,12 @@ #define MY_DEFAULT_TX_LED_PIN 16 // the PCB, on board LED */ +#if defined(MY_USE_UDP) + #include +#else + #include +#endif + #include void setup() { @@ -133,8 +138,7 @@ void presentation() { void loop() { - wait(500); - Serial.println("Hello"); + // Send locally attech sensors data here }