@@ -477,17 +477,16 @@ esp_err_t adc_continuous_config(adc_continuous_handle_t handle, const adc_contin
477477 }
478478
479479 ESP_RETURN_ON_FALSE (config -> sample_freq_hz <= SOC_ADC_SAMPLE_FREQ_THRES_HIGH && config -> sample_freq_hz >= SOC_ADC_SAMPLE_FREQ_THRES_LOW , ESP_ERR_INVALID_ARG , ADC_TAG , "ADC sampling frequency out of range" );
480-
481480#if CONFIG_IDF_TARGET_ESP32
482- ESP_RETURN_ON_FALSE ( config -> format == ADC_DIGI_OUTPUT_FORMAT_TYPE1 , ESP_ERR_INVALID_ARG , ADC_TAG , "Please use type1" ) ;
481+ handle -> format = ADC_DIGI_OUTPUT_FORMAT_TYPE1 ;
483482#elif CONFIG_IDF_TARGET_ESP32S2
484483 if (config -> conv_mode == ADC_CONV_BOTH_UNIT || config -> conv_mode == ADC_CONV_ALTER_UNIT ) {
485- ESP_RETURN_ON_FALSE ( config -> format == ADC_DIGI_OUTPUT_FORMAT_TYPE2 , ESP_ERR_INVALID_ARG , ADC_TAG , "Please use type2" ) ;
484+ handle -> format = ADC_DIGI_OUTPUT_FORMAT_TYPE2 ;
486485 } else if (config -> conv_mode == ADC_CONV_SINGLE_UNIT_1 || config -> conv_mode == ADC_CONV_SINGLE_UNIT_2 ) {
487- ESP_RETURN_ON_FALSE ( config -> format == ADC_DIGI_OUTPUT_FORMAT_TYPE1 , ESP_ERR_INVALID_ARG , ADC_TAG , "Please use type1" ) ;
486+ handle -> format = ADC_DIGI_OUTPUT_FORMAT_TYPE1 ;
488487 }
489488#else
490- ESP_RETURN_ON_FALSE ( config -> format == ADC_DIGI_OUTPUT_FORMAT_TYPE2 , ESP_ERR_INVALID_ARG , ADC_TAG , "Please use type2" ) ;
489+ handle -> format = ADC_DIGI_OUTPUT_FORMAT_TYPE2 ;
491490#endif
492491
493492 uint32_t clk_src_freq_hz = 0 ;
@@ -585,3 +584,88 @@ esp_err_t adc_continuous_channel_to_io(adc_unit_t unit_id, adc_channel_t channel
585584{
586585 return adc_channel_to_io (unit_id , channel , io_num );
587586}
587+
588+ esp_err_t adc_continuous_parse_data (adc_continuous_handle_t handle ,
589+ const uint8_t * raw_data ,
590+ uint32_t raw_data_size ,
591+ adc_continuous_data_t * parsed_data ,
592+ uint32_t * num_parsed_samples )
593+ {
594+ // Parameter validation
595+ ESP_RETURN_ON_FALSE (handle && raw_data && parsed_data && num_parsed_samples , ESP_ERR_INVALID_ARG , ADC_TAG , "invalid argument" );
596+
597+ // Buffer size validation
598+ if (raw_data_size == 0 || raw_data_size % SOC_ADC_DIGI_RESULT_BYTES != 0 ) {
599+ * num_parsed_samples = 0 ;
600+ return ESP_ERR_INVALID_SIZE ;
601+ }
602+
603+ // Calculate number of samples
604+ uint32_t samples_to_parse = raw_data_size / SOC_ADC_DIGI_RESULT_BYTES ;
605+
606+ for (uint32_t i = 0 ; i < samples_to_parse ; i ++ ) {
607+ adc_digi_output_data_t * p = (adc_digi_output_data_t * )& raw_data [i * SOC_ADC_DIGI_RESULT_BYTES ];
608+ #if CONFIG_IDF_TARGET_ESP32
609+ parsed_data [i ].unit = ADC_UNIT_1 ;
610+ parsed_data [i ].channel = p -> type1 .channel ;
611+ parsed_data [i ].raw_data = p -> type1 .data ;
612+ parsed_data [i ].valid = (parsed_data [i ].channel < SOC_ADC_CHANNEL_NUM (parsed_data [i ].unit ));
613+ #elif CONFIG_IDF_TARGET_ESP32S2
614+ if (handle -> format == ADC_DIGI_OUTPUT_FORMAT_TYPE2 ) {
615+ parsed_data [i ].unit = p -> type2 .unit ? ADC_UNIT_2 : ADC_UNIT_1 ;
616+ parsed_data [i ].channel = p -> type2 .channel ;
617+ parsed_data [i ].raw_data = p -> type2 .data ;
618+ parsed_data [i ].valid = (parsed_data [i ].channel < SOC_ADC_CHANNEL_NUM (parsed_data [i ].unit ));
619+ } else if (handle -> format == ADC_DIGI_OUTPUT_FORMAT_TYPE1 ) {
620+ parsed_data [i ].unit = handle -> use_adc1 ? ADC_UNIT_1 : ADC_UNIT_2 ;
621+ parsed_data [i ].channel = p -> type1 .channel ;
622+ parsed_data [i ].raw_data = p -> type1 .data ;
623+ parsed_data [i ].valid = (parsed_data [i ].channel < SOC_ADC_CHANNEL_NUM (parsed_data [i ].unit ));
624+ }
625+ #else
626+ #if CONFIG_SOC_ADC_PERIPH_NUM == 1
627+ parsed_data [i ].unit = ADC_UNIT_1 ;
628+ #else
629+ parsed_data [i ].unit = p -> type2 .unit ? ADC_UNIT_2 : ADC_UNIT_1 ;
630+ #endif
631+ parsed_data [i ].channel = (parsed_data [i ].unit == ADC_UNIT_2 ) ? p -> type2 .channel - ADC_LL_UNIT2_CHANNEL_SUBSTRATION : p -> type2 .channel ;
632+ parsed_data [i ].raw_data = p -> type2 .data ;
633+ parsed_data [i ].valid = (parsed_data [i ].channel < SOC_ADC_CHANNEL_NUM (parsed_data [i ].unit ));
634+ #endif
635+ }
636+
637+ * num_parsed_samples = samples_to_parse ;
638+ return ESP_OK ;
639+ }
640+
641+ esp_err_t adc_continuous_read_parse (adc_continuous_handle_t handle ,
642+ adc_continuous_data_t * parsed_data ,
643+ uint32_t max_samples ,
644+ uint32_t * num_samples ,
645+ uint32_t timeout_ms )
646+ {
647+ // Parameter validation
648+ ESP_RETURN_ON_FALSE (handle && parsed_data && num_samples , ESP_ERR_INVALID_ARG , ADC_TAG , "invalid argument" );
649+
650+ // Allocate raw data buffer based on max_samples
651+ uint32_t raw_buffer_size = max_samples * SOC_ADC_DIGI_RESULT_BYTES ;
652+ uint8_t * raw_data = malloc (raw_buffer_size );
653+ if (raw_data == NULL ) {
654+ * num_samples = 0 ;
655+ return ESP_ERR_NO_MEM ;
656+ }
657+
658+ uint32_t out_length = 0 ;
659+ esp_err_t read_ret = adc_continuous_read (handle , raw_data , raw_buffer_size , & out_length , timeout_ms );
660+ if (read_ret != ESP_OK ) {
661+ free (raw_data );
662+ * num_samples = 0 ;
663+ return read_ret ;
664+ }
665+
666+ esp_err_t parse_ret = adc_continuous_parse_data (handle , raw_data , out_length , parsed_data , num_samples );
667+
668+ free (raw_data );
669+
670+ return parse_ret ;
671+ }
0 commit comments