diff --git a/README.md b/README.md index 2df7752..0b838e4 100644 --- a/README.md +++ b/README.md @@ -88,12 +88,12 @@ void app_main(void) i2c_new_master_bus(&i2c_bus_config, &i2c_bus_handle); esp_event_loop_create_default(); esp_event_handler_instance_register(ZH_PCF8574, ESP_EVENT_ANY_ID, &zh_pcf8574_event_handler, NULL, NULL); - zh_pcf8574_init_config_t pcf8574_init_config = ZH_PCF8574_INIT_CONFIG_DEFAULT(); - pcf8574_init_config.i2c_handle = i2c_bus_handle; - pcf8574_init_config.i2c_address = 0x38; - pcf8574_init_config.p0_gpio_work_mode = true; - pcf8574_init_config.interrupt_gpio = GPIO_NUM_14; - zh_pcf8574_init(&pcf8574_init_config, &pcf8574_handle); + zh_pcf8574_init_config_t config = ZH_PCF8574_INIT_CONFIG_DEFAULT(); + config.i2c_handle = i2c_bus_handle; + config.i2c_address = 0x38; + config.p0_gpio_work_mode = ZH_PCF8574_GPIO_INPUT; + config.interrupt_gpio = GPIO_NUM_14; + zh_pcf8574_init(&config, &pcf8574_handle); uint8_t reg = 0; zh_pcf8574_read(&pcf8574_handle, ®); print_gpio_status("GPIO status: ", reg); @@ -102,13 +102,13 @@ void app_main(void) zh_pcf8574_read(&pcf8574_handle, ®); print_gpio_status("GPIO status: ", reg); printf("Sets P0 to 0.\n"); - zh_pcf8574_write_gpio(&pcf8574_handle, 0, false); + zh_pcf8574_write_gpio(&pcf8574_handle, ZH_PCF8574_GPIO_NUM_P0, ZH_PCF8574_GPIO_LOW); bool gpio = 0; - zh_pcf8574_read_gpio(&pcf8574_handle, 0, &gpio); + zh_pcf8574_read_gpio(&pcf8574_handle, ZH_PCF8574_GPIO_NUM_P0, &gpio); printf("P0 status: %d.\n", gpio); printf("Set P1 to 0.\n"); - zh_pcf8574_write_gpio(&pcf8574_handle, 1, false); - zh_pcf8574_read_gpio(&pcf8574_handle, 1, &gpio); + zh_pcf8574_write_gpio(&pcf8574_handle, ZH_PCF8574_GPIO_NUM_P1, ZH_PCF8574_GPIO_LOW); + zh_pcf8574_read_gpio(&pcf8574_handle, ZH_PCF8574_GPIO_NUM_P1, &gpio); printf("P1 status: %d.\n", gpio); zh_pcf8574_read(&pcf8574_handle, ®); print_gpio_status("GPIO status: ", reg); diff --git a/include/zh_pcf8574.h b/include/zh_pcf8574.h index c341ee2..120f810 100755 --- a/include/zh_pcf8574.h +++ b/include/zh_pcf8574.h @@ -12,22 +12,27 @@ #include "esp_event.h" #include "zh_vector.h" +#define ZH_PCF8574_GPIO_OUTPUT false +#define ZH_PCF8574_GPIO_INPUT true +#define ZH_PCF8574_GPIO_LOW false +#define ZH_PCF8574_GPIO_HIGH true + /** * @brief PCF8574 expander initial default values. */ -#define ZH_PCF8574_INIT_CONFIG_DEFAULT() \ - { \ - .task_priority = 10, \ - .stack_size = 2048, \ - .i2c_address = 0xFF, \ - .p0_gpio_work_mode = 0, \ - .p1_gpio_work_mode = 0, \ - .p2_gpio_work_mode = 0, \ - .p3_gpio_work_mode = 0, \ - .p4_gpio_work_mode = 0, \ - .p5_gpio_work_mode = 0, \ - .p6_gpio_work_mode = 0, \ - .p7_gpio_work_mode = 0, \ +#define ZH_PCF8574_INIT_CONFIG_DEFAULT() \ + { \ + .task_priority = 10, \ + .stack_size = 2048, \ + .i2c_address = 0xFF, \ + .p0_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p1_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p2_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p3_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p4_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p5_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p6_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ + .p7_gpio_work_mode = ZH_PCF8574_GPIO_OUTPUT, \ .interrupt_gpio = GPIO_NUM_MAX} #ifdef __cplusplus @@ -37,6 +42,22 @@ extern "C" extern TaskHandle_t zh_pcf8574; /*!< Unique task handle. */ + /** + * @brief Enumeration of PCF8574 expander GPIO. + */ + typedef enum + { + ZH_PCF8574_GPIO_NUM_P0 = 0, + ZH_PCF8574_GPIO_NUM_P1, + ZH_PCF8574_GPIO_NUM_P2, + ZH_PCF8574_GPIO_NUM_P3, + ZH_PCF8574_GPIO_NUM_P4, + ZH_PCF8574_GPIO_NUM_P5, + ZH_PCF8574_GPIO_NUM_P6, + ZH_PCF8574_GPIO_NUM_P7, + ZH_PCF8574_GPIO_NUM_MAX + } zh_pcf8574_gpio_num_t; + /** * @brief Structure for initial initialization of PCF8574 expander. */ @@ -45,14 +66,14 @@ extern "C" uint8_t task_priority; /*!< Task priority for the PCF8574 expander isr processing. @note It is not recommended to set a value less than 10. */ uint16_t stack_size; /*!< Stack size for task for the PCF8574 expander isr processing processing. @note The minimum size is 2048 bytes. */ uint8_t i2c_address; /*!< Expander I2C address. */ - bool p0_gpio_work_mode; /*!< Expander GPIO PO work mode. True for input, false for output. */ - bool p1_gpio_work_mode; /*!< Expander GPIO P1 work mode. True for input, false for output. */ - bool p2_gpio_work_mode; /*!< Expander GPIO P2 work mode. True for input, false for output. */ - bool p3_gpio_work_mode; /*!< Expander GPIO P3 work mode. True for input, false for output. */ - bool p4_gpio_work_mode; /*!< Expander GPIO P4 work mode. True for input, false for output. */ - bool p5_gpio_work_mode; /*!< Expander GPIO P5 work mode. True for input, false for output. */ - bool p6_gpio_work_mode; /*!< Expander GPIO P6 work mode. True for input, false for output. */ - bool p7_gpio_work_mode; /*!< Expander GPIO P7 work mode. True for input, false for output. */ + bool p0_gpio_work_mode; /*!< Expander GPIO PO work mode. */ + bool p1_gpio_work_mode; /*!< Expander GPIO P1 work mode. */ + bool p2_gpio_work_mode; /*!< Expander GPIO P2 work mode. */ + bool p3_gpio_work_mode; /*!< Expander GPIO P3 work mode. */ + bool p4_gpio_work_mode; /*!< Expander GPIO P4 work mode. */ + bool p5_gpio_work_mode; /*!< Expander GPIO P5 work mode. */ + bool p6_gpio_work_mode; /*!< Expander GPIO P6 work mode. */ + bool p7_gpio_work_mode; /*!< Expander GPIO P7 work mode. */ uint8_t interrupt_gpio; /*!< Interrupt GPIO. @attention Must be same for all PCF8574 expanders. */ i2c_master_bus_handle_t i2c_handle; /*!< Unique I2C bus handle. @attention Must be same for all PCF8574 expanders. */ } zh_pcf8574_init_config_t; @@ -120,7 +141,7 @@ extern "C" * @return ESP_OK if success or an error code otherwise. */ esp_err_t zh_pcf8574_deinit(zh_pcf8574_handle_t *handle); - + /** * @brief Read PCF8574 all GPIO's status. * @@ -165,7 +186,7 @@ extern "C" * * @return ESP_OK if success or an error code otherwise. */ - esp_err_t zh_pcf8574_read_gpio(zh_pcf8574_handle_t *handle, uint8_t gpio, bool *status); + esp_err_t zh_pcf8574_read_gpio(zh_pcf8574_handle_t *handle, zh_pcf8574_gpio_num_t gpio, bool *status); /** * @brief Set PCF8574 GPIO status. @@ -178,7 +199,7 @@ extern "C" * * @return ESP_OK if success or an error code otherwise. */ - esp_err_t zh_pcf8574_write_gpio(zh_pcf8574_handle_t *handle, uint8_t gpio, bool status); + esp_err_t zh_pcf8574_write_gpio(zh_pcf8574_handle_t *handle, zh_pcf8574_gpio_num_t gpio, bool status); /** * @brief Get error statistics. diff --git a/zh_pcf8574.c b/zh_pcf8574.c index 54c6181..2d66dad 100755 --- a/zh_pcf8574.c +++ b/zh_pcf8574.c @@ -147,11 +147,11 @@ esp_err_t zh_pcf8574_reset(zh_pcf8574_handle_t *handle) return ESP_OK; } -esp_err_t zh_pcf8574_read_gpio(zh_pcf8574_handle_t *handle, uint8_t gpio, bool *status) // -V2008 +esp_err_t zh_pcf8574_read_gpio(zh_pcf8574_handle_t *handle, zh_pcf8574_gpio_num_t gpio, bool *status) // -V2008 { ZH_LOGI("PCF8574 read GPIO started."); ZH_ERROR_CHECK(handle != NULL && status != NULL, ESP_ERR_INVALID_ARG, NULL, "PCF8574 read GPIO failed. Invalid argument."); - ZH_ERROR_CHECK(gpio <= 7, ESP_FAIL, NULL, "PCF8574 read GPIO failed. Invalid GPIO number.") + ZH_ERROR_CHECK(gpio >= ZH_PCF8574_GPIO_NUM_P0 && gpio < ZH_PCF8574_GPIO_NUM_MAX, ESP_FAIL, NULL, "PCF8574 read GPIO failed. Invalid GPIO number.") ZH_ERROR_CHECK(handle->is_initialized == true, ESP_ERR_NOT_FOUND, NULL, "PCF8574 read GPIO failed. PCF8574 not initialized."); uint8_t gpio_temp = _gpio_matrix[gpio]; uint8_t reg_temp = 0; @@ -162,11 +162,11 @@ esp_err_t zh_pcf8574_read_gpio(zh_pcf8574_handle_t *handle, uint8_t gpio, bool * return ESP_OK; } -esp_err_t zh_pcf8574_write_gpio(zh_pcf8574_handle_t *handle, uint8_t gpio, bool status) // -V2008 +esp_err_t zh_pcf8574_write_gpio(zh_pcf8574_handle_t *handle, zh_pcf8574_gpio_num_t gpio, bool status) // -V2008 { ZH_LOGI("PCF8574 write GPIO started."); ZH_ERROR_CHECK(handle != NULL, ESP_ERR_INVALID_ARG, NULL, "PCF8574 write GPIO failed. Invalid argument."); - ZH_ERROR_CHECK(gpio <= 7, ESP_FAIL, NULL, "PCF8574 write GPIO failed. Invalid GPIO number.") + ZH_ERROR_CHECK(gpio >= ZH_PCF8574_GPIO_NUM_P0 && gpio < ZH_PCF8574_GPIO_NUM_MAX, ESP_FAIL, NULL, "PCF8574 write GPIO failed. Invalid GPIO number.") ZH_ERROR_CHECK(handle->is_initialized == true, ESP_ERR_NOT_FOUND, NULL, "PCF8574 write GPIO failed. PCF8574 not initialized."); uint8_t gpio_temp = _gpio_matrix[gpio]; esp_err_t err = ESP_OK;