完善了数据库功能,将udp单独编译为一个静态库
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
|
||||
ProcessConfig = pPowerManger
|
||||
{
|
||||
AppTick = 4
|
||||
AppTick = 2
|
||||
CommsTick = 4
|
||||
}
|
||||
|
||||
|
||||
@@ -1,47 +1,47 @@
|
||||
{
|
||||
"HVABFTDev123Cur_uint16": 1024,
|
||||
"HVABFTDev123Cur_uint16": 12373,
|
||||
"HVABactCur_uint16": 0,
|
||||
"HVABbowRudCur_uint16": 0,
|
||||
"HVABbusBCur_uint16": 1792,
|
||||
"HVABbowRudCur_uint16": 48628,
|
||||
"HVABbusBCur_uint16": 58368,
|
||||
"HVABbusBVol_uint16": 127,
|
||||
"HVABmastSteGeaCur_uint16": 0,
|
||||
"HVABopenWaterCur_uint16": 23040,
|
||||
"HVABxczCur_uint16": 0,
|
||||
"HVBBCCUCur_uint16": 44210,
|
||||
"HVBBFCSSecurSysCur_uint16": 23197,
|
||||
"HVBBbatInsCur_uint16": 33584,
|
||||
"HVBBbowLowVolDisBoxCur_uint16": 44214,
|
||||
"HVBBdcC1InsCur_uint16": 23197,
|
||||
"HVBBemer2BusVol_uint16": 57344,
|
||||
"HVBBemerBatCur_uint16": 57344,
|
||||
"HVBBinsBusVol_uint16": 26624,
|
||||
"HVBBplcCur_uint16": 127,
|
||||
"HVABopenWaterCur_uint16": 15788,
|
||||
"HVABxczCur_uint16": 62464,
|
||||
"HVBBCCUCur_uint16": 0,
|
||||
"HVBBFCSSecurSysCur_uint16": 0,
|
||||
"HVBBbatInsCur_uint16": 48768,
|
||||
"HVBBbowLowVolDisBoxCur_uint16": 62844,
|
||||
"HVBBdcC1InsCur_uint16": 64539,
|
||||
"HVBBemer2BusVol_uint16": 9472,
|
||||
"HVBBemerBatCur_uint16": 51712,
|
||||
"HVBBinsBusVol_uint16": 29696,
|
||||
"HVBBplcCur_uint16": 0,
|
||||
"HVBBreservedCur1_uint16": 127,
|
||||
"HVBBreservedCur2_uint16": 127,
|
||||
"HVBBunit4Cur_uint16": 23197,
|
||||
"HVBFTDev45Cur_uint16": 32765,
|
||||
"HVBbatGroupCur_uint16": 448,
|
||||
"HVBbowHVolDisBoxCur_uint16": 24982,
|
||||
"HVBBunit4Cur_uint16": 15788,
|
||||
"HVBFTDev45Cur_uint16": 32573,
|
||||
"HVBbatGroupCur_uint16": 32970,
|
||||
"HVBbowHVolDisBoxCur_uint16": 44222,
|
||||
"HVBbusACur_uint16": 0,
|
||||
"HVBbusAVol_uint16": 40256,
|
||||
"HVBbusAVol_uint16": 7157,
|
||||
"HVBdcDc5Cur_uint16": 0,
|
||||
"HVBfbCur_uint16": 49495,
|
||||
"HVBmotorCur_uint16": 32602,
|
||||
"HVBpowerBusCur_uint16": 31744,
|
||||
"HVBpowerBusVol_uint16": 32602,
|
||||
"HVBreservedCur1_uint16": 24982,
|
||||
"HVBfbCur_uint16": 31908,
|
||||
"HVBmotorCur_uint16": 32764,
|
||||
"HVBpowerBusCur_uint16": 31796,
|
||||
"HVBpowerBusVol_uint16": 32573,
|
||||
"HVBreservedCur1_uint16": 0,
|
||||
"HVBreservedCur2_uint16": 0,
|
||||
"HVBreservedCur3_uint16": 0,
|
||||
"HVBsternRud1Cur_uint16": 440,
|
||||
"HVBsternRud2Cur_uint16": 32765,
|
||||
"HVBreservedCur3_uint16": 44222,
|
||||
"HVBsternRud1Cur_uint16": 3590,
|
||||
"HVBsternRud2Cur_uint16": 0,
|
||||
"HVBtyzCur_uint16": 0,
|
||||
"LVBBbowPZDevCur_uint16": 0,
|
||||
"LVBBemerBatCur_uint16": 768,
|
||||
"LVBBemerBusVol_uint16": 0,
|
||||
"LVBBinsBusCur_uint16": 97,
|
||||
"LVBBunit1Cur_uint16": 0,
|
||||
"LVBBunit2Cur_uint16": 0,
|
||||
"LVBBunit3Cur_uint16": 0,
|
||||
"LVBBunit5Cur_uint16": 0,
|
||||
"LVBinsBusVol_uint16": 38402
|
||||
"LVBBbowPZDevCur_uint16": 127,
|
||||
"LVBBemerBatCur_uint16": 29696,
|
||||
"LVBBemerBusVol_uint16": 62844,
|
||||
"LVBBinsBusCur_uint16": 15788,
|
||||
"LVBBunit1Cur_uint16": 127,
|
||||
"LVBBunit2Cur_uint16": 30720,
|
||||
"LVBBunit3Cur_uint16": 62844,
|
||||
"LVBBunit5Cur_uint16": 64539,
|
||||
"LVBinsBusVol_uint16": 49434
|
||||
}
|
||||
@@ -1,30 +1,30 @@
|
||||
{
|
||||
"backpressure1_fp32": 7.7812956078560092e-10,
|
||||
"backpressure2_fp32": 0.0,
|
||||
"ch4oConcent1_fp32": -4.8547832420808845e-12,
|
||||
"ch4oConcent2_fp32": 1.1695613932541827e-38,
|
||||
"ch4o_fp32": 1.1695613932541827e-38,
|
||||
"excTemp_fp32": 1.1695613932541827e-38,
|
||||
"faultCode1_uint16": 34036,
|
||||
"faultCode2_uint16": 40361,
|
||||
"faultCode3_uint16": 32602,
|
||||
"fcuCurIns_fp32": -1.2859852072111266e-13,
|
||||
"fcuCurPower_fp32": 1.1695613932541827e-38,
|
||||
"fcuCur_fp32": -1.6155215737897056e+25,
|
||||
"fcuFaultLeve_uint8": 98,
|
||||
"fcuOutIns_fp32": 1.1695613932541827e-38,
|
||||
"fcuOutPower_fp32": 8.3046377128711946e+19,
|
||||
"fcuState_uint8": 105,
|
||||
"fcuVolIns_fp32": -1.0396555642088759e-25,
|
||||
"fcuVolPower_fp32": 1.1754003236953313e-38,
|
||||
"fcuVol_fp32": 1.1695613932541827e-38,
|
||||
"backpressure1_fp32": -0.2467193603515625,
|
||||
"backpressure2_fp32": 1.1685231712219644e-38,
|
||||
"ch4oConcent1_fp32": 1.8108811898653892e-39,
|
||||
"ch4oConcent2_fp32": 0.0,
|
||||
"ch4o_fp32": 1.1685231712219644e-38,
|
||||
"excTemp_fp32": 1.1685231712219644e-38,
|
||||
"faultCode1_uint16": 59856,
|
||||
"faultCode2_uint16": 44221,
|
||||
"faultCode3_uint16": 32573,
|
||||
"fcuCurIns_fp32": 8.3046377128711946e+19,
|
||||
"fcuCurPower_fp32": 1.1685231712219644e-38,
|
||||
"fcuCur_fp32": -0.2467193603515625,
|
||||
"fcuFaultLeve_uint8": 245,
|
||||
"fcuOutIns_fp32": 6.7262326287591219e-44,
|
||||
"fcuOutPower_fp32": -1.1348810210013775e-34,
|
||||
"fcuState_uint8": 123,
|
||||
"fcuVolIns_fp32": 7.3381652328374862e+19,
|
||||
"fcuVolPower_fp32": 1.1685231712219644e-38,
|
||||
"fcuVol_fp32": 1.1685231712219644e-38,
|
||||
"flameDet_uint8": 0,
|
||||
"h2Concent1_fp32": 1.7280140038790768e-39,
|
||||
"h2Concent2_fp32": 0.0,
|
||||
"o2Concent1_fp32": -1.2491396805813793e-13,
|
||||
"o2Concent2_fp32": 1.1695613932541827e-38,
|
||||
"o2Level_fp32": 1.9618178500547439e-44,
|
||||
"o2_fp32": -5.3151927303929369e-14,
|
||||
"powLimit_fp32": 1.1695613932541827e-38,
|
||||
"powerGen_fp32": -1.2491396805813793e-13
|
||||
"h2Concent1_fp32": -3.1907161748557105e+32,
|
||||
"h2Concent2_fp32": 1.1753546413653943e-38,
|
||||
"o2Concent1_fp32": -0.2515411376953125,
|
||||
"o2Concent2_fp32": 1.1685231712219644e-38,
|
||||
"o2Level_fp32": 1.1685231712219644e-38,
|
||||
"o2_fp32": -0.1107940673828125,
|
||||
"powLimit_fp32": 1.1753546413653943e-38,
|
||||
"powerGen_fp32": 2.1756349367871582e+21
|
||||
}
|
||||
@@ -1,38 +1,38 @@
|
||||
{
|
||||
"fcuCurToInsLimit1_uint8": 127,
|
||||
"fcuCurToInsLimit1_uint8": 0,
|
||||
"fcuCurToinsLimit2_uint8": 0,
|
||||
"insBatCurElect_uint16": 32765,
|
||||
"insBatLimit_uint16": 40361,
|
||||
"insBatCurElect_uint16": 32573,
|
||||
"insBatLimit_uint16": 62950,
|
||||
"insBatSoc_uint8": 0,
|
||||
"insBatTotalElect_uint16": 244,
|
||||
"insChargeState_uint8": 202,
|
||||
"insCurSocHold1_uint8": 172,
|
||||
"insCurSocHold2_uint8": 157,
|
||||
"insCurSocHold3_uint8": 90,
|
||||
"insBatTotalElect_uint16": 28728,
|
||||
"insChargeState_uint8": 80,
|
||||
"insCurSocHold1_uint8": 0,
|
||||
"insCurSocHold2_uint8": 0,
|
||||
"insCurSocHold3_uint8": 0,
|
||||
"insCurrent_uint16": 0,
|
||||
"insLinkVol_uint16": 40362,
|
||||
"insLinkVol_uint16": 44098,
|
||||
"insNegRelayState_uint8": 0,
|
||||
"insNegRes_uint16": 0,
|
||||
"insPackVol_uint16": 32602,
|
||||
"insNegRes_uint16": 7157,
|
||||
"insPackVol_uint16": 32573,
|
||||
"insPosRelayState_uint8": 0,
|
||||
"insPosRes_uint16": 37,
|
||||
"insfaultCode_uint8": 208,
|
||||
"insPosRes_uint16": 31732,
|
||||
"insfaultCode_uint8": 94,
|
||||
"powBatCurElect_uint16": 0,
|
||||
"powBatSoc_uint8": 0,
|
||||
"powBatTotalElect_uint16": 24982,
|
||||
"powChargeState_uint8": 16,
|
||||
"powBatTotalElect_uint16": 44098,
|
||||
"powChargeState_uint8": 122,
|
||||
"powCurSocHold1_uint8": 0,
|
||||
"powCurSocHold2_uint8": 248,
|
||||
"powCurSocHold3_uint8": 0,
|
||||
"powCurToInsLimit1_uint8": 150,
|
||||
"powCurToinsLimit2_uint8": 97,
|
||||
"powCur_uint16": 35008,
|
||||
"powLinkVol_uint16": 0,
|
||||
"powNegRelayState_uint8": 133,
|
||||
"powNegRes_uint16": 32602,
|
||||
"powPosRelayState_uint8": 0,
|
||||
"powPosRes_uint16": 40361,
|
||||
"powerBatLimit_uint16": 32602,
|
||||
"powCurSocHold2_uint8": 164,
|
||||
"powCurSocHold3_uint8": 124,
|
||||
"powCurToInsLimit1_uint8": 190,
|
||||
"powCurToinsLimit2_uint8": 172,
|
||||
"powCur_uint16": 32970,
|
||||
"powLinkVol_uint16": 32764,
|
||||
"powNegRelayState_uint8": 22,
|
||||
"powNegRes_uint16": 32573,
|
||||
"powPosRelayState_uint8": 243,
|
||||
"powPosRes_uint16": 44222,
|
||||
"powerBatLimit_uint16": 0,
|
||||
"powerPackVol_uint16": 0,
|
||||
"powfaultCode_uint8": 170
|
||||
"powfaultCode_uint8": 9
|
||||
}
|
||||
@@ -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
|
||||
|
||||
+24
-2
@@ -5,12 +5,34 @@ TEST_CASE("SQLiteDB Test", "[SQLiteDB]") {
|
||||
SQLiteDB db("test.db");
|
||||
|
||||
SECTION("Create Tables") {
|
||||
db.createPowerDataTables();
|
||||
db.createStateTables();
|
||||
REQUIRE(db.createPowerDataTables() == true);
|
||||
REQUIRE(db.createStateTables() == true);
|
||||
}
|
||||
|
||||
SECTION("Test isDatabaseConnected") {
|
||||
REQUIRE(db.isDatabaseConnected("/home/zjk/project/H100/H100PowerManger/bin","test.db") == true);
|
||||
}
|
||||
|
||||
SECTION("Test insertPowerData") {
|
||||
PowerData powerData;
|
||||
StateData stateData;
|
||||
stateData.state_id = 1;
|
||||
stateData.state_name = "test";
|
||||
stateData.event = "test";
|
||||
stateData.event_id = 1;
|
||||
stateData.fault_code = 1;
|
||||
stateData.note = "test";
|
||||
REQUIRE(db.insertStateData(stateData) == true);
|
||||
// db.insertPowerData(powerData);
|
||||
|
||||
StateData stateDataForGet;
|
||||
REQUIRE(db.getStateData(stateDataForGet) == true);
|
||||
REQUIRE(stateDataForGet.state_id == 1);
|
||||
REQUIRE(stateDataForGet.state_name == "test");
|
||||
REQUIRE(stateDataForGet.event == "test");
|
||||
REQUIRE(stateDataForGet.event_id == 1);
|
||||
REQUIRE(stateDataForGet.fault_code == 1);
|
||||
REQUIRE(stateDataForGet.note == "test");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user