diff --git a/lib/lib_rf/rc-switch/src/RCSwitch.cpp b/lib/lib_rf/rc-switch/src/RCSwitch.cpp
index 6efd9f3e7..f5b628c53 100644
--- a/lib/lib_rf/rc-switch/src/RCSwitch.cpp
+++ b/lib/lib_rf/rc-switch/src/RCSwitch.cpp
@@ -133,6 +133,7 @@ enum {
};
#if not defined( RCSwitchDisableReceiving )
+
volatile unsigned long long RCSwitch::nReceivedValue = 0;
volatile unsigned int RCSwitch::nReceivedBitlength = 0;
volatile unsigned int RCSwitch::nReceivedDelay = 0;
@@ -145,6 +146,10 @@ const unsigned int RCSwitch::nSeparationLimit = 2600; // 4300 default
// should be set to the minimum value of pulselength * the sync signal
unsigned int RCSwitch::timings[RCSWITCH_MAX_CHANGES];
unsigned int RCSwitch::buftimings[4];
+#ifdef BAZMODS
+uint64_t_t RCSwitch::enabled_protocol_mask;
+
+#endif
#endif
RCSwitch::RCSwitch() {
@@ -155,9 +160,16 @@ RCSwitch::RCSwitch() {
this->nReceiverInterrupt = -1;
this->setReceiveTolerance(60);
RCSwitch::nReceivedValue = 0;
+#ifdef BAZMODS
+ RCSwitch::enabled_protocol_mask.value = (1ULL << numProto)-1 ;//pow(2,numProto)-1;
+#endif
#endif
}
-
+#ifdef BAZMODS
+uint8_t RCSwitch::getNumProtos(){
+ return numProto;
+}
+#endif
/**
* Sets the protocol to send.
*/
@@ -833,11 +845,21 @@ void RECEIVE_ATTR RCSwitch::handleInterrupt() {
repeatCount++;
// при приеме второго повторного начинаем анализ принятого первым
if (repeatCount == 1) {
+ #ifdef BAZMODS
+ unsigned long long thismask = 1;
+ #endif
for(unsigned int i = 1; i <= numProto; i++) {
- if (receiveProtocol(i, changeCount)) {
- // receive succeeded for protocol i
- break;
+ #ifdef BAZMODS
+ if(enabled_protocol_mask.value & thismask){
+#endif
+ if (receiveProtocol(i, changeCount)) {
+ // receive succeeded for protocol i
+ break;
+ }
+ #ifdef BAZMODS
}
+ thismask <<= 1;
+#endif
}
// очищаем количество повторных пакетов
repeatCount = 0;
diff --git a/lib/lib_rf/rc-switch/src/RCSwitch.h b/lib/lib_rf/rc-switch/src/RCSwitch.h
index 0a1e9d821..5af50be16 100644
--- a/lib/lib_rf/rc-switch/src/RCSwitch.h
+++ b/lib/lib_rf/rc-switch/src/RCSwitch.h
@@ -61,6 +61,17 @@
// Для keeloq нужно увеличить RCSWITCH_MAX_CHANGES до 23+1+66*2+1=157
#define RCSWITCH_MAX_CHANGES 67 // default 67
+typedef union __uint64
+{
+ uint64_t value;
+ struct
+ {
+ uint32_t low32;
+ uint32_t high32;
+
+ } longs;
+} uint64_t_t;
+
class RCSwitch {
public:
@@ -93,6 +104,10 @@ class RCSwitch {
unsigned int getReceivedDelay();
unsigned int getReceivedProtocol();
unsigned int* getReceivedRawdata();
+ #ifdef BAZMODS
+ uint8_t getNumProtos();
+ static uint64_t_t enabled_protocol_mask; //perhaps need function to change because used in interrupt
+ #endif
#endif
void enableTransmit(int nTransmitterPin);
@@ -164,7 +179,9 @@ class RCSwitch {
static void handleInterrupt();
static bool receiveProtocol(const int p, unsigned int changeCount);
int nReceiverInterrupt;
+
#endif
+
int nTransmitterPin;
int nRepeatTransmit;
@@ -183,6 +200,8 @@ class RCSwitch {
static unsigned int timings[RCSWITCH_MAX_CHANGES];
// буфер длительностей последних четырех пакетов, [0] - последний
static unsigned int buftimings[4];
+
+
#endif
diff --git a/tasmota/i18n.h b/tasmota/i18n.h
index b84ce4265..4d2f0f2d6 100644
--- a/tasmota/i18n.h
+++ b/tasmota/i18n.h
@@ -221,7 +221,8 @@
#define D_LOG_SOME_SETTINGS_RESET "Some settings have been reset"
-// Commands tasmota.ino
+// Commands tasmota.ino
+
#define D_CMND_BACKLOG "Backlog"
#define D_CMND_DELAY "Delay"
#define D_CMND_NODELAY "NoDelay"
@@ -496,6 +497,9 @@
#define D_JSON_RFRECEIVED "RfReceived"
#define D_CMND_RFRAW "RfRaw"
+#define D_CMND_RFRXPROTOCOL "RfRxProtocol"
+#define D_JSON_ENABLED_MASK "Enabled-Mask"
+
// Commands xdrv_08_serial_bridge.ino
#define D_CMND_SSERIALSEND "SSerialSend"
#define D_CMND_SBAUDRATE "SBaudrate"
diff --git a/tasmota/support_command.ino b/tasmota/support_command.ino
index 4b9e21839..c3ac4d2ba 100644
--- a/tasmota/support_command.ino
+++ b/tasmota/support_command.ino
@@ -18,6 +18,11 @@
*/
const char kTasmotaCommands[] PROGMEM = "|" // No prefix
+#ifdef BAZMODS
+#ifdef USE_RC_SWITCH
+ D_CMND_RFRXPROTOCOL "|"
+#endif
+#endif
D_CMND_BACKLOG "|" D_CMND_DELAY "|" D_CMND_POWER "|" D_CMND_STATUS "|" D_CMND_STATE "|" D_CMND_SLEEP "|" D_CMND_UPGRADE "|" D_CMND_UPLOAD "|" D_CMND_OTAURL "|"
D_CMND_SERIALLOG "|" D_CMND_RESTART "|" D_CMND_POWERONSTATE "|" D_CMND_PULSETIME "|" D_CMND_BLINKTIME "|" D_CMND_BLINKCOUNT "|" D_CMND_SAVEDATA "|"
D_CMND_SO "|" D_CMND_SETOPTION "|" D_CMND_TEMPERATURE_RESOLUTION "|" D_CMND_HUMIDITY_RESOLUTION "|" D_CMND_PRESSURE_RESOLUTION "|" D_CMND_POWER_RESOLUTION "|"
@@ -43,8 +48,12 @@ const char kTasmotaCommands[] PROGMEM = "|" // No prefix
"|Info|" D_CMND_TOUCH_CAL "|" D_CMND_TOUCH_THRES "|" D_CMND_TOUCH_NUM "|" D_CMND_CPU_FREQUENCY "|" D_CMND_WIFI
#endif // ESP32
;
-
void (* const TasmotaCommand[])(void) PROGMEM = {
+ #ifdef BAZMODS
+#ifdef USE_RC_SWITCH
+ &CmndRfRxProtocol,
+#endif
+#endif
&CmndBacklog, &CmndDelay, &CmndPower, &CmndStatus, &CmndState, &CmndSleep, &CmndUpgrade, &CmndUpgrade, &CmndOtaUrl,
&CmndSeriallog, &CmndRestart, &CmndPowerOnState, &CmndPulsetime, &CmndBlinktime, &CmndBlinkcount, &CmndSavedata,
&CmndSetoption, &CmndSetoption, &CmndTemperatureResolution, &CmndHumidityResolution, &CmndPressureResolution, &CmndPowerResolution,
diff --git a/tasmota/xdrv_17_rcswitch.ino b/tasmota/xdrv_17_rcswitch.ino
index 067e3f457..abbafa353 100644
--- a/tasmota/xdrv_17_rcswitch.ino
+++ b/tasmota/xdrv_17_rcswitch.ino
@@ -16,7 +16,11 @@
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
+#include
+#include "my_user_config.h"
+// doesn't pickup defines while editing without this
+// dunno if this is unique to my enviroment or everyone experiences it ..
#ifdef USE_RC_SWITCH
/*********************************************************************************************\
* RF send and receive using RCSwitch library https://github.com/sui77/rc-switch/
@@ -32,8 +36,8 @@
#define D_JSON_RF_PULSE "Pulse"
#define D_JSON_RF_REPEAT "Repeat"
-const char kRfSendCommands[] PROGMEM = "|" // No prefix
- D_CMND_RFSEND;
+const char kRfSendCommands[] PROGMEM = "|" D_CMND_RFSEND; // No prefix
+
void (* const RfSendCommand[])(void) PROGMEM = {
&CmndRfSend };
@@ -86,6 +90,10 @@ void RfInit(void)
if (PinUsed(GPIO_RFRECV)) {
pinMode( Pin(GPIO_RFRECV), INPUT);
mySwitch.enableReceive(Pin(GPIO_RFRECV));
+#ifdef BAZMODS
+ mySwitch.enabled_protocol_mask.longs.high32 = Settings.ex_adc_param1;
+ mySwitch.enabled_protocol_mask.longs.low32 = Settings.ex_adc_param2;
+#endif
}
}
@@ -93,6 +101,55 @@ void RfInit(void)
* Commands
\*********************************************************************************************/
+#ifdef BAZMODS
+void CmndRfRxProtocol(void){
+ uint64_t thisbit;
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: index:%d usridx:%d data_len:%d data:%s"),XdrvMailbox.index, XdrvMailbox.usridx, XdrvMailbox.data_len,XdrvMailbox.data);
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: test data_len >0"));
+ //if (XdrvMailbox.data_len > 0) {
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: test usridx ==1"));
+ if (XdrvMailbox.usridx==1) {
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: test payload >=0"));
+ if(XdrvMailbox.payload >=0){
+ thisbit = (1ULL << (XdrvMailbox.index-1) );
+ if(XdrvMailbox.payload &1){
+ mySwitch.enabled_protocol_mask.value |= thisbit;
+ }else{
+ mySwitch.enabled_protocol_mask.value &= ~thisbit;
+ }
+ }
+ }else{
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: test for a"));
+ if(XdrvMailbox.data[0]=='a'){
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: set mask all"));
+ mySwitch.enabled_protocol_mask.value= (1ULL << mySwitch.getNumProtos())-1 ;
+ }else{
+ // AddLog_P(LOG_LEVEL_INFO, PSTR("RFR: set mask with value"));
+ mySwitch.enabled_protocol_mask.value = strtoull(XdrvMailbox.data,nullptr, 0);
+ }
+ }
+ Settings.ex_adc_param1 = mySwitch.enabled_protocol_mask.longs.high32;
+ Settings.ex_adc_param2 = mySwitch.enabled_protocol_mask.longs.low32;
+ //}
+ ResponseClear();
+ ResponseAppend_P(PSTR("{\"" D_CMND_RFRXPROTOCOL "\":"));
+ ResponseAppend_P(PSTR("\""));
+ bool gotone = false;
+ thisbit=1;
+ for (int i=0;i