Skip to content

Commit 73ffd51

Browse files
committed
fix: static can_interface lib, service user sed, release assets, CAN/model improvements
1 parent a884589 commit 73ffd51

16 files changed

Lines changed: 1012 additions & 652 deletions

.github/workflows/release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,10 @@ jobs:
9999
files: |
100100
cluster-arm64
101101
build-info.txt
102+
VERSION
102103
scripts/install.sh
103104
scripts/update.sh
105+
scripts/cluster-kiosk.service
106+
scripts/cluster-update.service
104107
generate_release_notes: true
105108
make_latest: true

.qtcreator/CMakeLists.txt.user

Lines changed: 318 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 91 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,91 @@
1-
#include "ClusterModel.hpp"
2-
#include <linux/can.h>
3-
#include <QThread>
4-
#include <iostream>
5-
6-
ClusterModel::ClusterModel(QObject *parent) : QObject(parent) {
7-
// can_frame을 Qt 메타타입으로 등록 (스레드 간 전달을 위해)
8-
qRegisterMetaType<can_frame>("can_frame");
9-
}
10-
11-
void ClusterModel::setCANInterface(std::unique_ptr<CANInterface> can_interface) {
12-
can_interface_ = std::move(can_interface);
13-
connect(can_interface_.get(), &CANInterface::frameReceived,
14-
this, &ClusterModel::onFrameReceived);
15-
}
16-
17-
void ClusterModel::startReceiving() {
18-
if (!can_interface_) return;
19-
20-
// CAN interface를 별도 스레드에서 실행
21-
QThread *thread = new QThread;
22-
can_interface_->moveToThread(thread);
23-
24-
connect(thread, &QThread::started, can_interface_.get(), &CANInterface::start);
25-
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
26-
27-
thread->start();
28-
}
29-
30-
void ClusterModel::stopReceiving() {
31-
if (can_interface_) {
32-
can_interface_->stop();
33-
}
34-
}
35-
36-
void ClusterModel::onFrameReceived(const can_frame &frame) {
37-
parseCANFrame(frame);
38-
}
39-
40-
void ClusterModel::parseCANFrame(const can_frame &frame) {
41-
// CAN ID에 따라 데이터 파싱
42-
// 예시: 0x100 = 속도, 0x200 = RPM, 0x300 = 연료, 0x400 = 온도
43-
44-
switch (frame.can_id) {
45-
case 0x100: // 속도 (km/h)
46-
if (frame.can_dlc >= 2) {
47-
int new_speed = (frame.data[0] << 8) | frame.data[1];
48-
if (new_speed != speed_) {
49-
speed_ = new_speed;
50-
emit speedChanged(speed_);
51-
}
52-
}
53-
break;
54-
55-
case 0x200: // RPM
56-
if (frame.can_dlc >= 2) {
57-
int new_rpm = (frame.data[0] << 8) | frame.data[1];
58-
if (new_rpm != rpm_) {
59-
rpm_ = new_rpm;
60-
emit rpmChanged(rpm_);
61-
}
62-
}
63-
break;
64-
65-
case 0x300: // 연료 레벨 (0-100%)
66-
if (frame.can_dlc >= 1) {
67-
int new_fuel = frame.data[0];
68-
if (new_fuel != fuel_level_) {
69-
fuel_level_ = new_fuel;
70-
emit fuelLevelChanged(fuel_level_);
71-
}
72-
}
73-
break;
74-
75-
case 0x400: // 온도 (섭씨)
76-
if (frame.can_dlc >= 1) {
77-
int new_temp = frame.data[0];
78-
if (new_temp != temperature_) {
79-
temperature_ = new_temp;
80-
emit temperatureChanged(temperature_);
81-
}
82-
}
83-
break;
84-
85-
default:
86-
std::cout << "Unknown CAN ID: 0x" << std::hex << frame.can_id << std::dec << std::endl;
87-
break;
88-
}
89-
}
1+
#include "ClusterModel.hpp"
2+
#ifndef _WIN32
3+
#include <linux/can.h>
4+
#endif
5+
#include <QThread>
6+
#include <iostream>
7+
8+
ClusterModel::ClusterModel(QObject *parent) : QObject(parent) {
9+
// can_frame을 Qt 메타타입으로 등록 (스레드 간 전달을 위해)
10+
qRegisterMetaType<can_frame>("can_frame");
11+
}
12+
13+
void ClusterModel::setCANInterface(std::unique_ptr<CANInterface> can_interface) {
14+
can_interface_ = std::move(can_interface);
15+
connect(can_interface_.get(), &CANInterface::frameReceived,
16+
this, &ClusterModel::onFrameReceived);
17+
}
18+
19+
void ClusterModel::startReceiving() {
20+
if (!can_interface_) return;
21+
22+
// CAN interface를 별도 스레드에서 실행
23+
QThread *thread = new QThread;
24+
can_interface_->moveToThread(thread);
25+
26+
connect(thread, &QThread::started, can_interface_.get(), &CANInterface::start);
27+
connect(thread, &QThread::finished, thread, &QThread::deleteLater);
28+
29+
thread->start();
30+
}
31+
32+
void ClusterModel::stopReceiving() {
33+
if (can_interface_) {
34+
can_interface_->stop();
35+
}
36+
}
37+
38+
void ClusterModel::onFrameReceived(const can_frame &frame) {
39+
parseCANFrame(frame);
40+
}
41+
42+
void ClusterModel::parseCANFrame(const can_frame &frame) {
43+
// CAN ID에 따라 데이터 파싱
44+
// 예시: 0x100 = 속도, 0x200 = RPM, 0x300 = 연료, 0x400 = 온도
45+
46+
switch (frame.can_id) {
47+
case 0x100: // 속도 (km/h)
48+
if (frame.can_dlc >= 2) {
49+
int new_speed = (frame.data[0] << 8) | frame.data[1];
50+
if (new_speed != speed_) {
51+
speed_ = new_speed;
52+
emit speedChanged(speed_);
53+
}
54+
}
55+
break;
56+
57+
case 0x200: // RPM
58+
if (frame.can_dlc >= 2) {
59+
int new_rpm = (frame.data[0] << 8) | frame.data[1];
60+
if (new_rpm != rpm_) {
61+
rpm_ = new_rpm;
62+
emit rpmChanged(rpm_);
63+
}
64+
}
65+
break;
66+
67+
case 0x300: // 연료 레벨 (0-100%)
68+
if (frame.can_dlc >= 1) {
69+
int new_fuel = frame.data[0];
70+
if (new_fuel != fuel_level_) {
71+
fuel_level_ = new_fuel;
72+
emit fuelLevelChanged(fuel_level_);
73+
}
74+
}
75+
break;
76+
77+
case 0x400: // 온도 (섭씨)
78+
if (frame.can_dlc >= 1) {
79+
int new_temp = frame.data[0];
80+
if (new_temp != temperature_) {
81+
temperature_ = new_temp;
82+
emit temperatureChanged(temperature_);
83+
}
84+
}
85+
break;
86+
87+
default:
88+
std::cout << "Unknown CAN ID: 0x" << std::hex << frame.can_id << std::dec << std::endl;
89+
break;
90+
}
91+
}
Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,47 +1,47 @@
1-
#ifndef CLUSTER_CLUSTERMODEL_HPP
2-
#define CLUSTER_CLUSTERMODEL_HPP
3-
4-
#include <QObject>
5-
#include <memory>
6-
#include "CANInterface.hpp"
7-
8-
struct can_frame;
9-
10-
class ClusterModel : public QObject {
11-
Q_OBJECT
12-
public:
13-
explicit ClusterModel(QObject *parent = nullptr);
14-
~ClusterModel() override = default;
15-
16-
void setCANInterface(std::unique_ptr<CANInterface> can_interface);
17-
void startReceiving();
18-
void stopReceiving();
19-
20-
// Getters for cluster data
21-
int getSpeed() const { return speed_; }
22-
int getRpm() const { return rpm_; }
23-
int getFuelLevel() const { return fuel_level_; }
24-
int getTemperature() const { return temperature_; }
25-
26-
signals:
27-
void speedChanged(int speed);
28-
void rpmChanged(int rpm);
29-
void fuelLevelChanged(int fuel);
30-
void temperatureChanged(int temp);
31-
32-
private slots:
33-
void onFrameReceived(const can_frame &frame);
34-
35-
private:
36-
void parseCANFrame(const can_frame &frame);
37-
38-
std::unique_ptr<CANInterface> can_interface_;
39-
40-
// Cluster data
41-
int speed_{0};
42-
int rpm_{0};
43-
int fuel_level_{100};
44-
int temperature_{90};
45-
};
46-
47-
#endif // CLUSTER_CLUSTERMODEL_HPP
1+
#ifndef CLUSTER_CLUSTERMODEL_HPP
2+
#define CLUSTER_CLUSTERMODEL_HPP
3+
4+
#include <QObject>
5+
#include <memory>
6+
#include "CANInterface.hpp"
7+
8+
struct can_frame;
9+
10+
class ClusterModel : public QObject {
11+
Q_OBJECT
12+
public:
13+
explicit ClusterModel(QObject *parent = nullptr);
14+
~ClusterModel() override = default;
15+
16+
void setCANInterface(std::unique_ptr<CANInterface> can_interface);
17+
void startReceiving();
18+
void stopReceiving();
19+
20+
// Getters for cluster data
21+
int getSpeed() const { return speed_; }
22+
int getRpm() const { return rpm_; }
23+
int getFuelLevel() const { return fuel_level_; }
24+
int getTemperature() const { return temperature_; }
25+
26+
signals:
27+
void speedChanged(int speed);
28+
void rpmChanged(int rpm);
29+
void fuelLevelChanged(int fuel);
30+
void temperatureChanged(int temp);
31+
32+
private slots:
33+
void onFrameReceived(const can_frame &frame);
34+
35+
private:
36+
void parseCANFrame(const can_frame &frame);
37+
38+
std::unique_ptr<CANInterface> can_interface_;
39+
40+
// Cluster data
41+
int speed_{0};
42+
int rpm_{0};
43+
int fuel_level_{100};
44+
int temperature_{90};
45+
};
46+
47+
#endif // CLUSTER_CLUSTERMODEL_HPP

0 commit comments

Comments
 (0)