diff --git a/libraries/MySensors/core/MyTransportRS485.cpp b/libraries/MySensors/core/MyTransportRS485.cpp index 68eeec5..dff19b2 100644 --- a/libraries/MySensors/core/MyTransportRS485.cpp +++ b/libraries/MySensors/core/MyTransportRS485.cpp @@ -66,6 +66,16 @@ #include "MyTransport.h" + +#if defined(MY_RS485_DE_PIN) + #define assertDE() digitalWrite(MY_RS485_DE_PIN, HIGH); delayMicroseconds(5) + #define deassertDE() digitalWrite(MY_RS485_DE_PIN, LOW) + +#else + #define assertDE() + #define deassertDE() +#endif + // We only use SYS_PACK in this application #define ICSC_SYS_PACK 0x58 @@ -252,7 +262,12 @@ bool transportSend(uint8_t to, const void* data, uint8_t len) } } - // Start of header by writing multiple SOH + #if defined(MY_RS485_DE_PIN) + digitalWrite(MY_RS485_DE_PIN, HIGH); + delayMicroseconds(5); + #endif + + // Start of header by writing multiple SOH for(byte w=0;w<1;w++) _dev.write(SOH); _dev.write(to); // Destination address cs += to; @@ -270,6 +285,28 @@ bool transportSend(uint8_t to, const void* data, uint8_t len) _dev.write(ETX); // End of text _dev.write(cs); _dev.write(EOT); + + #if defined(MY_RS485_DE_PIN) + #ifdef __PIC32MX__ + // MPIDE has nothing yet for this. It uses the hardware buffer, which + // could be up to 8 levels deep. For now, let's just delay for 8 + // characters worth. + delayMicroseconds((F_CPU/9600)+1); + #else + #if defined(ARDUINO) && ARDUINO >= 100 + #if ARDUINO >= 104 + // Arduino 1.0.4 and upwards does it right + _dev.flush(); + #else + // Between 1.0.0 and 1.0.3 it almost does it - need to compensate + // for the hardware buffer. Delay for 2 bytes worth of transmission. + _dev.flush(); + delayMicroseconds((20000000UL/9600)+1); + #endif + #endif + #endif + digitalWrite(MY_RS485_DE_PIN, LOW); + #endif return true; } @@ -279,6 +316,10 @@ bool transportInit() { // Reset the state machine _dev.begin(MY_RS485_BAUD_RATE); _serialReset(); + #if defined(MY_RS485_DE_PIN) + pinMode(MY_RS485_DE_PIN, OUTPUT); + digitalWrite(MY_RS485_DE_PIN, LOW); + #endif return true; } diff --git a/libraries/MySensors/examples/GatewaySerialRS485/GatewaySerialRS485.ino b/libraries/MySensors/examples/GatewaySerialRS485/GatewaySerialRS485.ino index d8823aa..3cdf756 100644 --- a/libraries/MySensors/examples/GatewaySerialRS485/GatewaySerialRS485.ino +++ b/libraries/MySensors/examples/GatewaySerialRS485/GatewaySerialRS485.ino @@ -55,6 +55,9 @@ // Enable RS485 transport layer #define MY_RS485 +// Define this to enables DE-pin management on defined pin +#define MY_RS485_DE_PIN 2 + // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 diff --git a/libraries/MySensors/examples/MotionSensorRS485/MotionSensorRS485.ino b/libraries/MySensors/examples/MotionSensorRS485/MotionSensorRS485.ino index dab57b7..f53ee99 100644 --- a/libraries/MySensors/examples/MotionSensorRS485/MotionSensorRS485.ino +++ b/libraries/MySensors/examples/MotionSensorRS485/MotionSensorRS485.ino @@ -47,6 +47,9 @@ // Enable RS485 transport layer #define MY_RS485 +// Define this to enables DE-pin management on defined pin +#define MY_RS485_DE_PIN 2 + // Set RS485 baud rate to use #define MY_RS485_BAUD_RATE 9600 diff --git a/libraries/MySensors/keywords.txt b/libraries/MySensors/keywords.txt index 6fef79b..52f9daf 100644 --- a/libraries/MySensors/keywords.txt +++ b/libraries/MySensors/keywords.txt @@ -104,4 +104,6 @@ MY_W5100_SPI_EN LITERAL1 MY_MQTT_SUBSCRIBE_TOPIC_PREFIX LITERAL1 MY_MQTT_PUBLISH_TOPIC_PREFIX LITERAL1 MY_MQTT_CLIENT_ID LITERAL1 -MY_GATEWAY_MQTT_CLIENT LITERAL1 \ No newline at end of file +MY_GATEWAY_MQTT_CLIENT LITERAL1 +MY_DISABLE_REMOTE_RESET LITERAL1 +MY_RS485_DE_PIN LITERAL1 \ No newline at end of file