From 2d08f681e6e53b71a295b0ab05155f4315fea76f Mon Sep 17 00:00:00 2001 From: Luke Hoersten Date: Tue, 9 Mar 2021 15:47:38 -0600 Subject: Updated doorbell ISR logic --- esp-homekit-intercom.code-workspace | 15 +++++++++++++ main/Kconfig.projbuild | 17 ++++++++++----- main/app_main.c | 42 +++++++++++++++++++++++++++---------- 3 files changed, 58 insertions(+), 16 deletions(-) create mode 100644 esp-homekit-intercom.code-workspace diff --git a/esp-homekit-intercom.code-workspace b/esp-homekit-intercom.code-workspace new file mode 100644 index 0000000..cad81f2 --- /dev/null +++ b/esp-homekit-intercom.code-workspace @@ -0,0 +1,15 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "files.associations": { + "stdio.h": "c", + "hap.h": "c", + "freertos.h": "c" + }, + "git.ignoreLimitWarning": true + } +} \ No newline at end of file diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index 4284718..9fa495f 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -34,27 +34,34 @@ menu "HomeKit Intercom Configuration" range 0 34 default 21 help - GPIO pin number (IOxx) to control lock relay. + GPIO pin number to control lock relay. config HOMEKIT_INTERCOM_BELL_GPIO_PIN - int "Intercombell GPIO pin number" + int "Intercom bell GPIO pin number" range 0 34 default 34 help - GPIO pin number (IOxx) from which to read intercom bell signal. + GPIO pin number from which to read intercom bell signal. + + config HOMEKIT_INTERCOM_BELL_ADC1_CHANNEL + int "Intercom bell ADC1 channel number" + range 0 7 + default 6 + help + ADC1 channel number from which to read intercom bell signal. config HOMEKIT_INTERCOM_WIFI_RESET_GPIO_PIN int "Intercom WIFI reset GPIO pin number" range 0 34 default 0 help - GPIO pin number (IOxx) to reset wifi. + GPIO pin number to reset wifi. config HOMEKIT_INTERCOM_LED_GPIO_PIN int "LED GPIO pin number" range 0 34 default 13 help - GPIO pin number (IOxx) for LED. + GPIO pin number for LED. endmenu diff --git a/main/app_main.c b/main/app_main.c index d075db6..1feb9dd 100644 --- a/main/app_main.c +++ b/main/app_main.c @@ -33,6 +33,7 @@ static const char *TAG = "HAP Intercom"; #define HAP_LOCK_TARGET_STATE_SECURED 1 static hap_val_t HAP_LOCK_CURRENT_STATE_UNSECURED = {.u = 0}; static hap_val_t HAP_LOCK_CURRENT_STATE_SECURED = {.u = 1}; +static hap_val_t HAP_PROGRAMMABLE_SWITCH_EVENT_SINGLE_PRESS = {.u = 0}; #define ESP_INTR_FLAG_DEFAULT 0 @@ -44,15 +45,27 @@ static const uint8_t INTERCOM_EVENT_QUEUE_LOCK_TIMEOUT = 4; /* static uint8_t tlv8buff[128]; static hap_data_val_t null_tlv8 = {.buf = &tlv8buff, .buflen = 127}; */ +volatile uint32_t avg_bell_val = 0; +volatile bool is_intercom_bell_blocked = false; static xQueueHandle intercom_event_queue = NULL; -static TimerHandle_t intercom_lock_timer = NULL; +static TimerHandle_t intercom_lock_timer = NULL; // lock the door when timer triggered +static TimerHandle_t intercom_bell_timer = NULL; // ignore new bells until timer triggered + +static bool is_bell_ringing(int val) +{ + return 1.2 < val && val < 2.5; +} /** * @brief the recover intercom bell gpio interrupt function */ static void IRAM_ATTR intercom_bell_isr(void *arg) { - xQueueSendFromISR(intercom_event_queue, (void *)&INTERCOM_EVENT_QUEUE_BELL, NULL); + if (!is_intercom_bell_blocked && is_bell_ringing(adc1_get_raw(CONFIG_HOMEKIT_INTERCOM_BELL_ADC1_CHANNEL))) + { + xQueueSendFromISR(intercom_event_queue, (void *)&INTERCOM_EVENT_QUEUE_BELL, NULL); + is_intercom_bell_blocked = true; + } } /** @@ -62,7 +75,7 @@ static void intercom_bell_init(uint32_t key_gpio_pin) { gpio_config_t io_conf; - io_conf.intr_type = GPIO_INTR_NEGEDGE; /* Interrupt for falling edge */ + io_conf.intr_type = GPIO_INTR_POSEDGE; /* Interrupt for rising edge */ io_conf.pin_bit_mask = 1 << key_gpio_pin; /* Bit mask of the pins */ io_conf.mode = GPIO_MODE_INPUT; /* Set as input mode */ io_conf.pull_up_en = GPIO_PULLUP_DISABLE; /* Disable internal pull-up */ @@ -72,6 +85,10 @@ static void intercom_bell_init(uint32_t key_gpio_pin) gpio_install_isr_service(ESP_INTR_FLAG_DEFAULT); /* Install gpio isr service */ gpio_isr_handler_add(key_gpio_pin, intercom_bell_isr, (void *)key_gpio_pin); /* Hook isr handler for specified gpio pin */ + + // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/peripherals/adc.html#_CPPv425adc1_config_channel_atten14adc1_channel_t11adc_atten_t + adc1_config_width(ADC_WIDTH_BIT_12); + adc1_config_channel_atten(CONFIG_HOMEKIT_INTERCOM_BELL_ADC1_CHANNEL, ADC_ATTEN_DB_11); } /** @@ -81,7 +98,7 @@ static void intercom_lock_init(uint32_t key_gpio_pin) { gpio_config_t io_conf; - io_conf.intr_type = GPIO_INTR_DISABLE; /* Interrupt for falling edge */ + io_conf.intr_type = GPIO_INTR_DISABLE; /* Disable interrupt */ io_conf.pin_bit_mask = 1 << key_gpio_pin; /* Bit mask of the pins */ io_conf.mode = GPIO_MODE_OUTPUT; /* Set as input mode */ io_conf.pull_up_en = GPIO_PULLUP_DISABLE; /* Disable internal pull-up */ @@ -145,15 +162,11 @@ static int intercom_identify(hap_acc_t *ha) static void intercom_bell_ring(hap_char_t *intercom_bell_current_state) { - adc1_config_width(ADC_WIDTH_BIT_12); - adc1_config_channel_atten(ADC1_CHANNEL_2, ADC_ATTEN_DB_0); - int val = adc1_get_raw(ADC1_CHANNEL_2); - - /* int level = gpio_get_level(CONFIG_HOMEKIT_INTERCOM_BELL_GPIO_PIN); */ + ESP_LOGI(TAG, "Intercom bell ring event processed"); - ESP_LOGI(TAG, "Intercom bell ring event processed [%d]", val); + hap_char_update_val(intercom_bell_current_state, &HAP_PROGRAMMABLE_SWITCH_EVENT_SINGLE_PRESS); - /* hap_char_update_val(intercom_bell_current_state, &HAP_PROGRAMMABLE_SWITCH_EVENT_SINGLE_PRESS); */ + xTimerReset(intercom_bell_timer, 10); } static void intercom_unlock(hap_char_t *intercom_lock_current_state) @@ -183,6 +196,12 @@ static void intercom_lock_timeout(hap_char_t *intercom_lock_target_state) hap_char_update_val(intercom_lock_target_state, &target_lock_secured); } +static void intercom_bell_timer_cb(TimerHandle_t timer) +{ + ESP_LOGI(TAG, "Intercom bell timer fired"); + is_intercom_bell_blocked = false; +} + static int intercom_lock_write_cb(hap_write_data_t write_data[], int count, void *serv_priv, void *write_priv) { int i, ret = HAP_SUCCESS; @@ -299,6 +318,7 @@ static void intercom_thread_entry(void *p) app_wifi_start(portMAX_DELAY); /* Start Wi-Fi */ intercom_lock_timer = xTimerCreate("intercom_lock_timer", pdMS_TO_TICKS(CONFIG_HOMEKIT_INTERCOM_LOCK_TIMEOUT), pdFALSE, 0, intercom_lock_timer_cb); + intercom_bell_timer = xTimerCreate("intercom_bell_timer", pdMS_TO_TICKS(CONFIG_HOMEKIT_INTERCOM_LOCK_TIMEOUT), pdFALSE, 0, intercom_bell_timer_cb); /* Listen for intercom bell state change events. Other read/write functionality will be handled by the HAP Core. When the * intercom bell in Use GPIO goes low, it means intercom bell is not ringing. When the Intercom in Use GPIO goes high, it means -- cgit v1.2.3