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

📄 loadchannels.c

📁 关于嵌入式PCB板UI的程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/*******************************************************************************
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 + -