#pragma once #include "ICalibrationInfoCreator.h" #include namespace Incart::Usb { struct MicroMonEcgCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t channelNumber_, const std::vector& calibrationPoints) override { const CalibrationPoint& firstPoint = calibrationPoints[channelNumber_ * 2]; const CalibrationPoint& secondPoint = calibrationPoints[channelNumber_ * 2 + 1]; int32_t secondPointValue = static_cast(secondPoint.AdcValue); int32_t firstPointValue = static_cast(firstPoint.AdcValue); if (firstPoint.IsValid && secondPoint.IsValid && ((secondPointValue - firstPointValue) != 0)) { // считаем lsb "по-честному" для выдачи результата в мВ double lsb = 10.0f / (static_cast(secondPointValue) - firstPointValue); return { static_cast(lsb * 1000 * 1000), 0, firstPointValue }; // наружу выдаем в мкВ * 1000 } return {1, 0, 0}; } }; struct MicroMonReoCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t channelNumber_, const std::vector& calibrationPoints) override { const CalibrationPoint& firstPoint = calibrationPoints[channelNumber_ * 2]; const CalibrationPoint& secondPoint = calibrationPoints[channelNumber_ * 2 + 1]; int32_t secondPointValue = static_cast(secondPoint.AdcValue); int32_t firstPointValue = static_cast(firstPoint.AdcValue); double lsb = 1.0; if (firstPoint.IsValid && secondPoint.IsValid && ((secondPointValue - firstPointValue) != 0)) { lsb = 1000000.0f / (static_cast(secondPointValue) - firstPointValue); // в мОм return { static_cast(lsb * 1000), 0, firstPointValue }; } return { static_cast(lsb * 1000), 0, 0 }; } }; struct MicroMonExternAccCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t channelNumber_, const std::vector& calibrationPoints) override { const CalibrationPoint& firstPoint = calibrationPoints[channelNumber_ * 2]; const CalibrationPoint& secondPoint = calibrationPoints[channelNumber_ * 2 + 1]; int32_t secondPointValue = static_cast(secondPoint.AdcValue); int32_t firstPointValue = static_cast(firstPoint.AdcValue); double lsb = 1.0; if (firstPoint.IsValid && secondPoint.IsValid && ((secondPointValue - firstPointValue) != 0)) { lsb = 1000.0 / (static_cast(secondPointValue) - firstPointValue); // mG } return { static_cast(round(lsb * 1000)), 0, 0 }; } }; struct MicroMonInnerAccCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t channelNumber_, const std::vector& calibrationPoints) override { const CalibrationPoint& firstPoint = calibrationPoints[channelNumber_ * 2]; const CalibrationPoint& secondPoint = calibrationPoints[channelNumber_ * 2 + 1]; int32_t secondPointValue = static_cast(secondPoint.AdcValue); int32_t firstPointValue = static_cast(firstPoint.AdcValue); double lsb = 1.0; if (firstPoint.IsValid && secondPoint.IsValid && ((secondPointValue - firstPointValue) != 0)) { lsb = 1000.0 / (static_cast(secondPointValue) - firstPointValue); // mG } return { static_cast(round(lsb * 1000)), 0, firstPointValue }; } }; struct MicroMonPrsCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t /*channelNumber_*/, const std::vector& /*calibrationPoints*/) override { double lsb = 0.001; return { static_cast(lsb * 1000), 0, 0 }; // наружу выдаем в mmHg * 1000 } }; struct MicroMonTonCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t /*channelNumber_*/, const std::vector& /*calibrationPoints*/) override { double lsb = -1.0; return { static_cast(lsb * 1000 * 1000), 0, 0 }; // наружу выдаем в мкВ * 1000 } }; struct MicroMonOxyCalibrationInfoCreator : public ICalibrationInfoCreator { CalibrationInfo createCalibrationInfo(uint8_t /*channelNumber_*/, const std::vector& /*calibrationPoints*/) override { double lsb = -1.0; return { static_cast(lsb * 1000 * 1000), 0, 0 }; // наружу выдаем в мкВ * 1000 } }; } // namespace Incart::Usb