/* * 文件: components/human_door/human_door.c * 角色: 人体/门磁输入采集 * 说明: * - 本文件用于实现当前模块的核心功能或接口定义。 * - 修改前请先确认该模块与其它任务/外设之间的数据流关系。 * - 涉及协议与硬件时,优先保持现有接口兼容,避免联调回归。 */ #include "human_door.h" #include "driver/gpio.h" #include "esp_check.h" static const char *TAG = "human_door"; static bool s_inited = false; /* 函数: human_door_init * 作用: 执行模块内与函数名对应的业务逻辑。 * 重点: 关注输入合法性、返回码与并发安全。 */ esp_err_t human_door_init(void) { if (s_inited) { return ESP_OK; } gpio_config_t io_cfg = { .pin_bit_mask = (1ULL << HUMAN_SENSOR_GPIO) | (1ULL << DOOR_SWITCH_GPIO), .mode = GPIO_MODE_INPUT, .pull_up_en = GPIO_PULLUP_ENABLE, .pull_down_en = GPIO_PULLDOWN_DISABLE, .intr_type = GPIO_INTR_DISABLE, }; ESP_RETURN_ON_ERROR(gpio_config(&io_cfg), TAG, "gpio config failed"); s_inited = true; return ESP_OK; } /* 函数: human_door_read * 作用: 执行模块内与函数名对应的业务逻辑。 * 重点: 关注输入合法性、返回码与并发安全。 */ esp_err_t human_door_read(human_door_state_t *out_state) { ESP_RETURN_ON_FALSE(out_state != NULL, ESP_ERR_INVALID_ARG, TAG, "out_state is null"); ESP_RETURN_ON_FALSE(s_inited, ESP_ERR_INVALID_STATE, TAG, "not initialized"); int human_level = gpio_get_level((gpio_num_t)HUMAN_SENSOR_GPIO); int door_level = gpio_get_level((gpio_num_t)DOOR_SWITCH_GPIO); out_state->human_present = (human_level != 0); out_state->door_closed = (door_level == 0); return ESP_OK; }