156 lines
4.8 KiB
C
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_ */
|