diff --git a/main/main.c b/main/main.c index 3a06fb1..714ff14 100644 --- a/main/main.c +++ b/main/main.c @@ -26,6 +26,7 @@ void app_main(void) { ambient_light_auto_fetch(); auto_fetch_temperature(); pca9555_init(); + pca9555_auto_fetch(); ui_input_init(); xTaskCreate(mqtt_publish_ui_input, "mqtt_publish_ui_input", 2048, NULL, 10, NULL); diff --git a/main/pca9555.c b/main/pca9555.c index d08a3c2..a881f53 100644 --- a/main/pca9555.c +++ b/main/pca9555.c @@ -19,8 +19,86 @@ #define PCA95555_CMD_CONFIGURATION_PORT_0 0x06 #define PCA95555_CMD_CONFIGURATION_PORT_1 0x07 +esp_err_t pca9555_write_config(uint8_t cmd_byte, uint8_t data) { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, PCA9555_ADDRESS << 1 | I2C_MASTER_WRITE, + ACK_CHECK_EN); + i2c_master_write_byte(cmd, cmd_byte, ACK_CHECK_EN); + i2c_master_write_byte(cmd, data, ACK_CHECK_EN); + i2c_master_stop(cmd); + esp_err_t error = + i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (error != ESP_OK) { + ESP_LOGW(PCA_9555_TAG, "write config failed. %d", error); + } + return error; +} +esp_err_t pca9555_write_output(uint8_t cmd_byte, uint8_t data) { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, PCA9555_ADDRESS << 1 | I2C_MASTER_WRITE, + ACK_CHECK_EN); + i2c_master_write_byte(cmd, cmd_byte, ACK_CHECK_EN); + i2c_master_write_byte(cmd, data, ACK_CHECK_EN); + i2c_master_stop(cmd); + esp_err_t error = + i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (error != ESP_OK) { + ESP_LOGW(PCA_9555_TAG, "write output failed. %d", error); + } + return error; +} +esp_err_t pca9555_read_one_input(uint8_t cmd_byte, uint8_t* data) { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, PCA9555_ADDRESS << 1 | I2C_MASTER_WRITE, + ACK_CHECK_EN); + i2c_master_write_byte(cmd, cmd_byte, ACK_CHECK_EN); + i2c_master_start(cmd); + i2c_master_write_byte(cmd, PCA9555_ADDRESS << 1 | I2C_MASTER_READ, + ACK_CHECK_EN); + i2c_master_read_byte(cmd, data, NACK_VAL); + i2c_master_stop(cmd); + esp_err_t error = + i2c_master_cmd_begin(I2C_MASTER_NUM, cmd, 1000 / portTICK_PERIOD_MS); + i2c_cmd_link_delete(cmd); + if (error != ESP_OK) { + ESP_LOGW(PCA_9555_TAG, "read input failed. %d", error); + } + return error; +} + +void pca9555_fetch(void* arg) { + ESP_LOGI(PCA_9555_TAG, "fetching"); + esp_err_t error; + uint8_t buff; + char disp_str[17]; + display_fill_rect(0, 6, 128, 8, 0x00); + for (;;) { + error = pca9555_read_one_input(PCA95555_CMD_INPUT_PORT_1, &buff); + if (error != ESP_OK) { + ESP_LOGW(PCA_9555_TAG, "read failed. %x", error); + } else { + sprintf(disp_str, "IO0: 0x%2x ", buff); + display_print8_str(8, 6, disp_str); + ESP_LOGD(PCA_9555_TAG, "IO0: 0x%2x", buff); + } + vTaskDelay(pdMS_TO_TICKS(10)); + } + display_fill_rect(0, 6, 128, 8, 0x00); +} + +void pca9555_auto_fetch() { + if (is_apds_9930_online == 0) { + return; + } + xTaskCreate(pca9555_fetch, "pac05555-fetching", 2048, NULL, 10, NULL); +} void pca9555_init() { if (is_pca9555_online == 0) { @@ -28,5 +106,6 @@ void pca9555_init() { return; } ESP_LOGI(PCA_9555_TAG, "Initializing PCA9555"); - // esp_log_level_set(PCA_9555_TAG, ESP_LOG_ERROR); + esp_log_level_set(PCA_9555_TAG, ESP_LOG_DEBUG); + pca9555_write_config(PCA95555_CMD_CONFIGURATION_PORT_1, 0x01); }