增加了moos变量显示的webui功能

This commit is contained in:
zjk
2025-03-04 11:17:16 +08:00
parent 16cffa296a
commit 341630f547
7 changed files with 761 additions and 7 deletions
+112 -3
View File
@@ -13,6 +13,7 @@
#include "../pPowerManger/SQLiteDB.h"
#include "../pPowerManger/pmSysvariable.h"
#include <MOOS/libMOOS/Comms/MOOSAsyncCommClient.h>
#include "DBImage.h"
using namespace std;
@@ -23,6 +24,9 @@ mutex wsMutex;
vector<crow::websocket::connection*> wsConnections;
shared_ptr<SQLiteDB> db;
shared_ptr<MOOS::MOOSAsyncCommClient> moosClient;
shared_ptr<CDBImage> dbImage;
bool bContinue = true;
// WebSocket消息处理
void sendStateUpdate() {
@@ -33,6 +37,7 @@ void sendStateUpdate() {
db->getStateData(stateData, time);
}
// 基本状态信息
msg["state"] = {
{"time", time},
{"state_id", stateData.state_id},
@@ -43,20 +48,65 @@ void sendStateUpdate() {
{"note", stateData.note}
};
// 添加数据库状态信息
// 数据库状态信息
msg["db_status"] = {
{"connected", db->isDatabaseConnected("/home/zjk/project/H100/H100PowerManger/data", "power_data.db")},
{"database", db->getDBPatch()},
{"size", db->getDatabaseSize()}
};
// 添加MOOS数据库状态信息
// MOOS数据库状态信息
msg["moos_db_status"] = {
{"connected", moosClient->IsConnected()},
{"host", "localhost"},
{"port", 9000}
};
// 进程详细信息
{
lock_guard<mutex> lock(wsMutex);
STRING_LIST processes;
dbImage->GetProcesses(processes);
crow::json::wvalue::list processList;
for(const auto& proc : processes) {
STRING_LIST subs, pubs;
if(dbImage->GetProcInfo(proc, subs, pubs)) {
crow::json::wvalue processInfo;
processInfo["name"] = proc;
// 将STRING_LIST转换为std::vector<std::string>
std::vector<std::string> subs_vec(subs.begin(), subs.end());
std::vector<std::string> pubs_vec(pubs.begin(), pubs.end());
processInfo["subscribed"] = subs_vec;
processInfo["published"] = pubs_vec;
processList.push_back(std::move(processInfo));
}
}
msg["processes"] = {
{"count", processes.size()},
{"list", std::move(processList)}
};
}
// 数据库变量信息
{
lock_guard<mutex> lock(wsMutex);
int varCount = dbImage->GetNumVariables();
CDBImage::CVar lastVar;
bool hasLastVar = (varCount > 0) && dbImage->Get(lastVar, varCount-1);
msg["variables"] = {
{"count", varCount},
{"last_updated", {
{"name", hasLastVar ? lastVar.GetName() : ""},
{"value", hasLastVar ? lastVar.GetValue() : ""},
{"time", hasLastVar ? lastVar.GetTime() : "0.0"}
}}
};
}
// 发送WebSocket消息
{
lock_guard<mutex> lock(wsMutex);
for(auto conn : wsConnections) {
@@ -65,10 +115,62 @@ void sendStateUpdate() {
}
}
// 订阅MOOS变量
bool FetchLoop(MOOS::MOOSAsyncCommClient* comms, CDBImage* m_DBImage)
{
int nCounts = 0;
while(true) // 外部需要控制循环退出条件
{
if(comms->IsConnected())
{
// 每5次循环获取一次进程摘要
if(nCounts++ % 5 == 0)
{
MOOSMSG_LIST procMail;
if(comms->ServerRequest("PROC_SUMMARY", procMail))
{
m_DBImage->SetProcInfo(procMail);
// 打印进程信息
STRING_LIST processes;
m_DBImage->GetProcesses(processes);
std::cout << "Active processes: " << processes.size() << std::endl;
}
}
// 每次循环都获取数据库摘要
MOOSMSG_LIST dbMail;
if(comms->ServerRequest("ALL", dbMail))
{
m_DBImage->Set(dbMail);
// 打印数据库变量信息
int varCount = m_DBImage->GetNumVariables();
std::cout << "Database variables: " << varCount << std::endl;
// 打印最近更新的变量
if(varCount > 0) {
CDBImage::CVar lastVar;
if(m_DBImage->Get(lastVar, varCount-1)) {
std::cout << "Last updated variable: "
<< lastVar.GetName() << " = "
<< lastVar.GetValue() << std::endl;
}
}
}
}
// 保持大约4Hz的频率
MOOSPause(250);
}
return true;
}
int main() {
crow::SimpleApp app;
db = make_shared<SQLiteDB>("/home/zjk/project/H100/H100PowerManger/data/power_data.db");
moosClient = make_shared<MOOS::MOOSAsyncCommClient>();
dbImage = make_shared<CDBImage>();
moosClient->Run("localhost", 9000, "appPowerMangerWebUI");
// WebSocket路由
@@ -97,6 +199,13 @@ int main() {
}
}).detach();
//MOOS数据库更新定时器
std::thread fetchThread([&](){
while(bContinue) {
FetchLoop(moosClient.get(), dbImage.get());
}
});
// 绑定主页路由
CROW_ROUTE(app, "/")([]() {
auto page = crow::mustache::load_text("index.html");