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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 6
0
	/**
		将数据更新到表中
	*/
	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;
	}
Exemplo n.º 7
0
auto R65816::op_write_addrr_b(Reg16& reg, Reg16& idx) {
  aa.l = readPC();
  aa.h = readPC();
  idle();
L writeDB(aa.w + idx, reg);
}
Exemplo n.º 8
0
auto R65816::op_write_addr_b(Reg16& reg) {
  aa.l = readPC();
  aa.h = readPC();
L writeDB(aa.w, reg);
}
Exemplo n.º 9
0
/// 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();
}