📄 db_ms.c
字号:
{
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 + -