⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 db_ms.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
📖 第 1 页 / 共 5 页
字号:
					{
	    			    DBMS_DBG(( "last sat can't be del.\n"));
	    			    break;
					}

					// evil kindergarten lost this child..., clean parent's memory
				    DVB_NetDelete (s16EvilStick);
					s16EvilStick--;
				}
			}
		}
		break;
	default:
		break;
	}

	// Does any child still here?
	for(s16EvilStick=0; s16EvilStick<u16TotalChildNum; s16EvilStick++)
	{
		if(pu8ChildNameList[s16EvilStick] == CHECK)
		{
			// kick child out.
			DBFS_InfoDestroy(enTableType, s16EvilStick );
		}
	}

	// evil kindergarten closed, go home.
#if defined(WIN32)
	free(pu8ChildNameList);
#else
	DVB_MemoryFree(pu8ChildNameList);
#endif

	m_enSystemType = enOrigSysType;
}
/*******************************************************************************************/

static u16 _service_get_start_index_in_net(EN_SYSTEM_TYPE enSysType, EN_SERVICE_TYPE enSrvType, u16 u16NetIdx)
{
	u16			u16SrvIdx, u16RelIdx;
	DB_SrvRel	stSrvRel;
	DB_TpRel	stTpRel;

	for(u16SrvIdx = 0; u16SrvIdx < m_as16SrvTotal[enSysType][enSrvType]; u16SrvIdx++)
	{
		u16RelIdx = _service_get_relation_index(enSysType, enSrvType, u16SrvIdx);

		DBFS_RelationGetSrv(u16RelIdx, &stSrvRel);
		DBFS_RelationGetTp(_tp_get_relation_index(m_enSystemType, stSrvRel.u16TpIdx), &stTpRel);

		if(stTpRel.u16SatIdx == u16NetIdx)
		{
			u16SrvIdx++;
			break;
		}
	}

	return(u16SrvIdx);
}
/*******************************************************************************************/

static void _create_other_sat(void)
{
	DVB_NetInfo		stNetInfo;
	DB_NetDetail	stNetDetail;
	DB_SatRel		stNetRel;

	if(_service_get_maximum(EN_SYSTEM_TYPE_DVBS) == 0)	
	{
		return;
	}
	
	memset(&stNetInfo.netSat, 0x00, sizeof(DVB_NetInfo));
	strcpy(	stNetInfo.netSat.acSatelliteName, "Others");
	stNetInfo.netSat.u16VidService_start_idx =
	stNetInfo.netSat.u16VidService_end_idx =
	stNetInfo.netSat.u16RdoService_start_idx =
	stNetInfo.netSat.u16RdoService_end_idx = 0xffff;

	_dvb_net_2_db(EN_SYSTEM_TYPE_DVBS, &stNetInfo, &stNetRel, &stNetDetail);
	stNetRel.u16LogicAddress = DBFS_InfoNew(EN_SAT_TABLE, (u8*)&stNetDetail);

	DBFS_RelationSetNet(_network_get_relation_index(EN_SYSTEM_TYPE_DVBS, 0), &stNetRel);
	m_as16NetTotal[EN_SYSTEM_TYPE_DVBS]++;
}
/*******************************************************************************************/

void DBMS_Clean(void)
{
	EN_SYSTEM_TYPE	enSysType;
	EN_SERVICE_TYPE	enSrvType;
	
	DVB_DramSet( DB_DRAM_EXTRA_SRV,0xff, DB_EXTRA_SRV_SIZE);

	for(enSysType = 0; enSysType < EN_SYSTEM_TYPE_TOTAL; enSysType++)
	{
		m_as16NetTotal[enSysType] = 0;
		m_as16TpTotal [enSysType] = 0;
		for(enSrvType=0; enSrvType < EN_SERVICE_TYPE_TOTAL; enSrvType++)
			m_as16SrvTotal[enSysType][enSrvType] = 0;
	}

    /*set Other Sat*/
    _create_other_sat();
}
/*******************************************************************************************/

void DBMS_Init(void)
{
	bool8 b8Error;
	EN_SYSTEM_TYPE	enSysType;
	EN_SERVICE_TYPE		enSrvType;
	u16					u16idx, u16RelIdx;
	DB_SrvRel			stSrvRel;
	DB_SrvDetail		stSrvDetail;
	DB_ExtraSrv			stExtraSrv;

#if 0
    extern void _relation_dump(u8 u8type);
    extern void _iat_dump(u8 u8type);
#endif

  	// Initial the total variants.
  	DVB_NetGetTotal();
	DVB_TPGetTotal();
	DVB_ServiceGetTotal(EN_SERVICE_TYPE_TV);

	b8Error = FALSE;

	// check orphan data and extra relation
	DBMS_DBG(( "check database interity...\n"));

	// search from satellite, del satellite also del a lot of service.
	if( DBFS_InfoCounter(EN_SAT_TABLE) != _network_get_total_all_system() )
	{
    	//DBMS_DBG(("sat error: %d/%d(T%d,S%d,C%d)\n", DBFS_InfoCounter(EN_SAT_TABLE),
    	//	_network_get_total_all_system(),     m_as16NetTotal[EN_SYSTEM_TYPE_DVBT],
    	//	m_as16NetTotal[EN_SYSTEM_TYPE_DVBS], m_as16NetTotal[EN_SYSTEM_TYPE_DVBC]));
    		
#if 0
	    _iat_dump(0);
	    _relation_dump(0);
#endif
		_evil_kindergarten(EN_SAT_TABLE, MAX_NUM_OF_SAT);
		b8Error = TRUE;
	}

	if( DBFS_InfoCounter(EN_TP_TABLE) != _tp_get_total_all_system() )
	{
    	//DBMS_DBG(("tp error: %d/%d(T%d,S%d,C%d)\n", DBFS_InfoCounter(EN_TP_TABLE),
    	//	_tp_get_total_all_system(),         m_as16TpTotal[EN_SYSTEM_TYPE_DVBT],
    	//	m_as16TpTotal[EN_SYSTEM_TYPE_DVBS], m_as16TpTotal[EN_SYSTEM_TYPE_DVBC]));
#if 0
	    _iat_dump(1);
	    _relation_dump(1);
#endif
		_evil_kindergarten(EN_TP_TABLE, MAX_NUM_OF_TP);
		b8Error = TRUE;
	}

	if( DBFS_InfoCounter(EN_SRV_TABLE) != _service_get_total_all_system() )
	{
    	//DBMS_DBG(("srv error: %d/%d(=T%d+C%d+S%d)\n", DBFS_InfoCounter(EN_SRV_TABLE),
    	//	_service_get_total_all_system(),          _service_get_total(EN_SYSTEM_TYPE_DVBT),
    	//	_service_get_total(EN_SYSTEM_TYPE_DVBC),  _service_get_total(EN_SYSTEM_TYPE_DVBS)));
#if 0
	    _iat_dump(2);
	    _relation_dump(2);
#endif
		_evil_kindergarten(EN_SRV_TABLE, MAX_NUM_OF_SRV);
		b8Error = TRUE;
	}

	if(m_as16NetTotal[EN_SYSTEM_TYPE_DVBS] == 0)
	{
		/* Set Other Sat */
		_create_other_sat();
	}

	if( b8Error==TRUE )
	{
		DVB_DatabaseWrite();
		DBMS_DBG(( "found error and fixed\n"));
	}
	else
	{
		DBMS_DBG(( "no error\n"));
	}

    DBMS_DBG(( "build extra service info...\n"));
	DVB_DramSet( DB_DRAM_EXTRA_SRV,0xff, DB_EXTRA_SRV_SIZE);

	/* Initial Extra Services */
	for(enSysType=0; enSysType<EN_SYSTEM_TYPE_TOTAL; enSysType++)
	{
		for(enSrvType=0; enSrvType<EN_SERVICE_TYPE_TOTAL; enSrvType++)
		{
			for(u16idx = 0; u16idx < m_as16SrvTotal[enSysType][enSrvType]; u16idx++)
			{
				u16RelIdx = _service_get_relation_index(enSysType, enSrvType, u16idx);

				DBFS_RelationGetSrv(u16RelIdx, &stSrvRel);
				DBFS_InfoRead(EN_SRV_TABLE, stSrvRel.u16LogicAddress, (u8*)&stSrvDetail);

				stExtraSrv.u16TypeEx        = stSrvDetail.u16TypeEX;
				stExtraSrv.u16EIT_HeaderIdx = 0xFFFF;
				_extra_srvinfo_set(u16RelIdx, &stExtraSrv);
			}
		}
	}
	DBMS_DBG(( "ExSrv ok\n"));
}
/*******************************************************************************************/

bool8 DVB_ServiceAdd(EN_SERVICE_TYPE enSrvType, u16 *pu16Idx, DVB_ServiceInfo *pstService)
{
	DB_SrvRel		stSrvRel;
	DB_ExtraSrv		stExtraSrv;
	DB_SrvDetail	stSrvDetail;

	DBMS_DBG(("DVB_ServiceAdd()-SysType=%d,SrvType=%d,Total=%d\n",
		m_enSystemType, enSrvType, m_as16SrvTotal[m_enSystemType][enSrvType]));

	_dvb_srv_2_db(pstService, &stSrvRel, &stExtraSrv, &stSrvDetail);
	return DVB_ServiceAddDetail( enSrvType, pu16Idx, &stSrvDetail, stSrvRel.u16TpIdx);
}
/*******************************************************************************************/

bool8 DVB_ServiceAddDetail(EN_SERVICE_TYPE enSrvType, u16 *pu16Idx, DB_SrvDetail *pstService, u16 u16TpIdx)
{
	DB_TpRel	stTpRel;
	DB_SatRel	stNetRel;
	DB_SrvRel	stSrvRel;
	DB_ExtraSrv	stExtraSrv;
	s16			s16idx;
	u16			u16RelIdx1, u16RelIdx2;

	 DBMS_DBG(("DVB_ServiceAddDetail()-SysType=%d,SrvType=%d,Total=%d,TpIdx=%d\n",
		m_enSystemType, enSrvType, m_as16SrvTotal[m_enSystemType][enSrvType], u16TpIdx));

	// one empty item for identify tv or radio
	if(_service_get_total(m_enSystemType) >= _service_get_maximum(m_enSystemType) - 1)
	{
		DBMS_DBG(( "\nService list full\n"));
		return FALSE;
	}

	// Update the current network relation.
	DBFS_RelationGetTp(_tp_get_relation_index(m_enSystemType, u16TpIdx), &stTpRel);
	
	// For older project, the tp index of service data means channel no of frequency.
	// And it should unuse TP & Net structures. So check the network index of TP to
	// know which the project is.
	if(stTpRel.u16SatIdx != 0xFFFF)
	{
		DBFS_RelationGetNet(_network_get_relation_index(m_enSystemType, stTpRel.u16SatIdx), &stNetRel);
	
		if((stNetRel.as16SrvStartIdx[enSrvType] < 0) || (stNetRel.as16SrvEndIdx  [enSrvType] < 0))
		{
			stNetRel.as16SrvStartIdx[enSrvType] =
			stNetRel.as16SrvEndIdx  [enSrvType] =
				_service_get_start_index_in_net(m_enSystemType, enSrvType, stTpRel.u16SatIdx);
		}
		else
		{
			stNetRel.as16SrvEndIdx[enSrvType]++;
		}
		DBFS_RelationSetNet(_network_get_relation_index(m_enSystemType, stTpRel.u16SatIdx), &stNetRel);
	
		// Update the following networks relation.
		for(s16idx = stTpRel.u16SatIdx + 1; s16idx < m_as16NetTotal[m_enSystemType]; s16idx++)
		{
			DBFS_RelationGetNet(_network_get_relation_index(m_enSystemType, s16idx), &stNetRel);
			if((stNetRel.as16SrvStartIdx[enSrvType] < 0) || (stNetRel.as16SrvEndIdx[enSrvType] < 0))
				continue;
	
			stNetRel.as16SrvStartIdx[enSrvType]++;
			stNetRel.as16SrvEndIdx  [enSrvType]++;
	
			DBFS_RelationSetNet(_network_get_relation_index(m_enSystemType, s16idx), &stNetRel);
		}
	
		// Shift backward service relations which are following insert one.
		DBFS_RelationGetNet(_network_get_relation_index(m_enSystemType, stTpRel.u16SatIdx), &stNetRel);
		for(s16idx  = m_as16SrvTotal[m_enSystemType][enSrvType]-1;
			s16idx >= stNetRel.as16SrvEndIdx[enSrvType]; s16idx--)
		{
			u16RelIdx1 = _service_get_relation_index(m_enSystemType, enSrvType, s16idx  );
			u16RelIdx2 = _service_get_relation_index(m_enSystemType, enSrvType, s16idx+1);
	
			DBFS_RelationGetSrv(u16RelIdx1, &stSrvRel);
			DBFS_RelationSetSrv(u16RelIdx2, &stSrvRel);
	
			_extra_srvinfo_get (u16RelIdx1, &stExtraSrv);
			_extra_srvinfo_set (u16RelIdx2, &stExtraSrv);
		}
		
		*pu16Idx = stNetRel.as16SrvEndIdx[enSrvType];
	}
	else
	{
		*pu16Idx = m_as16SrvTotal[m_enSystemType][enSrvType];
	}

	// Add service.
	stSrvRel.u16LogicAddress    = DBFS_InfoNew(EN_SRV_TABLE, (u8*)pstService);
	stSrvRel.u16TpIdx           = u16TpIdx;
	stExtraSrv.u16TypeEx        = pstService->u16TypeEX;
	stExtraSrv.u16EIT_HeaderIdx = 0xFFFF;

	u16RelIdx1 = _service_get_relation_index(m_enSystemType, enSrvType, *pu16Idx);

	DBFS_RelationSetSrv(u16RelIdx1, &stSrvRel);
	_extra_srvinfo_set (u16RelIdx1, &stExtraSrv);

	m_as16SrvTotal[m_enSystemType][enSrvType]++;
	return TRUE;
}
/*******************************************************************************************/

bool8 DVB_ServiceUpdate(EN_SERVICE_TYPE enSrvType, u16 u16Idx, DVB_ServiceInfo *pstService)
{
	DB_SrvRel		stSrvRel;
	DB_ExtraSrv		stExtraSrv;
	DB_SrvDetail	stSrvDetail;
	u16				u16RelIdx;
	DVB_ServiceInfo OriginSrv;
	DBMS_DBG(("DVB_ServiceUpdate()-SysType=%d,SrvType=%d,SrvIdx=%d,Total=%d\n",
		m_enSystemType, enSrvType, u16Idx, m_as16SrvTotal[m_enSystemType][enSrvType]));

	if(u16Idx >= m_as16SrvTotal[m_enSystemType][enSrvType])
	{
		return FALSE;
	}	
	memset(&stSrvRel, 0, sizeof(DB_SrvRel));
	memset(&stExtraSrv, 0, sizeof(DB_ExtraSrv));
	memset(&OriginSrv, 0, sizeof(DVB_ServiceInfo));
	memset(&stSrvDetail, 0, sizeof(DB_SrvDetail));//add by seven
	DVB_ServiceRead(enSrvType, u16Idx, &OriginSrv);
	if(memcmp(&OriginSrv, pstService, sizeof(DVB_ServiceInfo)) == 0)
	{
		DBMS_DBG(("The same data, no update!\n"));
	}
	else
	{
		DBMS_DBG(("Different data, update!\n"));
		u16RelIdx = _service_get_relation_index(m_enSystemType, enSrvType, u16Idx);

		DBFS_RelationGetSrv(u16RelIdx, &stSrvRel);
		
		_dvb_srv_2_db(pstService, &stSrvRel, &stExtraSrv, &stSrvDetail);

		DBFS_InfoWrite(EN_SRV_TABLE, stSrvRel.u16LogicAddress, (u8*)&stSrvDetail);

		DBFS_RelationSetSrv(u16RelIdx, &stSrvRel);
		_extra_srvinfo_set(u16RelIdx, &stExtraSrv);
	}

	return TRUE;
}
/*******************************************************************************************/

bool8 DVB_ServiceUpdateDetail(EN_SERVICE_TYPE enSrvType, u16 u16Idx, DB_SrvDetail *pstService, u16 u16TpIdx)
{
	u16			u16RelIdx;
	DB_SrvRel	stSrvRel;
	DB_ExtraSrv	stExtraSrv;

	DBMS_DBG(("%s L%d: DVB_ServiceUpdateDetail()-SysType=%d,SrvType=%d,SrvIdx=%d,Total=%d\n",
		m_enSystemType, enSrvType, u16Idx, m_as16SrvTotal[m_enSystemType][enSrvType]));

	if(u16Idx >= m_as16SrvTotal[m_enSystemType][enSrvType])
	{
		return FALSE;
	}
	u16RelIdx = _service_get_relation_index(m_enSystemType, enSrvType, u16Idx);

	DBFS_RelationGetSrv(u16RelIdx, &stSrvRel);
	if (stSrvRel.u16TpIdx != u16TpIdx)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -