200 size_t write(
const uint8_t *src,
size_t size_bytes)
override {
205 int16_t *data16 = (int16_t *)src;
206 uint8_t *data8 = (uint8_t *)src;
207 int samples = size_bytes / 2;
210 for (
int j = 0; j < samples; j++) {
211 data8[j] = (32768u + data16[j]) >> 8;
214 if (dac_continuous_write(self->dac_handle, data8, samples, &result, self->cfg.timeout) != ESP_OK) {
243 size_t readBytes(uint8_t *dest,
size_t size_bytes) {
246 size_t total_bytes = 0;
247 size_t bytes_provided = 0;
248 int min_samples_in_fifo_per_channel = 0;
249 int max_samples_in_fifo_per_channel = 0;
253 int samples_provided_per_channel = 0;
254 int data_milliVolts = 0;
256 int samples_requested = size_bytes /
sizeof(int16_t);
257 int samples_requested_per_channel = samples_requested/self->cfg.
channels;
259 adc_digi_output_data_t* result_data = (adc_digi_output_data_t*)malloc(samples_requested *
sizeof(adc_digi_output_data_t));
260 if (result_data == NULL) {
261 LOGE(
"Failed to allocate memory for result_data");
264 memset(result_data, 0, samples_requested *
sizeof(adc_digi_output_data_t));
268 uint16_t *result16 = (uint16_t *)dest;
269 uint16_t *
end = (uint16_t *)(dest + size_bytes);
273 if (adc_continuous_read(self->adc_handle, (uint8_t *)result_data, (uint32_t)(samples_requested *
sizeof(adc_digi_output_data_t)), &bytes_read, (uint32_t)self->cfg.timeout) == ESP_OK) {
274 samples_read = bytes_read /
sizeof(adc_digi_output_data_t);
275 LOGD(
"adc_continuous_read -> %u bytes / %d samples of %d bytes requested", (
unsigned)bytes_read, samples_read, (
int)(samples_requested *
sizeof(adc_digi_output_data_t)));
278 for (
int i = 0; i < samples_read; i++) {
279 adc_digi_output_data_t *p = &result_data[i];
280 ADC_CHANNEL_TYPE chan_num = AUDIO_ADC_GET_CHANNEL(p);
281 ADC_DATA_TYPE data = AUDIO_ADC_GET_DATA(p);
285 for (
int j = 0; j < self->cfg.
channels; ++j) {
286 if (self->cfg.adc_channels[j] == chan_num) {
293 if (self->fifo_buffers[idx]->push(data)) {
294 LOGD(
"Sample %d, FIFO %d, ch %u, d %u", i, idx, (
unsigned)chan_num, (
unsigned)data);
296 LOGE(
"Sample %d, FIFO buffer is full, ch %u, d %u", i, (
unsigned)chan_num, (
unsigned)data);
299 LOGE(
"Sample %d, ch %u not found in configuration, d: %u", i, (
unsigned)chan_num, (
unsigned)data);
300 for (
int k = 0; k < self->cfg.
channels; ++k) {
301 LOGE(
"Available config ch: %u", self->cfg.adc_channels[k]);
308 min_samples_in_fifo_per_channel = self->fifo_buffers[0]->size();
309 for (
int i = 1; i < self->cfg.
channels; i++) {
310 fifo_size = self->fifo_buffers[i]->size();
311 if (fifo_size < min_samples_in_fifo_per_channel) {
312 min_samples_in_fifo_per_channel = fifo_size;
317 while (samples_requested_per_channel > min_samples_in_fifo_per_channel) {
321 if (adc_continuous_read(self->adc_handle, (uint8_t *)result_data, (uint32_t)(2*self->cfg.
channels *
sizeof(adc_digi_output_data_t)), &bytes_read, (uint32_t)self->cfg.timeout) != ESP_OK) {
322 LOGE(
"Top off, adc_continuous_read unsuccessful");
327 samples_read = bytes_read /
sizeof(adc_digi_output_data_t);
328 LOGD(
"Top Off: Requested %d samples per Channel, Min samples in FIFO: %d, Read additional %d bytes / %d samples", samples_requested_per_channel, min_samples_in_fifo_per_channel, (
unsigned)bytes_read, samples_read);
330 for (
int i = 0; i < samples_read; i++) {
331 adc_digi_output_data_t *p = &result_data[i];
332 ADC_CHANNEL_TYPE chan_num = AUDIO_ADC_GET_CHANNEL(p);
333 ADC_DATA_TYPE data = AUDIO_ADC_GET_DATA(p);
337 for (
int j = 0; j < self->cfg.
channels; ++j) {
338 if (self->cfg.adc_channels[j] == chan_num) {
345 if (self->fifo_buffers[idx]->push(data)) {
346 LOGD(
"Top Off Sample %d, FIFO %d, ch %u, d %u", i, idx, (
unsigned)chan_num, (
unsigned)data);
348 LOGE(
"Top Off Sample %d, FIFO buffer is full, ch %u, d %u", i, (
unsigned)chan_num, (
unsigned)data);
351 LOGE(
"Top Off Sample %d, ch %u not found in configuration, d %u", i, (
unsigned)chan_num, (
unsigned)data);
352 for (
int k = 0; k < self->cfg.
channels; ++k) {
353 LOGE(
"Available config ch: %u", self->cfg.adc_channels[k]);
359 min_samples_in_fifo_per_channel = self->fifo_buffers[0]->size();
360 max_samples_in_fifo_per_channel = self->fifo_buffers[0]->size();
361 for (
int i = 1; i < self->cfg.
channels; i++) {
362 fifo_size = self->fifo_buffers[i]->size();
363 if (fifo_size < min_samples_in_fifo_per_channel) {
364 min_samples_in_fifo_per_channel = fifo_size;
366 if (fifo_size > max_samples_in_fifo_per_channel) {
367 max_samples_in_fifo_per_channel = fifo_size;
370 LOGD(
"Min # of samples in FIFO: %d, Max # of samples in FIFO: %d", min_samples_in_fifo_per_channel, max_samples_in_fifo_per_channel);
374 if (samples_requested_per_channel <= min_samples_in_fifo_per_channel) {
375 LOGD(
"Going to copying %d samples of %d samples/channel to output buffer", samples_requested, samples_requested_per_channel);
376 samples_provided_per_channel = samples_requested_per_channel;
379 LOGE(
"Only %d samples per channel available for output buffer", min_samples_in_fifo_per_channel);
380 samples_provided_per_channel = min_samples_in_fifo_per_channel;
383 for (
int i = 0; i < samples_provided_per_channel; i++) {
384 for (
int j = 0; j < self->cfg.
channels; j++) {
386 self->fifo_buffers[j]->pop(data);
387 if (result16 <
end) {
388 if (self->cfg.adc_calibration_active) {
390 auto err = adc_cali_raw_to_voltage(self->adc_cali_handle, (
int)data, &data_milliVolts);
392 *result16 =
static_cast<int16_t
>(data_milliVolts);
394 LOGE(
"adc_cali_raw_to_voltage error: %d", err);
402 LOGE(
"Buffer write overflow, skipping data");
407 bytes_provided = samples_provided_per_channel * self->cfg.
channels *
sizeof(int16_t);
410 if (self->cfg.is_auto_center_read) {
411 self->auto_center.convert(dest, bytes_provided);
415 LOGE(
"adc_continuous_read unsuccessful");
419 return bytes_provided;
753 if (!cfg.adc_calibration_active)
760 esp_err_t err = ESP_OK;
762 if (adc_cali_handle == NULL) {
763 #if ADC_CALI_SCHEME_CURVE_FITTING_SUPPORTED
765 adc_cali_curve_fitting_config_t cali_config;
766 cali_config.unit_id = cfg.adc_unit;
767 cali_config.atten = (adc_atten_t)cfg.adc_attenuation;
768 cali_config.bitwidth = (adc_bitwidth_t)cfg.adc_bit_width;
769 err = adc_cali_create_scheme_curve_fitting(&cali_config, &adc_cali_handle);
770 #elif !defined(CONFIG_IDF_TARGET_ESP32H2) && !defined(CONFIG_IDF_TARGET_ESP32P4)
772 adc_cali_line_fitting_config_t cali_config;
773 cali_config.unit_id = cfg.adc_unit;
774 cali_config.atten = (adc_atten_t)cfg.adc_attenuation;
775 cali_config.bitwidth = (adc_bitwidth_t)cfg.adc_bit_width;
776 err = adc_cali_create_scheme_line_fitting(&cali_config, &adc_cali_handle);
779 LOGE(
"creating calibration handle failed for ADC%d with atten %d and bitwidth %d",
780 cfg.adc_unit, cfg.adc_attenuation, cfg.adc_bit_width);
783 LOGI(
"enabled calibration for ADC%d with atten %d and bitwidth %d",
784 cfg.adc_unit, cfg.adc_attenuation, cfg.adc_bit_width);