📄 main.c
字号:
/*
*******************************************************************************
* ACTOS AP
* main ap of sdk 3.0
*
* (c) Copyright, Actions Co,Ld.
* All Right Reserved
*
*******************************************************************************
*/
#include "actos.h"
#include "ap_common.h"
#ifdef SDK35FD
#include "pdmodule.h"
#endif
//#define CAMERA SYSTEM
//#define CAMERAA SYSTEMA
#define MAIN_ITEMCOUNT 6
#define CHGVDD
//用户测试时定义这两个常量
//#define MAIN_DEBUG
//#define YOUR_AP_NAME "ap_voice.AP"
//#define MY_TEST //for m-record.ap test by ccm
#ifdef MY_TEST
#define MY_DUMP(string, value) \
do{ \
char dump_buf[6]; \
dump_buf[0] = ','; \
SetTextPos(0, 16); \
PutS((string), -1); \
itoa4((value), &dump_buf[1]); \
dump_buf[5] = '>'; \
PutS(dump_buf, 6); \
UpdateScreen(NULL); \
while( ap_get_message() != (AP_KEY_EQ| AP_KEY_UP)) {;} \
}while(0)
#else
#define MY_DUMP(string, value)
#endif
//进入录音, 但不自动开始
#define RESULT_REC_NOSTART RESULT_USER1
//进入设定, 关标停留在ADFU
#define RESULT_SYSTEM_ADFU (RESULT_USER1+1)
void draw_logo(BOOL wait_key_up);
void draw_staff(void);
//global
comval_t g_comval;
extern unsigned char SuppCardFlag;
int counter;
//secrect key sequence
const BYTE sec_tester[] =
{
AP_KEY_PLAY | AP_KEY_UP,
AP_KEY_PLAY | AP_KEY_UP,
AP_KEY_PLAY | AP_KEY_UP,
AP_KEY_PLAY | AP_KEY_UP,
AP_KEY_PLAY | AP_KEY_UP,
};
const BYTE sec_staff[] =
{
AP_KEY_VOLADD | AP_KEY_UP,
AP_KEY_VOLADD | AP_KEY_UP,
AP_KEY_VOLADD | AP_KEY_UP,
AP_KEY_VOLADD | AP_KEY_UP,
AP_KEY_PLAY | AP_KEY_UP
};
//pic ids
const WORD inactive_id[MAIN_ITEMCOUNT] = {MUSIC, RECORD, VOICE, FM, SYSTEM,DSC};
const WORD active_id[MAIN_ITEMCOUNT] = {MUSICA, RECORDA, VOICEA, FMA, SYSTEMA,DSCOK};
const WORD inactive_id_nofm[MAIN_ITEMCOUNT-1] = {MUSIC, RECORD, VOICE, SYSTEM,CAMERA};
const WORD active_id_nofm[MAIN_ITEMCOUNT-1] = {MUSICA, RECORDA, VOICEA, SYSTEMA,CAMERAA};
//pic position
const BYTE inactive_pos[5] = {3, 3+(21+5), 3+(21+5)*2, 3+(21+5)*3, 3+(21+5)*4};
const BYTE inactive_pos_nofm[5] = {3, 3+(21+5), 3+(21+5)*2, 3+(21+5)*3, 3+(21+5)*4};
//ap id
const WORD ap_id[MAIN_ITEMCOUNT]={RESULT_MUSIC, RESULT_REC_NOSTART,
RESULT_VOICE, RESULT_RADIO, RESULT_SYSTEM,RESULT_CAMERA};
const WORD ap_id_nofm[MAIN_ITEMCOUNT-1]={RESULT_MUSIC, RESULT_REC_NOSTART,
RESULT_VOICE, RESULT_SYSTEM,RESULT_CAMERA};
#ifdef MAIN_DEBUG
char lan_id=0; //for test, language id
function_menu_t menu;
slider_t slider;
// progress_t progress;
void test(void);
#endif /* MAIN_DEBUG*/
/*
********************************************************************************
* Description : 初始化系统设置变量
*
* Arguments :
*
* Returns :
*
* Notes :
*
********************************************************************************
*/
void read_var(void)
{
BOOL result;
//read comval
result = VMRead(&g_comval, VM_SYSTEM, sizeof(g_comval));
ASSERT(result);
//check if valid
if(g_comval.magic != MAGIC_COMVAL)
{
DUMP_STRING("comval init-ed!");
//COMVAL_INIT(g_comval);
GetDefaultComval(&g_comval);
//write to vm
result = VMWrite(&g_comval, VM_SYSTEM);
ASSERT(result);
}
if ( g_comval.SuppCard == 1 )
{
SuppCardFlag = 1;
}
//init ap message
ap_message_init(&g_comval);
//sKY_SetBLightColor(g_comval.BLightColor); //设置背光颜色。for s2 by ccm
//set contrast just in main ap
SetContrast(g_comval.DisplayContrast);
}
/*
********************************************************************************
* Description : 主函数
*
* Arguments :
*
* Returns : 结果消息或0
*
* Notes :
*
********************************************************************************
*/
int main(int param)
{
int active=0; //当前活动的项目
int i;
char key;
char IsUDisk=0;
int result;
int result_bak=0; //关机时把上次执行的ap记在此
BOOL need_draw=TRUE;
BYTE sec_tester_count = 0;
BYTE sec_staff_count = 0;
BYTE item_count; //主界面有几个项目
BYTE item_index;
BOOL with_fm; //存在fm模块
#ifdef SDK35FD
usbval_t g_usbval;
#endif
output8(0x4e,input8(0x4e) | 0x08);
// output8(0x4e,input8(0x4e)& 0x7f); //测试用,关Watchdog
/* enable watch-dog */
//output8(REG4E_RTC_WATCH_DOG, 0xaa);
#ifdef CHGVDD
output8(0x4f,0xa2); //VCC set to 3.0V, VDD set to 1.8V first step
#else
output8(0x4f,0xa5); //VCC set to 3.0V, VDD set to 2.1V second step
#endif
for (counter=0; counter<0x80; counter++){;}
//ExecAP("config.ap", 0); //for s2. del by ccm
//安装驱动
if(!DRV_Install("UI_S0724.DRV",0)) while(1) {;} //缺省简体
if(!DRV_Install("ky_hard.drv",0)) while(1) {;}
if(!DRV_Install("vm_nanf.drv",0)) while(1) {;}
//打开lcd
ClearScreen(NULL);
UpdateScreen(NULL); //recommended by chliang
StandbyScreen(TRUE);
enable_interrupt();
read_var();
#ifdef SDK35FD
VMRead(&g_usbval, VM_AP_UDISK, sizeof(usbval_t));
#endif
//安装驱动
switch (g_comval.langid)
{
case 2:
if(!DRV_Install("UI_T0724.DRV",1)) while(1) {;}
break;
case 3:
if(!DRV_Install("UI_J0724.DRV",1)) while(1) {;}
break;
case 4:
if(!DRV_Install("UI_K0724.DRV",1)) while(1) {;}
break;
case LAN_ID_ENGLISH:
if(!DRV_Install("UI_L0724.DRV",1)) while(1) {;}
break;
default:
break;
}
ClearScreen(NULL);
UpdateScreen(NULL); //recommended by chliang
StandbyScreen(TRUE);
//TODO: support other language
//初始化资源文件
res_fp = ResOpen("ui30.res");
ASSERT( res_fp != NULL);
//mainap 的启动参数
//result = param;
//result =RESULT_FIRST_BOOT;
result = RESULT_MAIN;
//clear the message pool
while(GetSysMsg() != Msg_KeyNull) {;}
//show logo 1s
//ResShowLogo(BOOTLOGO);
//ap_sleep(2);
draw_logo(FALSE);
#ifdef MAIN_DEBUG
test();
#endif /* MAIN_DEBUG*/
IsUDisk = g_comval.Onlinedev;
//check if usb plugin
if(GetUsbCableStatus())
{
result = RESULT_UDISK; //or RESULT_PDDRM
}
//check if fm exists, 0表示有fm, 比较奇怪
with_fm = !g_comval.FMBuildInFlag;
if(with_fm) item_count = MAIN_ITEMCOUNT;
else item_count = MAIN_ITEMCOUNT-1;
while(1)
{
output8(0x4e,input8(0x4e) | 0x08);
//check if ap_main.ap started with param
if(result == RESULT_NULL || result == RESULT_MAIN)
{
//no ap for bakup
result_bak = RESULT_NULL;
// result_bak=RESULT_MAIN; //Start whith main
//show icons
if(need_draw)
{
ui_auto_update = FALSE;
//show main logos
ClearScreen(NULL);
item_index = active - active % 5;
for(i=0; i<5 ; i++)
{
if ( item_index + i >= item_count )
{
break;
}
if(with_fm)
{
ResShowPic(inactive_id[item_index + i], inactive_pos[i], 0);
}
else
{
ResShowPic(inactive_id_nofm[item_index + i], inactive_pos_nofm[i], 0);
}
}
//show active logo
if(with_fm)
{
ResShowPic(active_id[active], inactive_pos[active % 5]-2, 0);
}
else
{
ResShowPic(active_id_nofm[active], inactive_pos_nofm[active]-2, 0);
}
UpdateScreen(NULL);
ui_auto_update = TRUE;
need_draw= FALSE;
}//need draw
if(result == RESULT_MAIN)
{
char rtc_count=0;
//start from other ap (user hold mode key)?
do
{
key = ap_get_message();
if(key == AP_KEY_NULL)
{
}
else if((key == AP_MSG_RTC) || (key == AP_MSG_CHARGING))
{
rtc_count++;
}
else rtc_count = 0;
//check time out
if(rtc_count >= 2) break;
}
while(key != (AP_KEY_MODE|AP_KEY_UP) );
}
else ASSERT(result == RESULT_NULL); //start form first boot
key = ap_get_message();
//check sec key squence, just check key_up
if(key != AP_MSG_RTC && key != AP_MSG_CHARGING &&
(key & AP_KEY_UP) != 0)
{
//tester
if(key == sec_tester[sec_tester_count])
{
sec_tester_count++;
}
else
{
sec_tester_count = 0;
}
//staff
if(key == sec_staff[sec_staff_count])
{
sec_staff_count++;
}
else
{
sec_staff_count = 0;
}
}
//handle msg
switch( key )
{
case AP_KEY_NEXT|AP_KEY_HOLD:
case AP_KEY_NEXT:
if(active < (item_count - 1))
{
active++;
}
else
{
active = 0;
}
need_draw= TRUE;
break;
case AP_KEY_PREV|AP_KEY_HOLD:
case AP_KEY_PREV:
if(active > 0)
{
active--;
}
else
{
active = item_count - 1;
}
need_draw= TRUE;
break;
case AP_KEY_MODE | AP_KEY_UP:
if(with_fm)
{
result = ap_id[active];
}
else
{
result = ap_id_nofm[active];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -