⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 Actions ucOS-II mp3方案源码,可以做参考
💻 C
字号:
/********************************************************************************
*                        SDK30F_D1
*                     music player main sub
*
*                (c) Copyright 2002, Actions Co,Ld.
*                        All Right Reserved
*
* File: main.c
* By  : wurui
* Version: 1> v1.00     first version     2005-9-19 8:28
*
*  $Id: main.c,v 1.17 2005/12/30 07:54:44 wurui Exp $
*******************************************************************************
*/
//#include "music.h"
#include "main.h"   
#include "string.h"
//#include "UsbService.h"
#include "driver.h"
#include "FIFO.h"
non_banked int usb_main(void);

#ifdef WIN32
bool MainTaskExistFlag = FALSE;
#endif
extern char RTCSchTimer;

void main();
void USB_Entry(void);
void System_KillAllTask();
bool System_DetectAllTask();
void System_KillIdleTask();

void Main_CreateMainWindow(stack_vars *MainTaskVars);
void Main_DeleteMainWindow(stack_vars *MainTaskVars);
void Main_HideMainWindow(stack_vars *MainTaskVars);
void Main_ShowMainWindow(stack_vars *MainTaskVars);
void Main_SelectKeyResolve(stack_vars *MainTaskVars);
void Main_KeyResolve(stack_vars *MainTaskVars,int key);
void Main_GetPicRect(GUI_RECT *PicRect,int i);
void Main_ReadMainVars(stack_vars *MainTaskVars);

void cbCallBack_MainMenu(WM_MESSAGE *pMsg);


void Main_SemInit(msg_t *msg_list);
void Main_ShowPicLock();
void Main_ShowPicUnlock();
void Main_SemExit();

 
static OS_EVENT *ShowPicSem = 0;
void MainTask()
{

    stack_vars MainTaskVars;    

    msg_t msg;
    msg_t   msg_list[10];
    
    int pic_invaliable[]={MUSIC_I, EBOOK_I, RECORD_I, RPL_I, FM_I,SYSTEM_I};  
    int pic_valiable[]={MUSIC_V, EBOOK_V, RECORD_V, RPL_V, FM_V,SYSTEM_V};  
    api_init();
    
    Main_SemInit(msg_list);
    
    memset(&MainTaskVars, 0, sizeof(stack_vars));          
     
    OSSetTaskOwnPtr((unsigned int *)&MainTaskVars, MAIN_FACE_ID); 
    
    MainTaskVars.point[1] = pic_invaliable;
    MainTaskVars.point[2] = pic_valiable;

    Main_CreateMainWindow(&MainTaskVars);

    //主循环
    while(1)
    {   
        //msg = (msg_t *)MYOSQPend(GUIToMainWindow,0,&err);
        MYOSQPend(GUIToMainWindow,&msg,0);

        switch(msg.type)
        {
        case MSG_REPAINTWIN:
            Main_ShowMainWindow(&MainTaskVars);
            break;
        case MSG_KEY:
            Main_KeyResolve(&MainTaskVars,msg.msg.data[0]);
            break;
        case MS_USB:
            USB_Entry();
            break;
        }  
    }
}
void USB_Entry(void)
{ 

    System_KillAllTask();
    OS_ENTER_CRITICAL();
    KillTimer(RTCSchTimer); //uninstall rtcschtimer
    SwitchRcodeToRam(DRV_USB_B); //switch usb entry bank
    OS_EXIT_CRITICAL();
    usb_main();
}
void Main_ShowMainWindow(stack_vars *MainTaskVars)
{
    MainTaskVars->RedrawFlag = TRUE;
    WM_ShowWindow(MainTaskVars->FrameWin);
    WM_SetFocus(MainTaskVars->FrameWin);
}
void Main_KeyResolve(stack_vars *MainTaskVars,int key)
{
    GUI_RECT rClient;

    switch(key)
    {
    case GUI_KeyEnter_KeyMode | GUI_Key_Up:
        if(MainTaskVars->lastkey == 0)
        {
            Main_SelectKeyResolve(MainTaskVars);
            MainTaskVars->lastkey = GUI_KeyEnter_KeyMode | GUI_Key_Up;
            return;
        }
        MainTaskVars->lastkey = 0;
        break;
    case GUI_KeyDown_KeyNext | GUI_Key_Down:
    case GUI_KeyDown_KeyNext | GUI_Key_Hold:
        Main_ShowPicLock();
        Main_GetPicRect(&rClient,MainTaskVars->CurSelect);
        MainTaskVars->LastSelect = MainTaskVars->CurSelect;
        WM_InvalidateRect(MainTaskVars->FrameWin,&rClient);
        MainTaskVars->CurSelect = (MainTaskVars->CurSelect +1) % 6;
        Main_GetPicRect(&rClient,MainTaskVars->CurSelect);
        WM_InvalidateRect(MainTaskVars->FrameWin,&rClient);
        break;
    case GUI_KeyUp_KeyPrev | GUI_Key_Down:
    case GUI_KeyUp_KeyPrev | GUI_Key_Hold:
        Main_ShowPicLock();
        Main_GetPicRect(&rClient,MainTaskVars->CurSelect);
        MainTaskVars->LastSelect = MainTaskVars->CurSelect;
        WM_InvalidateRect(MainTaskVars->FrameWin,&rClient);
        if(MainTaskVars->CurSelect ==0)
            MainTaskVars->CurSelect = 5;
        else
            MainTaskVars->CurSelect--;
        Main_GetPicRect(&rClient,MainTaskVars->CurSelect);
        WM_InvalidateRect(MainTaskVars->FrameWin,&rClient); 
        break;
    }
}
void Main_SelectKeyResolve(stack_vars *MainTaskVars)
{

    switch(MainTaskVars->CurSelect)
    {
#ifndef WIN32
    case 0:
        WM_SetFocus(WM_HBKWIN);
        Main_HideMainWindow(MainTaskVars);
        MusicTaskCreate();
        break;
#endif
    case 1: 
        WM_SetFocus(WM_HBKWIN);
        Main_HideMainWindow(MainTaskVars);
        EBookTaskCreate();
        break;
    case 2: 
        WM_SetFocus(WM_HBKWIN);
        Main_HideMainWindow(MainTaskVars);
        RecordTaskCreate();
        break;
    }
}
void Main_CreateMainWindow(stack_vars *MainTaskVars)
{
    MainTaskVars->RedrawFlag = TRUE;
    MainTaskVars->FrameWin = WM_CreateWindow(0,0,96,64,WM_CF_SHOW,&cbCallBack_MainMenu,0);
    WM_SetFocus(MainTaskVars->FrameWin);
}
void cbCallBack_MainMenu(WM_MESSAGE *pMsg)
{
    GUI_RECT rClient;
    stack_vars *MainTaskVars;
    int *pic_invaliable,*pic_valiable;
    int i;
    msg_t msg;

    switch (pMsg->MsgId) 
    {
    case WM_PAINT:
        GUI_SetBkColor(GUI_LIGHTBLUE);
        //GUI_Clear();
        MainTaskVars = (stack_vars *)OSGetTaskOwnPtr(MAIN_FACE_ID);
        pic_invaliable = (int*)MainTaskVars->point[1];
        pic_valiable = (int*)MainTaskVars->point[2];
        
        for(i=0;i<6;i++)
        {
            if(!MainTaskVars->RedrawFlag)
                if(i!=MainTaskVars->LastSelect && i!=MainTaskVars->CurSelect)
                    continue;
            Main_GetPicRect(&rClient,i);
            if(i != MainTaskVars->CurSelect)
                GUI_ShowPic(pic_invaliable[i], rClient.x0, rClient.y0);
            else
                GUI_ShowPic(pic_valiable[i], rClient.x0, rClient.y0);
        }
        Main_ShowPicUnlock(); 
        
        MainTaskVars->RedrawFlag = 0;
        break;
    case WM_KEY:
        switch(((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt)
        {
        case 0:
            msg.type = MSG_KEY;
            msg.msg.data[0] = ((WM_KEY_INFO*)(pMsg->Data.p))->Key | GUI_Key_Up; 
            MYOSQPost(GUIToMainWindow,&msg);
            return;
        case 1:
            msg.type = MSG_KEY;
            msg.msg.data[0] = ((WM_KEY_INFO*)(pMsg->Data.p))->Key | GUI_Key_Down; 
            MYOSQPost(GUIToMainWindow,&msg);
            return;
        case 3:
            msg.type = MSG_KEY;
            msg.msg.data[0] = ((WM_KEY_INFO*)(pMsg->Data.p))->Key | GUI_Key_Hold; 
            MYOSQPost(GUIToMainWindow,&msg);
            return;
        case 4:
            System_DealMessage(pMsg);
            return;
        }
        break;
    }
    WM_DefaultProc(pMsg);
}
void Main_GetPicRect(GUI_RECT *PicRect,int i) 
{
    PicRect->x0= 32*(i % 3);
    PicRect->x1 = PicRect->x0 + 32;
    PicRect->y0 = 32*(i / 3);
    PicRect->y1 = PicRect->y0 + 32;
}
void Main_HideMainWindow(stack_vars *MainTaskVars)
{
    WM_HideWindow(MainTaskVars->FrameWin);
}  

void Main_DeleteMainWindow(stack_vars *MainTaskVars)
{
    WM_DeleteWindow(MainTaskVars->FrameWin);
}


void MainTaskCreate()
{
    //IF MAINTASK IS NOT EXIST THEN
    if(!MainTaskDetect())
    {
#ifdef WIN32
    CREATE_TASK(&aTCB[0], "MAIN MENU", MainTask, 3, Stack_0);
#else   
    OSTaskCreate((void(*)(void *))(long)MainTask,    (void *)0x0000,  
                    (void *)MAIN_FACE_SPACE, MAIN_FACE_PRIO, MAIN_FACE_ID);
#endif
    }
    //ELSE THEN DO NOTHING
    else
    {
        msg_t msg;
        msg.type = MSG_REPAINTWIN;
        MYOSQPost(GUIToMainWindow,&msg);
    }
}

void MainTaskDelete()
{
#ifndef WIN32
    Main_SemExit();
    for(;;)
    {
        OSTaskDel(OS_PRIO_SELF);
    }
#endif
}

bool MainTaskDetect()
{   
#ifndef WIN32 
    OS_ENTER_CRITICAL();
    if(OSTCBPrioTbl[MAIN_FACE_PRIO] != (OS_TCB *)0)
    {
        OS_EXIT_CRITICAL();
        return TRUE;
    }
    OS_EXIT_CRITICAL();
    return FALSE;
#else
    if(!MainTaskExistFlag)
    {
        MainTaskExistFlag = TRUE;
        return FALSE;
    }
    return TRUE;
#endif    
} 

void Main_SemInit(msg_t *msg_list)
{
    if(ShowPicSem == 0)
    {
        ShowPicSem = OSSemCreate(1);    
    }
    if(GUIToMainWindow == 0)
    {
        GUIToMainWindow  = MYOSQCreate(msg_list,10); 
    } 

}

void Main_ShowPicUnlock()
{ 
    OSSemPost(ShowPicSem);
}


void Main_ShowPicLock() 
{
    INT8U err;
    OSSemPend(ShowPicSem, 0, &err);
}

void Main_SemExit()
{   
    INT8U err; 
    MYOSQDel (GUIToMainWindow, OS_DEL_ALWAYS, &err);
}

void System_KillAllTask()
{
    msg_t msg_send;
    msg_send.type = MS_END;
    MYOSQPost(Engine_Out,&msg_send);
    MYOSQPost(GUIToEBookWindow,&msg_send);
    OSTimeDly(10);
    DelGUITask();
    GUI_ShowPic(BACK, 0, 0);
    GUI_ShowPic(USBIMG,4,14);
    MYOSQPost(Engine_In,&msg_send);
    do
    {
        OSTimeDly(5);
    }while(PlayerEngineDetect() != 0);

}

void System_KillIdleTask()
{
    OSTaskDel(IDEL_PRIO);
}
bool System_DetectAllTask()
{
    bool result;
    
    result = EBookTaskDetect();
    result |= MusicTaskDetect();
    result |= PlayerEngineDetect();

    return result;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -