mirror of https://github.com/arendst/Tasmota.git
Merge pull request #7081 from s-hadinger/zigbee_hw_serial_gpio
Fix Zigbee uses Hardware Serial
This commit is contained in:
commit
855423020e
|
@ -5,6 +5,7 @@
|
||||||
- Remove inconsistent hardware detection introduced in version 7.0.0.5
|
- Remove inconsistent hardware detection introduced in version 7.0.0.5
|
||||||
- Fix lost functionality of GPIO9 and GPIO10 on some devices (#7080)
|
- Fix lost functionality of GPIO9 and GPIO10 on some devices (#7080)
|
||||||
- Change light color schemes 2, 3 and 4 from color wheel to Hue driven
|
- Change light color schemes 2, 3 and 4 from color wheel to Hue driven
|
||||||
|
- Fix Zigbee uses Hardware Serial if GPIO 1/3 or GPIO 13/15 and SerialLog 0 (#7071)
|
||||||
|
|
||||||
## Released
|
## Released
|
||||||
|
|
||||||
|
|
|
@ -25,16 +25,8 @@ const uint32_t ZIGBEE_BUFFER_SIZE = 256; // Max ZNP frame is SOF+LEN+CMD1+CMD2+
|
||||||
const uint8_t ZIGBEE_SOF = 0xFE;
|
const uint8_t ZIGBEE_SOF = 0xFE;
|
||||||
const uint8_t ZIGBEE_SOF_ALT = 0xFF;
|
const uint8_t ZIGBEE_SOF_ALT = 0xFF;
|
||||||
|
|
||||||
//#define Z_USE_SOFTWARE_SERIAL
|
|
||||||
|
|
||||||
#ifdef Z_USE_SOFTWARE_SERIAL
|
|
||||||
#include <SoftwareSerial.h>
|
|
||||||
SoftwareSerial *ZigbeeSerial = nullptr;
|
|
||||||
#else
|
|
||||||
#include <TasmotaSerial.h>
|
#include <TasmotaSerial.h>
|
||||||
TasmotaSerial *ZigbeeSerial = nullptr;
|
TasmotaSerial *ZigbeeSerial = nullptr;
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
const char kZigbeeCommands[] PROGMEM = "|"
|
const char kZigbeeCommands[] PROGMEM = "|"
|
||||||
D_CMND_ZIGBEEZNPSEND "|" D_CMND_ZIGBEE_PERMITJOIN "|"
|
D_CMND_ZIGBEEZNPSEND "|" D_CMND_ZIGBEE_PERMITJOIN "|"
|
||||||
|
@ -185,9 +177,7 @@ void ZigbeeInput(void)
|
||||||
char hex_char[(zigbee_buffer->len() * 2) + 2];
|
char hex_char[(zigbee_buffer->len() * 2) + 2];
|
||||||
ToHex_P((unsigned char*)zigbee_buffer->getBuffer(), zigbee_buffer->len(), hex_char, sizeof(hex_char));
|
ToHex_P((unsigned char*)zigbee_buffer->getBuffer(), zigbee_buffer->len(), hex_char, sizeof(hex_char));
|
||||||
|
|
||||||
#ifndef Z_USE_SOFTWARE_SERIAL
|
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric());
|
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR(D_LOG_ZIGBEE "Bytes follow_read_metric = %0d"), ZigbeeSerial->getLoopReadMetric());
|
||||||
#endif
|
|
||||||
// buffer received, now check integrity
|
// buffer received, now check integrity
|
||||||
if (zigbee_buffer->len() != zigbee_frame_len) {
|
if (zigbee_buffer->len() != zigbee_frame_len) {
|
||||||
// Len is not correct, log and reject frame
|
// Len is not correct, log and reject frame
|
||||||
|
@ -224,21 +214,16 @@ void ZigbeeInit(void)
|
||||||
zigbee.active = false;
|
zigbee.active = false;
|
||||||
if ((pin[GPIO_ZIGBEE_RX] < 99) && (pin[GPIO_ZIGBEE_TX] < 99)) {
|
if ((pin[GPIO_ZIGBEE_RX] < 99) && (pin[GPIO_ZIGBEE_TX] < 99)) {
|
||||||
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("Zigbee: GPIOs Rx:%d Tx:%d"), pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX]);
|
AddLog_P2(LOG_LEVEL_DEBUG_MORE, PSTR("Zigbee: GPIOs Rx:%d Tx:%d"), pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX]);
|
||||||
#ifdef Z_USE_SOFTWARE_SERIAL
|
// if seriallog_level is 0, we allow GPIO 13/15 to switch to Hardware Serial
|
||||||
ZigbeeSerial = new SoftwareSerial();
|
ZigbeeSerial = new TasmotaSerial(pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX], seriallog_level ? 1 : 2, 0, 256); // set a receive buffer of 256 bytes
|
||||||
ZigbeeSerial->begin(115200, pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX], SWSERIAL_8N1, false, 256); // ZNP is 115200, RTS/CTS (ignored), 8N1
|
|
||||||
ZigbeeSerial->enableIntTx(false);
|
|
||||||
zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE);
|
|
||||||
#else
|
|
||||||
ZigbeeSerial = new TasmotaSerial(pin[GPIO_ZIGBEE_RX], pin[GPIO_ZIGBEE_TX], 0, 0, 256); // set a receive buffer of 256 bytes
|
|
||||||
ZigbeeSerial->begin(115200);
|
ZigbeeSerial->begin(115200);
|
||||||
if (ZigbeeSerial->hardwareSerial()) {
|
if (ZigbeeSerial->hardwareSerial()) {
|
||||||
ClaimSerial();
|
ClaimSerial();
|
||||||
zigbee_buffer = new PreAllocatedSBuffer(sizeof(serial_in_buffer), serial_in_buffer);
|
uint32_t aligned_buffer = ((uint32_t)serial_in_buffer + 3) & ~3;
|
||||||
|
zigbee_buffer = new PreAllocatedSBuffer(sizeof(serial_in_buffer) - 3, (char*) aligned_buffer);
|
||||||
} else {
|
} else {
|
||||||
zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE);
|
zigbee_buffer = new SBuffer(ZIGBEE_BUFFER_SIZE);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
zigbee.active = true;
|
zigbee.active = true;
|
||||||
zigbee.init_phase = true; // start the state machine
|
zigbee.init_phase = true; // start the state machine
|
||||||
zigbee.state_machine = true; // start the state machine
|
zigbee.state_machine = true; // start the state machine
|
||||||
|
|
Loading…
Reference in New Issue