-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserialmanager.cpp
More file actions
108 lines (94 loc) · 3.13 KB
/
serialmanager.cpp
File metadata and controls
108 lines (94 loc) · 3.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
* @file serialmanager.cpp
* @brief Implementacja klasy SerialManager obsługującej komunikację szeregową oraz parsowanie danych.
*/
#include "serialmanager.h"
#include <QDebug>
/**
* @brief Konstruktor klasy SerialManager.
* Inicjalizuje obiekt QSerialPort oraz łączy sygnał `readyRead()` z metodą `readData()`.
* @param parent Obiekt nadrzędny (domyślnie nullptr).
*/
SerialManager::SerialManager(QObject *parent)
: QObject(parent), serial(new QSerialPort(this))
{
connect(serial, &QSerialPort::readyRead, this, &SerialManager::readData);
}
/**
* @brief Rozpoczyna nasłuch na wskazanym porcie szeregowym.
* @param portName Nazwa portu szeregowego, np. "/dev/ttyUSB0".
*/
void SerialManager::start(const QString &portName)
{
serial->setPortName(portName);
serial->setBaudRate(QSerialPort::Baud9600);
if (!serial->open(QIODevice::ReadOnly)) {
emit serialError("!Nie można otworzyć portu: " + portName);
}
}
/**
* @brief Odczytuje dostępne linie z portu szeregowego i przekazuje je do parsera.
*
* Funkcja wywoływana automatycznie po odebraniu danych (readyRead).
*/
void SerialManager::readData()
{
while (serial->canReadLine()) {
QByteArray data = serial->readLine();
QString line = QString::fromUtf8(data).trimmed();
ParsedPacket packet = parseSerialLine(line);
emit newPacketReceived(packet);
}
}
/**
* @brief Parsuje linię tekstu odebraną z portu szeregowego.
*
* Linia może zawierać:
* - Współrzędne geograficzne (latitude;longitude)
* - Dane sensorów
* - Dodatkowy log tekstowy poprzedzony znakiem `!`
*
* Przykład:
* ```
* 51.107;17.038;12.5;3.14;8.9!Błąd pomiaru temperatury
* ```
*
* @param line Linia danych wejściowych.
* @return Parsowana struktura danych ParsedPacket.
*/
ParsedPacket SerialManager::parseSerialLine(const QString &line)
{
ParsedPacket result;
result.hasPosition = false;
QString cleanLine = line.trimmed();
int logIndex = cleanLine.indexOf('!');
QString dataPart = (logIndex >= 0) ? cleanLine.left(logIndex) : cleanLine;
QString logPart = (logIndex >= 0) ? cleanLine.mid(logIndex + 1) : "";
QStringList items = dataPart.split(';', Qt::SkipEmptyParts);
if (items.size() >= 2) {
bool latOk = false, lonOk = false;
double lat = items[0].toDouble(&latOk);
double lon = items[1].toDouble(&lonOk);
if (latOk && lonOk) {
result.latitude = lat;
result.longitude = lon;
qDebug() << lat << " , " << lon;
result.hasPosition = true;
// Pozostałe elementy to sensory
for (int i = 2; i < items.size(); ++i) {
bool ok;
double val = items[i].toDouble(&ok);
if (ok) result.sensors.append(val);
}
} else {
// Jeśli współrzędne niepoprawne, potraktuj wszystko jako sensory
for (const QString &item : items) {
bool ok;
double val = item.toDouble(&ok);
if (ok) result.sensors.append(val);
}
}
}
result.log = logPart;
return result;
}