完善了数据库功能,将udp单独编译为一个静态库

This commit is contained in:
zjk
2025-02-13 22:00:15 +08:00
parent 25b4e0d688
commit 6d00ecfbf2
11 changed files with 265 additions and 172 deletions
+5
View File
@@ -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})
+23 -9
View File
@@ -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:
+2 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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