Author:家有仙妻谢掌柜
Date:2021/2/8
总结一下用单片机做项目时代码的架构,写在这里记录自己的成长历程!
1.做智能手表的框架,暂时不完全,有时间会更新该文章
event.h文件
/* 事件标识 -------------------------------------------------------------*/
#define AppID_System 0 //系统准备
#define AppID_Timer 1 //GIF定时器
#define AppID_Main1 2 //主界面1
#define AppID_Main2 3 //主界面2
#define AppID_Main3 4 //主界面3
#define AppID_Main4 5 //主界面4
#define AppID_Max 6 //AppID最大值
/* 界面标识 -------------------------------------------------------------*/
#define UiID_None 0
#define UiID_Main1 1 //主界面1
#define UiID_Main2 2 //主界面2
#define UiID_Main3 3 //主界面3
#define UiID_Main4 4 //主界面4
/* 设置事件 ------------------------------------------------------------*/
#define MaxEventAmount 10 //表示同时可以最多执行10个事件
#define SystemEventStart(id) ((id) << 8)
#define SystemEventMask(event) (((event) >> 8)&0xffffffff)
/* 系统 ----------------------------------------------------------------*/
enum{
System_NoneEvent = SystemEventStart(AppID_System),
System_InitEvent, //先发这个事件
System_MaxEvent
};
/* 主界面1 -------------------------------------------------------------*/
enum{
Main1_NoneEvent = SystemEventStart(AppID_Main1),
Main1_ShowEvent,
Main1_ShowGifEvent,
Main1_MaxEvent
};
/* 主界面2 -------------------------------------------------------------*/
enum{
Main2_NoneEvent = SystemEventStart(AppID_Main2),
Main2_ShowEvent,
Main2_ShowGifEvent,
Main2_MaxEvent
};
/* 主界面3 -------------------------------------------------------------*/
enum{
Main3_NoneEvent = SystemEventStart(AppID_Main3),
Main3_ShowEvent,
Main3_ShowGifEvent,
Main3_MaxEvent
};
/* 主界面4 -------------------------------------------------------------*/
enum{
Main4_NoneEvent = SystemEventStart(AppID_Main4),
Main4_ShowEvent,
Main4_ShowGifEvent,
Main4_MaxEvent
};
/* GIF_TIMER -----------------------------------------------------------*/
enum{
Timer_NoneEvent = SystemEventStart(AppID_Timer),
Timer_GifEvent,
Timer_MaxEvent
};
event.c文件
/* 事件运行 */
static uint32_t AppEventArray[MaxEventAmount] = {
System_NoneEvent,System_NoneEvent,System_NoneEvent,System_NoneEvent,System_NoneEvent};
uint32_t AppIDChoose;
uint16_t MenuChoose = UiID_None;
static int readEventIndex = 0;
static int writeEventIndex= 0;
/*******************************************************************************
* fuction APP_GetFirstEvent
* brief 获取事件
* param 无
* return 事件标识
*******************************************************************************/
static uint32_t APP_GetFirstEvent(void)
{
uint32_t event = AppEventArray[readEventIndex];
if(event==System_NoneEvent)
{
readEventIndex++;
readEventIndex%=MaxEventAmount;
}
return event;
}
/*******************************************************************************
* fuction APP_SetEvent
* brief 发事件
* param event:事件标识
* return 无
*******************************************************************************/
void APP_SetEvent(uint32_t event)
{
//AppEventArray|=event;
AppEventArray[writeEventIndex]=event;
writeEventIndex++;
writeEventIndex%=MaxEventAmount;
}
/*******************************************************************************
* fuction APP_ClearEvent
* brief 清除事件
* param event:事件标识
* return 无
*******************************************************************************/
void APP_ClearEvent(uint32_t event)
{
int index;
if(AppEventArray[readEventIndex]==event)
{
AppEventArray[readEventIndex] = System_NoneEvent;
readEventIndex++;
readEventIndex%=MaxEventAmount;
}
else
{
for(index=0;index<MaxEventAmount;index++)
{
if(AppEventArray[index]==event)
AppEventArray[index] = System_NoneEvent;
}
}
//AppEventArray &= (~event);
}
前面已经将框架的准备工作做好了,接下来就是搭建框架!
/*******************************************************************************
* fuction AppEventSystem
* brief 系统跑起来前的做好准备的事件
* param event:事件标识
* return 当前事件
*******************************************************************************/
uint32_t AppEventSystem(uint32_t event)
{
uint32_t RetainEvent=0;
if(event==System_InitEvent)
{
/* 这里加上开始之前的准备 */
APP_SetEvent(Main1_ShowEvent);
RetainEvent=event;
MenuChoose=UiID_None;
}
return RetainEvent;
}
/*******************************************************************************
* fuction AppEventMain1
* brief 显示主界面1事件
* param event:事件标识
* return 当前事件
*******************************************************************************/
uint32_t AppEventMain1(uint32_t event)
{
uint32_t RetainEvent=0;
if(event==Main1_ShowEvent)
{
StopAppGifTimer();
/* 这里加上显示静态界面 */
StartAppGifTimer(AppIDChoose,t_time_GIF,Main1_ShowGifEvent,1);
RetainEvent=event;
ClearGifCnt();
MenuChoose=UiID_Main1;
}
if(event==Main1_ShowGifEvent)
{
/* 这里加上显示动态界面 */
RetainEvent=event;
MenuChoose=UiID_Main1;
}
return RetainEvent;
}
/*******************************************************************************
* fuction AppEventMain2
* brief 显示主界面2事件
* param event:事件标识
* return 当前事件
*******************************************************************************/
uint32_t AppEventMain2(uint32_t event)
{
uint32_t RetainEvent=0;
if(event==Main2_ShowEvent)
{
StopAppGifTimer();
/* 这里加上显示静态界面 */
StartAppGifTimer(AppIDChoose,t_time_GIF,Main2_ShowGifEvent,1);
RetainEvent=event;
ClearGifCnt();
MenuChoose=UiID_Main2;
}
if(event==Main2_ShowGifEvent)
{
/* 这里加上显示动态界面 */
RetainEvent=event;
MenuChoose=UiID_Main2;
}
return RetainEvent;
}
/*******************************************************************************
* fuction AppEventMain3
* brief 显示主界面3事件
* param event:事件标识
* return 当前事件
*******************************************************************************/
uint32_t AppEventMain3(uint32_t event)
{
uint32_t RetainEvent=0;
if(event==Main3_ShowEvent)
{
StopAppGifTimer();
/* 这里加上显示静态界面 */
StartAppGifTimer(AppIDChoose,t_time_GIF,Main3_ShowGifEvent,1);
RetainEvent=event;
ClearGifCnt();
MenuChoose=UiID_Main3;
}
if(event==Main3_ShowGifEvent)
{
/* 这里加上显示动态界面 */
RetainEvent=event;
MenuChoose=UiID_Main3;
}
return RetainEvent;
}
/*******************************************************************************
* fuction AppEventMain4
* brief 显示主界面4事件
* param event:事件标识
* return 当前事件
*******************************************************************************/
uint32_t AppEventMain4(uint32_t event)
{
uint32_t RetainEvent=0;
if(event==Main4_ShowEvent)
{
StopAppGifTimer();
/* 这里加上显示静态界面 */
StartAppGifTimer(AppIDChoose,t_time_GIF,Main4_ShowGifEvent,1);
RetainEvent=event;
ClearGifCnt();
MenuChoose=UiID_Main4;
}
if(event==Main4_ShowGifEvent)
{
/* 这里加上显示动态界面 */
RetainEvent=event;
MenuChoose=UiID_Main4;
}
return RetainEvent;
}
/*******************************************************************************
* fuction AppEventTimer
* brief 显示任意界面内部的包含的动态图片
* param event:事件标识
* return 当前事件
*******************************************************************************/
uint32_t AppEventTimer(uint32_t event)
{
uint32_t RetainEvent=0;
if(event==Timer_GifEvent)
{
app_gif_timer_evt();
RetainEvent=event;
}
return RetainEvent;
}
/*******************************************************************************
* fuction AppEventMainLoop
* brief 事件循环,扔到主循环中即可
* param 无
* return 无
*******************************************************************************/
void AppEventMainLoop(void)
{
uint32_t RetainEvent=0;
uint32_t GetEvent = APP_GetFirstEvent();/* 开始事件 */
if(GetEvent!=0)
{
AppIDChoose = SystemEventMask(GetEvent);
if(AppID_System == AppIDChoose){
//System
RetainEvent = AppEventSystem(GetEvent);
}else if(AppID_Main1 == AppIDChoose){
//Main1
RetainEvent = AppEventMain1(GetEvent);
}else if(AppID_Main2 == AppIDChoose){
//Main2
RetainEvent = AppEventMain2(GetEvent);
}else if(AppID_Main3 == AppIDChoose){
//Main3
RetainEvent = AppEventMain3(GetEvent);
}else if(AppID_Main4 == AppIDChoose){
//Main4
RetainEvent = AppEventMain4(GetEvent);
}else if(AppID_Timer == AppIDChoose){
//GIF_timer
RetainEvent = AppEventTimer(GetEvent);
}
APP_ClearEvent(RetainEvent);
}
}
/*******************************************************************************
* fuction AppKeyMianLoop
* brief 按键循环,扔到主循环中即可
* param 无
* return 无
*******************************************************************************/
void AppKeyMianLoop(void)
{
if(KeyPressFlag)//中断里面,按键按下就置一
{
if(SystemFlag)//系统运行标志位
{
APP_SetEvent(System_InitEvent);
AppKeyClearEvent(KeyPressFlag);
if(UiID_Main1==MenuChoose)
APP_SetEvent(Main2_ShowEvent);
else if(UiID_Main2==MenuChoose)
APP_SetEvent(Main3_ShowEvent);
else if(UiID_Main3==MenuChoose)
APP_SetEvent(Main4_ShowEvent);
else if(UiID_Main4==MenuChoose)
APP_SetEvent(Main1_ShowEvent);
}
AppKeyClearEvent(KeyPressFlag);
}
}