stm32-moto/Core/Inc/moto_config.h

156 lines
4.8 KiB
C

/*
* moto_config.h
*
* Created on: Jul 24, 2025
* Author: loren
*/
#ifndef INC_MOTO_CONFIG_H_
#define INC_MOTO_CONFIG_H_
#include <stdbool.h>
#include <stdint.h>
//------------------------------------------------------------------------------
// Constantes de configuration moto
//------------------------------------------------------------------------------
// Seuils d'alerte d'inclinaison (en degrés)
#define MOTO_ROLL_WARNING_THRESHOLD 20.0f // Avertissement inclinaison
#define MOTO_ROLL_DANGER_THRESHOLD 35.0f // Danger inclinaison
#define MOTO_PITCH_WHEELIE_THRESHOLD 25.0f // Détection wheelie
#define MOTO_PITCH_STOPPIE_THRESHOLD -25.0f // Détection stoppie
// Seuils de vitesse angulaire (degrés/s)
#define MOTO_GYRO_RAPID_TURN_THRESHOLD 100.0f // Virage rapide
#define MOTO_GYRO_CRASH_THRESHOLD 300.0f // Possible chute
// Filtrage et échantillonnage
#define MOTO_SAMPLE_RATE_HZ 100 // Fréquence d'échantillonnage
#define MOTO_SAMPLE_PERIOD (1.0f / MOTO_SAMPLE_RATE_HZ)
#define MOTO_MAG_FILTER_ALPHA 0.1f // Filtre magnétomètre
#define MOTO_ANGLE_FILTER_ALPHA 0.2f // Filtre angles affichés
// Calibration magnétomètre (à ajuster selon votre environnement)
#define MOTO_MAG_OFFSET_X 0.0f
#define MOTO_MAG_OFFSET_Y 0.0f
#define MOTO_MAG_OFFSET_Z 0.0f
#define MOTO_MAG_SCALE_X 1.0f
#define MOTO_MAG_SCALE_Y 1.0f
#define MOTO_MAG_SCALE_Z 1.0f
//------------------------------------------------------------------------------
// Types de données
//------------------------------------------------------------------------------
typedef enum {
MOTO_STATE_NORMAL = 0,
MOTO_STATE_WARNING,
MOTO_STATE_DANGER,
MOTO_STATE_WHEELIE,
MOTO_STATE_STOPPIE,
MOTO_STATE_RAPID_TURN,
MOTO_STATE_POSSIBLE_CRASH
} MotoState_t;
typedef struct {
float roll;
float pitch;
float yaw;
float roll_filtered;
float pitch_filtered;
float yaw_filtered;
MotoState_t state;
bool is_initializing;
uint32_t crash_detect_counter;
uint32_t last_update_time;
} MotoData_t;
typedef struct {
float max_roll;
float min_roll;
float max_pitch;
float min_pitch;
float max_gyro_x;
float max_gyro_y;
float max_gyro_z;
uint32_t total_samples;
uint32_t warning_count;
uint32_t danger_count;
} MotoStats_t;
//------------------------------------------------------------------------------
// Prototypes de fonctions
//------------------------------------------------------------------------------
/**
* @brief Initialise les données moto
* @param data Pointeur vers la structure de données moto
*/
void Moto_InitData(MotoData_t *data);
/**
* @brief Met à jour l'état de la moto basé sur les angles
* @param data Pointeur vers la structure de données moto
* @param roll Angle de roulis en degrés
* @param pitch Angle de tangage en degrés
* @param yaw Angle de lacet en degrés
* @param gyro_x Vitesse angulaire X en dps
* @param gyro_y Vitesse angulaire Y en dps
* @param gyro_z Vitesse angulaire Z en dps
*/
void Moto_UpdateState(MotoData_t *data, float roll, float pitch, float yaw,
float gyro_x, float gyro_y, float gyro_z);
/**
* @brief Applique un filtre passe-bas aux angles
* @param data Pointeur vers la structure de données moto
*/
void Moto_FilterAngles(MotoData_t *data);
/**
* @brief Retourne une chaîne décrivant l'état actuel
* @param state État de la moto
* @return Pointeur vers la chaîne de caractères
*/
const char* Moto_GetStateString(MotoState_t state);
/**
* @brief Met à jour les statistiques de conduite
* @param stats Pointeur vers la structure de statistiques
* @param data Pointeur vers les données actuelles
* @param gyro_x Vitesse angulaire X
* @param gyro_y Vitesse angulaire Y
* @param gyro_z Vitesse angulaire Z
*/
void Moto_UpdateStats(MotoStats_t *stats, const MotoData_t *data,
float gyro_x, float gyro_y, float gyro_z);
/**
* @brief Calibre les données du magnétomètre
* @param mx Pointeur vers la composante X
* @param my Pointeur vers la composante Y
* @param mz Pointeur vers la composante Z
*/
void Moto_CalibrateMagnetometer(float *mx, float *my, float *mz);
/**
* @brief Détecte une possible chute
* @param data Pointeur vers la structure de données moto
* @param gyro_magnitude Magnitude de la vitesse angulaire
* @return true si chute détectée
*/
bool Moto_DetectCrash(MotoData_t *data, float gyro_magnitude);
/**
* @brief Formate l'affichage pour l'écran LCD selon l'état
* @param data Pointeur vers les données moto
* @param line Numéro de ligne (0-3)
* @param buffer Buffer de sortie (21 caractères)
*/
void Moto_FormatDisplay(const MotoData_t *data, int line, char *buffer);
#endif /* INC_MOTO_CONFIG_H_ */