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

📄 mosaic.c

📁 c语言编的
💻 C
字号:
/* 
 * File: mosaicapp.c
 * Contains:
 *      the file of mosaic application.
 *
 * Author:
 *      stone
 *
 * CVS control words:
 *
 * $Id: mosaic.c,v 1.8 2006/03/08 06:41:05 jli Exp $ 
 *
 * Last checked in:
 * $Date: 2006/03/08 06:41:05 $ 
 *
 * History:
 *      $Log: mosaic.c,v $
 *      Revision 1.8  2006/03/08 06:41:05  jli
 *      add ca error display
 *
 *      Revision 1.7  2006/02/10 09:30:34  wjbai
 *      Add the ca macro MEDIAGUARD_CA.
 *
 *      Revision 1.6  2006/01/20 06:15:17  syan
 *      no message
 *
 *      Revision 1.5  2006/01/18 07:56:01  syan
 *      no message
 *
 *      Revision 1.4  2005/12/20 09:03:00  hwxiao
 *      no message
 *
 *      Revision 1.3  2005/08/16 07:55:11  wjbai
 *      update for ca
 *
 *      Revision 1.2  2005/07/04 07:03:09  hwxiao
 *      no message
 *
 *
 */
#include <stdio.h>
#include <string.h>
#include "stddefs.h"
#include "stcommon.h"
#include "modules.h"
#include "mosaic.h"
#include "appltype.h"
#include "app_vol.h"
#include "app_ca_error.h"
#include "vid.h"

extern mosaic_node_t *mosaic_tree_data_t;

extern mosaic_data_t *mosaic_node_data;

/*extern cell_data_t *current_active_cell_info;*/
extern semaphore_t *connect_ok;
extern uint8_t mosaic_pmt[1024];

extern component_t ms_audio_component;
extern service_t   ms_service;
extern ms_eitpf_event_t ms_eitpf_event[2];
extern int16_t	ms_pre_eitpf_version_number;

/*extern ms_dbg_info_t ms_dbg_info[500];
extern int16_t ms_app_index, ms_total_num;*/

uint8_t ms_info_pf_state = 0;

#ifdef MEDIAGUARD_CA
TMGAPIOperator ms_net_operator, ms_net_opi[MS_MAX_OPERATOR];
int32_t ms_actual_operator = 0;
#endif

db_mosaic_service_list_t ms_list;

time_date_t ms_cur_offer_time;

void mosaic_ss_callback(uint32_t event, void *context);

#if 0
ui_logical_palette_t *g_mosaic_palette = NULL;
#endif


int mosaic_app(int argc, char *argv[])
{		
	cell_data_t *current_active_cell_info,*new_active_cell_info;
	cell_node_ident_t cell_node_identify;
	page_node_ident_t page_node_identify;
	
	cell_node_t *tag_cell_node;
	page_node_t *tag_page_node;
	
	clock_t wait_for_any_key;
	
	uint8_t timer_expired_num = 5;
	ui_rect_t rect, window_rect;
	uint8_t h_alignment, v_alignment,  f_color, b_color;
	time_date_t ms_current_time;
	char current_time_str[30];	
	int16_t i;

	app_message_t *msg, message;
	app_timer_t *timer;
	db_service_t svc;
	info_dis_area_data_t *tag_info_area;
	error_t error;
	int32_t max_operator = MS_MAX_OPERATOR;
	
	/*dbg_mem_trace();
	dbg_mem_check_set(0);*/
	
	window_rect.x = VOL_MOSAIC_RECT_X;
	window_rect.y = VOL_MOSAIC_RECT_Y;
	window_rect.w = VOL_MOSAIC_RECT_W;
	window_rect.h = VOL_MOSAIC_RECT_H;
	
	ui_clear_full_area();
	ss_stop_running_service();
	
	ui_load_background_display(res_string(RES_STRING_MOSAIC_SEARCHING));
	
	/*display front panel digital*/
	error = db_make_app_service_by_service_type(global_db_client, &svc, DVB_MOSAIC_SERVICE_TYPE);
	if(error != SUCCESS)
		fp_drv_display_characters('C', '1', '2', '1');
	else
	{
		fp_display_prog_num(svc.bgctv_logical_channel_number);
	}
	
	timer = NULL;
	
	/***************/
	/* Original VK_HOME_PAGE handling begin */
	ss_service_notification(SS_NTF_ENTER_MOSAIC_STATE, NULL);

	APP_TRACE("mosaic_test\n");
	
	/*get and parse the mosaic data*/
	error = mosaic_test();
	if(error == ERROR_MOSAIC_NO_SIGNAL)
	{
		/*ui_load_background_display(res_string(RES_STRING_MOSAIC_NO_INFO));*/
		
		STVID_DisableOutputWindow(/*VIDHndl*/VID_ViewPortHandle);
		ui_clear_full_area();
		ui_message_box(MESSAGEBOX_POS_X, MESSAGEBOX_POS_Y, UI_IDCANCEL, 
				       UI_BLACK_COLOR, g_menu_small_panel_id, 
				       RES_PICTURE_PROMPT_BG_ID,
				       res_string(RES_STRING_MOSAIC_NO_INFO), 
				       TIMER_ONCE, ST_GetClocksPerSecond()*20);
		
		ss_service_notification(SS_NTF_EXIT_MOSAIC_STATE, NULL);
	    
	    /*dbg_mem_check_set(1);*/
	    
	    app_exit();
	}

#ifdef MEDIAGUARD_CA	
	/*get the CA offers*/
	error = ca_get_operator_info(ms_net_opi, max_operator, &ms_actual_operator);
	for(i=0;i<ms_actual_operator;i++)
	{
		ms_net_operator = ms_net_opi[i];
		if(ms_net_opi[i].OPI == BGCTV_OPI)
			break;
	}
#endif
	
	error = sys_get_current_time(&ms_cur_offer_time);
	
	/**/app_ca_display_enable(false);
	
	APP_TRACE("mosaic_test over\n");
	
	if(connect_ok == NULL)
		connect_ok = semaphore_create_fifo_timeout(0);
	ss_register_callback(mosaic_ss_callback, SS_EV_GENERIC_CALLBACK);
	current_active_cell_info = NULL;
	
	app_register_message_filter(app_message_filter_callback);
	
	/*add by xhw, change the palette*/
	ui_clear_full_area();
	#if 0
	g_mosaic_palette = mosaic_palette_create();
	#endif
	
	ms_list.service = ext_mem_allocate(DB_MAX_MOSAIC_SERVICE_SUPPORTED*sizeof(db_mosaic_service_t));
	ms_list.service_number = 0;
	error = db_query_mosaic_service_list(&ms_list);
	
	page_node_identify.page_id = mosaic_node_data -> default_page_id;
	cell_node_identify.page_id = mosaic_node_data -> default_page_id/*0*/;
	cell_node_identify.cell_id = mosaic_node_data -> default_cell_id/*0*/;
	
	error = mosaic_find_page_node(mosaic_tree_data_t,
      	       					  page_node_identify,
          	                      &tag_page_node); 
	
	error = mosaic_find_cell_node(mosaic_tree_data_t,
    		                      cell_node_identify,
            		              &tag_cell_node);
                                   
    /*enter the default page*/ 
    error = ms_enter_new_page(tag_page_node, tag_cell_node);
	
    current_active_cell_info = tag_cell_node -> cell_data;
    
    /*focus the default cell*/
    ms_draw_focus(current_active_cell_info->x, current_active_cell_info->y,
        	      current_active_cell_info->w, current_active_cell_info->h);
        
    error = ms_display_current_cell_info(current_active_cell_info);
    
    error = ms_play_cell_audio(current_active_cell_info);
	
	/* Original VK_HOME_PAGE handling end */
	
	timer = app_timer_create( TIMER_REPEAT, ST_GetClocksPerSecond() * 5 );
	if( !timer )
		DB_TRACE("[dtv], timer create failed!\n");
		
	if(timer) 
		app_timer_start(timer);
	
	while(1)
	{
		wait_for_any_key = time_plus (time_now() , ST_GetClocksPerSecond() * 5);
		msg = app_get_message(&wait_for_any_key);
		
		if(msg == NULL)
		{
			if(current_active_cell_info != NULL)
			{
				error = ms_get_event_info(current_active_cell_info, 0);
				                         
				if(ms_pre_eitpf_version_number != ms_eitpf_event[0].version_number)			
				{
					ms_reset_version_number();
					error = ms_event_info_display(current_active_cell_info, 0);
					ms_info_pf_state = 0;
					
					continue;
				}
				else
				{
					APP_TRACE(" mosaic EIT P/F info have not change \n");
					continue;
				}
				continue;
			}
			continue;	
		}/**/
		
		message = *msg;
		app_release_message(msg);
		
		switch(message.event)
		{
			case EV_SYS_APP_EXIT:
				
				error = mosaic_app_exit(current_active_cell_info);
				
				app_exit();
				break;
			
			case EV_SYS_APP_TIMER_EXPIRED:
			
			    page_node_identify.page_id = current_active_cell_info->page_id;
				error = mosaic_find_page_node(mosaic_tree_data_t,
	  	       					              page_node_identify,
	      	                                  &tag_page_node);
				for(i=0;i<(tag_page_node->page_data ->info_dis_area_num);i++)
				{			
					if(tag_page_node -> page_data -> info_position[ i ].dis_type == 0x02)
						break;
				}
				
				error = ms_find_info_area(tag_page_node -> page_data -> info_position[i].data_list,
				                         &tag_info_area);
				if(error != SUCCESS)
					break;
				/* updated display the current time on the screen */
				rect.x = tag_info_area->text_frame.x;
				rect.y = tag_info_area->text_frame.y;
				rect.w = tag_info_area->text_frame.w;
				rect.h = tag_info_area->text_frame.h;
				
				if(rect.h < 24)
					rect.h = 24;
				
				h_alignment = ms_get_display_alignment(tag_info_area->text_frame.h_alignment);
				v_alignment = ms_get_display_alignment(tag_info_area->text_frame.v_alignment);
				
				f_color = mosaic_get_color_index(tag_info_area->text_frame.foreground_color);
				b_color = mosaic_get_color_index(tag_info_area->text_frame.background_color);			
				
				if( timer_expired_num == 5 )
				{
					if( sys_get_current_time ( &ms_current_time ) != ERROR_SYS_ILLEGAL_TIME )
					{
						memset( current_time_str, 0, 30 );
						sprintf(current_time_str, "%02d:%02d", 
							    ms_current_time . tm_hour, 
							    ms_current_time . tm_min );
						
						ms_ui_clear_area(rect.x, rect.y, rect.w, rect.h);
						ms_STWTK_DynamicTextInRect(hitune_ui_draw_get_context(), 
						                        rect.x, 
						                        rect.y, 
						                        rect.w, 
						                        rect.h, 
						                        current_time_str, 
									            0, 0, 
									            h_alignment, v_alignment,
									            f_color,
		                        				b_color);
	                 	timer_expired_num = 0;
					}
				}
				timer_expired_num ++;
				
				if(current_active_cell_info != NULL)
				{
					error = ms_get_event_info(current_active_cell_info, 0);
					
					if(ms_pre_eitpf_version_number != ms_eitpf_event[0].version_number)			
					{
						ms_reset_version_number();
						error = ms_event_info_display(current_active_cell_info, 0);
						ms_info_pf_state = 0;
					}
					else
					{
						APP_TRACE(" mosaic EIT P/F info have not change \n");
					}
				}/**/
				
				break;
				
			case EV_SYS_KEYBOARD:
				APP_TRACE("[MOSAIC] key[%d]\n", message.wparam);
				switch(message.wparam)
				{
					case VK_HOME_PAGE:
					
					case VK_EXIT:
					case VK_FP_MENU:
					    error = mosaic_app_exit(current_active_cell_info);
					    
					    /*dbg_dump_partition_status(kernel_partition);*/
					    
					    APP_TRACE("\n mosaic_test_exit \n");
					    app_exit(); 
					    break;
					
					case VK_OK:
					case VK_FP_OK:
						error = ms_cell_nav_link(current_active_cell_info, 
					        	        		 0,
					        	          		 0,
					        	          		 VK_OK,
					        	          		 &new_active_cell_info);
			        	current_active_cell_info = new_active_cell_info;
			        	
			        	if(error == FALSE)
			        	{
			        		error = ms_enter_cell_possible_link(current_active_cell_info);
			        	}
			        	/*APP_TRACE("VK_OK have been exit\n");*/
						break;
					    
					case VK_RETURN:
						ms_cell_nav_link(current_active_cell_info, 
			        	        		 0,
			        	          		 0,
			        	          		 VK_RETURN,
			        	          		 &new_active_cell_info);
			        	current_active_cell_info = new_active_cell_info;
			        	/*APP_TRACE("VK_RETURN have been exit\n");*/
						break;    
					    
					case VK_PROGRAM_NEXT:
						ms_cell_nav_link(current_active_cell_info, 
			        	        		 0,
			        	          		 0,
			        	          		 VK_PROGRAM_NEXT,
			        	          		 &new_active_cell_info);
			        	current_active_cell_info = new_active_cell_info;
			        	/*APP_TRACE("VK_PROGRAM_NEXT have been exit\n");*/
						
						break;
						
					case VK_PROGRAM_PREV:
						ms_cell_nav_link(current_active_cell_info, 
			        	        		 0,
			        	          		 0,
			        	          		 VK_PROGRAM_PREV,
			        	          		 &new_active_cell_info);
			        	current_active_cell_info = new_active_cell_info;
			        	/*APP_TRACE("VK_PROGRAM_PREV have been exit\n");*/
						break;
					
				    case VK_UP:
				    case VK_FP_UP:/*North*/
				    	if((current_active_cell_info->nav_data.common_directions_bitmap & 0x80) == 0x80)
				    	{
					    	ms_cell_nav(current_active_cell_info, 
				        	    		current_active_cell_info->nav_data.n_page_id,
				        	            current_active_cell_info->nav_data.n_cell_id,
				        	            &new_active_cell_info);
				        	current_active_cell_info = new_active_cell_info;
				        }
						break;
						
					case VK_DOWN:
					case VK_FP_DOWN:/*South*/
						if((current_active_cell_info->nav_data.common_directions_bitmap & 0x08) == 0x08)
				    	{
							ms_cell_nav(current_active_cell_info, 
				        	    		current_active_cell_info->nav_data.s_page_id,
				        	            current_active_cell_info->nav_data.s_cell_id,
				        	            &new_active_cell_info);
				        	current_active_cell_info = new_active_cell_info;
				        }
					    break;
					
					case VK_LEFT:
					case VK_FP_LEFT:/*West*/
						if((current_active_cell_info->nav_data.common_directions_bitmap & 0x02) == 0x02)
				    	{
							ms_cell_nav(current_active_cell_info, 
				        	    		current_active_cell_info->nav_data.w_page_id,
				        	            current_active_cell_info->nav_data.w_cell_id,
				        	            &new_active_cell_info);
				        	current_active_cell_info = new_active_cell_info;
				        }
						break;
						
			        case VK_RIGHT:
			        case VK_FP_RIGHT:/*East*/
			        	if((current_active_cell_info->nav_data.common_directions_bitmap & 0x20) == 0x20)
				    	{
				        	ms_cell_nav(current_active_cell_info, 
				        	    		current_active_cell_info->nav_data.e_page_id,
				        	            current_active_cell_info->nav_data.e_cell_id,
				        	            &new_active_cell_info);
				        	current_active_cell_info = new_active_cell_info;
				        }
			        	break;
			        	
			        case VK_INFO:
						
						if(ms_info_pf_state == 0)
							ms_info_pf_state = 1;
						else
							ms_info_pf_state = 0;
		
						ms_event_info_display (current_active_cell_info, ms_info_pf_state);
		
			        	break;	
		
					/*voice control*/
					case VK_MUTE:
						vol_window(VOL_MUTE, MOSAIC_VOL_TYPE, window_rect);
						break;
						
					case VK_VOLUME_PREV:
						vol_window(VOL_DECREASE, MOSAIC_VOL_TYPE, window_rect);
						break;
						
					case VK_VOLUME_NEXT:
						vol_window(VOL_INCREASE, MOSAIC_VOL_TYPE, window_rect);
						break;
		
					case VK_RED:
						/*{
							FILE *stream;
							char list[30];
							int16_t numwriten = 0;
							
							APP_TRACE("\n ###### VK_RED is be pressed ***** \n");
							
							if((stream = fopen("hpfile","w")) == NULL)
							{
								APP_TRACE("\n can not open this file ***** \n");
							}
							else
							{
								APP_TRACE("\n ###### ***** \n");
								for ( i = 0; i < 25; i++ )
			         				list[i] = (char)('z' - i);
								
								numwriten = fwrite(list, sizeof(char), 25, stream);
								APP_TRACE("\n num[%d] has been write to the file\n", numwriten);
							}
							fclose(stream);
						}*/
						break;
				}
			break;
		}
	}
}



⌨️ 快捷键说明

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