浏览代码

allow array to be used in dac_controlset - release

Philippe G 3 年之前
父节点
当前提交
08b22504bc
共有 3 个文件被更改,包括 54 次插入18 次删除
  1. 1 0
      components/squeezelite/adac.h
  2. 23 3
      components/squeezelite/adac_core.c
  3. 30 15
      components/squeezelite/external/dac_external.c

+ 1 - 0
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);

+ 23 - 3
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;
-}
+}
+
+/****************************************************************************************
+ * 
+ */
+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");
+	}
+	
+}	

+ 30 - 15
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;