2025-06-05 09:03:12 +08:00
|
|
|
#include <iostream>
|
|
|
|
|
#include <fstream>
|
|
|
|
|
#include "toml.hpp"
|
|
|
|
|
#include <chrono>
|
|
|
|
|
#include <thread>
|
|
|
|
|
#include "SerialPort.h"
|
|
|
|
|
#include "LedCommand.h"
|
2025-06-05 09:38:24 +08:00
|
|
|
#include "LedMqttSubscriber.h"
|
2025-06-05 09:03:12 +08:00
|
|
|
|
|
|
|
|
using namespace toml;
|
|
|
|
|
|
|
|
|
|
// 常红灯
|
|
|
|
|
void alwaysRed(SerialPort &serial)
|
|
|
|
|
{
|
|
|
|
|
LedCommand cmd;
|
|
|
|
|
cmd.setColor(255, 0, 0); // 红色
|
|
|
|
|
cmd.setExtCount(1);
|
|
|
|
|
auto packet = cmd.serialize();
|
|
|
|
|
|
|
|
|
|
std::cout << "发送常红数据包:";
|
|
|
|
|
for (auto b : packet)
|
|
|
|
|
printf(" %02X", b);
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
if (!serial.writeData(packet.data(), packet.size()))
|
|
|
|
|
std::cerr << "发送数据失败" << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-05 10:29:26 +08:00
|
|
|
// 常绿灯
|
|
|
|
|
void alwaysGreen(SerialPort &serial)
|
|
|
|
|
{
|
|
|
|
|
LedCommand cmd;
|
|
|
|
|
cmd.setColor(0, 255, 0); // 红色
|
|
|
|
|
cmd.setExtCount(1);
|
|
|
|
|
auto packet = cmd.serialize();
|
|
|
|
|
|
|
|
|
|
std::cout << "发送常红数据包:";
|
|
|
|
|
for (auto b : packet)
|
|
|
|
|
printf(" %02X", b);
|
|
|
|
|
std::cout << std::endl;
|
|
|
|
|
|
|
|
|
|
if (!serial.writeData(packet.data(), packet.size()))
|
|
|
|
|
std::cerr << "发送数据失败" << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-05 09:03:12 +08:00
|
|
|
// 黄色呼吸灯效果
|
|
|
|
|
void yellowBreathing(SerialPort &serial)
|
|
|
|
|
{
|
|
|
|
|
LedCommand cmd;
|
|
|
|
|
std::cout << "开始黄色呼吸灯效果..." << std::endl;
|
|
|
|
|
|
|
|
|
|
// 呼吸灯亮度从0升到255
|
|
|
|
|
for (int i = 0; i <= 255; i += 15)
|
|
|
|
|
{
|
|
|
|
|
cmd.setColor(i, i, 0);
|
|
|
|
|
cmd.setExtCount(1);
|
|
|
|
|
auto packet = cmd.serialize();
|
|
|
|
|
if (!serial.writeData(packet.data(), packet.size()))
|
|
|
|
|
std::cerr << "发送数据失败" << std::endl;
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 呼吸灯亮度从255降到0
|
|
|
|
|
for (int i = 255; i >= 0; i -= 15)
|
|
|
|
|
{
|
|
|
|
|
cmd.setColor(i, i, 0);
|
|
|
|
|
cmd.setExtCount(1);
|
|
|
|
|
auto packet = cmd.serialize();
|
|
|
|
|
if (!serial.writeData(packet.data(), packet.size()))
|
|
|
|
|
std::cerr << "发送数据失败" << std::endl;
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main()
|
|
|
|
|
{
|
|
|
|
|
std::string port = "/dev/ttyS0";
|
|
|
|
|
int baudrate = 115200;
|
|
|
|
|
|
|
|
|
|
std::ifstream ifs("config.toml");
|
|
|
|
|
if (ifs)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
auto data = toml::parse(ifs);
|
|
|
|
|
if (auto serial = toml::find(data, "serial"); !serial.is_table())
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "serial 部分不存在或格式错误" << std::endl;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
port = toml::find<std::string>(data, "serial", "port");
|
|
|
|
|
baudrate = toml::find<int>(data, "serial", "baudrate");
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception &e)
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "解析 config.toml 失败: " << e.what() << std::endl;
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
std::cerr << "无法打开 config.toml 文件,使用默认参数。" << std::endl;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::cout << "串口号: " << port << "\n波特率: " << baudrate << std::endl;
|
|
|
|
|
|
2025-06-05 09:42:09 +08:00
|
|
|
MqttClient mqtt("config.toml");
|
2025-06-05 10:29:26 +08:00
|
|
|
if (!mqtt.start())
|
2025-06-05 09:38:24 +08:00
|
|
|
{
|
2025-06-05 09:42:09 +08:00
|
|
|
std::cerr << "MQTT 启动失败" << std::endl;
|
2025-06-05 10:29:26 +08:00
|
|
|
return 1;
|
2025-06-05 09:42:09 +08:00
|
|
|
}
|
2025-06-05 10:29:26 +08:00
|
|
|
std::cout << "MQTT 连接成功,开始循环处理..." << std::endl;
|
2025-06-05 09:38:24 +08:00
|
|
|
|
2025-06-05 09:03:12 +08:00
|
|
|
SerialPort serial;
|
|
|
|
|
if (!serial.openPort(port, baudrate))
|
|
|
|
|
{
|
|
|
|
|
return 1;
|
|
|
|
|
}
|
|
|
|
|
|
2025-06-05 10:29:26 +08:00
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
mqtt.checkTimeout(std::chrono::seconds(3)); // 没消息则重置数据
|
|
|
|
|
|
|
|
|
|
int gear = mqtt.getGear();
|
|
|
|
|
double speed = mqtt.getSpeed();
|
|
|
|
|
|
|
|
|
|
// 根据 gear 和 speed 控制 LED
|
|
|
|
|
LedCommand cmd;
|
|
|
|
|
if (gear == 3)
|
|
|
|
|
{
|
|
|
|
|
alwaysRed(serial);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (speed > 0)
|
|
|
|
|
{
|
|
|
|
|
yellowBreathing(serial);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
alwaysGreen(serial);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::this_thread::sleep_for(std::chrono::milliseconds(500));
|
|
|
|
|
}
|
2025-06-05 09:03:12 +08:00
|
|
|
|
|
|
|
|
serial.closePort();
|
2025-06-05 10:29:26 +08:00
|
|
|
mqtt.disconnect();
|
2025-06-05 09:03:12 +08:00
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|