mirror of
https://github.com/sle118/squeezelite-esp32.git
synced 2025-12-08 04:27:12 +03:00
allow array to be used in dac_controlset - release
This commit is contained in:
@@ -33,6 +33,7 @@ extern const struct adac_s dac_external;
|
|||||||
|
|
||||||
int adac_init(char *config, int i2c_port);
|
int adac_init(char *config, int i2c_port);
|
||||||
void adac_deinit(void);
|
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_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);
|
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);
|
uint8_t adac_read_byte(int i2c_addr, uint8_t reg);
|
||||||
|
|||||||
@@ -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,
|
uint8_t data[] = { i2c_addr << 1, reg,
|
||||||
val >> 8, val & 0xff };
|
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;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************************
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
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");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
45
components/squeezelite/external/dac_external.c
vendored
45
components/squeezelite/external/dac_external.c
vendored
@@ -104,25 +104,40 @@ bool i2c_json_execute(char *set) {
|
|||||||
|
|
||||||
if (!json_set) return true;
|
if (!json_set) return true;
|
||||||
|
|
||||||
cJSON_ArrayForEach(item, json_set)
|
cJSON_ArrayForEach(item, json_set) {
|
||||||
{
|
|
||||||
cJSON *reg = cJSON_GetObjectItemCaseSensitive(item, "reg");
|
cJSON *reg = cJSON_GetObjectItemCaseSensitive(item, "reg");
|
||||||
cJSON *val = cJSON_GetObjectItemCaseSensitive(item, "val");
|
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) {
|
if (!mode) {
|
||||||
adac_write_byte(i2c_addr, reg->valueint, val->valueint);
|
adac_write_byte(i2c_addr, reg->valueint, val->valueint);
|
||||||
} else if (!strcasecmp(mode->valuestring, "or")) {
|
} else if (!strcasecmp(mode->valuestring, "or")) {
|
||||||
uint8_t data = adac_read_byte(i2c_addr,reg->valueint);
|
uint8_t data = adac_read_byte(i2c_addr,reg->valueint);
|
||||||
data |= (uint8_t) val->valueint;
|
data |= (uint8_t) val->valueint;
|
||||||
adac_write_byte(i2c_addr, reg->valueint, data);
|
adac_write_byte(i2c_addr, reg->valueint, data);
|
||||||
} else if (!strcasecmp(mode->valuestring, "and")) {
|
} else if (!strcasecmp(mode->valuestring, "and")) {
|
||||||
uint8_t data = adac_read_byte(i2c_addr, reg->valueint);
|
uint8_t data = adac_read_byte(i2c_addr, reg->valueint);
|
||||||
data &= (uint8_t) val->valueint;
|
data &= (uint8_t) val->valueint;
|
||||||
adac_write_byte(i2c_addr, reg->valueint, data);
|
adac_write_byte(i2c_addr, reg->valueint, data);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user