完善了数据库功能,将udp单独编译为一个静态库
This commit is contained in:
@@ -49,7 +49,7 @@ int main() {
|
||||
// 定义路由,处理 /api/power-data 的请求
|
||||
CROW_ROUTE(app, "/api/download-db")
|
||||
([&db]() {
|
||||
std::ifstream file("/home/zjk/project/H100/H100PowerManger/src/appPowerMangerWebUI/static/index.html", std::ios::binary);
|
||||
std::ifstream file("/home/zjk/project/H100/H100PowerManger/src/appPowerMangerWebUI/index.html", std::ios::binary);
|
||||
if (!file) {
|
||||
return crow::response(404, "Database file not found");
|
||||
}
|
||||
|
||||
@@ -41,8 +41,13 @@ TARGET_LINK_LIBRARIES(pPowerManger
|
||||
sqlite3)
|
||||
|
||||
# Add SQLiteDB static library
|
||||
SET(UDPCOMM_SRC
|
||||
udpComm.cpp
|
||||
)
|
||||
|
||||
SET(SQLITEDB_SRC
|
||||
SQLiteDB.cpp
|
||||
)
|
||||
|
||||
ADD_LIBRARY(SQLiteDB STATIC ${SQLITEDB_SRC})
|
||||
ADD_LIBRARY(UDPComm STATIC ${UDPCOMM_SRC})
|
||||
|
||||
@@ -122,8 +122,6 @@ bool PowerManger::Iterate()
|
||||
m_FsmThread.Start();
|
||||
else
|
||||
m_FsmThread.Stop();
|
||||
// 数据库测试
|
||||
|
||||
//3. 输出报告
|
||||
buildPowerSysReport();
|
||||
//4. 打印错误信息
|
||||
@@ -138,6 +136,8 @@ bool PowerManger::Iterate()
|
||||
//AppCastingMOOSApp::PostReport();
|
||||
//5. 清空UDP消息队列
|
||||
m_udpComm.clearMsgQueue();
|
||||
//6. 写入数据库
|
||||
writeDataToDB();
|
||||
return(true);
|
||||
}
|
||||
|
||||
@@ -276,7 +276,7 @@ bool PowerManger::FsmLoop()
|
||||
|
||||
bool PowerManger::updatePmState()
|
||||
{
|
||||
|
||||
//1. 更新下位机状态
|
||||
if(!m_udpComm.m_qReceiveCcuStateBuffer.empty())
|
||||
{
|
||||
double time;
|
||||
@@ -802,6 +802,23 @@ bool PowerManger::saveStringToJsonFile(const string &strJson, const string &file
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool PowerManger::writeDataToDB()
|
||||
{
|
||||
m_stateData.state_id = m_pmState.id;
|
||||
m_stateData.state_name = m_pmState.name;
|
||||
m_stateData.event = m_pmEvent;
|
||||
m_stateData.event_id = 1;
|
||||
m_stateData.fault_code = m_faultNum;
|
||||
m_stateData.note = "No fault";
|
||||
if(!m_db->insertStateData(m_stateData))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//TODO:配电系统操作函数
|
||||
bool PowerManger::disSystemOperation(disBreaker optBreaker, disBreakerOpt)
|
||||
{
|
||||
@@ -823,14 +840,10 @@ int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
|
||||
{
|
||||
cout << fsm.name << endl;
|
||||
PowerManger* pm = (PowerManger*)pData;
|
||||
//1. 检查复合管控器连接
|
||||
//1. 检查复合管控器连接 如果10S则进入故障状态
|
||||
double StartTime = pm->GetAppStartTime();
|
||||
while (!pm->m_connected)
|
||||
{
|
||||
// disHighVolBusCmd a;
|
||||
// a.fuelCellCircuitBreaker = DIS_BREAKER_OFF;
|
||||
// a.propulsionMotorCircuitBreaker = DIS_BREAKER_OFF;
|
||||
// pm->m_udpComm.sendDisSysCmd(a);
|
||||
MOOSPause(1000);
|
||||
pm->updateTime();
|
||||
double dft = abs(pm->m_current_time - StartTime);
|
||||
@@ -862,7 +875,7 @@ int PowerManger::handleInite_s1(FSM_State &fsm, void* pData)
|
||||
}
|
||||
//3. 检查当前配电装置状态
|
||||
//a. 断开高压母线的主要断路器
|
||||
//TODO 检查并配置当前配电装置状态
|
||||
//TODO 配置当前配电装置状态
|
||||
disHighVolBusCmd a;
|
||||
a.fuelCellCircuitBreaker = DIS_BREAKER_OFF;
|
||||
a.propulsionMotorCircuitBreaker = DIS_BREAKER_OFF;
|
||||
@@ -917,6 +930,7 @@ int PowerManger::handleFault_s99(FSM_State &fsm, void* pData)
|
||||
{
|
||||
case 1:
|
||||
pm->printState(fsm,"通信故障");
|
||||
pm->m_pmEvent = "复合管控连接超时";
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -107,6 +107,7 @@ class PowerManger : public AppCastingMOOSApp
|
||||
|
||||
//数据库
|
||||
SQLiteDB* m_db;
|
||||
bool writeDataToDB();
|
||||
|
||||
// CMOOSThread m_SendThread;
|
||||
private: //
|
||||
@@ -114,9 +115,9 @@ class PowerManger : public AppCastingMOOSApp
|
||||
|
||||
|
||||
public: //状态实现
|
||||
|
||||
void printState(FSM_State st, string desp);
|
||||
bool FSM_RUN_IS_OK = true;
|
||||
StateData m_stateData;
|
||||
FSM_State m_pmState; //当前状态
|
||||
string m_pmEvent;
|
||||
FSM m_fsm;
|
||||
|
||||
+102
-57
@@ -17,87 +17,135 @@ SQLiteDB::~SQLiteDB() {
|
||||
}
|
||||
}
|
||||
|
||||
void SQLiteDB::createPowerDataTables() {
|
||||
if (!m_db) return;
|
||||
bool SQLiteDB::createPowerDataTables() {
|
||||
if (!m_db) return false;
|
||||
|
||||
const char* sql = "CREATE TABLE IF NOT EXISTS power_data ("
|
||||
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,"
|
||||
"timestamp DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now')),"
|
||||
"voltage REAL NOT NULL,"
|
||||
"current REAL NOT NULL,"
|
||||
"power REAL NOT NULL,"
|
||||
"temperature REAL NOT NULL);";
|
||||
"temperature REAL NOT NULL,"
|
||||
"PRIMARY KEY(timestamp, voltage, current));";
|
||||
|
||||
char* errMsg = nullptr;
|
||||
if (sqlite3_exec(m_db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
|
||||
std::cerr << "SQL error: " << errMsg << std::endl;
|
||||
sqlite3_free(errMsg);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void SQLiteDB::createStateTables() {
|
||||
if (!m_db) return;
|
||||
bool SQLiteDB::createStateTables() {
|
||||
if (!m_db) return false;
|
||||
|
||||
const char* sql = "CREATE TABLE IF NOT EXISTS state_data ("
|
||||
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
|
||||
"timestamp DATETIME DEFAULT CURRENT_TIMESTAMP,"
|
||||
"state_id INTEGER NOT NULL,"
|
||||
"timestamp DATETIME DEFAULT (strftime('%Y-%m-%d %H:%M:%f', 'now')),"
|
||||
"state_name TEXT NOT NULL,"
|
||||
"event TEXT NOT NULL,"
|
||||
"event_id INTEGER NOT NULL,"
|
||||
"fault_code INTEGER NOT NULL);";
|
||||
|
||||
"fault_code INTEGER DEFAULT 0,"
|
||||
"note TEXT NOT NULL);";
|
||||
char* errMsg = nullptr;
|
||||
if (sqlite3_exec(m_db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
|
||||
std::cerr << "SQL error: " << errMsg << std::endl;
|
||||
sqlite3_free(errMsg);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
void SQLiteDB::insertPowerData(float voltage, float current, float power, float temperature) {
|
||||
if (!m_db) return;
|
||||
|
||||
bool SQLiteDB::insertPowerData(const PowerData& powerData) {
|
||||
if (!m_db) return false;
|
||||
|
||||
const char* sql = "INSERT INTO power_data (voltage, current, power, temperature) VALUES (?, ?, ?, ?);";
|
||||
sqlite3_stmt* stmt;
|
||||
bool result = true;
|
||||
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
|
||||
sqlite3_bind_double(stmt, 1, voltage);
|
||||
sqlite3_bind_double(stmt, 2, current);
|
||||
sqlite3_bind_double(stmt, 3, power);
|
||||
sqlite3_bind_double(stmt, 4, temperature);
|
||||
sqlite3_bind_double(stmt, 1, powerData.voltage);
|
||||
sqlite3_bind_double(stmt, 2, powerData.current);
|
||||
sqlite3_bind_double(stmt, 3, powerData.power);
|
||||
sqlite3_bind_double(stmt, 4, powerData.temperature);
|
||||
|
||||
if (sqlite3_step(stmt) != SQLITE_DONE) {
|
||||
std::cerr << "Error inserting data: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
result = false;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
} else {
|
||||
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
result = false;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
void SQLiteDB::insertStateData(StateData stateData) {
|
||||
if (!m_db) return;
|
||||
|
||||
const char* sql = "INSERT INTO state_data (timestamp, state_id, state_name, event, event_id, fault_code) VALUES (?, ?, ?, ?, ?, ?);";
|
||||
bool SQLiteDB::insertStateData(StateData stateData,bool filter) {
|
||||
if (!m_db) return false;
|
||||
if(filter){
|
||||
StateData lastStateData;
|
||||
if(getStateData(lastStateData)){
|
||||
if(lastStateData.state_id==stateData.state_id &&
|
||||
lastStateData.event_id==stateData.event_id &&
|
||||
lastStateData.fault_code==stateData.fault_code &&
|
||||
lastStateData.note==stateData.note &&
|
||||
lastStateData.state_name==stateData.state_name &&
|
||||
lastStateData.event==stateData.event){
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
const char* sql = "INSERT INTO state_data (state_id, state_name, event, event_id, fault_code, note) VALUES (?, ?, ?, ?, ?, ?);";
|
||||
sqlite3_stmt* stmt;
|
||||
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
|
||||
sqlite3_bind_text(stmt, 1, stateData.timestamp.c_str(), -1, SQLITE_TRANSIENT);
|
||||
sqlite3_bind_int(stmt, 2, stateData.state_id);
|
||||
sqlite3_bind_text(stmt, 3, stateData.state_name.c_str(), -1, SQLITE_TRANSIENT);
|
||||
sqlite3_bind_text(stmt, 4, stateData.event.c_str(), -1, SQLITE_TRANSIENT);
|
||||
sqlite3_bind_int(stmt, 5, stateData.event_id);
|
||||
sqlite3_bind_int(stmt, 6, stateData.fault_code);
|
||||
sqlite3_bind_int(stmt, 1, stateData.state_id);
|
||||
sqlite3_bind_text(stmt, 2, stateData.state_name.c_str(), -1, SQLITE_TRANSIENT);
|
||||
sqlite3_bind_text(stmt, 3, stateData.event.c_str(), -1, SQLITE_TRANSIENT);
|
||||
sqlite3_bind_int(stmt, 4, stateData.event_id);
|
||||
sqlite3_bind_int(stmt, 5, stateData.fault_code);
|
||||
sqlite3_bind_text(stmt, 6, stateData.note.c_str(), -1, SQLITE_TRANSIENT);
|
||||
|
||||
if (sqlite3_step(stmt) != SQLITE_DONE) {
|
||||
std::cerr << "Error inserting data: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
} else {
|
||||
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SQLiteDB::getStateData(StateData &stateData) {
|
||||
if (!m_db) return false;
|
||||
|
||||
const char* sql = "SELECT * FROM state_data ORDER BY timestamp DESC LIMIT 1;";
|
||||
sqlite3_stmt* stmt;
|
||||
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
|
||||
if (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||
stateData.state_id = sqlite3_column_int(stmt, 1);
|
||||
stateData.state_name = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 3));
|
||||
stateData.event = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 4));
|
||||
stateData.event_id = sqlite3_column_int(stmt, 5);
|
||||
stateData.fault_code = sqlite3_column_int(stmt, 6);
|
||||
stateData.note = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 7));
|
||||
sqlite3_finalize(stmt);
|
||||
return true;
|
||||
}
|
||||
sqlite3_finalize(stmt);
|
||||
} else {
|
||||
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool SQLiteDB::isDatabaseConnected(const std::string& path, const std::string& dbName) {
|
||||
if (!m_db) return false;
|
||||
|
||||
@@ -124,35 +172,32 @@ bool SQLiteDB::isDatabaseConnected(const std::string& path, const std::string& d
|
||||
return true;
|
||||
}
|
||||
|
||||
std::vector<PowerData> SQLiteDB::getPowerData(int limit) {
|
||||
std::vector<PowerData> data;
|
||||
if (!m_db) return data;
|
||||
|
||||
const char* sql = "SELECT id, timestamp, voltage, current, power, temperature FROM power_data ORDER BY timestamp DESC LIMIT ?;";
|
||||
sqlite3_stmt* stmt;
|
||||
|
||||
if (sqlite3_prepare_v2(m_db, sql, -1, &stmt, nullptr) == SQLITE_OK) {
|
||||
sqlite3_bind_int(stmt, 1, limit);
|
||||
|
||||
while (sqlite3_step(stmt) == SQLITE_ROW) {
|
||||
PowerData record;
|
||||
// record.id = sqlite3_column_int(stmt, 0);
|
||||
record.timestamp = reinterpret_cast<const char*>(sqlite3_column_text(stmt, 1));
|
||||
record.voltage = sqlite3_column_double(stmt, 2);
|
||||
record.current = sqlite3_column_double(stmt, 3);
|
||||
record.power = sqlite3_column_double(stmt, 4);
|
||||
record.temperature = sqlite3_column_double(stmt, 5);
|
||||
data.push_back(record);
|
||||
}
|
||||
|
||||
sqlite3_finalize(stmt);
|
||||
} else {
|
||||
std::cerr << "Error preparing statement: " << sqlite3_errmsg(m_db) << std::endl;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
string SQLiteDB::getDBPatch(){
|
||||
return m_dbPath;
|
||||
}
|
||||
}
|
||||
|
||||
bool SQLiteDB::clearPowerData() {
|
||||
if (!m_db) return false;
|
||||
|
||||
const char* sql = "DELETE FROM power_data;";
|
||||
char* errMsg = nullptr;
|
||||
if (sqlite3_exec(m_db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
|
||||
std::cerr << "SQL error: " << errMsg << std::endl;
|
||||
sqlite3_free(errMsg);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
bool SQLiteDB::clearStateData() {
|
||||
if (!m_db) return false;
|
||||
|
||||
const char* sql = "DELETE FROM state_data;";
|
||||
char* errMsg = nullptr;
|
||||
if (sqlite3_exec(m_db, sql, nullptr, nullptr, &errMsg) != SQLITE_OK) {
|
||||
std::cerr << "SQL error: " << errMsg << std::endl;
|
||||
sqlite3_free(errMsg);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
+17
-11
@@ -5,11 +5,9 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "json/json.h"
|
||||
// #include <nlohmann/json.hpp>
|
||||
|
||||
using namespace std;
|
||||
struct PowerData {
|
||||
std::string timestamp;
|
||||
double voltage;
|
||||
double current;
|
||||
double power;
|
||||
@@ -17,12 +15,12 @@ struct PowerData {
|
||||
};
|
||||
|
||||
struct StateData {
|
||||
std::string timestamp;
|
||||
int state_id;
|
||||
std::string state_name;
|
||||
std::string event;
|
||||
int event_id;
|
||||
int fault_code;
|
||||
std::string note;
|
||||
};
|
||||
|
||||
class SQLiteDB {
|
||||
@@ -30,21 +28,29 @@ public:
|
||||
SQLiteDB(const std::string& dbPath);
|
||||
~SQLiteDB();
|
||||
|
||||
void createPowerDataTables();
|
||||
void insertPowerData(float voltage, float current, float power, float temperature);
|
||||
void createStateTables();
|
||||
void insertStateData(StateData stateData);
|
||||
bool createPowerDataTables();
|
||||
bool createStateTables();
|
||||
|
||||
bool clearPowerData();
|
||||
bool clearStateData();
|
||||
|
||||
bool insertPowerData(const PowerData& powerData);
|
||||
bool insertStateData(StateData stateData,bool filter=true);
|
||||
|
||||
// 获取最新的状态数据
|
||||
bool getStateData(StateData &stateData);
|
||||
|
||||
// 使用函数
|
||||
bool isDatabaseConnected(const std::string& path, const std::string& dbName);
|
||||
std::vector<PowerData> getPowerData(int limit = 100);
|
||||
|
||||
//使用函数
|
||||
bool isDatabaseConnected(const std::string& path, const std::string& dbName);
|
||||
|
||||
//获取数据库状态函数
|
||||
// 获取数据库状态函数
|
||||
string getDBPatch();
|
||||
|
||||
private:
|
||||
sqlite3* m_db;
|
||||
string m_dbPath;
|
||||
|
||||
};
|
||||
|
||||
#endif // SQLITEDB_H
|
||||
|
||||
Reference in New Issue
Block a user