From 08b22504bc1bc6c3e0df8f1999d06fdb149e9d4b Mon Sep 17 00:00:00 2001 From: Philippe G Date: Wed, 17 Nov 2021 10:24:01 -0800 Subject: [PATCH] allow array to be used in dac_controlset - release --- components/squeezelite/adac.h | 1 + components/squeezelite/adac_core.c | 26 +++++++++-- .../squeezelite/external/dac_external.c | 45 ++++++++++++------- 3 files changed, 54 insertions(+), 18 deletions(-) diff --git a/components/squeezelite/adac.h b/components/squeezelite/adac.h index 4a61ad10..5a3a8cf6 100644 --- a/components/squeezelite/adac.h +++ b/components/squeezelite/adac.h @@ -33,6 +33,7 @@ extern const struct adac_s dac_external; int adac_init(char *config, int i2c_port); void adac_deinit(void); +esp_err_t adac_write(int i2c_addr, uint8_t reg, uint8_t *data, size_t count); esp_err_t adac_write_byte(int i2c_addr, uint8_t reg, uint8_t val); esp_err_t adac_write_word(int i2c_addr, uint8_t reg, uint16_t val); uint8_t adac_read_byte(int i2c_addr, uint8_t reg); diff --git a/components/squeezelite/adac_core.c b/components/squeezelite/adac_core.c index 9f746f99..0f714cc1 100644 --- a/components/squeezelite/adac_core.c +++ b/components/squeezelite/adac_core.c @@ -150,8 +150,7 @@ uint16_t adac_read_word(int i2c_addr, uint8_t reg) { /**************************************************************************************** * */ -esp_err_t adac_write_word(int i2c_addr, uint8_t reg, uint16_t val) -{ +esp_err_t adac_write_word(int i2c_addr, uint8_t reg, uint16_t val) { uint8_t data[] = { i2c_addr << 1, reg, val >> 8, val & 0xff }; @@ -169,4 +168,25 @@ esp_err_t adac_write_word(int i2c_addr, uint8_t reg, uint16_t val) } return ret; -} \ No newline at end of file +} + +/**************************************************************************************** + * + */ +esp_err_t adac_write(int i2c_addr, uint8_t reg, uint8_t *data, size_t count) { + i2c_cmd_handle_t cmd = i2c_cmd_link_create(); + i2c_master_start(cmd); + + i2c_master_write_byte(cmd, (i2c_addr << 1) | I2C_MASTER_WRITE, I2C_MASTER_NACK); + i2c_master_write_byte(cmd, reg, I2C_MASTER_NACK); + i2c_master_write(cmd, data, count, I2C_MASTER_NACK); + + i2c_master_stop(cmd); + esp_err_t ret = i2c_master_cmd_begin(i2c_port, cmd, 200 / portTICK_RATE_MS); + i2c_cmd_link_delete(cmd); + + if (ret != ESP_OK) { + ESP_LOGW(TAG, "I2C write failed"); + } + +} \ No newline at end of file diff --git a/components/squeezelite/external/dac_external.c b/components/squeezelite/external/dac_external.c index c274b065..babab59d 100644 --- a/components/squeezelite/external/dac_external.c +++ b/components/squeezelite/external/dac_external.c @@ -104,25 +104,40 @@ bool i2c_json_execute(char *set) { if (!json_set) return true; - cJSON_ArrayForEach(item, json_set) - { + cJSON_ArrayForEach(item, json_set) { cJSON *reg = cJSON_GetObjectItemCaseSensitive(item, "reg"); cJSON *val = cJSON_GetObjectItemCaseSensitive(item, "val"); - cJSON *mode = cJSON_GetObjectItemCaseSensitive(item, "mode"); + + if (cJSON_IsArray(val)) { + cJSON *value; + uint8_t *data = malloc(cJSON_GetArraySize(val)); + int count = 0; + + if (!data) continue; + + cJSON_ArrayForEach(value, val) { + data[count++] = value->valueint; + } + + adac_write(i2c_addr, reg->valueint, data, count); + free(data); + } else { + cJSON *mode = cJSON_GetObjectItemCaseSensitive(item, "mode"); - if (!reg || !val) continue; + if (!reg || !val) continue; - if (!mode) { - adac_write_byte(i2c_addr, reg->valueint, val->valueint); - } else if (!strcasecmp(mode->valuestring, "or")) { - uint8_t data = adac_read_byte(i2c_addr,reg->valueint); - data |= (uint8_t) val->valueint; - adac_write_byte(i2c_addr, reg->valueint, data); - } else if (!strcasecmp(mode->valuestring, "and")) { - uint8_t data = adac_read_byte(i2c_addr, reg->valueint); - data &= (uint8_t) val->valueint; - adac_write_byte(i2c_addr, reg->valueint, data); - } + if (!mode) { + adac_write_byte(i2c_addr, reg->valueint, val->valueint); + } else if (!strcasecmp(mode->valuestring, "or")) { + uint8_t data = adac_read_byte(i2c_addr,reg->valueint); + data |= (uint8_t) val->valueint; + adac_write_byte(i2c_addr, reg->valueint, data); + } else if (!strcasecmp(mode->valuestring, "and")) { + uint8_t data = adac_read_byte(i2c_addr, reg->valueint); + data &= (uint8_t) val->valueint; + adac_write_byte(i2c_addr, reg->valueint, data); + } + } } return true;