src.nth.io/

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Hoersten <[email protected]>2021-03-09 15:47:38 -0600
committerLuke Hoersten <[email protected]>2021-03-09 15:47:38 -0600
commit2d08f681e6e53b71a295b0ab05155f4315fea76f (patch)
tree71d72ea51c1b1e19589a1b9c79b3aef1f5a8be78
parentaa7558f38d5a2edac695919e02857635746d6596 (diff)
Updated doorbell ISR logic
-rw-r--r--esp-homekit-intercom.code-workspace15
-rw-r--r--main/Kconfig.projbuild17
-rw-r--r--main/app_main.c42
3 files changed, 58 insertions, 16 deletions
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