8. ishell api (2)

28
임임임임 임임임 임임임임임 1 8. IShell API (2) 8.1 IShell API 임임 • ISHELL_CreateInstance 임임 : Brew 임임임임임 임임임임 임임 임임임임 . 임 임임임 ClassID 임 임임임 임임임 임임임임 임임임임 임임 임임임임 임임임 임임임 임임임 임임임임 . 임임 임임 Int ISHELL_CreateInstance(ISHELL *pIShell, AEECLSID cls, void ** ppobj) 임임 임임임 임임임 ID 임 임임 임임임 임임임 임임임임 . 임임 임임 PIShell IShell 임임임임임 임임 임임임 cls 임임임 임임임임 32 임임 ClassID 임임 ppobj 임임임 임임임임 임임임 임임임임 임임임 임임임 임임 임 SUCCESS 임임임 임임임 임임임임임 임임임임 ENOMEMORY 임임임 임임 ECLASSNOSUPPORT 임임임 임임임임 임임임임 임임 EBADPARM ppobj 임 임 임임임임 임임임 임임

Upload: len-griffin

Post on 02-Jan-2016

49 views

Category:

Documents


0 download

DESCRIPTION

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) 재개 - PowerPoint PPT Presentation

TRANSCRIPT

임베디드 모바일 프로그래밍 1

8. IShell API (2)

8.1 IShell API 함수• ISHELL_CreateInstance 함수 : Brew 프로그램의 진입점이 되는 함수이다 . 이 함수는

ClassID 를 받아서 새로운 애플릿을 생성하고 해당 애플릿의 이벤트 핸들링 함수를

등록한다 . 함수 형식

Int ISHELL_CreateInstance(ISHELL *pIShell, AEECLSID cls, void ** ppobj)

기능 지정된 클래스 ID 를 가진 클래스 객체를 생성한다 .

함수 인자

PIShell IShell 인터페이스 객체 포인터

cls 생성될 클래스의 32 비트 ClassID 정보

ppobj 생성될 클래스의 객체를 저장하는 메모리 포인터

반환 값

SUCCESS 클래스 생성이 정상적으로 이루어짐

ENOMEMORY 메모리 부족

ECLASSNOSUPPORT 생성된 클래스가 지원되지 않음

EBADPARM ppobj 가 널 포인터로 전달될 경우

임베디드 모바일 프로그래밍 2

8. IShell API (2)

• ISHELL_StartApplet 함수 : 지정한 애플릿을 실행한다 .

함수 형식

Int ISHELL_StartApplet(ISHELL *pIShell, AEECLSID cls)

기능 애플릿을 실행할 때 사용한다 .

함수 인자pIShell IShell 인터페이스 객체 포인터

cls 생성될 클래스의 32 비트 ClassID 정보

반환 값

SUCCESS 클래스 생성이 정상적으로 이루어짐

ENOMEMORY 메모리 부족

ECLASSNOSUPPORT 생성된 클래스가 지원되지 않음

EEXPIRED 애플릿 사용이 만료됨

임베디드 모바일 프로그래밍 3

8. IShell API (2)

• A 애플릿에서 B 애플릿을 실행시킬 경우의 제어 흐름

AEE_Shell

ISHELL_HandleEvent

A

B

(1) ISHELL_PostEvent(IShell, EEC_SID_B)

(2) 대기상태

EVT_APP_SUSPEND

(3) B 애플릿 생성

EVT_APP_START(4) B 종료

(5) 재개

EVT_APP_RESUME

임베디드 모바일 프로그래밍 4

8. IShell API (2)

• ISHELL_CloseApplet 함수 : AEE 셀에 현재 실행되고 있는 애플릿에 대한 종료를 요

청하는데 이 메시지가 EVT_APP_STOP 이벤트이다 .함수 형식

Int ISHELL_ CloseApplet(ISHELL *pIShell, boolean bReturnToldle)

기능 실행 중인 애플릿을 종료하는데 사용한다 .

함수 인자

pIShell IShell 인터페이스 객체 포인터

bReturnToldle

이 값은 AEE Shell 실행 중인 모든 애플릿을 종료하고 대기 화면으로 돌아갈 것인지를 결정할 때 사용된다 . 만일 이 값이 TRUE 이면 모든 애플릿을 종료하고 대기 화면으로 돌아간다 .

반환 값SUCCESS 클래스 생성이 정상적으로 이루어짐

EFAILED 에러 발생

임베디드 모바일 프로그래밍 5

8. IShell API (2)

• ISHELL_ActiveApplet 함수 : 현재 실행되고 있는 클래스 ID 정보를 읽어 온다 .

함수 형식

AEECLSID ISHELL_ ActiveApplet(ISHELL *pIShell)

기능 실행 중인 애플릿의 클래스 ID 정보를 읽어 온다 .

함수 인자 pIShell IShell 인터페이스 객체 포인터

반환 값애플릿 클래스 ID 현재 실행 중인 애플릿의 클래스 ID

0 실행 중인 애플릿이 없다 .

임베디드 모바일 프로그래밍 6

8. IShell API (2)

• ISHELL_SendEvent 함수 : 특정 애플릿이나 클래스에 이벤트를 전달한다 .

함수 형식

boolean ISHELL_ SendEvent((ISHELL *pIShell, AEECLSID clsApp, AEEEvent evt, unit16 wp, uint32 dwp)

기능 특정 애플릿이나 객체에 이벤트를 보낸다 .

함수 인자

pIShell IShell 인터페이스 객체 포인터

clsApp 이벤트를 받을 애플릿이나 클래스의 32 비트 클래스 ID

evt 전송될 이벤트 정보

wp 이벤트와 함께 보내는 16 비트 데이터

dwp 이벤트와 함께 보내는 32 비트 데이터

반환 값TRUE 이벤트 전송 성공

FALSE 이벤트 전송 실패

임베디드 모바일 프로그래밍 7

8. IShell API (2)

• ISHELL_SendEvent 함수의 제어 흐름

AEE Shell

A

B

(1) ISHELL_SendEvent(pIShell, B, EVT_USER, wp, dwp)

(2) 애플릿 생성 , IAPPLET_HandleEvent 함수를 통해서 A 가 전송한 EVT_USER 이벤트를 B 에게 전달

(3) EVT_USER 이벤트를 받고 , ISHELL_StartApplet을 실행시켜 EVT_USER 이벤트에 대한 결과 처리

임베디드 모바일 프로그래밍 8

8. IShell API (2)

• ISHELL_PostEvent 함수 : 전달한 이벤트를 큐에 저장한 후 나중에 처리할 수 있

다 .

함수 형식

boolean ISHELL_PostEvent(ISHELL *pIShell, AEECLSID clsApp, AEEEvent, uint16 bwp, uint32 dwp)

기능 특정 애플릿이나 클래스에 이벤트를 비동적으로 전송한다 .

함수 인자

pIShell IShell 인터페이스 객체 포인터

clsApp 이벤트를 받을 애플릿이나 클래스의 32 비트 클래스 ID

evt 전송될 이벤트 정보

wp 이벤트와 함께 전송되는 16 비트 데이터

dwp 이벤트와 함께 전송되는 32 비트 데이터

반환 값TRUE 이벤트가 전송 성공

FALSE 이벤트 전송 실패

임베디드 모바일 프로그래밍 9

8. IShell API (2)

• IShell_PostEvent 함수의 제어 흐름

A

B

AEE Shell

ISHELL_HandleEvent

(1) ISHELL_PostEvent(pIShell, B, EVT_USER, wp, dwp)

(2) 이벤트를 큐에 저장

(3) ISHELL_HandleEvent 함수를 이용해서 큐에 저장된 이벤트 처리

임베디드 모바일 프로그래밍 10

8. IShell API (2)

8.2 IShell API 서비스 대화상자 , 메시지 박스 , 프롬프트

• 대화상자는 컨트롤이 내장된 프레임

• ISHELL_CreateDialog 함수 : 대화 상자 생성

함수 형식

Int ISHELL_CreateDialog(IShell *pIShell, const char *pszResFile, uint16 wID, DialogInfo *pInfo)

기능 AEE Shell 에게 리소스 파일에 있는 특정 대화 상자의 실행을 요청한다 .

함수 인자

pIShell IShell 인터페이스 객체 포인터

pszResFile 대화 상자 정보를 가지고 있는 리소스 파일

wID 리소스 파일 안에 있는 대화 상자의 ID

pInfo 대화 상자 구조체 정보

반환값

SUCCESS 대화 상자 생성 성공

ENOMEMORY 메모리 부족

EBADPARM 올바르지 못한 함수 인자

EFAILED 대화 상자 생성 실패

임베디드 모바일 프로그래밍 11

8. IShell API (2)• ISHELL_EndDialog 함수 : 대화 상자 종료

함수 형식

Int ISHELL_EndDialog(ISHELL *pIShell)

기능 AEE Shell 에게 리소스 파일에 있는 특정 대화 상자의 실행을 요청한다 .

함수 인자 pIShell IShell 인터페이스 객체 포인터

반환값SUCCESS 실행 중인 대화 상자 종료 성공

EFAILED 대화 상자 종료 실패

임베디드 모바일 프로그래밍 12

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 발생

임베디드 모바일 프로그래밍 13

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

임베디드 모바일 프로그래밍 14

8. IShell API (2)

임베디드 모바일 프로그래밍 15

8. IShell API (2)

임베디드 모바일 프로그래밍 16

8. IShell API (2)

임베디드 모바일 프로그래밍 17

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;

임베디드 모바일 프로그래밍 18

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);}

임베디드 모바일 프로그래밍 19

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_SCROLL

BAR|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);

임베디드 모바일 프로그래밍 20

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;

대화상자 메뉴 항목 생성

코드 값

임베디드 모바일 프로그래밍 21

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 에게 대화상자 실행 요청

임베디드 모바일 프로그래밍 22

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 를 선택할 경우 ,

대화상자를 종료하고 메인 메뉴로 복귀

메뉴 컨트롤 객체를 활성화 , 표시

임베디드 모바일 프로그래밍 23

8. IShell API (2)_STR_TO_WSTR("1 분 후 알람 발생 ", szBuf, sizeof(szBu

f));

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);

임베디드 모바일 프로그래밍 24

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)

{

임베디드 모바일 프로그래밍 25

// 메뉴 컨트롤 해지하는 함수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)

임베디드 모바일 프로그래밍 26

8. IShell API (2){

*pcDestin = *psSource;

pcDestin += 1;

}

else

{

*pcDestin = *psSource;

pcDestin += 1;

*pcDestin = 0;

pcDestin += 1;

}

}

return (AECHAR*)pcDestin;

}

임베디드 모바일 프로그래밍 27

• 실행 결과

8. IShell API (2)

임베디드 모바일 프로그래밍 28

8. IShell API (2)