111 lines
2.2 KiB
C++
111 lines
2.2 KiB
C++
/**
|
|
* @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 <QMC5883LCompass.h>
|
|
#include <Preferences.h>
|
|
#include <iostream>
|
|
|
|
#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;
|
|
};
|