新增 pELoad 电子负载(IT6000C)控制程序:以太网 Raw Socket SCPI 直连设备,100ms 周期功率控制(订阅 MOOS 功率消息按 P/U 折算电流,CC/CV 双环路优先 + FUNC:MODE FIX 防护),网页人机交互(步骤引导/防误触确认),sqlite3 存储(100ms 高采样 V/I/P 测量表 meas_log + CSV 导出分析),并接入 scripts/build-board.sh 板卡部署与 systemd 服务、missions/h100.moos 配置

This commit is contained in:
zjk
2026-09-03 12:26:02 +08:00
parent 38c489caec
commit 2a34b79461
21 changed files with 3601 additions and 5 deletions
+55
View File
@@ -0,0 +1,55 @@
#ifndef PELOAD_WEB_SERVER_H
#define PELOAD_WEB_SERVER_H
#define UNIX
#include "mongoose.h"
#include <string>
#include <functional>
#include <vector>
#include <mutex>
#include <atomic>
#include <thread>
namespace eload {
class WebServer {
public:
WebServer();
~WebServer();
bool start(int port);
void stop();
bool isRunning() const { return m_running; }
// 向所有 WebSocket 客户端广播文本
// 线程安全:mongoose 非线程安全,本接口只把文本放入待发队列,
// 由 Web 线程在 mg_mgr_poll 返回后统一发送(禁止跨线程直接 mg_ws_send)
void broadcast(const std::string& text);
// 新客户端连接时调用,返回初始快照
void setOnOpen(std::function<std::string()> handler);
// 处理 /api/* 请求:返回 (Content-Type, body)。
// 默认内容类型 application/json;文本/CSV 接口由处理器自行指定。
void setApiHandler(std::function<std::pair<std::string, std::string>(const std::string& uri, const std::string& query)> handler);
private:
static bool serverThreadCB(void* pParam);
bool serverThreadFunc();
void handleEvent(struct mg_connection* c, int ev, void* ev_data);
void flushPending();
struct mg_mgr m_mgr;
int m_port = 0;
std::atomic<bool> m_running{false};
std::thread m_thread;
std::mutex m_pendingMutex;
std::string m_pending; // latest snapshot to broadcast
std::vector<mg_connection*> m_wsConnections; // web thread only
std::function<std::string()> m_onOpen;
std::function<std::pair<std::string, std::string>(const std::string&, const std::string&)> m_apiHandler;
};
} // namespace eload
#endif // PELOAD_WEB_SERVER_H