57 : unit_(unit),
58 num_channels_(num_channels),
59 attenuation_(attenuation),
60 bitwidth_(ResolveBitwidth(bitwidth)),
61 reference_voltage_(reference_voltage),
62 max_raw_((1U << static_cast<uint8_t>(bitwidth_)) - 1U)
63{
64 ASSERT(channels != nullptr);
65 ASSERT(num_channels_ > 0U);
66 ASSERT(reference_voltage_ > 0.0f);
67 ASSERT(max_raw_ != 0U);
68 ASSERT(num_channels_ <= SOC_ADC_MAX_CHANNEL_NUM);
69 if ((channels == nullptr) || (num_channels_ == 0U) || (reference_voltage_ <= 0.0f) ||
70 (max_raw_ == 0U) || (num_channels_ > SOC_ADC_MAX_CHANNEL_NUM))
71 {
72 return;
73 }
74
75 channels_ = new (std::nothrow) Channel[num_channels_];
76 channel_ids_ = new (std::nothrow) adc_channel_t[num_channels_];
77 channel_ready_ = new (std::nothrow) bool[num_channels_];
78 latest_values_ = new (std::nothrow) float[num_channels_];
79 latest_raw_ = new (std::nothrow) uint16_t[num_channels_];
80 ASSERT(channels_ != nullptr);
81 ASSERT(channel_ids_ != nullptr);
82 ASSERT(channel_ready_ != nullptr);
83 ASSERT(latest_values_ != nullptr);
84 ASSERT(latest_raw_ != nullptr);
85 if ((channels_ == nullptr) || (channel_ids_ == nullptr) ||
86 (channel_ready_ == nullptr) || (latest_values_ == nullptr) ||
87 (latest_raw_ == nullptr))
88 {
89 ASSERT(false);
90 return;
91 }
92
93 for (uint8_t i = 0; i < SOC_ADC_MAX_CHANNEL_NUM; ++i)
94 {
95 channel_idx_map_[i] = kInvalidChannelIdx;
96 cali_handles_[i] = nullptr;
97 }
98
99 for (uint8_t i = 0; i < num_channels_; ++i)
100 {
101 ASSERT(IsValidChannel(channels[i]));
102 const uint8_t ch = static_cast<uint8_t>(channels[i]);
103 ASSERT(channel_idx_map_[ch] == kInvalidChannelIdx);
104 if (!IsValidChannel(channels[i]) || (channel_idx_map_[ch] != kInvalidChannelIdx))
105 {
106 return;
107 }
108
109 channels_[i] = Channel(this, i, ch);
110 channel_ids_[i] = channels[i];
111 channel_idx_map_[ch] = i;
112 channel_ready_[i] = false;
113 latest_values_[i] = 0.0f;
114 latest_raw_[i] = 0U;
115 }
116
117#if defined(CONFIG_IDF_TARGET_ESP32) && CONFIG_IDF_TARGET_ESP32 && \
118 defined(CONFIG_ESP_WIFI_ENABLED) && CONFIG_ESP_WIFI_ENABLED
119 if (unit_ == ADC_UNIT_2)
120 {
121 wifi_mode_t wifi_mode = WIFI_MODE_NULL;
122 const esp_err_t wifi_mode_err = esp_wifi_get_mode(&wifi_mode);
123 const bool wifi_active = (wifi_mode_err == ESP_OK) && (wifi_mode != WIFI_MODE_NULL);
124 ASSERT(!wifi_active);
125 if (wifi_active)
126 {
127 return;
128 }
129 }
130#endif
131
132 (void)InitCalibration();
133
134 const ContinuousInitResult cont_ans = InitContinuous(freq, dma_buf_size);
135 if (cont_ans == ContinuousInitResult::STARTED)
136 {
137 valid_ = true;
138 return;
139 }
140
141 if (cont_ans == ContinuousInitResult::FAILED)
142 {
143 ASSERT(false);
144 return;
145 }
146
147 const bool oneshot_ok = InitOneshot();
148 ASSERT(oneshot_ok);
149 if (!oneshot_ok)
150 {
151 return;
152 }
153
154 valid_ = true;
155}