mirror of
https://github.com/arendst/Tasmota.git
synced 2025-07-30 06:06:36 +00:00
Refactor Sonoff Bridge commands
Refactor Sonoff Bridge commands
This commit is contained in:
parent
c7f810da54
commit
7e05984a11
@ -25,11 +25,14 @@
|
|||||||
|
|
||||||
const uint32_t SFB_TIME_AVOID_DUPLICATE = 2000; // Milliseconds
|
const uint32_t SFB_TIME_AVOID_DUPLICATE = 2000; // Milliseconds
|
||||||
|
|
||||||
enum SonoffBridgeCommands {
|
enum SonoffBridgeCommands { CMND_RFSYNC, CMND_RFLOW, CMND_RFHIGH, CMND_RFHOST, CMND_RFCODE };
|
||||||
CMND_RFSYNC, CMND_RFLOW, CMND_RFHIGH, CMND_RFHOST, CMND_RFCODE, CMND_RFKEY, CMND_RFRAW };
|
|
||||||
const char kSonoffBridgeCommands[] PROGMEM =
|
const char kSonoffBridgeCommands[] PROGMEM =
|
||||||
D_CMND_RFSYNC "|" D_CMND_RFLOW "|" D_CMND_RFHIGH "|" D_CMND_RFHOST "|" D_CMND_RFCODE "|" D_CMND_RFKEY "|" D_CMND_RFRAW;
|
D_CMND_RFSYNC "|" D_CMND_RFLOW "|" D_CMND_RFHIGH "|" D_CMND_RFHOST "|" D_CMND_RFCODE "|" D_CMND_RFKEY "|" D_CMND_RFRAW;
|
||||||
|
|
||||||
|
void (* const SonoffBridgeCommand[])(void) PROGMEM = {
|
||||||
|
&CmndRfSync, &CmndRfLow, &CmndRfHigh, &CmndRfHost, &CmndRfCode, &CmndRfKey, &CmndRfRaw };
|
||||||
|
|
||||||
uint8_t sonoff_bridge_receive_flag = 0;
|
uint8_t sonoff_bridge_receive_flag = 0;
|
||||||
uint8_t sonoff_bridge_receive_raw_flag = 0;
|
uint8_t sonoff_bridge_receive_raw_flag = 0;
|
||||||
uint8_t sonoff_bridge_learn_key = 1;
|
uint8_t sonoff_bridge_learn_key = 1;
|
||||||
@ -418,71 +421,91 @@ void SonoffBridgeLearn(uint8_t key)
|
|||||||
* Commands
|
* Commands
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
||||||
bool SonoffBridgeCommand(void)
|
void SonoffBridgeCmnd(uint32_t command_code) // RfSync, RfLow, RfHigh, RfHost and RfCode
|
||||||
{
|
{
|
||||||
char command [CMDSZ];
|
char *p;
|
||||||
bool serviced = true;
|
char stemp [10];
|
||||||
|
uint32_t code = 0;
|
||||||
|
uint8_t radix = 10;
|
||||||
|
|
||||||
int command_code = GetCommandCode(command, sizeof(command), XdrvMailbox.topic, kSonoffBridgeCommands);
|
uint32_t set_index = command_code *2;
|
||||||
if (-1 == command_code) {
|
|
||||||
serviced = false; // Unknown command
|
if (XdrvMailbox.data[0] == '#') {
|
||||||
|
XdrvMailbox.data++;
|
||||||
|
XdrvMailbox.data_len--;
|
||||||
|
radix = 16;
|
||||||
}
|
}
|
||||||
else if ((command_code >= CMND_RFSYNC) && (command_code <= CMND_RFCODE)) { // RfSync, RfLow, RfHigh, RfHost and RfCode
|
|
||||||
char *p;
|
|
||||||
char stemp [10];
|
|
||||||
uint32_t code = 0;
|
|
||||||
uint8_t radix = 10;
|
|
||||||
|
|
||||||
uint8_t set_index = command_code *2;
|
if (XdrvMailbox.data_len) {
|
||||||
|
code = strtol(XdrvMailbox.data, &p, radix);
|
||||||
if (XdrvMailbox.data[0] == '#') {
|
if (code) {
|
||||||
XdrvMailbox.data++;
|
if (CMND_RFCODE == command_code) {
|
||||||
XdrvMailbox.data_len--;
|
sonoff_bridge_last_send_code = code;
|
||||||
radix = 16;
|
SonoffBridgeSendCode(code);
|
||||||
}
|
} else {
|
||||||
|
if (1 == XdrvMailbox.payload) {
|
||||||
if (XdrvMailbox.data_len) {
|
code = pgm_read_byte(kDefaultRfCode + set_index) << 8 | pgm_read_byte(kDefaultRfCode + set_index +1);
|
||||||
code = strtol(XdrvMailbox.data, &p, radix);
|
}
|
||||||
if (code) {
|
uint8_t msb = code >> 8;
|
||||||
if (CMND_RFCODE == command_code) {
|
uint8_t lsb = code & 0xFF;
|
||||||
sonoff_bridge_last_send_code = code;
|
if ((code > 0) && (code < 0x7FFF) && (msb != 0x55) && (lsb != 0x55)) { // Check for End of Text codes
|
||||||
SonoffBridgeSendCode(code);
|
Settings.rf_code[0][set_index] = msb;
|
||||||
} else {
|
Settings.rf_code[0][set_index +1] = lsb;
|
||||||
if (1 == XdrvMailbox.payload) {
|
|
||||||
code = pgm_read_byte(kDefaultRfCode + set_index) << 8 | pgm_read_byte(kDefaultRfCode + set_index +1);
|
|
||||||
}
|
|
||||||
uint8_t msb = code >> 8;
|
|
||||||
uint8_t lsb = code & 0xFF;
|
|
||||||
if ((code > 0) && (code < 0x7FFF) && (msb != 0x55) && (lsb != 0x55)) { // Check for End of Text codes
|
|
||||||
Settings.rf_code[0][set_index] = msb;
|
|
||||||
Settings.rf_code[0][set_index +1] = lsb;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (CMND_RFCODE == command_code) {
|
|
||||||
code = sonoff_bridge_last_send_code;
|
|
||||||
} else {
|
|
||||||
code = Settings.rf_code[0][set_index] << 8 | Settings.rf_code[0][set_index +1];
|
|
||||||
}
|
|
||||||
if (10 == radix) {
|
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), code);
|
|
||||||
} else {
|
|
||||||
snprintf_P(stemp, sizeof(stemp), PSTR("\"#%X\""), code);
|
|
||||||
}
|
|
||||||
Response_P(S_JSON_COMMAND_XVALUE, command, stemp);
|
|
||||||
}
|
}
|
||||||
else if ((CMND_RFKEY == command_code) && (XdrvMailbox.index > 0) && (XdrvMailbox.index <= 16)) {
|
if (CMND_RFCODE == command_code) {
|
||||||
|
code = sonoff_bridge_last_send_code;
|
||||||
|
} else {
|
||||||
|
code = Settings.rf_code[0][set_index] << 8 | Settings.rf_code[0][set_index +1];
|
||||||
|
}
|
||||||
|
if (10 == radix) {
|
||||||
|
snprintf_P(stemp, sizeof(stemp), PSTR("%d"), code);
|
||||||
|
} else {
|
||||||
|
snprintf_P(stemp, sizeof(stemp), PSTR("\"#%X\""), code);
|
||||||
|
}
|
||||||
|
Response_P(S_JSON_COMMAND_XVALUE, XdrvMailbox.command, stemp);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndRfSync(void)
|
||||||
|
{
|
||||||
|
SonoffBridgeCmnd(CMND_RFSYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndRfLow(void)
|
||||||
|
{
|
||||||
|
SonoffBridgeCmnd(CMND_RFLOW);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndRfHigh(void)
|
||||||
|
{
|
||||||
|
SonoffBridgeCmnd(CMND_RFHIGH);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndRfHost(void)
|
||||||
|
{
|
||||||
|
SonoffBridgeCmnd(CMND_RFHOST);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndRfCode(void)
|
||||||
|
{
|
||||||
|
SonoffBridgeCmnd(CMND_RFCODE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndRfKey(void)
|
||||||
|
{
|
||||||
|
if ((XdrvMailbox.index > 0) && (XdrvMailbox.index <= 16)) {
|
||||||
unsigned long now = millis();
|
unsigned long now = millis();
|
||||||
if ((!sonoff_bridge_learn_active) || (now - sonoff_bridge_last_learn_time > 60100)) {
|
if ((!sonoff_bridge_learn_active) || (now - sonoff_bridge_last_learn_time > 60100)) {
|
||||||
sonoff_bridge_learn_active = 0;
|
sonoff_bridge_learn_active = 0;
|
||||||
if (2 == XdrvMailbox.payload) { // Learn RF data
|
if (2 == XdrvMailbox.payload) { // Learn RF data
|
||||||
SonoffBridgeLearn(XdrvMailbox.index);
|
SonoffBridgeLearn(XdrvMailbox.index);
|
||||||
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, D_JSON_START_LEARNING);
|
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, D_JSON_START_LEARNING);
|
||||||
}
|
}
|
||||||
else if (3 == XdrvMailbox.payload) { // Unlearn RF data
|
else if (3 == XdrvMailbox.payload) { // Unlearn RF data
|
||||||
Settings.rf_code[XdrvMailbox.index][0] = 0; // Reset sync_time MSB
|
Settings.rf_code[XdrvMailbox.index][0] = 0; // Reset sync_time MSB
|
||||||
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, D_JSON_SET_TO_DEFAULT);
|
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, D_JSON_SET_TO_DEFAULT);
|
||||||
}
|
}
|
||||||
else if (4 == XdrvMailbox.payload) { // Save RF data provided by RFSync, RfLow, RfHigh and last RfCode
|
else if (4 == XdrvMailbox.payload) { // Save RF data provided by RFSync, RfLow, RfHigh and last RfCode
|
||||||
for (uint32_t i = 0; i < 6; i++) {
|
for (uint32_t i = 0; i < 6; i++) {
|
||||||
@ -491,7 +514,7 @@ bool SonoffBridgeCommand(void)
|
|||||||
Settings.rf_code[XdrvMailbox.index][6] = (sonoff_bridge_last_send_code >> 16) & 0xff;
|
Settings.rf_code[XdrvMailbox.index][6] = (sonoff_bridge_last_send_code >> 16) & 0xff;
|
||||||
Settings.rf_code[XdrvMailbox.index][7] = (sonoff_bridge_last_send_code >> 8) & 0xff;
|
Settings.rf_code[XdrvMailbox.index][7] = (sonoff_bridge_last_send_code >> 8) & 0xff;
|
||||||
Settings.rf_code[XdrvMailbox.index][8] = sonoff_bridge_last_send_code & 0xff;
|
Settings.rf_code[XdrvMailbox.index][8] = sonoff_bridge_last_send_code & 0xff;
|
||||||
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, D_JSON_SAVED);
|
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, D_JSON_SAVED);
|
||||||
} else if (5 == XdrvMailbox.payload) { // Show default or learned RF data
|
} else if (5 == XdrvMailbox.payload) { // Show default or learned RF data
|
||||||
uint8_t key = XdrvMailbox.index;
|
uint8_t key = XdrvMailbox.index;
|
||||||
uint8_t index = (0 == Settings.rf_code[key][0]) ? 0 : key; // Use default if sync_time MSB = 0
|
uint8_t index = (0 == Settings.rf_code[key][0]) ? 0 : key; // Use default if sync_time MSB = 0
|
||||||
@ -506,52 +529,52 @@ bool SonoffBridgeCommand(void)
|
|||||||
code |= Settings.rf_code[index][8];
|
code |= Settings.rf_code[index][8];
|
||||||
}
|
}
|
||||||
Response_P(PSTR("{\"%s%d\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":\"%06X\"}}"),
|
Response_P(PSTR("{\"%s%d\":{\"" D_JSON_SYNC "\":%d,\"" D_JSON_LOW "\":%d,\"" D_JSON_HIGH "\":%d,\"" D_JSON_DATA "\":\"%06X\"}}"),
|
||||||
command, XdrvMailbox.index, sync_time, low_time, high_time, code);
|
XdrvMailbox.command, XdrvMailbox.index, sync_time, low_time, high_time, code);
|
||||||
} else {
|
} else {
|
||||||
if ((1 == XdrvMailbox.payload) || (0 == Settings.rf_code[XdrvMailbox.index][0])) { // Test sync_time MSB
|
if ((1 == XdrvMailbox.payload) || (0 == Settings.rf_code[XdrvMailbox.index][0])) { // Test sync_time MSB
|
||||||
SonoffBridgeSend(0, XdrvMailbox.index); // Send default RF data
|
SonoffBridgeSend(0, XdrvMailbox.index); // Send default RF data
|
||||||
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, D_JSON_DEFAULT_SENT);
|
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, D_JSON_DEFAULT_SENT);
|
||||||
} else {
|
} else {
|
||||||
SonoffBridgeSend(XdrvMailbox.index, 0); // Send learned RF data
|
SonoffBridgeSend(XdrvMailbox.index, 0); // Send learned RF data
|
||||||
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, XdrvMailbox.index, D_JSON_LEARNED_SENT);
|
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, XdrvMailbox.index, D_JSON_LEARNED_SENT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Response_P(S_JSON_COMMAND_INDEX_SVALUE, command, sonoff_bridge_learn_key, D_JSON_LEARNING_ACTIVE);
|
Response_P(S_JSON_COMMAND_INDEX_SVALUE, XdrvMailbox.command, sonoff_bridge_learn_key, D_JSON_LEARNING_ACTIVE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (CMND_RFRAW == command_code) {
|
}
|
||||||
if (XdrvMailbox.data_len) {
|
|
||||||
if (XdrvMailbox.data_len < 6) { // On, Off
|
|
||||||
switch (XdrvMailbox.payload) {
|
|
||||||
case 0: // Receive Raw Off
|
|
||||||
SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling
|
|
||||||
case 1: // Receive Raw On
|
|
||||||
sonoff_bridge_receive_raw_flag = XdrvMailbox.payload;
|
|
||||||
break;
|
|
||||||
case 166: // 0xA6 - Start reading RF signals disabling iTead default RF handling
|
|
||||||
case 167: // 0xA7 - Stop reading RF signals enabling iTead default RF handling
|
|
||||||
case 169: // 0xA9 - Start learning predefined protocols
|
|
||||||
case 176: // 0xB0 - Stop sniffing
|
|
||||||
case 177: // 0xB1 - Start sniffing
|
|
||||||
case 255: // 0xFF - Show firmware version
|
|
||||||
SonoffBridgeSendCommand(XdrvMailbox.payload);
|
|
||||||
sonoff_bridge_receive_raw_flag = 1;
|
|
||||||
break;
|
|
||||||
case 192: // 0xC0 - Beep
|
|
||||||
char beep[] = "AAC000C055\0";
|
|
||||||
SerialSendRaw(beep);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
SerialSendRaw(RemoveSpace(XdrvMailbox.data));
|
|
||||||
sonoff_bridge_receive_raw_flag = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Response_P(S_JSON_COMMAND_SVALUE, command, GetStateText(sonoff_bridge_receive_raw_flag));
|
|
||||||
} else serviced = false; // Unknown command
|
|
||||||
|
|
||||||
return serviced;
|
void CmndRfRaw(void)
|
||||||
|
{
|
||||||
|
if (XdrvMailbox.data_len) {
|
||||||
|
if (XdrvMailbox.data_len < 6) { // On, Off
|
||||||
|
switch (XdrvMailbox.payload) {
|
||||||
|
case 0: // Receive Raw Off
|
||||||
|
SonoffBridgeSendCommand(0xA7); // Stop reading RF signals enabling iTead default RF handling
|
||||||
|
case 1: // Receive Raw On
|
||||||
|
sonoff_bridge_receive_raw_flag = XdrvMailbox.payload;
|
||||||
|
break;
|
||||||
|
case 166: // 0xA6 - Start reading RF signals disabling iTead default RF handling
|
||||||
|
case 167: // 0xA7 - Stop reading RF signals enabling iTead default RF handling
|
||||||
|
case 169: // 0xA9 - Start learning predefined protocols
|
||||||
|
case 176: // 0xB0 - Stop sniffing
|
||||||
|
case 177: // 0xB1 - Start sniffing
|
||||||
|
case 255: // 0xFF - Show firmware version
|
||||||
|
SonoffBridgeSendCommand(XdrvMailbox.payload);
|
||||||
|
sonoff_bridge_receive_raw_flag = 1;
|
||||||
|
break;
|
||||||
|
case 192: // 0xC0 - Beep
|
||||||
|
char beep[] = "AAC000C055\0";
|
||||||
|
SerialSendRaw(beep);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
SerialSendRaw(RemoveSpace(XdrvMailbox.data));
|
||||||
|
sonoff_bridge_receive_raw_flag = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Response_P(S_JSON_COMMAND_SVALUE, XdrvMailbox.command, GetStateText(sonoff_bridge_receive_raw_flag));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************************************************/
|
/*********************************************************************************************/
|
||||||
@ -572,14 +595,14 @@ bool Xdrv06(uint8_t function)
|
|||||||
|
|
||||||
if (SONOFF_BRIDGE == my_module_type) {
|
if (SONOFF_BRIDGE == my_module_type) {
|
||||||
switch (function) {
|
switch (function) {
|
||||||
|
case FUNC_SERIAL:
|
||||||
|
result = SonoffBridgeSerialInput();
|
||||||
|
break;
|
||||||
case FUNC_INIT:
|
case FUNC_INIT:
|
||||||
SonoffBridgeInit();
|
SonoffBridgeInit();
|
||||||
break;
|
break;
|
||||||
case FUNC_COMMAND:
|
case FUNC_COMMAND:
|
||||||
result = SonoffBridgeCommand();
|
result = DecodeCommand(kSonoffBridgeCommands, SonoffBridgeCommand);
|
||||||
break;
|
|
||||||
case FUNC_SERIAL:
|
|
||||||
result = SonoffBridgeSerialInput();
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user