Table of Contents

POD 가 제공하는 몇가지 application 중 하나인 Application_info 에 대해서 알아본다.
내가 이해한 것을 바탕으로 각각의 시나리오 별로 설명하도록 하겠다.

시나리오가 시작되기 전까지의 단계

프로그램이 시작되고, 각각의 디바이스들은 초기화 된다. 여기서는 POD 를 중심으로 설명하기 때문에, POD 는 buffernego 를 끝내고, 상단의 resource manager 에서 호스트와 POD 각각의 resource_identifier 을 지정한다. Application_info 의 경우 호스트쪽에서 먼저 request 한다. 후에 POD 로부터 오는 정보를 받아서 'APPINFO_ENTITY' 라는 struct 안에 저장한다.

시나리오 1

물론 위의 작업이 제대로 성공이 되었다는 가정하에 설명한다.
리모콘을 이용해서, 서비스 정보에서 확인을 누른다. 그럼 총 4개의 메뉴가 뜬다. 이것은 POD 로 부터 받은 데이터를 가지고 만든 메뉴이다.
POD 와 UI 간에 인터페이스를 통해서 구현가능한 것이다. 이제 속을 들여다 보자!~
가장 먼저 봐야 할 것은 바로 ui 쪽이다. ui_main.c 파일 중 다음의 부분을 보자.

if(preMode != curMode) { 
			order=0;
			nSiMenu = getServiceInformation();   // 나중에 처리 : 메뉴명중 가장 긴것을 잡아서 폭을 조절하고
																// 메뉴 수대로 길이를 조정한다.
			Fill_Rect(300, 100, 220, 210, 300);
			Fill_Rect(310, 105, 200, 30, 2);
			Fill_Rect(310, 140, 200, 160, 298);
 
			//PrintText2(350, 200,  "SI MENU\0", 2, 155);
			PrintText(350, 110,  "SI", 162, 2);
			memset(letter, 0, 20);
			letter[0]=0xba54;
			letter[1]=0xb274;
			letter[2]=0x00;
			PrintText2(350+FONTWIDTH*2+10, 110,letter, 162, 2);
			dispMenuforSI(nSiMenu);
			PrintText(330,150, siMenuList[order].menu_name, 3, 2);

위의 함수 중 getServiceInformation() 함수가 바로 POD 와 연동되는 함수다. 정확히 말하면, 위의 Application_info 에서 POD 로 부터 저장한 struct 를 불러낸 이름들을 UI 의 메뉴로 구성하는 역할을 한다. 이 함수안에 들어 있는 podGetMenuNumPoint() 라는 함수는 메뉴의 개수가 몇개인지 반환해주는 역할이다.

시나리오 2

이번에는 위의 시나리오에서 각각의 서브메뉴를 눌렀을 때, 어떻게 UI 와 연동이 되는지 살펴보자!!
ui_main.c 의 다음의 부분을 보기로 하자.

if(ukey == OK_KEY){
		HideRegion(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0);
		Fill_Rect(90, 95, 510, 205, 300);
		Fill_Rect(100, 100, 500, 200, 298);
		MMI_READY = FALSE;
		podRequestHtml(order);          // 
		while(1) {
			if(MMI_READY == TRUE) {
			if(html->PlainTextFile) {
				PrintText(130, 120, html->PlainTextFile, 179, 153);
				if(html->HotSpotInfo.HyperLink != 0) {
					//PrintText(230+(html->HotSpotInfo.HyperLinkStart*FONTWIDTH), 120, html->HotSpotInfo.UrlLink, 2, 173);
					Fill_Rect(130+(html->HotSpotInfo.HyperLinkStart-4)*FONTWIDTH, 135, FONTWIDTH*(html->HotSpotInfo.HyperLinkEnd-html->HotSpotInfo.HyperLinkStart+1), 2, 174);
 
		while(1) {
			msg = message_receive_timeout (uiKeyQid, TIMEOUT_INFINITY);
			if (msg != NULL) {
				uiMsg = *msg;
				message_release (uiKeyQid, msg);
				ukey =uiMsg.value1;
			if(ukey == OK_KEY) {
				HideRegion(130, 120, 200, 100, 157);
				podRequestUrl(order, html->HotSpotInfo.UrlLink);
				PrintText(130, 120, html->PlainTextFile, 151, 153);
				Fill_Rect(130+(html->HotSpotInfo.HyperLinkStart-4)*FONTWIDTH, 135, FONTWIDTH*(html->HotSpotInfo.HyperLinkEnd-html->HotSpotInfo.HyperLinkStart+1), 2, 174);
				break;
				}
		}
	}
	}
	}
		break;
	}					
         }
	//printf("MMI HTML NOT READY\n");
	//break;
}

위의 루틴중에서 podRequestHtml() 라는 함수가 있다. 이 함수가 하는 역할은 pod 로 server_query 를 보내는 것이다. 이 함수가 돌아갈때, 호스트와 POD 사이에 통신을 수행한다.
POD 로 부터 server_reply 가 오면(.html) HOST 는 이를 text 로 컨버전해서 화면에 뿌린다.

이상 메뉴를 뿌리는 동작의 경우, POD 어떤 동작을 하고 싶어 한다. 하지만, POD 입장에서는 현재 꼽혀 있는 호스트가 어떤 사양인지 알 수 가 없다.
그래서 먼저 POD 쪽에서 HOST 에게 application info 를 하면 호스트는 현재 디스플레이 할 수 있는 스펙정보를 POD 에 보낸다. 그러므로 POD 는 호스트의 디스플레이 능력을 알 수 있다.
호스트에서 POD 로 부터 받은 메뉴를 띄우고, 이에 대한 서브 메뉴를 누르면, 호스트에서는 필요한 url 과 html 파일의 위치를 요청한다.
이에 POD 는 요청한 파일을 호스트에 넘겨준다. 호스트는 이를 받아서 html → text 형태로 바꾸어서 화면에 뿌려준다.