📄 loadchannels.c
字号:
if(pstTransponderList->cNoOfValidTransponders <= 0)
{
iNoOfTransponderMenuElements = 0;
scTransponderNumber2bRetrieved = 0;
scTransponderIndex2bRetrieved = INVALID_LINK;
return (int)INVALID_LINK;
}
if(numHighlightTransAfterDelete == 0)
{
/*if numHighlightTransAfterDelete is 0, it's the 1st time to TransponderManagement, or there is no transponders.*/
/* get current playing program 's transponder index & number*/
if(sProgIndex2bRetrieved != INVALID_LINK)
{
scTransponderIndex2bRetrieved = ProgIndex2TransIndex(sProgIndex2bRetrieved);
scTransponderNumber2bRetrieved = TransIndex2TransNum(scTransponderIndex2bRetrieved);
}
pstTransponderInfoTemp = CurTransInfo( &scTransNum_bak ) ;
/*move the start index of the 1st transponder to be shown*/
if(scTransNum_bak <= iMaxItemsOnScreen)
{
PositionTransInfoTop();
}
else
{
PositionTransInfoNeg(iMaxItemsOnScreen-1);
}
}
else
{
/*then, it called after deleted one transponder,*/
scTransNum_bak = numHighlightTransAfterDelete;
numHighlightTransAfterDelete = 0;
}
/* sttbx_Print("++getTrans(),scTransIndex: %d, scTransNum: %d \n", scTransponderIndex2bRetrieved,scTransponderNumber2bRetrieved);
*/
pstTransponderInfoTemp = CurTransInfo ( &scTransNum);
/* sttbx_Print("1st item:scTransIndex: %d, scTransNum: %d, scTransNum_bak:%d \n",
scTransponderIndex2bRetrieved,scTransponderNumber2bRetrieved,scTransNum_bak);
*/
sprintf ( ( char * ) pstTransponderMenuDataTail ->aucData, "%-16d %-15s %-16d %-3d",
scTransNum ,
pstTransponderInfoTemp ->Xpdr.Terrestrial.acNetworkName,
pstTransponderInfoTemp ->Xpdr.Terrestrial.iTransponderFreq,
GetProgramsInTransponder(scTransponderIndex2bRetrieved) );
//sttbx_Print("1st item data: %10s\n",pstTransponderMenuDataTail ->aucData);
iNoOfTransponderMenuElements = 1;
if(scTransNum_bak == scTransNum)
{
/*set it point to the chosen item*/
pstCurTransponder = pstTransponderMenuDataTail;
iCurrentTransOffset = 0;
}
while ( iNoOfTransponderMenuElements < iMaxItemsOnScreen )
{
if ( ( pstTransponderInfoTemp = NextTransInfo ( &scTransNum) ) == NULL )
break;
/*
* add the new element to the menu list
*/
pstMenuDataTemp = &astTransponders [ iNoOfTransponderMenuElements ];
pstTransponderMenuDataTail ->Next = pstMenuDataTemp;
pstMenuDataTemp ->Prev = pstTransponderMenuDataTail;
pstTransponderMenuDataTail = pstMenuDataTemp;
pstTransponderMenuDataTail ->Next = ( MENU_DATA_STRUCT * ) NULL;
++iNoOfTransponderMenuElements;
sprintf ( ( char * ) pstTransponderMenuDataTail ->aucData, "%-16d %-15s %-16d %-3d",
scTransNum ,
pstTransponderInfoTemp ->Xpdr.Terrestrial.acNetworkName,
pstTransponderInfoTemp ->Xpdr.Terrestrial.iTransponderFreq,
GetProgramsInTransponder(scTransponderIndex2bRetrieved) );
if(scTransNum_bak == scTransNum)
{
/*set it point to the chosen item*/
pstCurTransponder = pstTransponderMenuDataTail;
iCurrentTransOffset = iNoOfTransponderMenuElements -1;
}
}
transponder_menu_page_last_sel = NEXT_PAGE;
//sttbx_Print("--getTran(), HIGHTLIGHT iCurrentTransOffset = %d ,total items = %d\n", iCurrentTransOffset,iNoOfTransponderMenuElements);
//sttbx_Print ("Tran info: %5s\n",pstCurTransponder->aucData);
return iCurrentTransOffset;
}
int transponderPrevKeyFunc(int iNoOfValidItems,int iNoOfItemsInScreen)
{
int iOffset;
signed char scTransNum;
MENU_DATA_STRUCT *pstMenuDataTemp;
TRANSPONDER_INFO_STRUCT *pstTransponderInfoTemp;
if(iNoOfValidItems < iNoOfItemsInScreen)
return (int)INVALID_LINK;
iOffset = iNoOfValidItems;/*number of valid elements in the menu data linked list*/
if ( transponder_menu_page_last_sel == PREV_PAGE )
iOffset = 1;
/*在menu_page_last_sel== NEXT_PAGE时,由于高亮显示的Item在当前列表的最下面
* 所以为了向上移动一格,就需要后退iNoOfValidItems步才能指示到上面的Item
*/
if ( PositionTransInfoNeg ( iOffset ) == INVALID_LINK )
return (int)INVALID_LINK;
transponder_menu_page_last_sel = PREV_PAGE;
if ( ( pstTransponderInfoTemp = CurTransInfo ( &scTransNum ) ) == NULL )
{
return (int)INVALID_LINK;
}
/*
* cut the tail and add it as a new head
* 将原列表尾部的元素变成头部
* 为什么要这样?--因为一次只向上移动一个节目的位置
* 也就是说最下面的那个节目相应往下移动被遮盖了
*/
pstMenuDataTemp = pstTransponderMenuDataTail;
pstTransponderMenuDataTail ->Prev ->Next = ( MENU_DATA_STRUCT * ) NULL;
pstTransponderMenuDataTail = pstTransponderMenuDataTail ->Prev;
pstMenuDataTemp ->Next = pstTransponderMenuDataHead;
pstTransponderMenuDataHead ->Prev = pstMenuDataTemp;
pstTransponderMenuDataHead = pstMenuDataTemp;
pstTransponderMenuDataHead ->Prev = ( MENU_DATA_STRUCT * ) NULL;
/*
* fill the data now, after clearing the existing data只清除现在的头部元素,等待加入新的节目名
*/
memset ( pstTransponderMenuDataHead ->aucData, 0, sizeof ( pstTransponderMenuDataHead ->aucData ) );
sprintf ( ( char * ) pstTransponderMenuDataHead ->aucData, "%-16d %-15s %-16d %-3d",
scTransNum ,
pstTransponderInfoTemp ->Xpdr.Terrestrial.acNetworkName,
pstTransponderInfoTemp ->Xpdr.Terrestrial.iTransponderFreq,
GetProgramsInTransponder(scTransponderIndex2bRetrieved) );
return iNoOfValidItems;
}
int transponderNextKeyFunc(int iNoOfValidItems)
{
int iOffset;
signed char scTransNum;
MENU_DATA_STRUCT *pstMenuDataTemp;
TRANSPONDER_INFO_STRUCT *pstTransponderInfoTemp;
iOffset = iNoOfValidItems;
if ( transponder_menu_page_last_sel == NEXT_PAGE )
iOffset = 1;
if ( PositionTransInfoPos ( iOffset ) == INVALID_LINK )
return (int)INVALID_LINK;
transponder_menu_page_last_sel = NEXT_PAGE;
if ( ( pstTransponderInfoTemp = CurTransInfo ( &scTransNum ) ) == NULL )
{
return (int)INVALID_LINK;
}
/*
* cut the head and add it as a new tail
*/
pstMenuDataTemp = pstTransponderMenuDataHead;
pstTransponderMenuDataHead ->Next ->Prev = ( MENU_DATA_STRUCT * ) NULL;
pstTransponderMenuDataHead = pstTransponderMenuDataHead ->Next;
pstMenuDataTemp ->Prev = pstTransponderMenuDataTail;
pstTransponderMenuDataTail ->Next = pstMenuDataTemp;
pstTransponderMenuDataTail = pstMenuDataTemp;
pstTransponderMenuDataTail ->Next = ( MENU_DATA_STRUCT * ) NULL;
/*
* fill the data now, after cleraing the existing data
*/
memset ( pstTransponderMenuDataTail ->aucData, 0, sizeof ( pstTransponderMenuDataTail ->aucData ) );
sprintf ( ( char * ) pstTransponderMenuDataTail ->aucData, "%-16d %-15s %-16d %-3d",
scTransNum ,
pstTransponderInfoTemp ->Xpdr.Terrestrial.acNetworkName,
pstTransponderInfoTemp ->Xpdr.Terrestrial.iTransponderFreq,
GetProgramsInTransponder(scTransponderIndex2bRetrieved) );
return iNoOfValidItems;
}
/*
delete the current chosen item.
-------------------
The 1st item to be displayed after deleteing depend on scTransIdx1st, 3 special situation:
1:
if there is only 1 item displayed on screen, it means that, we came to the end to whole transponder list.
after delete the current one, we will display the previos page if there are any items.
so before gettranponder(), move the scTransponderIndex2bRetrieved to the 1st item on previos page,
2: there are many on current screen.
2.1, if delete the 1st one on screen. before gettranponder(), set scTransponderIndex2bRetrieved = 1st item -> next tranponde index.
2.2, else if delete other items, before gettranponder(),set scTransponderIndex2bRetrieved = current 1st transponder index
--------------------
Which one is highlighted is depend on iTransOffInChManagement, set it = scTransIdx1st:
*/
/*
int iMaxNumOnScreen : the max num of items can be displayed on screen at a time. range: 1~ ??MAX_ITEM_ON_SREEN??
int iNoOfValidItems : the num of items that current displayed. range 1~iMaxNumOnScreen
intiItemOffPassed : the offset of chosen item among items on screen. range: 0~ iNoOfValidItems-1
*/
void transponderDeleteFunc(int iItemOffPassed, int iNoOfValidItems , int iMaxNumOnScreen)
{
// signed char scTransSlot;
// TRANSPONDER_INFO_STRUCT *pstTransponderInfoTemp;
signed char scTransIdxBak;
signed char scTransIdx2Del;
signed char scTransIdx1st;
signed char scTransNum1st;
short progidx_tmp;
if(iItemOffPassed>=iNoOfValidItems || iNoOfValidItems> iMaxNumOnScreen)
return ;
sttbx_Print("----------------------\niItemOffPassed %d,iNoOfValidItems %d\n",
iItemOffPassed, iNoOfValidItems);
sttbx_Print("++TransDelete1:scTransponderIndex2bRetrieved =%d, scTransponderNumber2bRetrieved=%d\n",
scTransponderIndex2bRetrieved,scTransponderNumber2bRetrieved);
scTransIdxBak = scTransponderIndex2bRetrieved;
/*--1. find after delete, the index of the 1st transponder in menu ---*/
/* we alway assume:
* scTransponderIndex2bRetrieved point the 1st item if transponder_menu_page_last_sel
* otherwize point to the last item on screen.
*/
/* scTransIdx1st point to the 1st item on current menu */
if ( transponder_menu_page_last_sel == NEXT_PAGE )
{
PositionTransInfoNeg(iNoOfValidItems-1);
}
scTransIdx1st = scTransponderIndex2bRetrieved;
scTransNum1st = scTransponderNumber2bRetrieved;
/* 3. set scTransIdx2Del, scTransponderIndex2bRetrieved point current chosen transponder index*/
scTransIdx2Del = PositionTransInfoPos ( iItemOffPassed );
/*2. set scTransIdx1st point to which one that will displayed as the 1st item, AFTER delete current item*/
numHighlightTransAfterDelete = scTransNum1st +iItemOffPassed;
if(scTransIdx2Del == pstTransponderList->cTailTransponderIndex)
{
sttbx_Print("--numHighlightTransAfterDelete\n");
numHighlightTransAfterDelete--;
}
sttbx_Print(" numHighlightTransAfterDelete = %d \n",numHighlightTransAfterDelete);
if(iNoOfValidItems <= 1)
{
/*only 1 transponder left*/
scTransIdx1st = INVALID_LINK;
scTransNum1st = 0;
}
else if(pstTransponderList->cNoOfValidTransponders <= iMaxNumOnScreen)
{
/* number of total transponder is no more than iMaxNumOnScreen, all is displayed on screen */
if(scTransIdx2Del == scTransIdx1st)
{
scTransIdx1st = pastTransponderInfoTable[scTransIdx1st].cNextTransponderIndex;
}
}
else
{
/*num of whole transponders are more than iMaxNumOnScreen, only displayed a part of them */
if(scTransIdx2Del == scTransIdx1st)
{
/*delete the 1st one on the screen*/
if((scTransNum1st +(iNoOfValidItems-1) == pstTransponderList->cNoOfValidTransponders))
{
/*come to the end of transponder list*/
scTransIdx1st = pastTransponderInfoTable[scTransIdx1st].cPrevTransponderIndex;
scTransNum1st--;
}
else
{
scTransIdx1st = pastTransponderInfoTable[scTransIdx1st].cNextTransponderIndex;
}
}
else
{
if(scTransNum1st +(iNoOfValidItems-1) == pstTransponderList->cNoOfValidTransponders)
{
scTransIdx1st = pastTransponderInfoTable[scTransIdx1st].cPrevTransponderIndex;
scTransNum1st--;
}
}
}
sttbx_Print("The 1st to show after delete:scTransIdx1st =%d, scTransNum1st=%d\n",
scTransIdx1st,scTransNum1st);
/*4, check whether the chosen transponder is valid --------*/
if (scTransIdx2Del == INVALID_LINK ||pastTransponderInfoTable[scTransIdx2Del].status == ELEMENT_FREE)
{
return ;
}
/*5. check if deleteing current playing program */
if(scTransIdx2Del == ProgIndex2TransIndex(sProgIndex2bRetrieved))
{
progidx_tmp = sProgIndex2bRetrieved;
/*stop current program*/
SRAVC_AVstop();
sttbx_Print("delete current program!!!!\n");
/*search previous programs*/
while(progidx_tmp != INVALID_LINK)
{
if(scTransIdx2Del != ProgIndex2TransIndex(progidx_tmp))
break;
progidx_tmp = astProgInfoTable[progidx_tmp].sPrevProgIndex;
}
if(progidx_tmp == INVALID_LINK)
{
/*search later programs*/
progidx_tmp = sProgIndex2bRetrieved;
while(progidx_tmp != INVALID_LINK)
{
if(scTransIdx2Del != ProgIndex2TransIndex(progidx_tmp))
break;
progidx_tmp = astProgInfoTable[progidx_tmp].sNextProgIndex;
}
}
/*found a program that will no be deleted, or all programs will be deleted*/
sProgIndex2bRetrieved = progidx_tmp;
/*7. calcualate new program no that will play */
iProgNumberBeingRetrieved = 0;
progidx_tmp = sProgIndex2bRetrieved;
while(progidx_tmp != INVALID_LINK)
{
++iProgNumberBeingRetrieved;
progidx_tmp = astProgInfoTable[progidx_tmp].sPrevProgIndex;
}
/*--start a new program, if any--*/
if(sProgIndex2bRetrieved != INVALID_LINK)
{
iCurrentProgramNo = iProgNumberBeingRetrieved;
//msm_ChannelDisplay(act_DirChNum);
msm_NewChannelDisplay(cmd_DirChNum);
}
}
/*8. calculate the trans INDEX of the 1st transponder to show,AFTER delete*/
scTransponderIndex2bRetrieved = scTransIdx1st;
scTransponderNumber2bRetrieved = scTransNum1st;
/*6.do delete job*/
SRDBE_DeleteProgramsByTransponder( scTransIdx2Del);//wuhan added,06-28-2005
DeleteTransponderSlot(scTransIdx2Del);
sttbx_Print("--TransDelete. scTransponderIndex2bRetrieved %d, scTransponderNumber2bRetrieved%d,hight numHighlightTransAfterDelete%d\n",
scTransponderIndex2bRetrieved,scTransponderNumber2bRetrieved,numHighlightTransAfterDelete);
}
int getChannels(int iNoOfItemsInScreen)
{
int iProgNo;
//int iArrayCount;
MENU_DATA_STRUCT *pstMenuDataTemp;
PROG_INFO_STRUCT *pstProgInfoTemp;
int iCurrentProgNo;
int iCurrentProgOffset = 0;
char networkName[MAX_NETWORK_NAME_LENGTH+1];
#if 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -