2013年4月24日 星期三

BREW 3.1.5 OEM Font


The BREW System using IFont Interface to Draw Text/Chars internal. Actually, It is used by IDisplay_DrawText.
The important concept is, two type font: Logical Font & Physical Font.


1)The Logical Font is as :
// Logical font type
enum {
AEE_FONT_NORMAL=0x8000,
AEE_FONT_BOLD,
AEE_FONT_LARGE,
AEE_FONT_ITALIC,
AEE_FONT_BOLD_ITALIC,
AEE_FONT_LARGE_ITALIC,
AEE_FONT_NORMAL_SCH,
AEE_FONT_USER_1,
AEE_FONT_USER_2,
AEE_FONT_TOTAL
};



2)The Phisical Font is The detail implemented IFont Interface
For, IDisplay, It will associate one logical font type with one phisical font instance. And When you Call IDisplay_DrawText, passed the logical font type, IDisplay inside will using the associated IFont instance to draw chars, such as IFONT_DrawText.


Now, I give the basic flow for BREW Font management:
When BREW Init, BREW will create some system Font instance(physical Font) with such as 
AEECLSID_FONTSYSNORMAL,
AEECLSID_FONTSYSLARGE,
AEECLSID_FONTSYSBOLD, 
And Call IDISPLAY_SetFont to associate them with logical font type:
 AEE_FONT_NORMAL,
AEE_FONT_LARGE,
AEE_FONT_BOLD
Then, When App Call IDISPLAY_DrawText, and passed logical font type, BREW will using the related IFont instance to draw chars.
If App want to change the default physical font, Then, Developer can implement their own IFont Interface. Create this IFont instance in run-time, Then Call IDisplay_SetFont, Passed this IFont Instance and the logical font type which you want to associated, assume, AEE_FONT_BOLD . 
OK, from now on, When you using IDisplay_Drawtext with AEE_FONT_BOLD , BREW will use your own IFont instance to draw the text.


修改自己的FONT三種方法
1)使用BREW Font Extension
2)從底層OEM層修改AEECLSID_FONTSYSNORMAL, AEECLSID_FONTSYSLARGE, AEECLSID_FONTSYSBOLD
3)在程式內撰寫IDisplay_SetFont





2013年4月11日 星期四

BREW IDatabase IDBMgr IDBRecord


1. create a IDBMgr object
-->ISHELL_CreateInstance( .... AEECLSID_DBMGR ... )

2. open database
--> IDatabase IDBMGR_OpenDatabase(......)

once database is open, IDBMgr is not longer needed
-->IDBMGR_Release(....)

3. Create Record
init AEEDBField
--> set fType, fName, wDataLen, pBuffer
--> IDATABASE_CreateRecord( .... AEEDBField ....)

4. Record Reset, Update, Delete, Get


Simplifying Access to BREW Databases


以下是官方資料

The IDatabase Interface functions allow you to create and access records in databases created and opened with the IDBMgr Interface.

1.
To obtain an instance of the IDatabase Interface , you call IDBMGR_OpenDatabase() to open the desired database.

You then use the IDatabase Interface pointer returned by this function to access the database with the operations described below.

2.
You can also use functions in the IDBRecord Interface to access the fields of individual database records.

3.
When you have completed access to the database, you call IDATABASE_Release() to close it.

4.
The IDATABASE_CreateRecord() function creates a new record and adds it to your database (the function IDBRECORD_Remove() is used to remove a record from the database). Each record contains one or more fields.

5.

Each field is defined by the AEEDBField structure, which includes the following elements:
  • The field name is a descriptor of the field's contents, (name, phone number, email address, etc.) The AEEDBFieldName enumerated type contains constants for commonly used field names.
  • The field type gives the data type of the field (byte, word, double-word, character string, binary, phone number or bitmap).
  • The field buffer pointer is a pointer to the actual contents of the field.
  • The field length is the length in bytes of the field contents.  







2013年4月2日 星期二

BREW Using bitmap fonts, How to use AEE_FONT_USER_1/AEE_FONT_USER_2 ?

This example shows how an application uses bitmap fonts to display text.

How to use AEE_FONT_USER_1/AEE_FONT_USER_2 ?

簡單來說BREW DrawText Font不只有這些而已
AEEFont:
Description
This ENUM specifies the logical font type used in IDisplay text drawing operations.

enum {
   AEE_FONT_NORMAL=0x8000,
   AEE_FONT_BOLD,
   AEE_FONT_LARGE,
   AEE_FONT_ITALIC,
   AEE_FONT_BOLD_ITALIC,
   AEE_FONT_LARGE_ITALIC,
   AEE_FONT_USER_1,
   AEE_FONT_USER_2,
   AEE_FONT_TOTAL
};

可以利用
  • AEECLSID_FONT_STANDARD11
  • AEECLSID_FONT_STANDARD11B
  • AEECLSID_FONT_STANDARD15
  • AEECLSID_FONT_STANDARD15B
  • AEECLSID_FONT_STANDARD18
  • AEECLSID_FONT_STANDARD18B
  • AEECLSID_FONT_STANDARD23
  • AEECLSID_FONT_STANDARD23B
  • AEECLSID_FONT_STANDARD26
  • AEECLSID_FONT_STANDARD26B
  • AEECLSID_FONT_STANDARD36
  • 
    怎麼利用呢?How to use this?
    
    
    1.建立Instance
    
    ISHELL_CreateInstance(me->piShell, AEECLSID_FONT_STANDARD11, (void**)&piFontUser1); 
    
    
    2.在Drawtext之前setFont
    
    IDisplay_SetFont(me->piDisplay, AEE_FONT_USER_1, piFontUser1);  
    
    
    3.Draw
    
    IDISPLAY_DrawText(pMe -> a.m_pIDisplay,
                                       AEE_FONT_USER_1,
                                         hello, 
                                        -1 , 
                                          0 , 
                                        0 , 
                                        NULL, IDF_ALIGN_CENTER );
    
    
    
    
    大功告成
    
    
    :)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    2013年3月28日 星期四

    BREW tutorial

    QUALCOMM平台BUIW开发文档
    BREW SDK 3.1
        看這個就對了

    步入 BREW 开发

    第10章IMENUCTL

    实验5 IMenuCtl

    第八章 IMENUCTL

    http://haorui215.iteye.com

    引路蜂移動軟件

    第14章ITectCtl


    Brew 3.1.5環境設置(只適用於Simulator)

    1.安裝Visual Studio 2005 
    2.安裝BREWSDK315SP02.exe 
    BREWSDKTOOLS111SP02.exe 
    BREW_Device_Configurator315.exe 
    -->Mif Editor& Brew Resource Editor, BREW Simulator, BREW Device Configurator v3.1.5 
    3.Using BREW add-in toolbar buttons 
    -->see the BREWSDKToolsUserDocs 

    4.將C:\....\BREW SDK Tools 1.1.1 SP02\VSAddins\vs80 下的資料夾改名為紅色框框內的名字即可

    5.Click Tools -> Add-in Manager.




    Getting start on Brew 

    • New Brew Project 
    • Mif Editor& Brew Resource Editor 
    • BREW Device Configurator v3.1.5 
    • run on Simulator 


    Project name不要有大寫, 不然使用resource會有問題


    Mif Editor

    1.Open BREW MIF Editor
    2.Create class ID from local
    -->save the class_name.bid
    (放在專案資料夾底下)
    3.Compile(Build->Compile MIF Script)
    -->save the class_name.mif
    (與專案資料夾放在一起)


    Resource Editor

    1.Open Brew Resource Editor 
    2.New Resouce item
    -->設定內容
    3.Build->Compile
    -->save class_name.brx


    Device Configurator

    1.執行C:\....\BREW Device Configurator v3.1.5\bin底下的 BREW_DeviceConfig.exe
    2.File->open
    -->C:\....\BREW 3.1.5\sdk\devices\DevicePack4\DevicePack4.dpk
    3.Edit->Device Pack Properties
    設定Font,不然有時會出現亂碼


    Brew Simulator

    1.VS2005->Build->Build Solution
    2.Open Brew Simulator ->File->Load Device
    -->設定Applet Directory ->Apply
    3.按下Apply後模擬器會Load程式






















    2013年3月27日 星期三

    BREW ISHELL_LoadResImage ALWAYS NULL PROBLEM


    At BREW SDK v3.1.5 + Visual Studio 2005
    If your ISHELL_LoadResImage ALWAYS return NULL
    Because your project name, resource name... have a upper-case characters.
    So.....




    BREW Applet SDK

    BREW Applet框架

    BREW Applet框架 - 田海立的专栏 - CSDN博客




    BREW Applet框架收藏

    BREW Applet框架
    The Framework of BREW Applet

    2006-5-6

    摘要

    本文首先通过一个简单的Applet介绍BREW环境下Applet的运行环境,然后分析如何在一个Module中实现多个Applet的方法,以及BREW中分布在不同的Module中的各Applet之间的启动交互关系。


    摘要... 1
    1 BREW概览... 2
      
    1.1 BREW简介... 2
      
    1.2 BREW中的几个基本概念... 2
      
    1.3 BREW模拟开发环境... 3
    麻雀虽小,五脏俱全之HelloBREW.. 3
      
    2.1 文件组成... 3
      
    2.2 ModuleApplet的总体框架... 4
      
    2.3 实现HelloBREW.. 6
        
    2.3.1 类型定义... 6
        
    2.3.2 AEEClsCreateInstance()的实现... 6
        
    2.3.3 HandleEvent()的实现... 7
        
    2.3.4 加入事件处理代... 8
      
    2.4 HelloBREW的执行结果... 9
    多个Applet实现在同一个Module... 9
      
    3.1 文件组成... 9
      
    3.2 实现AppsInOneModule11
        
    3.2.1 类型定义... 11
        
    3.2.2 AEEClsCreateInstance() 函数的实现... 11
        
    3.2.3 Applet构造函数的实现... 12
        
    3.2.4 Applet事件处理... 12
      
    3.3 执行序列... 13
    4 Applet实现在不同的Module... 14
    总结... 16
    参考资料及进一步参考... 16
    关于作者... 17


    1 BREW概览

    1.1 BREW简介

    BREWBinary Runtime Environment for Wireless,即无线二进制运行环境)是QUALCOMM 公司的产品。它以组件(COM的组织形式封装了底层平台提供给应用开发的服务,屏蔽了底层的实现细节,而提供给应用层统一的API。它所提供的API描述的是Spec而非实现细节,不管今后QUALCOMM的平台技术如何发展,其实现的功能和实现该功能的API规范应该是确定并向后兼容的。
    BREW上接受的OEM或其他第三方软件厂商提供的最终软件实体Module的执行体——Win32模拟环境下是 *.dll,真实机器上是*.mod,这也体现了BREW中的Binary。另外,也可以在BREW运行时从网络上下载BREW所接受的实体,加入到BREW中来运行。

    1.2 BREW中的几个基本概念

    BREW中的有AppletExtensionApplet是一个独立运行(从应用开发角度看)的实体,有Applet Context,简记为ACONTEXTExtension过实现它所定义的接口提供服务给Applet或其它ExtensionExtension不是独立的运行实体,它运行在调用它的Applet(直接或间接地,当前Extension Ext1的某个服务Ext1::srv可能不是由Applet接调用,但是调用Ext1::srvExtension Ext2归根到底还是可以追溯到某个Applet)的ACONTEXT中。AppletExtension都是被包含在Module里面的,它们之间的关系如一所示。

     
    图一、BREW中几个概念之间的关系

           BREW最终接受的是Module,所以你所提供的AppletExtension必须在某个Module中;另一方面,一个Module里可以有0…nAppletExtension,也可以同时有AppletExtension还可以两者都没有,不过两者都没有的Module也没有实际意义Module的属性和它所包含的AppletExtension的信息,以及Dependency关系都描述在MIFModule Information File)文件里,BREW通过该描述文件检索它所需要的信息,并通过相应的Module二进制文件完成相应的操作。
           BREW加载AppletExtension时,首先检查包含它的Module是否已经被加载到内存里,如果还没在内存里,BREW要做的工作是先把该Module加载;接着BREW通过该ModuleIMODULE_CreateInstance() 来创建AppletExtension的一个实例,然后才完成AppletExtension的真正加载。

    1.3 BREW模拟开发环境

    本文所描述的BREW环境和概念都是基于BREW 3.0.1,采用的程序在下面软件环境中调试通过:
    BREW SDK 3.0.1,包含
                  API手册
                  BREW Simulator, MIF Editor, etc.
                  Header files & some src files
    Microsoft Visual studio,包含
                  Visual studio 6.0
                  Visual studio 6.0 Service Package 5
           Additions
                  BREW Application Wizard
                  BREW Addins for vs60

    麻雀虽小,五脏俱全之HelloBREW

    有了上面BREW的概念以及开发调试所需的软件环境,下面我们看一个简单的BREW Applet——HelloBREW

    2.1 文件组成

           ms vs60环境中通过BREW Application Wizard创建一个HelloBREW 工程。自动生成和关联的文件如图二所示。

     
    图二、HelloBREW中自动生成的文件

           AEEAppGen.cAEEModGen.cBREW SDK中自代的文件,分别是IAppletIModule的一个实现。HelloBREW.c是新生成的文件,利用了AEEApplet这一Applet实现模版来实现特定的Applet
    这些文件将连同BREW SDK提供库一块被编译并连接成一个dll文件——HelloBREW.dllWIN32环境中,Module的执行体)。但是,只是有这些还不行,还没有跟BREWModuleApplet关联起来,BREW Simulator也不会知道如何创建和加载它们。我们还必须创建一个MIF文件来描述这些信息。
           假定,我们创建的HelloBREW这个Applet包含在HelloBREW Module中。那么,我们用BREW MIF Editor创建一个HelloBREW.mif文件;然后在其中创建一个Applet HelloBREW,并把这个AppletAEECLSID述文件HelloBREW.bid保存;最后通过菜单Build Compile MIF Script来编译这个MIF脚本,保存退出。用BREW MIF Editor创建HelloBREW.mif的过程如图三所示。

     
    图三、编辑HelloBREW.MIF

           上面工作做完之后,vs60的工程就可被Build成一个BREWModule执行体,并可用BREW Simulator来装载执行。但是,现在这个ModuleApplet什么工作也没做,执行起来也没什么意义,笔者打算在分析Applet框架并加入一些处理代码之后,再来执行之。

    2.2 ModuleApplet的总体框架

    通过调试跟踪上述的HelloBREW 工程,得出图四所示的BREW ModuleApplet的执行序列。

     
    图四、BREWModuleApplet演示——HelloBREW

    AEEModGenAEEAppGenHelloBREW 一起被编译并连接为 HelloBREW.dll。如1.2节所述,BREW 刚启动时并不是加载所有的Module,只有在 Module 所包含的 Applet  Extension 需要被加载时,BREW才加载该Module。所以,当用户点击执行HelloBREW 这个Applet 时,BREW 通过调用 AEEMod_Load() 首先来加载这个 Module [序列1]AEEModGen 通过 AEEStaticMod_New() 完成IModule 创建和初始化的工作之后,Module的加载过程完成[序列2&3]
    Module被加载完成之后,BREW就通过 IMODULE_CreateInstance() 来创建AppletAEEModGen通过HelloBREWAEEClsCreateInstance(),把Applet的具体创建工作交给HelloBREW [序列4, 5 & 6];而AEEAppGen通过AEEApplet_New() 提供了IApplet创建和初始化的便利,HelloBREW过在AEEClsCreateInstance()中调用此函数,把具体的事件处理函数HelloBREW_HandleEvent() 和程序退出时的清理函数注册到BREW里。当完成上述工作并返回AEE_SUCCESS之后, Applet的创建也就完成了 [序列 4~8]
    如果Applet是因为要运行而被创建并成功创建之后,会马上收到一条EVT_APP_START的事件,此时你的Applet已经正常的加载运行了,并通过HandleEvent数来处理它所收到的各种事件。

    再把上述过程总结一下,AEEAppGenAEEModGen其实并不是独立的实体对象,只是由于它们是BREW SDK提供的,为了明确展现开发BREW Applet时,程序员自己所要做的工作的需要,才把它们单独列出来。要看程序员所需要做的工作,只需要从图四中HelloBREW的生命线(竖线)看过去,也就是只要实现AEEClsCreateInstance(),另外,HelloBREW调用AEEApplet_New() 时,把注册自己实现的事件处理函数和程序退出时的清理函数,而退出时的清理函数也可以不定义,所以最后,程序员所要实现的函数只有AEEClsCreateInstance()和事件处理函数。

    2.3 实现HelloBREW

    2.3.1 类型定义

    首先,定义一个结构体,里面可以存放用户关心的数据。

    typedef struct _HelloBREW {
        AEEApplet       a             // Must be AEEApplet
        AEEDeviceInfo  DeviceInfo;    // access to the HW device info
        IDisplay       *pIDisplay;    // access the Display interface
        IShell         *pIShell;      // access the Shell interface
    HelloBREW;
    代码片断一、HelloBREW类型的定义

    2.3.2 AEEClsCreateInstance()的实现


    int AEEClsCreateInstance(AEECLSID ClsIdIShell *pIShellIModule *povoid **ppObj) {
        *ppObj = NULL;
        if (ClsId == AEECLSID_HELLOBREW)     {
            // Create the applet and make room for the applet structure
            if (AEEApplet_New(sizeof(HelloBREW),                           ClsId,                           pIShell,                           po,                           (IApplet**)ppObj,                           (AEEHANDLER)HelloBREW_HandleEvent,                           (PFNFREEAPPDATA)HelloBREW_FreeAppData))         {
                if (HelloBREW_InitAppData((HelloBREW*)*ppObj))             {
                    // Data initialized successfully
                    return (AEE_SUCCESS);             }
                else
                {
                    IAPPLET_Release((IApplet*)*ppObj);                 return EFAILED;             }
            // end AEEApplet_New
        }
        return (EFAILED); }
    代码片断二、HelloBREW  AEEClsCreateInstance() 的实现

    这里定义了一个局部的初始化函数HelloBREW_InitAppData(),用来执行用户数据的初始化,比如,把初始化HelloBREW的下列成员DeviceInfo : AEEDeviceInfo; *pIDisplay: IDisplay; *pIShell: IShell

    2.3.3 HandleEvent()的实现

    最后看,HelloBREW的主体——事件处理函数HelloBREW_HandleEvent()
    原型为:
    boolean HelloBREW_HandleEvent(HelloBREW* pMe, AEEEvent eCode, uint16 wParam, uint32 dwParam)
    该函数通过eCode参数来决定消息的类型,然后做出相应的处理,所以它的主体是一个大的switch语句:

        switch (eCode)     {
            // App is told it is starting up
            case EVT_APP_START:             return (TRUE);
            // App is told it is exiting
            case EVT_APP_STOP:             return (TRUE);
            // App is being suspended 
            case EVT_APP_SUSPEND:             return (TRUE);
            // App is being resumed
            case EVT_APP_RESUME:             return (TRUE);
            case EVT_APP_MESSAGE:             return (TRUE);
            case EVT_KEY:             return (TRUE);
            // If nothing fits up to this point then we'll just break out
            default:             break;    }
       return FALSE;
    代码片断三、HelloBREW 中事件处理的主体实现

    如果事件被处理,该函数返回TRUE,否则返回FALSE

    2.3.4 加入事件处理代码

    为了简单起见,笔者就直接在HelloBREW刚被加载也就是在收到EVT_APP_START事件的时候加入一些处理。对这个事件的处理也只是显示“Hello BREW”。相应的代码如下:

        AECHAR szText[] = L"Hello BREW";
        switch (eCode)
        {
            // App is told it is starting up
            case EVT_APP_START: ...

    Things you can do from here: