diff --git a/components/ocs_io/CMakeLists.txt b/components/ocs_io/CMakeLists.txt index 833a04db..066b2394 100644 --- a/components/ocs_io/CMakeLists.txt +++ b/components/ocs_io/CMakeLists.txt @@ -12,6 +12,8 @@ set(COMPONENT_SRCS if(IDF_TARGET STREQUAL "esp32") list(APPEND COMPONENT_SRCS "adc/target_esp32/line_fitting_converter.cpp") +elseif(IDF_TARGET STREQUAL "esp32s3") + list(APPEND COMPONENT_SRCS "adc/target_esp32/curve_fitting_converter.cpp") endif() idf_component_register( diff --git a/components/ocs_io/adc/target_esp32/curve_fitting_converter.cpp b/components/ocs_io/adc/target_esp32/curve_fitting_converter.cpp new file mode 100644 index 00000000..cac12746 --- /dev/null +++ b/components/ocs_io/adc/target_esp32/curve_fitting_converter.cpp @@ -0,0 +1,32 @@ +/* + * SPDX-FileCopyrightText: 2026 Tendry Lab + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +#include "ocs_io/adc/target_esp32/curve_fitting_converter.h" + +namespace ocs { +namespace io { +namespace adc { + +CurveFittingConverter::CurveFittingConverter(adc_unit_t unit, + adc_atten_t atten, + adc_bitwidth_t bitwidth) { + memset(&calibration_config_, 0, sizeof(calibration_config_)); + calibration_config_.unit_id = unit; + calibration_config_.atten = atten; + calibration_config_.bitwidth = bitwidth; + + ESP_ERROR_CHECK( + adc_cali_create_scheme_curve_fitting(&calibration_config_, &calibration_handle_)); +} + +CurveFittingConverter::~CurveFittingConverter() { + ESP_ERROR_CHECK(adc_cali_delete_scheme_curve_fitting(calibration_handle_)); +} + +} // namespace adc +} // namespace io +} // namespace ocs diff --git a/components/ocs_io/adc/target_esp32/curve_fitting_converter.h b/components/ocs_io/adc/target_esp32/curve_fitting_converter.h new file mode 100644 index 00000000..c8f9932e --- /dev/null +++ b/components/ocs_io/adc/target_esp32/curve_fitting_converter.h @@ -0,0 +1,34 @@ +/* + * SPDX-FileCopyrightText: 2026 Tendry Lab + * SPDX-License-Identifier: Apache-2.0 + */ + +#pragma once + +#include "esp_adc/adc_cali_scheme.h" + +#include "ocs_core/noncopyable.h" +#include "ocs_io/adc/target_esp32/basic_converter.h" + +namespace ocs { +namespace io { +namespace adc { + +//! Convert ADC raw data to calibrated voltage. +//! +//! https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/peripherals/adc_calibration.html +class CurveFittingConverter : public BasicConverter, private core::NonCopyable<> { +public: + //! Initialize. + CurveFittingConverter(adc_unit_t unit, adc_atten_t atten, adc_bitwidth_t bitwidth); + + //! Destroy. + ~CurveFittingConverter(); + +private: + adc_cali_curve_fitting_config_t calibration_config_; +}; + +} // namespace adc +} // namespace io +} // namespace ocs