/** * @file calibrateCompass.h * @author Alexander Klein (alex@kleiax.de) * @brief Contains a class to calibrate the compass module * @version 0.1 * @date 2023-05-23 * * @copyright Copyright (c) 2023 * */ #pragma once #include #include #include #include "component.h" /** * @brief A Class to calibrate the compass * * This class reads the raw values of the compass while * the rove have to be moved. The lowest and highest values * are used to calibrate the compass to the current location. */ class CalibrateCompass : public Component { public: /** * @brief State of the calibration process */ enum State { Ready, Calibrating, Finished }; /** * @brief Type for calibration data * * The data consist of 6 values. For each for the 3 axis * are to integer needed. */ struct CalibrationData { int data[3][2]; }; CalibrateCompass(QMC5883LCompass *compass); /** * @brief Starts the calibration */ void start(); /** * @brief Use the measured calibration data */ void useData(); /** * @brief Remove the measured calibration data */ void removeCalibration(); /** * @brief Reset the calibration process to start again */ void reset(); /** * @brief Save the measured calibration data to the flash */ void saveData(); /** * @brief Load the measured calibration data from the flash * */ void loadData(); State getState() const { return this->state; } CalibrationData getCalibrationData() const { return this->data; } /** * @brief Makes the calibration data printable with std::cout() * * @param stream * @param caliComp * @return std::ostream& */ friend std::ostream &operator<<(std::ostream &stream, const CalibrateCompass &caliComp); private: void runAsChild() override; void run() override; void checkDataValidity(); QMC5883LCompass *compass; State state = State::Ready; CalibrationData data{}; void clearData(); bool dataValid = false; const uint16_t maxTimeWithoutChange = 10000; uint32_t lastChange = 0; };