POD 가 제공하는 몇가지 application 중 하나인 Application_info 에 대해서 알아본다.
내가 이해한 것을 바탕으로 각각의 시나리오 별로 설명하도록 하겠다.
프로그램이 시작되고, 각각의 디바이스들은 초기화 된다. 여기서는 POD 를 중심으로 설명하기 때문에, POD 는 buffernego 를 끝내고, 상단의 resource manager 에서 호스트와 POD 각각의 resource_identifier 을 지정한다. Application_info 의 경우 호스트쪽에서 먼저 request 한다. 후에 POD 로부터 오는 정보를 받아서 'APPINFO_ENTITY' 라는 struct 안에 저장한다.
물론 위의 작업이 제대로 성공이 되었다는 가정하에 설명한다.
리모콘을 이용해서, 서비스 정보에서 확인을 누른다. 그럼 총 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() 라는 함수는 메뉴의 개수가 몇개인지 반환해주는 역할이다.
이번에는 위의 시나리오에서 각각의 서브메뉴를 눌렀을 때, 어떻게 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 형태로 바꾸어서 화면에 뿌려준다.