#include <cstdint>
/** ADC step values for pressure conversion.
*
* These constants define the ADC range for pressure measurements.
* adStep[0] = minimum ADC value
* adStep[1] = mid ADC value (not used in current implementation)
* adStep[2] = maximum ADC value
*/
static constexpr uint32_t adStep[3] = {0, 512, 1023};
/** Convert ADC value to bars.
*
* Converts an ADC reading to pressure in bars using linear interpolation
* between minimum and maximum ADC values.
*
* @param ad_val The ADC value to convert (0-1023).
* @return Pressure in bars (0.0 to 2.0).
*/
float convertToBars(uint32_t ad_val) {
if (ad_val < adStep[0]) {
return 0.0f;
}
if (ad_val > adStep[2]) {
return 2.0f;
}
uint32_t max = adStep[2] - adStep[0];
uint32_t val = ad_val - adStep[0];
return (static_cast<float>(val) / max) * 2.0f;
}
/** User-defined literal for bars.
*
* Allows writing pressure values directly as literals, e.g., 30_Bars.
*
* @param value The ADC value.
* @return Pressure in bars.
*/
float operator""_Bars(unsigned long long value) {
return convertToBars(static_cast<uint32_t>(value));
}
/** User-defined literal for millibars.
*
* Allows writing pressure values directly as literals, e.g., 30_mBars.
* Note: This currently uses the same conversion as bars.
*
* @param value The ADC value.
* @return Pressure in millibars.
*/
float operator""_mBars(unsigned long long value) {
return convertToBars(static_cast<uint32_t>(value));
}
/** Main function demonstrating pressure literals.
*
* Demonstrates how to use the custom literals for pressure conversion.
*
* @return Exit status (0 for success).
*/
int main() {
float bars = 30_Bars;
float millibars = 30_mBars;
return 0;
}