增加了moos变量显示的webui功能
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user