📄 loadchannels.c
字号:
/*******************************************************************************
File name : loadchannels.c
Description : Provide the interface to load channels from dbase for display in 'channel list','epg','
channel management',etc.
Revision : 2.2.0
COPYRIGHT (C) EMC-HUST-JRC 2005.
Date Label Auther Comment
---- ---- ------ ---------------------
11-25-2005 FF02 Floid Feng support transponder
11-09-2005 AL15 Allen Wu support end-to-front in rolling page
11-02-2005 AL05 Allen Wu support to channel management
05-07-2005 Allen Wu Created
*********************************************************************************/
#include "stddefs.h"
#include "sr_dbase.h"
//#include "Rckeymap.h"
//#include "keyboardtest.h"
#include "usif.h"
#include "string.h"
#include "stdio.h"
#include "loadchannels.h"
#include "cmdcontrol.h" //FF02
#include "emc_channeldisplay.h"
/*-------------------------------------------------------------------------------*/
/*These are the two very inportant globle vari which point to the program displaying now*/
/*Notice!!!Don't modify them unless you want to change the current program*/
extern short int sProgIndex2bRetrieved;
extern int iProgNumberBeingRetrieved;
/*comes from Sr_dbase.h,these are global varis*/
extern int iCurrentProgramNo;
extern PROGRAM_LIST *ProgramList;
extern PROG_INFO_STRUCT *astProgInfoTable;
extern TRANSPONDER_LIST *pstTransponderList;
extern TRANSPONDER_INFO_STRUCT *pastTransponderInfoTable;
/*-------------------------------------------------------------------------------*/
/*store necessary information(part of info. in dbase) which will be display in the channel list*/
MENU_DATA_STRUCT astAvailableChannels[MAX_NO_OF_MENU_ELEMENTS_IN_BIG_SCREEN];
MENU_DATA_STRUCT astFavoriteChannels[MAX_NO_OF_MENU_ELEMENTS_IN_BIG_SCREEN];
MENU_DATA_STRUCT astTransponders[MAX_NO_OF_MENU_ELEMENTS_IN_BIG_SCREEN];
/*Head Points & Tail Points*/
MENU_DATA_STRUCT *pstAvailableMenuDataHead = NULL;
MENU_DATA_STRUCT *pstAvailableMenuDataTail = NULL;
MENU_DATA_STRUCT *pstFavoriteMenuDataHead = NULL;
MENU_DATA_STRUCT*pstFavoriteMenuDataTail = NULL;
MENU_DATA_STRUCT *pstTransponderMenuDataHead = NULL;
MENU_DATA_STRUCT *pstTransponderMenuDataTail = NULL;
/*Current Points*/
MENU_DATA_STRUCT *pstCurAvailableChannel = NULL;
MENU_DATA_STRUCT *pstCurFavoriteChannel = NULL;
MENU_DATA_STRUCT *pstCurTransponder = NULL;
/*表示此时向下翻页只需将指针移动到下一个位置即可*/
/*若向上翻页则需计算移动的数目*/
menu_page_sel_t available_menu_page_last_sel = NEXT_PAGE;
menu_page_sel_t favorite_menu_page_last_sel = NEXT_PAGE;
menu_page_sel_t transponder_menu_page_last_sel = NEXT_PAGE;
/*Availabe Channels,Favorite Channels & Transponders 在一屏内的真实数目*/
int iNoOfAvailableMenuElements = 0;
int iNoOfFavoriteMenuElements = 0;
int iNoOfTransponderMenuElements = 0;
/*指向当前的节目的Index和当前节目号(适用于EPG和Available Channels)*/
short int sProgIndex = INVALID_LINK;
int iProgNumber = 0;
/*指向当前的节目的Index和当前节目号(适用于Favorite Channels)*/
int iFavoriteProgNumberBeingRetrieved = 0;
short int sFavoriteProgIndex2bRetrieved = INVALID_LINK;
/*Point to the current transponder*/
signed char scTransponderIndex2bRetrieved = INVALID_LINK;
signed char scTransponderNumber2bRetrieved = 0; /* FF02 current transponder number displayed*/
/*-------------------------------------------------------------------------------*/
extern void sttbx_Print(const char *const Format_p, ...);
extern PROG_INFO_STRUCT *SRDBE_CurProgInfo ( int *piProgramNo );
extern PROG_INFO_STRUCT *SRDBE_NextProgInfo ( int *piProgramNo );
extern PROG_INFO_STRUCT *SRDBE_PrevProgInfo ( int *piProgramNo );
extern int SRDBE_PositionProgInfoTop ( void );
extern SHORT SRDBE_PositionProgInfoNeg ( int iOffset );
extern SHORT SRDBE_PositionProgInfoPos ( int iOffset );
extern BOOL SRDBE_SetProgFavorite(int iProgNo);
/*-------------------------------------------------------------------------------*/
/*extend funcs for build favorite channel dbase,added by Allen Wu,2005-5-14*/
static PROG_INFO_STRUCT *CurFavoriteProgInfo ( int *piProgramNo );
static PROG_INFO_STRUCT *NextFavoriteProgInfo(int *piProgramNo);
static PROG_INFO_STRUCT *PrevFavoriteProgInfo ( int *piProgramNo );
static SHORT PositionFavoriteProgInfoPos(int iOffset);
static SHORT PositionFavoriteProgInfoNeg(int iOffset);
static int PositionFavoriteProgInfoTop(void);
/*wuhan added,06-29-2005*/
static TRANSPONDER_INFO_STRUCT *CurTransInfo(signed char *pcTransSlot);
static TRANSPONDER_INFO_STRUCT *NextTransInfo(signed char *pcTransSlot);
static TRANSPONDER_INFO_STRUCT *PrevTransInfo(signed char *pcTransSlot);
static signed char PositionTransInfoPos(int iOffset);
static signed char PositionTransInfoNeg(int iOffset);
static int PositionTransInfoTop(void);
/*以下函数不更改全局变量*/
static PROG_INFO_STRUCT *CurProgInfo ( int *piProgramNo );
static PROG_INFO_STRUCT *NextProgInfo ( int *piProgramNo );
static PROG_INFO_STRUCT *PrevProgInfo ( int *piProgramNo );
static int PositionProgInfoTop ( void );
SHORT PositionProgInfoNeg ( int iOffset );
static SHORT PositionProgInfoPos ( int iOffset );
static volatile signed char numHighlightTransAfterDelete = 0;
/*-------------------------------------------------------------------------------*/
/*---------------------favorite channels--------------------------*/
int iFavProgNumber = 0;
short int sFavProgIndex = INVALID_LINK;
int getFavoriteChannels(int iNoOfItemsInScreen)
{
int iProgNo,iCurrentProgNo,iNoOfFavChannelSoFar = 0;
MENU_DATA_STRUCT *pstMenuDataTemp;
PROG_INFO_STRUCT *pstProgInfoTemp;
int iCurrentProgOffset = 0;
/*1.clear the list*/
memset ( astFavoriteChannels, 0, ( sizeof ( MENU_DATA_STRUCT ) * iNoOfItemsInScreen ) );
pstFavoriteMenuDataHead = pstFavoriteMenuDataTail= &astFavoriteChannels[ 0 ];
pstFavoriteMenuDataHead ->Prev = ( MENU_DATA_STRUCT * ) NULL;
pstFavoriteMenuDataTail ->Next = ( MENU_DATA_STRUCT * ) NULL;
/*get the last watching favorite program*/
if(sFavoriteProgIndex2bRetrieved == INVALID_LINK)
{
if(PositionFavoriteProgInfoTop ()==INVALID_LINK)
return (int)INVALID_LINK;
iCurrentProgNo = iFavProgNumber;
}
else
iCurrentProgNo = iFavoriteProgNumberBeingRetrieved; /*前一次选择的喜爱节目号*/
//sttbx_Print("\niCurrentProgNo1 = %d\n",iCurrentProgNo);
#if 0
pstProgInfoTemp = CurFavoriteProgInfo ( &iProgNo);
iCurrentProgNo = iProgNo;
if(pstProgInfoTemp == NULL)
return (int)INVALID_LINK;
#endif
/*计算该节目之前有多少喜爱节目*/
PositionFavoriteProgInfoTop ();
//sttbx_Print("\niCurrentProgNo2 = %d\n",iCurrentProgNo);
//sttbx_Print("\niFavProgNumber = %d\n",iCurrentProgNo);
for(;;)
{
if(iFavProgNumber == iCurrentProgNo)
{
iNoOfFavChannelSoFar++;
break;
}
NextFavoriteProgInfo(&iProgNo);
iNoOfFavChannelSoFar++; /*wuhan added,07-06-2005*/
}
//sttbx_Print("\n\niNoOfFavChannelSoFar = %d\n\n",iNoOfFavChannelSoFar);
/*前一次喜爱节目信息,用于列表的显示和翻页*/
iFavProgNumber = iFavoriteProgNumberBeingRetrieved;
sFavProgIndex = sFavoriteProgIndex2bRetrieved;
//sttbx_Print("\nin select\nsProgIndex= %d\niProgNumber = %d\n",sProgIndex,iProgNumber);
if(iNoOfFavChannelSoFar <= iNoOfItemsInScreen)
{
PositionFavoriteProgInfoTop ();
//sttbx_Print("Position Top\n");
}
else
{
PositionFavoriteProgInfoNeg(iNoOfItemsInScreen-1);
//sttbx_Print("Position Neg %d\n",iNoOfItemsInScreen-1);
}
pstProgInfoTemp = CurFavoriteProgInfo ( &iProgNo);
sprintf ( ( char * ) pstFavoriteMenuDataTail ->aucData, "%-16d %-15s %-16s ",
iProgNo,
pstProgInfoTemp ->cServiceName,
pstProgInfoTemp ->cServiceProviderName);
if(iProgNo == iCurrentProgNo)
{
iCurrentProgOffset = 0;
pstCurFavoriteChannel = pstFavoriteMenuDataTail;
}
iNoOfFavoriteMenuElements = 1;
while ( iNoOfFavoriteMenuElements < iNoOfItemsInScreen )
{
if ( ( pstProgInfoTemp = NextFavoriteProgInfo ( &iProgNo) ) == NULL )
break;
/*
* add the new element to the menu list
*/
pstMenuDataTemp = &astFavoriteChannels [ iNoOfFavoriteMenuElements ];
pstFavoriteMenuDataTail ->Next = pstMenuDataTemp;
pstMenuDataTemp ->Prev = pstFavoriteMenuDataTail;
pstFavoriteMenuDataTail = pstMenuDataTemp;
pstFavoriteMenuDataTail ->Next = ( MENU_DATA_STRUCT * ) NULL;
++iNoOfFavoriteMenuElements;
sprintf ( ( char * ) pstFavoriteMenuDataTail ->aucData, "%-16d %-15s %-16s ",
iProgNo,
pstProgInfoTemp ->cServiceName,
pstProgInfoTemp ->cServiceProviderName);
if(iProgNo == iCurrentProgNo)
{
pstCurFavoriteChannel = pstFavoriteMenuDataTail;
iCurrentProgOffset = iNoOfFavoriteMenuElements -1;
}
}
favorite_menu_page_last_sel = NEXT_PAGE;
//return iNoOfFavoriteMenuElements;
return iCurrentProgOffset;
}
int favoriteChannelPrevKeyFunc(int iNoOfValidItems,int iNoOfItemsInScreen)
{
int iOffset;
int iProgNo;
MENU_DATA_STRUCT *pstMenuDataTemp;
PROG_INFO_STRUCT *pstProgInfoTemp;
if(iNoOfValidItems < iNoOfItemsInScreen)
return (int)INVALID_LINK;
iOffset = iNoOfValidItems;/*number of valid elements in the menu data linked list*/
if ( favorite_menu_page_last_sel == PREV_PAGE )
iOffset = 1;
/*在menu_page_last_sel== NEXT_PAGE时,由于高亮显示的Item在当前列表的最下面
* 所以为了向上移动一格,就需要后退iNoOfValidItems步才能指示到上面的Item
*/
if ( PositionFavoriteProgInfoNeg ( iOffset ) == INVALID_LINK )
return (int)INVALID_LINK;
favorite_menu_page_last_sel = PREV_PAGE;
if ( ( pstProgInfoTemp = CurFavoriteProgInfo ( &iProgNo ) ) == NULL )
{
return (int)INVALID_LINK;
}
/*
* cut the tail and add it as a new head
* 将原列表尾部的元素变成头部
* 为什么要这样?--因为一次只向上移动一个节目的位置
* 也就是说最下面的那个节目相应往下移动被遮盖了
*/
pstMenuDataTemp = pstFavoriteMenuDataTail;
pstFavoriteMenuDataTail ->Prev ->Next = ( MENU_DATA_STRUCT * ) NULL;
pstFavoriteMenuDataTail = pstFavoriteMenuDataTail ->Prev;
pstMenuDataTemp ->Next = pstFavoriteMenuDataHead;
pstFavoriteMenuDataHead ->Prev = pstMenuDataTemp;
pstFavoriteMenuDataHead = pstMenuDataTemp;
pstFavoriteMenuDataHead ->Prev = ( MENU_DATA_STRUCT * ) NULL;
/*
* fill the data now, after clearing the existing data只清除现在的头部元素,等待加入新的节目名
*/
memset ( pstFavoriteMenuDataHead ->aucData, 0, sizeof ( pstFavoriteMenuDataHead ->aucData ) );
sprintf ( ( char * ) pstFavoriteMenuDataHead ->aucData, "%-16d %-15s %-16s ",
iProgNo,
pstProgInfoTemp ->cServiceName,
pstProgInfoTemp ->cServiceProviderName);
return iNoOfValidItems;
}
int favoriteChannelNextKeyFunc(int iNoOfValidItems)
{
int iOffset;
int iProgNo;
MENU_DATA_STRUCT *pstMenuDataTemp;
PROG_INFO_STRUCT *pstProgInfoTemp;
iOffset = iNoOfValidItems;
if ( favorite_menu_page_last_sel == NEXT_PAGE )
iOffset = 1;
if ( PositionFavoriteProgInfoPos ( iOffset ) == INVALID_LINK )
return (int)INVALID_LINK;
favorite_menu_page_last_sel = NEXT_PAGE;
if ( ( pstProgInfoTemp = CurFavoriteProgInfo ( &iProgNo ) ) == NULL )
{
return (int)INVALID_LINK;
}
/*
* cut the head and add it as a new tail
*/
pstMenuDataTemp = pstFavoriteMenuDataHead;
pstFavoriteMenuDataHead ->Next ->Prev = ( MENU_DATA_STRUCT * ) NULL;
pstFavoriteMenuDataHead = pstFavoriteMenuDataHead ->Next;
pstMenuDataTemp ->Prev = pstFavoriteMenuDataTail;
pstFavoriteMenuDataTail ->Next = pstMenuDataTemp;
pstFavoriteMenuDataTail = pstMenuDataTemp;
pstFavoriteMenuDataTail ->Next = ( MENU_DATA_STRUCT * ) NULL;
/*
* fill the data now, after cleraing the existing data
*/
memset ( pstFavoriteMenuDataTail ->aucData, 0, sizeof ( pstFavoriteMenuDataTail ->aucData ) );
sprintf ( ( char * ) pstFavoriteMenuDataTail->aucData, "%-16d %-15s %-16s ",
iProgNo,
pstProgInfoTemp ->cServiceName,
pstProgInfoTemp ->cServiceProviderName);
return iNoOfValidItems;
}
void favoriteChannelSelectKeyFunc(int iItemOffPassed, int iNoOfValidItems )
{
int iProgNo;
PROG_INFO_STRUCT *pstProgInfoTemp;
//int iFavoriteProgNum_Bak = iFavoriteProgNumberBeingRetrieved;
//short int sFavoriteProgIndex_bak= sFavoriteProgIndex2bRetrieved;
if ( favorite_menu_page_last_sel == PREV_PAGE )
{
PositionFavoriteProgInfoPos ( iItemOffPassed );
}
else
{
PositionFavoriteProgInfoNeg ( iNoOfValidItems - iItemOffPassed - 1 );
}
if ( ( pstProgInfoTemp = CurFavoriteProgInfo ( &iProgNo ) ) == NULL )
{
return;
}
iFavoriteProgNumberBeingRetrieved = iFavProgNumber;
sFavoriteProgIndex2bRetrieved = sFavProgIndex;
//pstProgInfoTemp ->bFavoriteStatus=false; //exchange to a func may be better
//SRDBE_SetProgFavorite(iProgNo);
//SRDBE_ClrProgFavorite(iProgNo);
//getFavoriteChannels(4);
//iFavoriteProgNumberBeingRetrieved = iFavoriteProgNum_Bak;
//sFavoriteProgIndex2bRetrieved = sFavoriteProgIndex_bak;
}
/*wuhan added,06-29-2005*/
static int TransIndex2TransNum(signed char index)
{
signed char tmp_idx = index;
int transnum = 0;
if(pastTransponderInfoTable[tmp_idx].status != ELEMENT_OCCUPIED)
{
return 0;
}
while (tmp_idx != INVALID_LINK)
{
tmp_idx = pastTransponderInfoTable[tmp_idx].cPrevTransponderIndex;
transnum++;
}
return transnum;
}
static signed char ProgIndex2TransIndex(int index)
{
if( (index != INVALID_LINK) && (astProgInfoTable[index].status == ELEMENT_OCCUPIED))
return astProgInfoTable[index].stProgNo.unShort.sHi16;
}
static int GetProgramsInTransponder(unsigned short TransIdx)
{
int nums = 0;
short int iProgIdx;
iProgIdx = ProgramList->HeadProgIndex;
sttbx_Print("++GetProgramsInTransponder, Transindx %d\n", TransIdx);
while(iProgIdx != INVALID_LINK)
{
if(TransIdx == astProgInfoTable[iProgIdx].stProgNo.unShort.sHi16)
{
++nums;
}
iProgIdx = astProgInfoTable[iProgIdx].sNextProgIndex;
}
return nums;
}
/*----------------------------------------------------
fill transponder menu with items of index scTransponderIndex2bRetrieved can be displayed. (CurTransInfo() get item of scTransponderIndex2bRetrieved)
Surppose: the chosen index [iTransOffInChManagement] has been set before calling getTransponder()
input:
return: the index of the chosen item on the screen, 0 ~ iNoOfItemsInScreen-1
*/
int getTransponders(int iMaxItemsOnScreen)
{
signed char scTransNum;
signed char scTransNum_bak;
int iCurrentTransOffset = 0; /*index of which item to be highlight*/
MENU_DATA_STRUCT *pstMenuDataTemp;
TRANSPONDER_INFO_STRUCT *pstTransponderInfoTemp;
/*1.clear the list*/
memset ( astTransponders, 0, ( sizeof ( MENU_DATA_STRUCT ) * iMaxItemsOnScreen ) );
pstTransponderMenuDataHead = pstTransponderMenuDataTail= &astTransponders[ 0 ];
pstTransponderMenuDataHead ->Prev = ( MENU_DATA_STRUCT * ) NULL;
pstTransponderMenuDataTail ->Next = ( MENU_DATA_STRUCT * ) NULL;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -