int readgeneralslave(int IDnumber, char slavename){ setmodbusslave(IDnumber); // Different Engine Variations have different readable addresses. // for example, engine does not use ADC channels 1-8. switch (slavename) { case GENERAL_ENGINE: if (readaddresses(REG_ANALOG_IN12 - 1, REG_GENERAL_MAX - REG_ANALOG_IN12)) writeDB(GENERAL_BOARD,slavename,REGISTERS); if (readcoils(COILS_GENERAL_BASE- 1,COIL_GENERAL_MAX - COILS_GENERAL_BASE)) writeDB(GENERAL_BOARD,slavename,COILS); break; default: break; } return 1; }
auto R65816::op_sta_isry_b() { sp = readPC(); idle(); aa.l = readSP(sp + 0); aa.h = readSP(sp + 1); idle(); L writeDB(aa.w + r.y.w, r.a.l); }
auto R65816::op_sta_idpy_b() { dp = readPC(); idle2(); aa.l = readDP(dp + 0); aa.h = readDP(dp + 1); idle(); L writeDB(aa.w + r.y.w, r.a.l); }
int readECslave(int IDnumber, char slavename){ setmodbusslave(IDnumber); if (readaddresses(REGS_ENVC_BASE- 1,REG_ENVC_MAX - REGS_ENVC_BASE)) { qWarning() << "EC Register Read Successful - Writing to DB"; writeDB(ENVIRONMENTAL_CONTROL,slavename,REGISTERS); }else{ // qWarning() << "EC Read Failed"; } if (readcoils(COILS_ENVC_BASE- 1,COIL_ENVC_MAX - COILS_ENVC_BASE)) { qWarning() << "EC Coil Read Successful - Writing to DB"; writeDB(ENVIRONMENTAL_CONTROL,slavename,COILS); }else{ // qWarning() << "EC Read Failed"; } return 1; }
int readLCDslave(int IDnumber, char slavename){ //Attempts to read from each block of registers //If successful, writes the read buffer to master DB setmodbusslave((IDnumber)); if (readaddresses(ENGINE_BASE -1,REG_ENG_MAX - ENGINE_BASE)) writeDB(LCD_CONTROL,slavename, ENGINE); if (readaddresses(DCSYSTEM_BASE - 1,REG_DCSYS_MAX - DCSYSTEM_BASE)) writeDB(LCD_CONTROL,slavename, DCSYS ); if (readaddresses(ACSYSTEM_BASE - 1,REG_ACSYS_MAX - ACSYSTEM_BASE)) writeDB(LCD_CONTROL,slavename, ACSYS); if (readaddresses(HVAC_BASE - 1,REG_HVAC_MAX - HVAC_BASE)) writeDB(LCD_CONTROL,slavename, HVAC); if (readaddresses(TANKS_BASE- 1,REG_TANKS_MAX - TANKS_BASE)) writeDB(LCD_CONTROL,slavename,TANKS ); if (readaddresses(RR_BASE- 1,REG_RR_MAX - RR_BASE)) writeDB(LCD_CONTROL,slavename, RR); if (readaddresses(GPS_BASE- 1,REG_GPS_MAX -GPS_BASE)) writeDB(LCD_CONTROL,slavename,GPS ); if (readaddresses(SONAR_BASE- 1,REG_SONAR_MAX - SONAR_BASE)) writeDB(LCD_CONTROL,slavename,SONAR ); if (readaddresses(LIGHTS_BASE- 1,REG_LIGHTS_MAX-LIGHTS_BASE)) writeDB(LCD_CONTROL,slavename,LIGHTS ); if (readaddresses(LCD_BASE- 1,REG_LCD_MAX - LCD_BASE)) writeDB(LCD_CONTROL,slavename,LCD ); if (readaddresses(GYRO_BASE- 1,REG_GYRO_MAX - GYRO_BASE)) writeDB(LCD_CONTROL,slavename,GYRO ); if (readcoils(ALARMS_BASE- 1,COIL_ALRM_MAX - ALARMS_BASE)) writeDB(LCD_CONTROL,slavename,ALARM ); if (readcoils(WARNINGS_BASE- 1,COIL_WARN_MAX - WARNINGS_BASE)) writeDB(LCD_CONTROL,slavename,WARNING ); return 1; }
/** 将数据更新到表中 */ static bool writeDB(DB_TABLE_OP optype, DBInterface* dbi, DB_OP_TABLE_ITEM_DATA_BOX& opTableItemDataBox) { bool ret = true; if(!opTableItemDataBox.isEmpty) { SqlStatement* pSqlcmd = createSql(dbi, optype, opTableItemDataBox.tableName, opTableItemDataBox.parentTableDBID, opTableItemDataBox.dbid, opTableItemDataBox.items); ret = pSqlcmd->query(); opTableItemDataBox.dbid = pSqlcmd->dbid(); delete pSqlcmd; } if(optype == TABLE_OP_INSERT) { // 开始更新所有的子表 DB_OP_TABLE_DATAS::iterator iter1 = opTableItemDataBox.optable.begin(); for(; iter1 != opTableItemDataBox.optable.end(); iter1++) { DB_OP_TABLE_ITEM_DATA_BOX& wbox = *iter1->second.get(); // 绑定表关系 wbox.parentTableDBID = opTableItemDataBox.dbid; // 更新子表 writeDB(optype, dbi, wbox); } } else { // 如果有父ID首先得到该属性数据库中同父id的数据有多少条目, 并取出每条数据的id // 然后将内存中的数据顺序更新至数据库, 如果数据库中有存在的条目则顺序覆盖更新已有的条目, 如果数据数量 // 大于数据库中已有的条目则插入剩余的数据, 如果数据少于数据库中的条目则删除数据库中的条目 // select id from tbl_SpawnPoint_xxx_values where parentID = 7; KBEUnordered_map< std::string, std::vector<DBID> > childTableDBIDs; if(opTableItemDataBox.dbid > 0) { DB_OP_TABLE_DATAS::iterator iter1 = opTableItemDataBox.optable.begin(); for(; iter1 != opTableItemDataBox.optable.end(); iter1++) { DB_OP_TABLE_ITEM_DATA_BOX& wbox = *iter1->second.get(); KBEUnordered_map<std::string, std::vector<DBID> >::iterator iter = childTableDBIDs.find(opTableItemDataBox.tableName); if(iter == childTableDBIDs.end()) { std::vector<DBID> v; childTableDBIDs.insert(std::pair< std::string, std::vector<DBID> >(wbox.tableName, v)); } } if(childTableDBIDs.size() > 1) { std::string sqlstr_getids; KBEUnordered_map< std::string, std::vector<DBID> >::iterator tabiter = childTableDBIDs.begin(); for(; tabiter != childTableDBIDs.end();) { char sqlstr[MAX_BUF * 10]; kbe_snprintf(sqlstr, MAX_BUF * 10, "select count(id) from "ENTITY_TABLE_PERFIX"_%s where "TABLE_PARENTID_CONST_STR"=%"PRDBID" union all ", tabiter->first.c_str(), opTableItemDataBox.dbid); sqlstr_getids += sqlstr; kbe_snprintf(sqlstr, MAX_BUF * 10, "select id from "ENTITY_TABLE_PERFIX"_%s where "TABLE_PARENTID_CONST_STR"=%"PRDBID, tabiter->first.c_str(), opTableItemDataBox.dbid); sqlstr_getids += sqlstr; if(++tabiter != childTableDBIDs.end()) sqlstr_getids += " union all "; } if(dbi->query(sqlstr_getids.c_str(), sqlstr_getids.size(), false)) { MYSQL_RES * pResult = mysql_store_result(static_cast<DBInterfaceMysql*>(dbi)->mysql()); if(pResult) { MYSQL_ROW arow; int32 count = 0; tabiter = childTableDBIDs.begin(); bool first = true; while((arow = mysql_fetch_row(pResult)) != NULL) { if(count == 0) { StringConv::str2value(count, arow[0]); if(!first || count <= 0) tabiter++; continue; } DBID old_dbid; StringConv::str2value(old_dbid, arow[0]); tabiter->second.push_back(old_dbid); count--; first = false; } mysql_free_result(pResult); } } } else if(childTableDBIDs.size() == 1) { KBEUnordered_map< std::string, std::vector<DBID> >::iterator tabiter = childTableDBIDs.begin(); char sqlstr[MAX_BUF * 10]; kbe_snprintf(sqlstr, MAX_BUF * 10, "select id from "ENTITY_TABLE_PERFIX"_%s where "TABLE_PARENTID_CONST_STR"=%"PRDBID, tabiter->first.c_str(), opTableItemDataBox.dbid); if(dbi->query(sqlstr, strlen(sqlstr), false)) { MYSQL_RES * pResult = mysql_store_result(static_cast<DBInterfaceMysql*>(dbi)->mysql()); if(pResult) { MYSQL_ROW arow; while((arow = mysql_fetch_row(pResult)) != NULL) { DBID old_dbid; StringConv::str2value(old_dbid, arow[0]); tabiter->second.push_back(old_dbid); } mysql_free_result(pResult); } } } } // 如果是要清空此表, 则循环N次已经找到的dbid, 使其子表中的子表也能有效删除 if(!opTableItemDataBox.isEmpty) { // 开始更新所有的子表 DB_OP_TABLE_DATAS::iterator iter1 = opTableItemDataBox.optable.begin(); for(; iter1 != opTableItemDataBox.optable.end(); iter1++) { DB_OP_TABLE_ITEM_DATA_BOX& wbox = *iter1->second.get(); if(wbox.isEmpty) continue; // 绑定表关系 wbox.parentTableDBID = opTableItemDataBox.dbid; KBEUnordered_map<std::string, std::vector<DBID> >::iterator iter = childTableDBIDs.find(wbox.tableName); if(iter != childTableDBIDs.end()) { if(iter->second.size() > 0) { wbox.dbid = iter->second.front(); iter->second.erase(iter->second.begin()); } if(iter->second.size() <= 0) { childTableDBIDs.erase(wbox.tableName); } } // 更新子表 writeDB(optype, dbi, wbox); } } // 删除废弃的数据项 KBEUnordered_map< std::string, std::vector<DBID> >::iterator tabiter = childTableDBIDs.begin(); for(; tabiter != childTableDBIDs.end(); tabiter++) { if(tabiter->second.size() == 0) continue; // 先删除数据库中的记录 std::string sqlstr = "delete from "ENTITY_TABLE_PERFIX"_"; sqlstr += tabiter->first; sqlstr += " where "TABLE_ID_CONST_STR" in ("; std::vector<DBID>::iterator iter = tabiter->second.begin(); for(; iter != tabiter->second.end(); iter++) { DBID dbid = (*iter); char sqlstr1[MAX_BUF]; kbe_snprintf(sqlstr1, MAX_BUF, "%"PRDBID, dbid); sqlstr += sqlstr1; sqlstr += ","; } sqlstr.erase(sqlstr.size() - 1); sqlstr += ")"; bool ret = dbi->query(sqlstr.c_str(), sqlstr.size(), false); KBE_ASSERT(ret); DB_OP_TABLE_DATAS::iterator iter1 = opTableItemDataBox.optable.begin(); for(; iter1 != opTableItemDataBox.optable.end(); iter1++) { DB_OP_TABLE_ITEM_DATA_BOX& wbox = *iter1->second.get(); if(wbox.tableName == tabiter->first) { std::vector<DBID>::iterator iter = tabiter->second.begin(); for(; iter != tabiter->second.end(); iter++) { DBID dbid = (*iter); wbox.parentTableDBID = opTableItemDataBox.dbid; wbox.dbid = dbid; wbox.isEmpty = true; // 更新子表 writeDB(optype, dbi, wbox); } } } } } return ret; }
auto R65816::op_write_addrr_b(Reg16& reg, Reg16& idx) { aa.l = readPC(); aa.h = readPC(); idle(); L writeDB(aa.w + idx, reg); }
auto R65816::op_write_addr_b(Reg16& reg) { aa.l = readPC(); aa.h = readPC(); L writeDB(aa.w, reg); }
/// create Preference database void preferences::createPrefDB() { string finalQry; finalQry = "create table pref(key INTEGER PRIMARY KEY,usr TEXT,PASS TEXT,SERVER TEXT,PRT TEXT,SQLTABLE TEXT,SQL TEXT,PLAYLISTDIR TEXT)"; writeMe(finalQry); writeDB(); }