InterfaceGPS 0.1.0
Interface embarquée Qt pour navigation, multimédia, caméra et télémétrie
Chargement...
Recherche...
Aucune correspondance
gpstelemetrysource.cpp
Aller à la documentation de ce fichier.
1
10#include "telemetrydata.h"
11#include <QDebug>
12
14 : QObject(parent), m_data(data)
15{
16 // Initialisation de l'interface série mat�rielle
17 m_serial = new QSerialPort(this);
18}
19
23
24void GpsTelemetrySource::start(const QString& portName) {
25 // Redémarrage idempotent : on repart d'un état propre et on referme le port
26 // s'il �tait déjà ouvert avant toute nouvelle tentative.
27 stop();
28
29 // Configuration de la connexion physique au module GPS (ex: NEO-6M)
30 m_serial->setPortName(portName);
31 m_serial->setBaudRate(QSerialPort::Baud9600); // 9600 bauds est le standard industriel NMEA par défaut
32
33 if (!m_serial->open(QIODevice::ReadOnly)) {
34 qCritical() << "? Erreur : Impossible d’ouvrir le module GPS sur le port" << portName;
35 if(m_data) m_data->setGpsOk(false);
36 return;
37 }
38
39 // Création du parseur NMEA en "RealTimeMode" (lit le flux en direct au lieu d'un fichier log)
40 m_nmeaSource = new QNmeaPositionInfoSource(QNmeaPositionInfoSource::RealTimeMode, this);
41 m_nmeaSource->setDevice(m_serial);
42
43 // Connexion du moteur Qt Positioning � notre logique métier
44 connect(m_nmeaSource, &QNmeaPositionInfoSource::positionUpdated,
45 this, &GpsTelemetrySource::onPositionUpdated);
46
47 // Démarrage de la boucle de lecture
48 m_nmeaSource->startUpdates();
49
50 qDebug() << "? GPS D�marr� (Mode Qt Positioning) sur" << portName;
51}
52
54 // L'arrêt explicite du parseur et la suppression de l'objet évitent
55 // des callbacks fantômes lors des changements d'état de l'application.
56 if (m_nmeaSource) {
57 m_nmeaSource->stopUpdates();
58 delete m_nmeaSource;
59 m_nmeaSource = nullptr;
60 }
61
62 // Lib�ration mat�rielle du port série
63 if (m_serial->isOpen()) {
64 m_serial->close();
65 }
66}
67
68void GpsTelemetrySource::onPositionUpdated(const QGeoPositionInfo &info) {
69 if (!m_data) return;
70
71 if (info.isValid()) {
72 // Le module GPS "fixe" les satellites (position 3D valid�e)
73 m_data->setGpsOk(true);
74
75 QGeoCoordinate coord = info.coordinate();
76 m_data->setLat(coord.latitude());
77 m_data->setLon(coord.longitude());
78
79 // Extraction de la vitesse (si la trame NMEA RMC ou VTG la fournit)
80 double speedMs = 0.0;
81 if (info.hasAttribute(QGeoPositionInfo::GroundSpeed)) {
82 speedMs = info.attribute(QGeoPositionInfo::GroundSpeed); // En m�tres par seconde
83 m_data->setSpeedKmh(speedMs * 3.6); // Conversion en km/h pour l'affichage tableau de bord
84 }
85
86 // Extraction du cap (Direction)
87 if (info.hasAttribute(QGeoPositionInfo::Direction)) {
88 double course = info.attribute(QGeoPositionInfo::Direction);
89
90 // LOGIQUE M�TIER CRITIQUE :
91 // Sous une faible vitesse, le calcul de cap (Heading) par le GPS devient erratique
92 // car le module ne peut plus d�terminer l'avant de l'arri�re.
93 // On applique un seuil (3 km/h) pour éviter que la carte GPS ne pivote brutalement
94 // dans tous les sens lorsque le v�hicule est arrêt� � un feu rouge.
95 /*if (speedMs * 3.6 > 3.0) {
96 m_data->setHeading(course);
97 }*/
98 }
99 } else {
100 // Le GPS est allum� mais cherche encore ses satellites (Cold/Warm start)
101 m_data->setGpsOk(false);
102 qDebug() << "GPS : En attente de satellites (No Fix)...";
103 }
104}
GpsTelemetrySource(TelemetryData *data, QObject *parent=nullptr)
Constructeur de la source GPS.
~GpsTelemetrySource()
Destructeur. Assure la fermeture propre du port série.
void stop()
Arrête l'acquisition GPS et libère le port matériel.
void start(const QString &portName="/dev/serial0")
Démarre l'acquisition des données GPS. Configure le port série (baudrate) et lance le parsing NMEA en...
Classe représentant les données en temps réel du véhicule. Cette classe hérite de QObject et centrali...
Rôle architectural : Source de télémétrie GPS branchée sur un flux NMEA série.
Rôle architectural : Modèle central de télémétrie partagé entre les modules C++ et l'interface QML.