280 likes | 358 Views
8. IShell API (2). 8.1 IShell API 함수 ISHELL_CreateInstance 함수 : Brew 프로그램의 진입점이 되는 함수이다 . 이 함수는 ClassID 를 받아서 새로운 애플릿을 생성하고 해당 애플릿의 이벤트 핸들링 함수를 등록한다. 8. IShell API (2). ISHELL_StartApplet 함수 : 지정한 애플릿을 실행한다. 8. IShell API (2). A 애플릿에서 B 애플릿을 실행시킬 경우의 제어 흐름. (5) 재개
E N D
8. IShell API (2) • 8.1 IShell API 함수 • ISHELL_CreateInstance 함수: Brew 프로그램의 진입점이 되는 함수이다. 이 함수는 • ClassID를 받아서 새로운 애플릿을 생성하고 해당 애플릿의 이벤트 핸들링 함수를 • 등록한다. 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_StartApplet 함수: 지정한 애플릿을 실행한다. 임베디드 모바일 프로그래밍
8. IShell API (2) • A 애플릿에서 B 애플릿을 실행시킬 경우의 제어 흐름 (5) 재개 EVT_APP_RESUME A (2) 대기상태 EVT_APP_SUSPEND (1) ISHELL_PostEvent(IShell, EEC_SID_B) AEE_Shell ISHELL_HandleEvent (3) B 애플릿 생성 EVT_APP_START (4) B 종료 B 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_CloseApplet 함수: AEE 셀에 현재 실행되고 있는 애플릿에 대한 종료를 요 • 청하는데 이 메시지가 EVT_APP_STOP 이벤트이다. 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_ActiveApplet 함수: 현재 실행되고 있는 클래스 ID 정보를 읽어 온다. 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_SendEvent 함수: 특정 애플릿이나 클래스에 이벤트를 전달한다. 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_SendEvent 함수의 제어 흐름 A (1) ISHELL_SendEvent(pIShell, B, EVT_USER, wp, dwp) AEE Shell (2) 애플릿 생성, IAPPLET_HandleEvent 함수를 통해서 A가 전송한 EVT_USER 이벤트를 B에게 전달 B (3) EVT_USER 이벤트를 받고, ISHELL_StartApplet을 실행시켜 EVT_USER 이벤트에 대한 결과 처리 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_PostEvent 함수: 전달한 이벤트를 큐에 저장한 후 나중에 처리할 수 있 • 다. 임베디드 모바일 프로그래밍
8. IShell API (2) • IShell_PostEvent 함수의 제어 흐름 A (1) ISHELL_PostEvent(pIShell, B, EVT_USER, wp, dwp) AEE Shell (2) 이벤트를 큐에 저장 ISHELL_HandleEvent (3) ISHELL_HandleEvent 함수를 이용해서 큐에 저장된 이벤트 처리 B 임베디드 모바일 프로그래밍
8. IShell API (2) • 8.2 IShell API 서비스 대화상자, 메시지 박스, 프롬프트 • 대화상자는 컨트롤이 내장된 프레임 • ISHELL_CreateDialog 함수: 대화 상자 생성 임베디드 모바일 프로그래밍
8. IShell API (2) • ISHELL_EndDialog 함수: 대화 상자 종료 임베디드 모바일 프로그래밍
8. IShell API (2) • 8.3 대화상자 프로그램 (IShellEx) • 대화상자는 컨트롤이 내장된 프레임 • 대화상자 이벤트 • (1) EVT_DIALOG_INIT • - 대화상자 개체의 매개변수를 확인하면 이 이벤트가 애플릿으로 보내져 초기화 • (2) EVT_DIALOG_START • - 모든 대화상자 컨트롤과 항목이 로드되면 이 이벤트가 애플릿으로 보내지고 화면이 새로 고쳐져 대화 상자가 표시 • (3) EVT_DIALOG_END • 대화상자를 종료 • 예제의 흐름 • (1) 대화상자 메뉴 클릭: ISHELL_CreateDialog 함수 호출 • (2) EVT_DIALOG_INIT, EVT_DIALOG_START 발생 • (3) 대화상자 생성: IDI_LIST_1, IDI_LIST_2 이벤트 발생 • (4) 메뉴 1, 메뉴 2를 선택할 경우 대화상자 종료: ISHELL_EndDialog 함수 호출, • EVT_DIALOG_END 발생 임베디드 모바일 프로그래밍
8. IShell API (2) • 리소스 구조 • (1) 문자열 • 1 IDS_TEXT_TITLE 대화상자 텍스트 • 2 IDS_TEXT_CONTENT *^^ 대화상자 내용 ^^* • 3 IDS_LISTITEM_1 메뉴1 • 4 IDS_LISTITEM_2 메뉴2 • (2) 대화상자 • 6001 IDD_TEXT_DIALOG 7001 IDC_TEXT IDS_TEXT_TITLE 7002 IDC_SOFTKEY 8001 IDI_LIST_1 IDS_LISTITEM_1 8002 IDI_LIST_2 IDS_LISTITEM_2 임베디드 모바일 프로그래밍
8. IShell API (2) 임베디드 모바일 프로그래밍
8. IShell API (2) 임베디드 모바일 프로그래밍
8. IShell API (2) 임베디드 모바일 프로그래밍
8. IShell API (2) • 소스 프로그램 (IShellEx.c) • /*=============================================================================== • INCLUDES AND VARIABLE DEFINITIONS • =============================================================================== */ • #include "AEEModGen.h" // Module interface definitions • #include "AEEAppGen.h" // Applet interface definitions • #include "AEEShell.h" // Shell interface definitions • #include "AEEMenu.h" • #include "AEEStdLib.h" • #include "IShellEx_res.h" • #include "IShellEx.bid" • #define APP_RES_FILE "IShellEx.bar" • #define MENU_EVENT_ALARM 401 • #define ALARM_ID 402 • #define MENU_EVENT_DIALOG 403 • typedef struct _CIShellEx • { • AEEApplet a; // 가장 먼저 추가될 멤버 변수 • IMenuCtl * m_pIMenu; • boolean alarmActive; • // Device parameters • //int m_nLineHeight; • AEEDeviceInfo m_dInfo; • } CIShellEx; 임베디드 모바일 프로그래밍
8. IShell API (2) /*------------------------------------------------------------------- Function Prototypes -------------------------------------------------------------------*/ // IShellExample 애플릿에서 발생하는 이벤트 처리 함수 static boolean IShellEx_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam); static boolean IShellEx_InitAppData(IApplet* pMe); static void IShellEx_FreeAppData(IApplet* pMe); // 1 바이트 문자열을 2 바이트 문자열로 변환 AECHAR* _STR_TO_WSTR(char* pszIn, AECHAR* pDest, int nSize); int AEEClsCreateInstance(AEECLSID ClsId,IShell * pIShell,IModule * po, void ** ppObj) { *ppObj = NULL; // AEEApplet_New 함수는 이벤트 처리 함수와 애플리케이션에서 사용한 데이 // 터 해지를 담당하는 함수 정보를 애플릿에 알려주는 역할을 한다. 다음은 // IShellExample 애플릿을 생성한다. if(ClsId == AEECLSID_ISHELLEX){ if(AEEApplet_New(sizeof(CIShellEx), ClsId, pIShell,po,(IApplet**)ppObj, (AEEHANDLER)IShellEx_HandleEvent,(PFNFREEAPPDATA)IShellEx_FreeAppData) == TRUE) { // IShellExample 애플릿이 가지는 컨트롤 및 변수 초기화 함수 추가 if (IShellEx_InitAppData((IApplet*)*ppObj) == TRUE) return(AEE_SUCCESS); } } return (EFAILED); } 임베디드 모바일 프로그래밍
8. IShell API (2) static boolean IShellEx_HandleEvent(IApplet * pi, AEEEvent eCode, uint16 wParam, uint32 dwParam) { CIShellEx * pMe = (CIShellEx *)pi; AEERect rc; AECHAR szBuf[50]; AEEMenuColors mclr; SETAEERECT (&rc, 0, 0, pMe->m_dInfo.cxScreen, pMe->m_dInfo.cyScreen); switch (eCode) { case EVT_APP_START: // 알람 정보를 등록할 메뉴 컨트롤을 생성한다. if(ISHELL_CreateInstance(pMe->a.m_pIShell, AEECLSID_MENUCTL, (void **)&pMe->m_pIMenu) != SUCCESS) { return FALSE; } // 선택된 메뉴의 색상을 설정한다 mclr.wMask = MC_BACK|MC_TEXT|MC_SEL_BACK|MC_SEL_TEXT|MC_SCROLLBAR|MC_SCROLLBAR_FILL|MC_FRAME; mclr.cBack = RGB_WHITE; mclr.cText = RGB_BLACK; //mclr.cSelBack = MAKE_RGB (146, 109, 255); mclr.cSelBack = MAKE_RGB (124, 109, 197); mclr.cSelText = RGB_BLACK; mclr.cFrame = RGB_WHITE; IMENUCTL_SetColors (pMe->m_pIMenu, &mclr); 임베디드 모바일 프로그래밍
8. IShell API (2) _STR_TO_WSTR("IShell 예제", szBuf, sizeof(szBuf)); IMENUCTL_SetTitle(pMe->m_pIMenu, NULL, 0, szBuf); IMENUCTL_SetRect(pMe->m_pIMenu, &rc); // Add CreateInstance to menu _STR_TO_WSTR("대화상자", szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVENT_DIALOG, szBuf, 0); _STR_TO_WSTR("알람 설정", szBuf, sizeof(szBuf)); IMENUCTL_AddItem(pMe->m_pIMenu, 0, 0, MENU_EVENT_ALARM, szBuf, 0); // Activate menu IMENUCTL_SetActive(pMe->m_pIMenu,TRUE); return(TRUE); // 애플릿이 종료될 때 발생하는 이벤트이다. case EVT_APP_STOP: return(TRUE); case EVT_APP_SUSPEND: return TRUE; case EVT_APP_RESUME: if (pMe->m_pIMenu) { IMENUCTL_SetActive(pMe->m_pIMenu,TRUE); IMENUCTL_Redraw(pMe->m_pIMenu); } return TRUE; 대화상자 메뉴 항목 생성 코드 값 임베디드 모바일 프로그래밍
8. IShell API (2) case EVT_ALARM: ISHELL_StartApplet(pMe->a.m_pIShell, AEECLSID_ISHELLEX); ISHELL_PostEvent(pMe->a.m_pIShell, AEECLSID_ISHELLEX, EVT_COMMAND, ALARM_ID, 0); return TRUE; case EVT_DIALOG_INIT: return TRUE; case EVT_DIALOG_START: return TRUE; case EVT_DIALOG_END: return TRUE; // EVT_KEY 이벤트를 처리하지 않으면 특정 메뉴 아이템을 선택했을 때 원하는 작업을 // 수행할 수 없다. 여기서 발생하는 이벤트를 EVT_COMMAND 로 보내게 된다. // 대화 상자 이벤트 case EVT_KEY: return IMENUCTL_HandleEvent(pMe->m_pIMenu, EVT_KEY, wParam, 0); case EVT_COMMAND: switch(wParam) { case MENU_EVENT_DIALOG: { if (ISHELL_CreateDialog(pMe->a.m_pIShell, APP_RES_FILE, IDD_TEXT_DIALOG, NULL) != AEE_SUCCESS) return FALSE; IShell에게 대화상자 실행 요청 임베디드 모바일 프로그래밍
8. IShell API (2) else return TRUE; } case IDI_LIST_1: case IDI_LIST_2: { ISHELL_EndDialog(pMe->a.m_pIShell); IMENUCTL_SetActive(pMe->m_pIMenu, TRUE); IMENUCTL_Redraw(pMe->m_pIMenu); return TRUE; } case MENU_EVENT_ALARM: { int nRetVal = EBADPARM; // Initialize return value. // 알람이 발생하기까지의 시간(분) uint32 numMin = 1; // 알람코드로서 다른 알람과 구분하는 역할을 한다. uint16 nUserCode = 4; // 화면을 지우는 함수이다 IDISPLAY_ClearScreen (pMe->a.m_pIDisplay); IMENUCTL_SetProperties(pMe->m_pIMenu, MP_NO_REDRAW); IMENUCTL_SetActive(pMe->m_pIMenu, FALSE); if ((nRetVal = ISHELL_SetAlarm(pMe->a.m_pIShell, AEECLSID_ISHELLEX, nUserCode, numMin)) == SUCCESS) { 메뉴 1, 메뉴 2를 선택할 경우, 대화상자를 종료하고 메인 메뉴로 복귀 메뉴 컨트롤 객체를 활성화, 표시 임베디드 모바일 프로그래밍
8. IShell API (2) _STR_TO_WSTR("1분 후 알람 발생", szBuf, sizeof(szBuf)); IDISPLAY_DrawText(pMe->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, 0, 0, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); IDISPLAY_UpdateEx(pMe->a.m_pIDisplay,TRUE); pMe->alarmActive = TRUE; } else { // 알람 서비스가 실패할 경우 에러 메시지를 띄운다. _STR_TO_WSTR("알람 발생 실패", szBuf, sizeof(szBuf)); IDISPLAY_DrawText(pMe->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, 0, 0, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); IDISPLAY_Update (pMe->a.m_pIDisplay); } return TRUE; } case ALARM_ID: // 알람을 잘 받았다는 메시지를 화면에 나타낸다. IDISPLAY_ClearScreen(pMe->a.m_pIDisplay); _STR_TO_WSTR("맛있는 저녁식사 약속", szBuf, sizeof(szBuf)); IDISPLAY_DrawText(pMe->a.m_pIDisplay, AEE_FONT_BOLD, szBuf, -1, 0, 0, 0, IDF_ALIGN_CENTER | IDF_ALIGN_MIDDLE); IDISPLAY_Update (pMe->a.m_pIDisplay); return(TRUE); 임베디드 모바일 프로그래밍
8. IShell API (2) default: return FALSE; } default: break; } return FALSE; } // IShellExample 애플릿 멤버 변수 초기화 함수 static boolean IShellEx_InitAppData(IApplet* pi) { CIShellEx * pMe = (CIShellEx*)pi; // Initialize the MenuCtl pointer to NULL pMe->m_pIMenu = NULL; pMe->alarmActive = FALSE; ISHELL_GetDeviceInfo(pMe->a.m_pIShell,&pMe->m_dInfo); return TRUE; } static void IShellEx_FreeAppData(IApplet* pi) { if (pMe->m_pIMenu != NULL) { 임베디드 모바일 프로그래밍
8. IShell API (2) // 메뉴 컨트롤 해지하는 함수 IMENUCTL_Release (pMe->m_pIMenu); pMe->m_pIMenu = NULL; } if ((pMe != NULL) && pMe->alarmActive == TRUE) { uint16 nUserCode = 4; // User code which distinguished this alarm. // Since there is only one alarm that is activated in this example we // know the alarm information to deactivate it. ISHELL_CancelAlarm (pMe->a.m_pIShell, AEECLSID_ISHELLEX, nUserCode); pMe->alarmActive = FALSE; } } AECHAR* _STR_TO_WSTR(char* pszIn, AECHAR* pDest, int nSize) { char* psSource = pszIn; char* pcDestin = (char *)pDest; int npszInSize = STRLEN(pszIn); MEMSET(pDest, 0, nSize); for(psSource = pszIn; psSource < (pszIn + npszInSize); psSource++) { if ((*psSource) < 0 || (*psSource) >= 128) 임베디드 모바일 프로그래밍
8. IShell API (2) { *pcDestin = *psSource; pcDestin += 1; } else { *pcDestin = *psSource; pcDestin += 1; *pcDestin = 0; pcDestin += 1; } } return (AECHAR*)pcDestin; } 임베디드 모바일 프로그래밍
8. IShell API (2) • 실행 결과 임베디드 모바일 프로그래밍
8. IShell API (2) 임베디드 모바일 프로그래밍