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

📄 winstack.c

📁 在ARM7和UC/OSII的平台上实现了GPS自动报站的功能,涉及GPS模块LEA_4S的驱动,位置速寻算法,语音芯片ISD4004的录放音驱动,LED页面管理等等.从启动代码到操作系统的移植以及到业
💻 C
字号:
/****************************************************************
**                                                              *
**  FILE         : WinStack.c                                   *
**                                                              *
**  By : Cyb 2007.07.01                                         *
****************************************************************/
#define WINSTACK_GLOBALS 

#include "includes.h"
#include "ErrTask.H"
#include "TimeTask.H"
#include "FormPage.h"
#include "WinStack.h"
#include "DisplayTask.h"
#include "UART_Drv.h"
#include "message.h"
#include "_keyboard.h"

#define NULLSTACK          0xFF

static  FORMSTACK FormPageStack;
static  INT8U CurStack ;  //CurStack=0表示有一个窗体在堆栈中
static  TMR_TSK *AutoCloseWinTmr;
static  INT8U LockPage;   //Destroy Form 直到释放到"LockPage-1"

void ClearLockPage(void)
{
     LockPage = NULLSTACK;
}    

void LockFormPage(INT8U page)
{
     INT8U curdepth;
     
     curdepth = GetFormPageDepth();
     if (curdepth > page) {
         LockPage = curdepth - page;
     }
}


static void AutoCloseWinFunc(void)
{
     FORMPAGE *formpage;
          
     CurStack = FormPageStack.formcnt;
     formpage = &FormPageStack.form[CurStack];
     if (formpage->rettype == FORMRET_TOP) {
        ReturnSpecifiedPage(0);//返回到顶层
     } else {
        PopFormStack();
     }
}
void ResetFormStack(void)
{
     FormPageStack.formcnt = NULLSTACK;
     LockPage = NULLSTACK;
}    

void InitFormStack(void)
{
     ResetFormStack();
     AutoCloseWinTmr = CreateTimer(AutoCloseWinFunc,0);
}


void PushFormStack(void)
{
     
     FORMPAGE *formpage;
     INT8U lifetime;
     
     CurStack = FormPageStack.formcnt;
     
     if (CurStack != NULLSTACK) 
     {
        formpage = &FormPageStack.form[CurStack];
        FormPageSuspendProc(formpage);//先将当前的窗体挂起
     }   
     if (CurStack == NULLSTACK) 
     {
        FormPageStack.formcnt = 0;
        CurStack = 0;
     } 
     else 
     {
        CurStack++;
        if (CurStack >= MAXFORMPAGE) return;
        FormPageStack.formcnt++;
     }
        
     formpage = &FormPageStack.form[CurStack];
     FormPageInitProc(formpage);//加载新窗体
     
     StopTmr(AutoCloseWinTmr);
     if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
        lifetime = formpage->lifetime;
        StartTmr(AutoCloseWinTmr,SECOND,lifetime);
     }   
}  

void PopFormStack(void)
{
     FORMPAGE *formpage;
     INT8U  lifetime;
     
     CurStack = FormPageStack.formcnt;
     formpage = &FormPageStack.form[CurStack];
     FormPageDestroyProc(formpage);//先destroy当前页面
     
     if ((CurStack == 0) || (CurStack == NULLSTACK)) 
     {
        return;
     } 
     else 
     {
        CurStack = CurStack - 1;
        formpage = &FormPageStack.form[CurStack];
        FormPageStack.formcnt--;
        
        if (LockPage != NULLSTACK) 
        {
           while (FormPageStack.formcnt >= LockPage ) {//一直destroy到LockPage-1
              FormPageDestroyProc(formpage);
              CurStack = CurStack - 1;
              formpage = &FormPageStack.form[CurStack];
              FormPageStack.formcnt--;
           }    
           LockPage = NULLSTACK;  //解锁
        }
        
        while (formpage->formattrib == POPFORMPAGE) 
        {//此类页面无需返回
           FormPageDestroyProc(formpage);
           CurStack = CurStack - 1;
           formpage = &FormPageStack.form[CurStack];
           FormPageStack.formcnt--;
        }
        
        FormPageResumeProc(formpage);      
        
        StopTmr(AutoCloseWinTmr);
        if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
           lifetime = formpage->lifetime;
           StartTmr(AutoCloseWinTmr,SECOND,lifetime);
        }   
     }   
}



void RefreshFormStack(void)
{
     FORMPAGE *formpage;
     INT8U lifetime;
     
     CurStack = FormPageStack.formcnt;
     if ((CurStack != NULLSTACK) && (CurStack < MAXFORMPAGE)) {
         formpage = &FormPageStack.form[CurStack];
         StopTmr(AutoCloseWinTmr);
         FormPageResumeProc(formpage);
         if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
            lifetime = formpage->lifetime;
            StartTmr(AutoCloseWinTmr,SECOND,lifetime);
         }   
     }   
}


void ReturnSpecifiedPage(INT8U depth)
{
     FORMPAGE *formpage;
     INT8U lifetime;
     
     CurStack = FormPageStack.formcnt;
     if (depth >= CurStack) return;
     
     for (;CurStack>depth;CurStack--) {
        formpage = &FormPageStack.form[CurStack];
        FormPageDestroyProc(formpage);
     }   
 
     if (CurStack == NULLSTACK) 
     {
       
        StopTmr(AutoCloseWinTmr);
     } 
     else 
     {
        formpage = &FormPageStack.form[depth];
        FormPageStack.formcnt = depth;
        FormPageResumeProc(formpage);
       
        StopTmr(AutoCloseWinTmr);
        if ((depth != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) {
           lifetime = formpage->lifetime;
           StartTmr(AutoCloseWinTmr,SECOND,lifetime);
        }   
     }
}


INT8U GetFormPageDepth(void)
{
     return FormPageStack.formcnt;
}


FORMPAGE *GetSpecifiedPage(INT8U depth)
{
     if (depth >= MAXFORMPAGE) {
        return NULL;
     } else {
        return &FormPageStack.form[depth]; 
     }   
}


FORMPAGE *AllocateFormPage(void)
{
     CurStack = FormPageStack.formcnt;
     
     if (CurStack == NULLSTACK)
     {//无页面
        ResetFormPage(&FormPageStack.form[0]);
        return &FormPageStack.form[0]; 
     } else if (CurStack >= MAXFORMPAGE+1) 
     {
        return NULL;
     } else 
     {
        ResetFormPage(&FormPageStack.form[CurStack+1]);//空闲指针是CurStack+1
        return &FormPageStack.form[CurStack+1]; 
     }
}    

FORMPAGE *GetCurrentFormpage(void)
{
     CurStack = FormPageStack.formcnt;
     
     if (CurStack != NULLSTACK) 
     {
         return &FormPageStack.form[CurStack];
     } 
     else 
     {
         return NULL;
     }    
}  

void WinStackEntry(void)
{
     FORMPAGE *formpage;
     INT8U lifetime;
     
     CurStack = FormPageStack.formcnt;//当前栈顶空间
 
     if (CurStack == NULLSTACK) 
     {
        return;
     } 
     else if (CurStack >= MAXFORMPAGE) 
     {
        ErrExit(0x1212);
        return;
     }   
     
     formpage = &FormPageStack.form[CurStack];//CurStack和数组下标是匹配的
     
     StopTmr(AutoCloseWinTmr);
     
     if ((CurStack != 0) && (formpage->lifetime != PAGELIFE_INFINITE)) 
     {
        lifetime = formpage->lifetime;
        StartTmr(AutoCloseWinTmr,SECOND,lifetime);
     }
        
     FormPageHdlKeyProc(formpage);
}     

⌨️ 快捷键说明

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