@@ -63,22 +63,6 @@ void madcblock_bits_helper(machine_adc_block_obj_t *self, mp_int_t bits) {
63
63
if (self -> unit_id == ADC_UNIT_1 ) {
64
64
adc1_config_width (self -> width );
65
65
}
66
- for (adc_atten_t atten = ADC_ATTEN_DB_0 ; atten < ADC_ATTEN_MAX ; atten ++ ) {
67
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (5 , 2 , 1 )
68
- if (self -> handle [atten ] != NULL ) {
69
- adc_cali_curve_fitting_config_t cali_config = {
70
- .unit_id = self -> unit_id ,
71
- .atten = atten ,
72
- .bitwidth = self -> width ,
73
- };
74
- check_esp_err (adc_cali_create_scheme_curve_fitting (& cali_config , self -> handle [atten ]));
75
- }
76
- #else
77
- if (self -> characteristics [atten ] != NULL ) {
78
- esp_adc_cal_characterize (self -> unit_id , atten , self -> width , DEFAULT_VREF , self -> characteristics [atten ]);
79
- }
80
- #endif
81
- }
82
66
}
83
67
84
68
mp_int_t madcblock_read_helper (machine_adc_block_obj_t * self , adc_channel_t channel_id ) {
@@ -93,30 +77,34 @@ mp_int_t madcblock_read_helper(machine_adc_block_obj_t *self, adc_channel_t chan
93
77
return raw ;
94
78
}
95
79
96
- mp_int_t madcblock_read_uv_helper (machine_adc_block_obj_t * self , adc_channel_t channel_id , adc_atten_t atten ) {
97
- int raw = madcblock_read_helper (self , channel_id );
98
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL (5 , 2 , 1 )
99
- adc_cali_handle_t * adc_handle = self -> handle [atten ];
100
- if (adc_handle == NULL ) {
101
- adc_cali_curve_fitting_config_t cali_config = {
102
- .unit_id = self -> unit_id ,
103
- .atten = atten ,
104
- .bitwidth = self -> width ,
105
- };
106
- adc_handle = malloc (sizeof (adc_cali_handle_t ));
107
- check_esp_err (adc_cali_create_scheme_curve_fitting (& cali_config , adc_handle ));
108
- self -> handle [atten ] = adc_handle ;
80
+ static esp_err_t ensure_adc_calibration (machine_adc_block_obj_t * self , adc_atten_t atten ) {
81
+ if (self -> handle [atten ] != NULL ) {
82
+ return ESP_OK ;
109
83
}
110
- int uv ;
111
- check_esp_err (adc_cali_raw_to_voltage (* adc_handle , raw , & uv ));
84
+
85
+ #if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
86
+ adc_cali_curve_fitting_config_t cali_config = {
87
+ .unit_id = self -> unit_id ,
88
+ .atten = atten ,
89
+ .bitwidth = self -> width ,
90
+ };
91
+ return adc_cali_create_scheme_curve_fitting (& cali_config , & self -> handle [atten ]);
112
92
#else
113
- esp_adc_cal_characteristics_t * adc_chars = self -> characteristics [atten ];
114
- if (adc_chars == NULL ) {
115
- adc_chars = malloc (sizeof (esp_adc_cal_characteristics_t ));
116
- esp_adc_cal_characterize (self -> unit_id , atten , self -> width , DEFAULT_VREF , adc_chars );
117
- self -> characteristics [atten ] = adc_chars ;
118
- }
119
- mp_int_t uv = esp_adc_cal_raw_to_voltage (raw , adc_chars );
93
+ adc_cali_line_fitting_config_t cali_config = {
94
+ .unit_id = self -> unit_id ,
95
+ .atten = atten ,
96
+ .bitwidth = self -> width ,
97
+ };
98
+ return adc_cali_create_scheme_line_fitting (& cali_config , & self -> handle [atten ]);
120
99
#endif
100
+ }
101
+
102
+ mp_int_t madcblock_read_uv_helper (machine_adc_block_obj_t * self , adc_channel_t channel_id , adc_atten_t atten ) {
103
+ int raw = madcblock_read_helper (self , channel_id );
104
+ int uv ;
105
+
106
+ check_esp_err (ensure_adc_calibration (self , atten ));
107
+ check_esp_err (adc_cali_raw_to_voltage (self -> handle [atten ], raw , & uv ));
108
+
121
109
return (mp_int_t )uv * 1000 ;
122
110
}
0 commit comments