18回答

0收藏

基于亮点STM32开源板\UCOS\UCGUI的实用工程开发记录

 

#开源分享 #开源分享 11325 人阅读 | 18 人回复 | 2013-04-10

/******************************简要介绍*************************************/
/*亮点嵌入式 版本2.1                                                   */
/*111111111111111111111111亮点嵌入式联系方式111111111111111111111111111111111
  交流论坛:https://www.cirmall.com/bp
  亮点博客:http://blog.sina.com.cn/u/2630123921
  淘宝:http://brightpoint.taobao.com/  
  QQ:   753096528
  手机:15881167090
************************************************************************/      

/*实验30 基于UCGUI及UCOS的液晶显示实验
包括基于挂起与回复、中断处理、循环缓冲数据采集处理实验 UCOS部分第2个实验
  
  需求说明:
        1.远程采集终端12位AD采集7路模拟量,每500毫秒左右将数据通过串口下面的格式送本机
  0xFA 0xFB D7H D7L D6H D6L D5H D5L D4H D4L D3H D3L D2H D2L D1H D1L 0xFE 0xFE
  D7H表示路7的高8位,D7L表示路7的低8位,D7H的高4位全为0。   
  2.远程采集终端具有过流保护功能,在发生过流的时候,通过串口发送以下数据格式到本机
  0xFA 0xF4 TYPE 0xFE 0xFE
  保护解除后再发一组数据
  其中,TYPE的位0表示灯丝过流、位1表示收集极过流、位2表示螺旋线过流.高有效。
  因为是异常,所以什么时候会接到这组数据不能确定
  3.数据接收后,将电压值显示在屏幕上。发生过流,
  当灯丝过流点亮灯LED1,收集集过流点亮灯LED2,螺旋线过流点亮灯LED3
  分析:因为数据长度不能确定,所以不采能用实验24的方法
    考虑采用循环缓冲区来   
  建立一个100个字节的缓冲,用P1指示下一个接收的位置,P2指示当前需要提取数据的位置
  如  01 02 03 04 空 空 空
   P2    P1
   如果P1==P2则数据都已经处理
  
  解决方案:采用UCOS多任务机制和循环缓冲,建立以下任务:
  1.串口中断函数向缓冲区填充接收到的数据
  2.数据处理任务分析缓冲区,根据缓冲区中的数据判断接收到的数据的类型,处理完毕,发消息给显示任务来更新显示
  显示任务负责更新显示,包括屏幕和LED
  3.测试的时候采用串口调试助手,以500毫秒周期发送数据包,严格于项目要求的500毫秒,将取得的数据送回,接收到
  过流保护信息包时查看LED的亮灭
  4.显示部分扩充为采用UCGUI来实现界面

*/
// 特殊说明:本实验用于具体工程项目中
#include "bp_config.h"
#include "interface.h"
static  OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE];
static  OS_STK App_TaskDispStk[APP_TASK_DISP_STK_SIZE];
static  OS_STK App_TaskProcStk[APP_TASK_PROC_STK_SIZE];
static  OS_STK App_TaskTouchStk[APP_TASK_TOUCH_STK_SIZE];
static  OS_STK App_TaskTestStk[APP_TASK_TEST_STK_SIZE];

//static  void App_TaskCreate(void);
static  void  App_TaskStart(void *p_arg);
static  void  App_TaskDisp(void *p_arg);
static  void  App_TaskProc(void *p_arg);
static  void  App_TaskTouch(void *p_arg);//触摸识别任务
static  void  App_TaskTest(void *p_arg);
u8 USART1_BUF[RECEBUFSIZE]; //缓冲0和缓冲1
u8 * BUFEXCEED;
u8 * pput;//正在接收的缓冲区,第一次为USART1_BUF[0]
u8 * pget;//正在处理的缓冲区,第一次为USART1_BUF[1]
u16 CJDY[7];
u8 TYPE;//位0表示灯丝过流、位1表示收集极过流、位2表示螺旋线过流.高有效、位3位1表示需更新电压显示 为0表示需更新LED
#define GETDSGL 0x01
#define GETSJJGL 0x02
#define GETLXXGL 0x04
#define DISPTYPE 0x08
#define ISEMPTY pput==pget
//ucgui
int TouchX;
int TouchY;
OS_EVENT  *MyEventSem;
u8 DMARECE=0;   //0 表示串口接收DMA中断未发生,即从上次接收到一组数据然后处理后,未接收完一组数据
                     //1 表示串口DMA中断刚发生,数据等待处理

int main(void)
{               
INT8U  os_err;
pput=USART1_BUF;
pget=USART1_BUF;
BUFEXCEED=USART1_BUF+RECEBUFSIZE;
bpboard_init();//初始化硬件 增加执行屏幕位置校准
   //bp_selfcheck(1);
GUI_Init();
OSInit(); //初始化UCOS
    GUI_SetBkColor(GUI_WHITE);//设置背景颜色为白色
GUI_FillRect(0,0,480,272);//清屏
os_err = OSTaskCreate((void (*)(void *)) App_TaskStart,  // 创建启动任务
                          (void          * ) 0,     
                          (OS_STK        * )&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],    //堆栈地址
                          (INT8U           ) APP_TASK_START_PRIO); //优先级3,最高
if (OS_ERR_NONE!=os_err)
{
  beep_run(100);
  printf("err OSTaskCreate prio:%d result:%d\r\n",APP_TASK_START_PRIO,os_err);
}
os_err = OSTaskCreate((void (*)(void *)) App_TaskTouch,  // 创建触摸屏检测任务
                          (void          * ) 0,     
                          (OS_STK        * )&App_TaskTouchStk[APP_TASK_TOUCH_STK_SIZE - 1],    //堆栈地址
                          (INT8U           ) APP_TASK_TOUCH_PRIO); //优先级4
if (OS_ERR_NONE!=os_err)
{
  beep_run(100);
  printf("err OSTaskCreate prio:%d result:%d\r\n",APP_TASK_TOUCH_PRIO,os_err);
}
os_err = OSTaskCreate((void (*)(void *)) App_TaskDisp,  /* Create the start task.                               */
                          (void          * ) 0,
                          (OS_STK        * )&App_TaskDispStk[APP_TASK_DISP_STK_SIZE - 1],
                          (INT8U           ) APP_TASK_DISP_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskProc,  /* Create the start task.                               */
                          (void          * ) 0,
                          (OS_STK        * )&App_TaskProcStk[APP_TASK_PROC_STK_SIZE - 1],
                          (INT8U           ) APP_TASK_PROC_PRIO);
os_err = OSTaskCreate((void (*)(void *)) App_TaskTest,                              
                          (void          * ) 0,
                          (OS_STK        * )&App_TaskTestStk[APP_TASK_TEST_STK_SIZE - 1],
                          (INT8U           ) APP_TASK_TEST_PRIO);   

OSStart();  
return(0);
}
//任务App_TaskStart启动SysTick定时器,然后创建信号量,等待信号量以阻塞自己
static  void  App_TaskStart(void *p_arg)
{
    if(ISDEBUG) printf("begin to start systick!\r\n");
OS_CPU_SysTickInit();  //启动SysTick定时器,该定时器每次中断进入操作系统服务程序                                          
OSTaskSuspend(OS_PRIO_SELF);//将自己挂起
}
static  void  App_TaskDisp(void *p_arg) //显示任务
{

INT8U i;
//INT8U i;
//OS_SEM_DATA mySemData;
if(TFT_SUPPORT)
   {;}
else
  {printf("disp task suspend self!");}
OSTaskSuspend(OS_PRIO_SELF);
while(1)
{
  if (TYPE&DISPTYPE)//更新电压显示
  {
    if(TFT_SUPPORT)
   {
   
     SetMainwindowDispValue(CJDY);
   }
   else
   {
     printf("%d,%d,%d,%d,%d,%d,%d ",\
     CJDY[0],CJDY[1],CJDY[2],CJDY[3],CJDY[4],CJDY[5],CJDY[6]);
   }
  }   
  else
  {
   USART1->DR =TYPE;//printf("%x",TYPE);
   if (TYPE&GETDSGL) led_on1;
      else led_off1;
   if (TYPE&GETSJJGL) led_on2;
   else led_off2;
   if (TYPE&GETLXXGL) led_on3;
   else led_off3;  
  }   
  OSTaskSuspend(OS_PRIO_SELF);//处理完成挂起自己
}
}

static  void  App_TaskProc(void *p_arg)  //缓冲区处理任务
{
INT8U err;
u16 * p;
while(1)
{
  if (ISEMPTY)
   OSTaskSuspend(OS_PRIO_SELF); //无需处理,挂起自己,释放CPU
  else
  {
   
   while ((*pget!=0xFA)&&(pget!=pput))
   {
    pget++;
    if (pget==BUFEXCEED)pget=USART1_BUF;//移动到最后面
     
   }
   if (ISEMPTY)
   {
    OSTaskSuspend(OS_PRIO_SELF); //无需处理,挂起自己,释放CPU
    continue;
   }
   pget++;
   if(pget==BUFEXCEED)pget=USART1_BUF;
   if (*pget==0xFB) //采集到一组电压
   {
    pget++;
    if(pget==BUFEXCEED)pget=USART1_BUF;
    p=CJDY;
    while(*pget!=0xFE)
    {
     *p=*pget++;
     if(pget==BUFEXCEED)pget=USART1_BUF;
     *p=(*p)<<8;//高8位
     *p++|=*pget++;//低8位
     if(pget==BUFEXCEED)pget=USART1_BUF;
    }
    TYPE=*pget|DISPTYPE;
    pget++;
    if(pget==BUFEXCEED)pget=USART1_BUF;
    pget++;
    if(pget==BUFEXCEED)pget=USART1_BUF;
    if (pget>=BUFEXCEED)//移动到最后面
     pget=USART1_BUF;  
     OSTaskResume(APP_TASK_DISP_PRIO); //恢复显示程序
   }
   if (*pget==0xF4) //采集到保护状态
   {   
    pget++;
    if(pget==BUFEXCEED)pget=USART1_BUF;
    TYPE=*pget&~DISPTYPE;
    pget++;
    if(pget==BUFEXCEED)pget=USART1_BUF;
    pget++;
    if(pget==BUFEXCEED)pget=USART1_BUF;
    OSTaskResume(APP_TASK_DISP_PRIO); //恢复显示程序
    }
      
  }
  OSTaskSuspend(OS_PRIO_SELF);//处理完成,挂起自己,释放CPU
}
}
static  void  App_TaskTouch(void *p_arg)
{
//OSTimeDly(100);
    while (1)
    {
        //RA8875_WAITSTATUS();
     //if(ISDEBUG)  printf("task touch!\r\n");
  tft_gettouchpoint(&TouchX,&TouchY);
        GUI_TOUCH_Exec();
  clear_TP_interrupt();  //清除RA8875中断标志
        OSTimeDly(10);
    }
}
static  void  App_TaskTest(void *p_arg)
{
    BP_UCGUI_Task();

}

嵌入式,ucos,FPGA系统书籍作者
分享到:
回复

使用道具 举报

回答|共 18 个

倒序浏览

沙发

laoliang-67665

发表于 2013-4-10 12:45:06 | 只看该作者

UCGUI接口在此文件
/主窗口
/*********************************************************************
*
*       static data
*
**********************************************************************
*/

#define GUI_ID_DS_DY   GUI_ID_USER+100+1
#define GUI_ID_DS_DL   GUI_ID_USER+100+2
#define GUI_ID_BUTTON_DS   GUI_ID_USER+100+3
#define GUI_ID_SJ_DY   GUI_ID_USER+100+4
#define GUI_ID_SJ_DL   GUI_ID_USER+100+5
#define GUI_ID_BUTTON_SJ   GUI_ID_USER+100+6
#define GUI_ID_LX_DY   GUI_ID_USER+100+7
#define GUI_ID_LX_DL   GUI_ID_USER+100+8
#define GUI_ID_BUTTON_LX   GUI_ID_USER+100+9
#define GUI_ID_KZ_DY   GUI_ID_USER+100+10
#define GUI_ID_BUTTON_KZ   GUI_ID_USER+100+11
#define GUI_ID_BUTTON_KZ_FS   GUI_ID_USER+100+12
#define GUI_ID_BUTTON_GL   GUI_ID_USER+100+13
#define GUI_ID_EDIT_GL   GUI_ID_USER+100+14


/*********************************************************************
*
*       Dialog resource
*
*                主窗口,为显示的主界面
*/

static const GUI_WIDGET_CREATE_INFO _MainDialogCreate[] = {
    { FRAMEWIN_CreateIndirect,  "Caption",           0,                       0,  0,  420,272,FRAMEWIN_CF_MOVEABLE,0},
    { CHECKBOX_CreateIndirect,  "灯丝",                GUI_ID_CHECK0,           12, 21, 49, 17, 0,0},
    { CHECKBOX_CreateIndirect,  "过流",                GUI_ID_CHECK1,           63, 20, 62, 19, 0,0},
    { TEXT_CreateIndirect,      "电压",                GUI_ID_TEXT1,            10, 49, 39, 18, 0,0},
    { TEXT_CreateIndirect,      "电流",                GUI_ID_TEXT2,            8,  82, 39, 18, 0,0},
    { EDIT_CreateIndirect,      "1.2",               GUI_ID_DS_DY,            45, 42, 80, 25, 0,0},
    { EDIT_CreateIndirect,       NULL,               GUI_ID_DS_DL,            45, 75, 80, 25, 0,0},
    { BUTTON_CreateIndirect,    "打开",                GUI_ID_BUTTON_DS,        45, 104,80, 25, 0,0},
    { EDIT_CreateIndirect,       NULL,               GUI_ID_SJ_DY,            183,42, 80, 25, 0,0},
    { EDIT_CreateIndirect,       NULL,               GUI_ID_SJ_DL,            183,75, 80, 25, 0,0},
    { BUTTON_CreateIndirect,    "打开",                GUI_ID_BUTTON_SJ,        183,104,80, 25, 0,0},
    { EDIT_CreateIndirect,       NULL,               GUI_ID_LX_DY,            323,42, 80, 25, 0,0},
    { EDIT_CreateIndirect,       NULL,               GUI_ID_LX_DL,            323,75, 80, 25, 0,0},
    { BUTTON_CreateIndirect,    "打开",                GUI_ID_BUTTON_LX,        323,104,80, 25, 0,0},
    { TEXT_CreateIndirect,      "电压",                GUI_ID_TEXT1,            10, 179,37, 18, 0,0},
    { EDIT_CreateIndirect,       NULL,               GUI_ID_KZ_DY,            47, 172,80, 25, 0,0},
    { BUTTON_CreateIndirect,    "打开",                GUI_ID_BUTTON_KZ,        133,172,80, 25, 0,0},
    { BUTTON_CreateIndirect,    "发射",                GUI_ID_BUTTON_KZ_FS,     229,172,80, 25, 0,0},
    { BUTTON_CreateIndirect,    "功率设置",              GUI_ID_BUTTON_GL,        133,208,80, 25, 0,0},
    { TEXT_CreateIndirect,      "功率",                GUI_ID_TEXT5,            10, 215,37, 18, 0,0},
    { EDIT_CreateIndirect,      "3.12",              GUI_ID_EDIT_GL,          47, 208,80, 25, 0,0},
    { TEXT_CreateIndirect,      "电压",                GUI_ID_TEXT1,            146,49, 37, 18, 0,0},
    { TEXT_CreateIndirect,      "电流",                GUI_ID_TEXT2,            148,82, 35, 18, 0,0},
    { TEXT_CreateIndirect,      "电压",                GUI_ID_TEXT1,            283,49, 39, 18, 0,0},
    { TEXT_CreateIndirect,      "电流",                GUI_ID_TEXT2,            283,82, 39, 18, 0,0},
    { CHECKBOX_CreateIndirect,  "收集",                GUI_ID_CHECK2,           148,21, 49, 17, 0,0},
    { CHECKBOX_CreateIndirect,  "过流",                GUI_ID_CHECK3,           203,21, 60, 19, 0,0},
    { CHECKBOX_CreateIndirect,  "螺旋",                GUI_ID_CHECK4,           283,22, 49, 17, 0,0},
    { CHECKBOX_CreateIndirect,  "过流",                GUI_ID_CHECK5,           337,22, 66, 19, 0,0},
    { CHECKBOX_CreateIndirect,  "控制",                GUI_ID_CHECK6,           10, 147,49, 17, 0,0},
    { CHECKBOX_CreateIndirect,  "过流",                GUI_ID_CHECK7,           62, 147,63, 19, 0,0}
};

/*****************************************************************
**      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_PAINT
*****************************************************************/

void MainPaintDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;

}
/*****************************************************************
**      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_INIT_DIALOG
*****************************************************************/

void MainInitDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
        //FRAMEWIN_SetFont(hWin,&GUI_FontHZ_SimSun_16);
    FRAMEWIN_SetClientColor(hWin,0xc0c0c0);
    FRAMEWIN_SetTextColor(hWin,0x000000);
    FRAMEWIN_SetTitleVis(hWin,0);
    //
    //GUI_ID_CHECK0
    //

    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK0),"灯丝");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK0),0xc0c0c0);
    //
    //GUI_ID_CHECK1
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK1),"过流");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK1),0xc0c0c0);
    //
    //GUI_ID_TEXT1
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1),0xc0c0c0);
    //
    //GUI_ID_TEXT2
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2),0xc0c0c0);
    //
    //GUI_ID_BUTTON_DS
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON_DS),BUTTON_CI_UNPRESSED,0xc0c0c0);
    //
    //GUI_ID_BUTTON_SJ
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON_SJ),BUTTON_CI_UNPRESSED,0xc0c0c0);
    //
    //GUI_ID_BUTTON_LX
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON_LX),BUTTON_CI_UNPRESSED,0xc0c0c0);
    //
    //GUI_ID_TEXT1
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1),0xc0c0c0);

    //
    //GUI_ID_BUTTON_KZ
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON_KZ),BUTTON_CI_UNPRESSED,0xc0c0c0);
    //
    //GUI_ID_BUTTON_KZ_FS
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON_KZ_FS),BUTTON_CI_UNPRESSED,0xc0c0c0);
    WM_DisableWindow(WM_GetDialogItem(hWin,GUI_ID_BUTTON_KZ_FS));
    //
    //GUI_ID_BUTTON_GL
    //
    BUTTON_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_BUTTON_GL),BUTTON_CI_UNPRESSED,0xc0c0c0);
    //
    //GUI_ID_TEXT5
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT5),0xc0c0c0);
    //
    //GUI_ID_EDIT_GL
    //
    EDIT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_EDIT_GL),0,0xdf967a);
    //
    //GUI_ID_TEXT1
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1),0xc0c0c0);
    //
    //GUI_ID_TEXT2
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2),0xc0c0c0);
    //
    //GUI_ID_TEXT1
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT1),0xc0c0c0);
    //
    //GUI_ID_TEXT2
    //
    TEXT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_TEXT2),0xc0c0c0);
    //
    //GUI_ID_CHECK2
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK2),"收集");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK2),0xc0c0c0);
    //
    //GUI_ID_CHECK3
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK3),"过流");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK3),0xc0c0c0);

    //
    //GUI_ID_CHECK4
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK4),"螺旋");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK4),0xc0c0c0);
//                CHECKBOX_SetFont(WM_GetDialogItem(hWin,GUI_ID_CHECK4),&GUI_FontHZ_SimSun_16);
    //
    //GUI_ID_CHECK5
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK5),"过流");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK5),0xc0c0c0);
    //
    //GUI_ID_CHECK6
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK6),"控制");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK6),0xc0c0c0);
    //
    //GUI_ID_CHECK7
    //
    CHECKBOX_SetText(WM_GetDialogItem(hWin,GUI_ID_CHECK7),"过流");
    CHECKBOX_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_CHECK7),0xc0c0c0);

}




/*********************************************************************
*
*       主窗口回调函数 Dialog callback routine
*/
static void _MainCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            MainPaintDialog(pMsg);
            break;
        case WM_INIT_DIALOG:
            MainInitDialog(pMsg);
            break;
        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (Id)
            {

                case GUI_ID_BUTTON_DS:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnMainDSClicked(pMsg);
                            break;
                    }
                    break;
                case GUI_ID_BUTTON_SJ:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnMainSJClicked(pMsg);
                            break;
                    }
                    break;
                case GUI_ID_BUTTON_LX:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnMainLXClicked(pMsg);
                            break;
                    }
                    break;
                case GUI_ID_BUTTON_KZ:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnMainKZClicked(pMsg);
                            break;
                    }
                    break;
                case GUI_ID_BUTTON_KZ_FS:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnMainFSClicked(pMsg);
                            break;
                    }
                    break;
                case GUI_ID_BUTTON_GL:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnMainPowerClicked(pMsg);
                            break;
                    }
                    break;

            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}

void OnMainDSClicked(WM_MESSAGE * pMsg)
{}
void OnMainSJClicked(WM_MESSAGE * pMsg)
{}
void OnMainLXClicked(WM_MESSAGE * pMsg)
{}
void OnMainKZClicked(WM_MESSAGE * pMsg)
{}
void OnMainFSClicked(WM_MESSAGE * pMsg)
{}
void OnMainPowerClicked(WM_MESSAGE * pMsg)
{
}
#define refvalue 3.3
void SetMainwindowDispValue(u16 * value)
{
        char buf[8];
        sprintf(buf, "%.2f",*value++*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_DS_DY),buf);
        sprintf(buf, "%.2f",*value++*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_DS_DL),buf);
        sprintf(buf, "%.2f",*value++*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_SJ_DY),buf);
        sprintf(buf, "%.2f",*value++*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_SJ_DL),buf);
        sprintf(buf, "%.2f",*value++*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_LX_DY),buf);
        sprintf(buf, "%.2f",*value++*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_LX_DL),buf);
        sprintf(buf, "%.2f",*value*refvalue/4095);
        EDIT_SetText(WM_GetDialogItem(_hDialogMain,GUI_ID_KZ_DY),buf);
               

}
/*********************end of main window**********************/


/*********************************************************************
*
*       控制窗口 static data
*
**********************************************************************
*/

#define GUI_ID_B_DISPALL   GUI_ID_USER+201
#define GUI_ID_B_POWER   GUI_ID_USER+202
#define GUI_ID_B_CLOSE   GUI_ID_USER+203


/*********************************************************************
*
*       Dialog resource
*
* This table conatins the info required to create the dialog.
* It has been created by ucGUIbuilder.
*/

static const GUI_WIDGET_CREATE_INFO _ControlDialogCreate[] = {
    { FRAMEWIN_CreateIndirect,  "CONTROL",           0,                       0,  0,  60, 272,FRAMEWIN_CF_MOVEABLE,0},
    { BUTTON_CreateIndirect,    "全部",                GUI_ID_B_DISPALL,        8,  24, 38, 38, 0,0},
    { BUTTON_CreateIndirect,    "功率",                GUI_ID_B_POWER,          8,  112,38, 38, 0,0},
    { BUTTON_CreateIndirect,    "关机",                GUI_ID_B_CLOSE,          8,  202,38, 38, 0,0}
};



/*****************************************************************
**      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_PAINT
*****************************************************************/

void ControlPaintDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;

}



/*****************************************************************
**      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_INIT_DIALOG
*****************************************************************/

void ControlInitDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
    FRAMEWIN_SetTitleVis(hWin,0);
    //
    //GUI_ID_B_DISPALL
    //
    BUTTON_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_B_DISPALL),BUTTON_CI_UNPRESSED,0x2a2aa5);
    //
    //GUI_ID_B_POWER
    //
    BUTTON_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_B_POWER),BUTTON_CI_UNPRESSED,0x2a2aa5);
    //
    //GUI_ID_B_CLOSE
    //
    BUTTON_SetTextColor(WM_GetDialogItem(hWin,GUI_ID_B_CLOSE),BUTTON_CI_UNPRESSED,0x2a2aa5);

}




/*********************************************************************
*
*       Dialog callback routine
*/
static void _ControlCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            ControlPaintDialog(pMsg);
            break;
        case WM_INIT_DIALOG:
            ControlInitDialog(pMsg);
            break;
        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (Id)
            {
                case GUI_ID_B_POWER:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        ON_DISPPOWER_CLICKED();
                    break;
                case GUI_ID_B_DISPALL :
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        ON_DISPALL_CLICKED();
                    break;
                                
            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}

void ON_DISPPOWER_CLICKED()
{
    WM_ShowWindow(_hDialogPower);
        WM_HideWindow(_hDialogMain);

}
void ON_DISPALL_CLICKED()
{
    WM_ShowWindow(_hDialogMain);
        WM_HideWindow(_hDialogPower);

}


/*********************************************************************
*
*       static data
*
**********************************************************************
*/

#define GUI_ID_BUTTON_GLBIG   GUI_ID_USER+206
#define GUI_ID_EDIT_GLBIG   GUI_ID_USER+207
#define  GUI_ID_TEXT_GLBIG  GUI_ID_USER+208

/*********************************************************************
*
*       功率窗口
*
* This table conatins the info required to create the dialog.
* It has been created by ucGUIbuilder.
*/

static const GUI_WIDGET_CREATE_INFO _PowerDialogCreate[] = {
    { FRAMEWIN_CreateIndirect,  "",           0,        0,  0,  420,272,FRAMEWIN_CF_MOVEABLE,0},
    { BUTTON_CreateIndirect,    "功率设置",              GUI_ID_BUTTON_GL,        299,87, 92, 86, 0,0},
    { TEXT_CreateIndirect,      "功率",                GUI_ID_TEXT5,            15, 32, 83, 44, 0,0},
    { EDIT_CreateIndirect,      "2.51",              GUI_ID_EDIT_GL,          15, 87, 258,86, 0,0}
};



/*****************************************************************
**      FunctionName:void PaintDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_PAINT
*****************************************************************/

void PowerPaintDialog(WM_MESSAGE * pMsg)
{
    //WM_HWIN hWin = pMsg->hWin;
        OnMainPowerClicked(pMsg);
}



/*****************************************************************
**      FunctionName:void InitDialog(WM_MESSAGE * pMsg)
**      Function: to initialize the Dialog items
**                                                      
**      call this function in _cbCallback --> WM_INIT_DIALOG
*****************************************************************/

void PowerInitDialog(WM_MESSAGE * pMsg)
{
    WM_HWIN hWin = pMsg->hWin;
    //
    //FRAMEWIN
    //
    //
    //GUI_ID_TEXT5
    //
    //TEXT_SetFont(WM_GetDialogItem(hWin,GUI_ID_TEXTGLBIG),&GUI_FontD24x32);
    //
    //GUI_ID_EDIT_GL
    //
        FRAMEWIN_SetTitleVis(hWin,0);
    EDIT_SetBkColor(WM_GetDialogItem(hWin,GUI_ID_EDIT_GLBIG),0,0xdf967a);
     EDIT_SetFont(WM_GetDialogItem(hWin,GUI_ID_EDIT_GLBIG),&GUI_FontD60x80);

}




/*********************************************************************
*
*       Dialog callback routine
*/
static void _PowerCallback(WM_MESSAGE * pMsg)
{
    int NCode, Id;
    WM_HWIN hWin = pMsg->hWin;
    switch (pMsg->MsgId)
    {
        case WM_PAINT:
            PowerPaintDialog(pMsg);
            break;
        case WM_INIT_DIALOG:
            PowerInitDialog(pMsg);
            break;
        case WM_KEY:
            switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key)
            {
                case GUI_KEY_ESCAPE:
                    GUI_EndDialog(hWin, 1);
                    break;
                case GUI_KEY_ENTER:
                    GUI_EndDialog(hWin, 0);
                    break;
            }
            break;
        case WM_NOTIFY_PARENT:
            Id = WM_GetId(pMsg->hWinSrc);
            NCode = pMsg->Data.v;        
            switch (Id)
            {
                case GUI_ID_OK:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        GUI_EndDialog(hWin, 0);
                    break;
                case GUI_ID_CANCEL:
                    if(NCode==WM_NOTIFICATION_RELEASED)
                        GUI_EndDialog(hWin, 0);
                    break;
                case GUI_ID_BUTTON_GLBIG:
                    switch(NCode)
                    {
                        case WM_NOTIFICATION_CLICKED:
                            OnPowerSetClicked(pMsg);
                            break;
                    }
                    break;

            }
            break;
        default:
            WM_DefaultProc(pMsg);
    }
}
void OnPowerSetClicked(WM_MESSAGE * pMsg)
{
        ;
}

/*介绍窗口*/

/* Text shown in the intro dialog */
static const char * _apIntro[] = {
  "This application made by BrightPoint",
  "2012 for BrightPoint Stm32 Develop Board",
  "To start the applicationplease press the <Start> button...",
};

/* Resource for intro */
static const GUI_WIDGET_CREATE_INFO _aIntro[] = {
  { WINDOW_CreateIndirect,    "",             0,                    0,   0, LCD_XSIZE, LCD_YSIZE, 0},
  { BUTTON_CreateIndirect,    "Start",        GUI_ID_BUTTON0,     LCD_XSIZE/2-50, 200, 100, 20},
};
/*********************************************************************
*
*       _cbIntro
*
* Purpose:
*   Callback routine of intro dialog.
*/
static void _cbIntro(WM_MESSAGE * pMsg) {
  WM_HWIN hDlg;
  GUI_RECT Rect;
  int Id, i, ySizeText, yPos = 20;
  hDlg = pMsg->hWin;
  switch (pMsg->MsgId) {
  case WM_PAINT:
    WM_GetClientRect(&Rect);
    GUI_SetBkColor(GUI_WHITE);
    GUI_SetColor(GUI_BLACK);
    GUI_Clear();
    GUI_DrawBitmap(&bmnewlogo80, (Rect.x1 - bmnewlogo80.XSize) / 2, yPos);
    ySizeText = GUI_GetFontSizeY();
    yPos += bmnewlogo80.YSize + 30;
    for (i = 0; i < GUI_COUNTOF(_apIntro); i++) {
      GUI_DispStringHCenterAt(_apIntro, Rect.x1 / 2, yPos);
      yPos += ySizeText;
    }
    break;
  case WM_KEY:
    switch (((WM_KEY_INFO*)(pMsg->Data.p))->Key) {
    case GUI_KEY_ESCAPE:
    case GUI_KEY_ENTER:
      GUI_EndDialog(hDlg, 0);
      break;
    }
    break;
  case WM_NOTIFY_PARENT:
    if (pMsg->Data.v == WM_NOTIFICATION_RELEASED) {
      Id = WM_GetId(pMsg->hWinSrc);      /* Id of widget */
      if (Id == GUI_ID_BUTTON0) {
        GUI_EndDialog(hDlg, 1);
      }
    }
    break;
  default:
    WM_DefaultProc(pMsg);
  }
}



void BP_UCGUI_Task(void) {
   

  WM_HWIN hMainFrame, hClientWindow;
  GUI_RECT Rect;
  GUI_Init();  //GUI 初始化,最先被调用
  GUI_CURSOR_Show();  //GUI函数,显示游标  
  //GUI_SetFont(&GUI_FontHZ_SimSun_16); //设置字体
  /* Enable use of memory devices (if available) */
  #if GUI_SUPPORT_MEMDEV //使用内存设备
    WM_SetCreateFlags(WM_CF_MEMDEV);
    WM_EnableMemdev(WM_HBKWIN);
  #endif
  /* Enable redrawing mechanism for background window */
  WM_SetDesktopColor(GUI_BLACK); //设置背景颜色 黑 在GUI.H中定义
  /* Create and execute the intro dialog */
  //在背景之上,创建并执行第一个对话框
  GUI_ExecDialogBox(_aIntro, GUI_COUNTOF(_aIntro), _cbIntro, WM_HBKWIN, 0, 0);
  //GUI_ExecDialogBox(_MainDialogCreate, GUI_COUNTOF(_MainDialogCreate), _MainCallback, WM_HBKWIN, 0, 0);
  //按START之后,该窗口关闭
  //Showain();
  
  /* Create main frame window */
  /*创建主帧,480×272*/
  hMainFrame = FRAMEWIN_CreateEx(0, 0, LCD_XSIZE, LCD_YSIZE,
                                 WM_HBKWIN, WM_CF_SHOW, 0, 0, "", 0);
  FRAMEWIN_SetTextAlign(hMainFrame, GUI_TA_HCENTER);

  hClientWindow = WM_GetClientWindow(hMainFrame); /* 取得主帧窗口的客户窗句柄 */
  WM_GetClientRectEx(hClientWindow, &Rect);       /* 取得该客户窗的位置到Rect*/
  hClientWindow=WM_HBKWIN;
  
  _hDialogMain=
  GUI_CreateDialogBox(_MainDialogCreate, GUI_COUNTOF(_MainDialogCreate), _MainCallback, hClientWindow, 0, 0);
  _hDialogControl=
  GUI_CreateDialogBox(_ControlDialogCreate, GUI_COUNTOF(_ControlDialogCreate), _ControlCallback, hClientWindow, Rect.x1 - 60, 0);
  _hDialogPower=
  GUI_CreateDialogBox(_PowerDialogCreate, GUI_COUNTOF(_ControlDialogCreate), _PowerCallback, hClientWindow, 0, 0);
  //WM_ShowWindow(_hDialogMain);
  WM_HideWindow(_hDialogPower);
  while(1) {
    WM_Exec(); //这里开始消息循环
    GUI_X_WAIT_EVENT(); //这里相当于进行OSTimeDlyl(50)
  }
}
嵌入式,ucos,FPGA系统书籍作者
板凳

斑斑

发表于 2013-4-10 13:34:32 | 只看该作者

代码过长,建议用附件形式
地板

laoliang-67665

发表于 2013-4-10 13:36:52 | 只看该作者

本帖最后由 亮点 于 2013-4-10 13:43 编辑

正在解决问题:发送数据第一次没反应,要到第二次发送才反应第一次送的数据
void USART1_IRQHandler(void) //串口1中断服务程序
{

u8 currentget;
    OSIntEnter();
currentget=USART1->DR  ;
//USART1->DR =Res;
*pput++ = currentget;
if (pput==BUFEXCEED)//数组地址越界
  pput=USART1_BUF;
if ((lastget==0xFE)&&(currentget==0xFE))
  {OSTaskResume(APP_TASK_PROC_PRIO);} //如果接收到连续的FE则表示接收到一组有效的数据
lastget=currentget;
    OSIntExit();
}
使用 JLINK调试 ,断点设置在OSTaskResume(APP_TASK_PROC_PRIO);}
嵌入式,ucos,FPGA系统书籍作者
5#

laoliang-67665

发表于 2013-4-10 13:39:58 | 只看该作者

qindong4058 发表于 2013-4-10 13:34
代码过长,建议用附件形式

代码贴下来直接讨论,附近以后会发
嵌入式,ucos,FPGA系统书籍作者
6#

laoliang-67665

发表于 2013-4-10 14:05:09 | 只看该作者

经调试检查,串口每次检查到连续接收到FE FE后都会调用OSTaskResume(APP_TASK_PROC_PRO),之后处理任务会执行无误,然后唤醒显示任务,显示任务调用SetMainwindowDispValue(CJDY);但是要等到下次显示任务挂起后才显示前一次的值
嵌入式,ucos,FPGA系统书籍作者
7#

Lin_811

发表于 2013-4-10 14:17:36 | 只看该作者

太长了。看着费劲啊。。。
8#

laoliang-67665

发表于 2013-4-10 15:08:07 | 只看该作者

Lin丶1st.南 发表于 2013-4-10 14:17
太长了。看着费劲啊。。。

看着费尽是因为不想仔细看
嵌入式,ucos,FPGA系统书籍作者
9#

laoliang-67665

发表于 2013-4-10 15:36:00 | 只看该作者

亮点 发表于 2013-4-10 14:05
经调试检查,串口每次检查到连续接收到FE FE后都会调用OSTaskResume(APP_TASK_PROC_PRO),之后处理任务会执 ...

串口没问题,是处理有误,修改后的缓冲区处理任务
static  void  App_TaskProc(void *p_arg)         //缓冲区处理任务
{
        INT8U err;
        u16 * p;
        while(1)
        {
                if (ISEMPTY)
                {
                        OSTaskResume(APP_TASK_DISP_PRIO);
                        OSTaskSuspend(OS_PRIO_SELF); //无需处理,挂起自己,释放CPU
                }
                else
                {       
                       
                        while ((*pget!=0xFA)&&(pget!=pput))
                        {
                                pget++;
                                if (pget==BUFEXCEED)pget=USART1_BUF;//移动到最后面
                                       
                        }
                        if (ISEMPTY)
                        {
                                OSTaskResume(APP_TASK_DISP_PRIO);
                                OSTaskSuspend(OS_PRIO_SELF); //无需处理,挂起自己,释放CPU
                                continue;
                        }
                        pget++;
                        if(pget==BUFEXCEED)pget=USART1_BUF;
                        if (*pget==0xFB) //采集到一组电压
                        {
                                pget++;
                                if(pget==BUFEXCEED)pget=USART1_BUF;
                                p=CJDY;
                                while(*pget!=0xFE)
                                {
                                        *p=*pget++;
                                        if(pget==BUFEXCEED)pget=USART1_BUF;
                                        *p=(*p)<<8;//高8位
                                        *p++|=*pget++;//低8位
                                        if(pget==BUFEXCEED)pget=USART1_BUF;
                                }
                                TYPE=*pget|DISPTYPE;
                                pget++;
                                if(pget==BUFEXCEED)pget=USART1_BUF;
                                pget++;       
                                if(pget==BUFEXCEED)pget=USART1_BUF;
                                if (pget>=BUFEXCEED)//移动到最后面
                                        pget=USART1_BUF;
                                       
                                continue;                       
                                 //OSTaskResume(APP_TASK_DISP_PRIO); //恢复显示程序

                        }
                        if (*pget==0xF4) //采集到保护状态
                        {                               
                                pget++;
                                if(pget==BUFEXCEED)pget=USART1_BUF;
                                TYPE=*pget&~DISPTYPE;
                                pget++;
                                if(pget==BUFEXCEED)pget=USART1_BUF;
                                pget++;
                                if(pget==BUFEXCEED)pget=USART1_BUF;
                                continue;
                                //OSTaskResume(APP_TASK_DISP_PRIO); //恢复显示程序
                        }

                                        
                }
                //OSTaskSuspend(OS_PRIO_SELF);//处理完成,挂起自己,释放CPU
        }       
}
嵌入式,ucos,FPGA系统书籍作者
10#

laoliang-67665

发表于 2013-4-10 15:39:15 | 只看该作者

我觉得调用OSTaskResume(APP_TASK_DISP_PRIO);的时候,是不希望OS进行操作系统调度的,所以,可以在前面加上一个OSIntNesting++
后面加一个OSIntNesting--
嵌入式,ucos,FPGA系统书籍作者
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条