mirror of https://github.com/arendst/Tasmota.git
Merge pull request #8021 from to-scho/feature/counter_debounce_low_high
Enhanced counter debouncing
This commit is contained in:
commit
bd34db87b1
|
@ -472,8 +472,10 @@ struct SYSCFG {
|
||||||
uint8_t bri_preset_high; // F07
|
uint8_t bri_preset_high; // F07
|
||||||
int8_t hum_comp; // F08
|
int8_t hum_comp; // F08
|
||||||
|
|
||||||
uint8_t free_f09[179]; // F09
|
uint8_t free_f09[175]; // F09
|
||||||
|
|
||||||
|
uint16_t pulse_counter_debounce_low; // FB8
|
||||||
|
uint16_t pulse_counter_debounce_high; // FBA
|
||||||
uint32_t keeloq_master_msb; // FBC
|
uint32_t keeloq_master_msb; // FBC
|
||||||
uint32_t keeloq_master_lsb; // FC0
|
uint32_t keeloq_master_lsb; // FC0
|
||||||
uint32_t keeloq_serial; // FC4
|
uint32_t keeloq_serial; // FC4
|
||||||
|
|
|
@ -27,16 +27,20 @@
|
||||||
#define D_PRFX_COUNTER "Counter"
|
#define D_PRFX_COUNTER "Counter"
|
||||||
#define D_CMND_COUNTERTYPE "Type"
|
#define D_CMND_COUNTERTYPE "Type"
|
||||||
#define D_CMND_COUNTERDEBOUNCE "Debounce"
|
#define D_CMND_COUNTERDEBOUNCE "Debounce"
|
||||||
|
#define D_CMND_COUNTERDEBOUNCELOW "DebounceLow"
|
||||||
|
#define D_CMND_COUNTERDEBOUNCEHIGH "DebounceHigh"
|
||||||
|
|
||||||
const char kCounterCommands[] PROGMEM = D_PRFX_COUNTER "|" // Prefix
|
const char kCounterCommands[] PROGMEM = D_PRFX_COUNTER "|" // Prefix
|
||||||
"|" D_CMND_COUNTERTYPE "|" D_CMND_COUNTERDEBOUNCE ;
|
"|" D_CMND_COUNTERTYPE "|" D_CMND_COUNTERDEBOUNCE "|" D_CMND_COUNTERDEBOUNCELOW "|" D_CMND_COUNTERDEBOUNCEHIGH ;
|
||||||
|
|
||||||
void (* const CounterCommand[])(void) PROGMEM = {
|
void (* const CounterCommand[])(void) PROGMEM = {
|
||||||
&CmndCounter, &CmndCounterType, &CmndCounterDebounce };
|
&CmndCounter, &CmndCounterType, &CmndCounterDebounce, &CmndCounterDebounceLow, &CmndCounterDebounceHigh };
|
||||||
|
|
||||||
struct COUNTER {
|
struct COUNTER {
|
||||||
uint32_t timer[MAX_COUNTERS]; // Last counter time in micro seconds
|
uint32_t timer[MAX_COUNTERS]; // Last counter time in micro seconds
|
||||||
|
uint32_t timer_low_high[MAX_COUNTERS]; // Last low/high counter time in micro seconds
|
||||||
uint8_t no_pullup = 0; // Counter input pullup flag (1 = No pullup)
|
uint8_t no_pullup = 0; // Counter input pullup flag (1 = No pullup)
|
||||||
|
uint8_t pin_state = 0; // LSB0..3 Last state of counter pin; LSB7==0 IRQ is FALLING, LSB7==1 IRQ is CHANGE
|
||||||
bool any_counter = false;
|
bool any_counter = false;
|
||||||
} Counter;
|
} Counter;
|
||||||
|
|
||||||
|
@ -51,7 +55,30 @@ void CounterUpdate4(void) ICACHE_RAM_ATTR;
|
||||||
void CounterUpdate(uint8_t index)
|
void CounterUpdate(uint8_t index)
|
||||||
{
|
{
|
||||||
uint32_t time = micros();
|
uint32_t time = micros();
|
||||||
uint32_t debounce_time = time - Counter.timer[index];
|
uint32_t debounce_time;
|
||||||
|
|
||||||
|
if (Counter.pin_state) {
|
||||||
|
// handle low and high debounce times when configured
|
||||||
|
if (digitalRead(pin[GPIO_CNTR1 +index]) == bitRead(Counter.pin_state, index)) {
|
||||||
|
// new pin state to be ignored because debounce time was not met during last IRQ
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
debounce_time = time - Counter.timer_low_high[index];
|
||||||
|
if bitRead(Counter.pin_state, index) {
|
||||||
|
// last valid pin state was high, current pin state is low
|
||||||
|
if (debounce_time <= Settings.pulse_counter_debounce_high * 1000) return;
|
||||||
|
} else {
|
||||||
|
// last valid pin state was low, current pin state is high
|
||||||
|
if (debounce_time <= Settings.pulse_counter_debounce_low * 1000) return;
|
||||||
|
}
|
||||||
|
// passed debounce check, save pin state and timing
|
||||||
|
Counter.timer_low_high[index] = time;
|
||||||
|
Counter.pin_state ^= (1<<index);
|
||||||
|
// do not count on rising edge
|
||||||
|
if bitRead(Counter.pin_state, index) return;
|
||||||
|
}
|
||||||
|
|
||||||
|
debounce_time = time - Counter.timer[index];
|
||||||
if (debounce_time > Settings.pulse_counter_debounce * 1000) {
|
if (debounce_time > Settings.pulse_counter_debounce * 1000) {
|
||||||
Counter.timer[index] = time;
|
Counter.timer[index] = time;
|
||||||
if (bitRead(Settings.pulse_counter_type, index)) {
|
if (bitRead(Settings.pulse_counter_type, index)) {
|
||||||
|
@ -103,7 +130,13 @@ void CounterInit(void)
|
||||||
if (pin[GPIO_CNTR1 +i] < 99) {
|
if (pin[GPIO_CNTR1 +i] < 99) {
|
||||||
Counter.any_counter = true;
|
Counter.any_counter = true;
|
||||||
pinMode(pin[GPIO_CNTR1 +i], bitRead(Counter.no_pullup, i) ? INPUT : INPUT_PULLUP);
|
pinMode(pin[GPIO_CNTR1 +i], bitRead(Counter.no_pullup, i) ? INPUT : INPUT_PULLUP);
|
||||||
attachInterrupt(pin[GPIO_CNTR1 +i], counter_callbacks[i], FALLING);
|
if ((0 == Settings.pulse_counter_debounce_low) && (0 == Settings.pulse_counter_debounce_high)) {
|
||||||
|
Counter.pin_state = 0;
|
||||||
|
attachInterrupt(pin[GPIO_CNTR1 +i], counter_callbacks[i], FALLING);
|
||||||
|
} else {
|
||||||
|
Counter.pin_state = 0x8f;
|
||||||
|
attachInterrupt(pin[GPIO_CNTR1 +i], counter_callbacks[i], CHANGE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -213,6 +246,24 @@ void CmndCounterDebounce(void)
|
||||||
ResponseCmndNumber(Settings.pulse_counter_debounce);
|
ResponseCmndNumber(Settings.pulse_counter_debounce);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CmndCounterDebounceLow(void)
|
||||||
|
{
|
||||||
|
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32001)) {
|
||||||
|
Settings.pulse_counter_debounce_low = XdrvMailbox.payload;
|
||||||
|
CounterInit();
|
||||||
|
}
|
||||||
|
ResponseCmndNumber(Settings.pulse_counter_debounce_low);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CmndCounterDebounceHigh(void)
|
||||||
|
{
|
||||||
|
if ((XdrvMailbox.payload >= 0) && (XdrvMailbox.payload < 32001)) {
|
||||||
|
Settings.pulse_counter_debounce_high = XdrvMailbox.payload;
|
||||||
|
CounterInit();
|
||||||
|
}
|
||||||
|
ResponseCmndNumber(Settings.pulse_counter_debounce_high);
|
||||||
|
}
|
||||||
|
|
||||||
/*********************************************************************************************\
|
/*********************************************************************************************\
|
||||||
* Interface
|
* Interface
|
||||||
\*********************************************************************************************/
|
\*********************************************************************************************/
|
||||||
|
|
Loading…
Reference in New Issue