allow array to be used in dac_controlset - release

This commit is contained in:
Philippe G
2021-11-17 10:24:01 -08:00
parent c236044228
commit 08b22504bc
3 changed files with 54 additions and 18 deletions

View File

@@ -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);

View File

@@ -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 };
@@ -170,3 +169,24 @@ esp_err_t adac_write_word(int i2c_addr, uint8_t reg, uint16_t val)
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");
}
}

View File

@@ -104,10 +104,24 @@ 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");
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;
@@ -124,6 +138,7 @@ bool i2c_json_execute(char *set) {
adac_write_byte(i2c_addr, reg->valueint, data);
}
}
}
return true;
}