diff --git a/bin/pPowerManger.moos b/bin/pPowerManger.moos index 78d0895..5c7b676 100644 --- a/bin/pPowerManger.moos +++ b/bin/pPowerManger.moos @@ -3,7 +3,7 @@ ProcessConfig = pPowerManger { - AppTick = 4 + AppTick = 2 CommsTick = 4 } diff --git a/data/msg/uPower_currentState_st.json b/data/msg/uPower_currentState_st.json index 0e6fa67..1e33b07 100644 --- a/data/msg/uPower_currentState_st.json +++ b/data/msg/uPower_currentState_st.json @@ -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 } \ No newline at end of file diff --git a/data/msg/uPower_fcsState_st.json b/data/msg/uPower_fcsState_st.json index 5b2aced..7b16a61 100644 --- a/data/msg/uPower_fcsState_st.json +++ b/data/msg/uPower_fcsState_st.json @@ -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 } \ No newline at end of file diff --git a/data/msg/uPower_liBatState_st.json b/data/msg/uPower_liBatState_st.json index bacc2ef..9482f72 100644 --- a/data/msg/uPower_liBatState_st.json +++ b/data/msg/uPower_liBatState_st.json @@ -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 } \ No newline at end of file diff --git a/src/appPowerMangerWebUI/main.cpp b/src/appPowerMangerWebUI/main.cpp index e68297c..ee07197 100644 --- a/src/appPowerMangerWebUI/main.cpp +++ b/src/appPowerMangerWebUI/main.cpp @@ -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"); } diff --git a/src/pPowerManger/CMakeLists.txt b/src/pPowerManger/CMakeLists.txt index d2b564e..b55eeff 100644 --- a/src/pPowerManger/CMakeLists.txt +++ b/src/pPowerManger/CMakeLists.txt @@ -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}) diff --git a/src/pPowerManger/PowerManger.cpp b/src/pPowerManger/PowerManger.cpp index 8b24f96..d2e6511 100644 --- a/src/pPowerManger/PowerManger.cpp +++ b/src/pPowerManger/PowerManger.cpp @@ -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: diff --git a/src/pPowerManger/PowerManger.h b/src/pPowerManger/PowerManger.h index b6f8819..3348a80 100644 --- a/src/pPowerManger/PowerManger.h +++ b/src/pPowerManger/PowerManger.h @@ -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; diff --git a/src/pPowerManger/SQLiteDB.cpp b/src/pPowerManger/SQLiteDB.cpp index aa6db58..441c152 100644 --- a/src/pPowerManger/SQLiteDB.cpp +++ b/src/pPowerManger/SQLiteDB.cpp @@ -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(sqlite3_column_text(stmt, 3)); + stateData.event = reinterpret_cast(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(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 SQLiteDB::getPowerData(int limit) { - std::vector 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(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; -} \ No newline at end of file +} + +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; +} diff --git a/src/pPowerManger/SQLiteDB.h b/src/pPowerManger/SQLiteDB.h index 2c4a8d2..fe7fe9c 100644 --- a/src/pPowerManger/SQLiteDB.h +++ b/src/pPowerManger/SQLiteDB.h @@ -5,11 +5,9 @@ #include #include #include "json/json.h" -// #include 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 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 diff --git a/test/SQLiteDBTest.cpp b/test/SQLiteDBTest.cpp index ad27d39..b172a59 100644 --- a/test/SQLiteDBTest.cpp +++ b/test/SQLiteDBTest.cpp @@ -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"); + } }