|

楼主 |
发表于 2018-6-13 14:39:43
|
显示全部楼层
/*
* GUI主任务
*/
void MainTask(void)
{
GUI_Init();
WM_SetCreateFlags(WM_CF_MEMDEV);
//WM_MULTIBUF_Enable(1);
/* 滑动使能 */
WM_MOTION_Enable(1);
/* 设置桌面窗口的回调函数,桌面窗口自动创建 */
WM_SetCallback(WM_HBKWIN, _cbBkWin);
WM_InvalidateWindow(WM_HBKWIN);
/*触摸校准*/
TOUCH_Calibration();
/* 绘制波形显示背景到存储设备 ***************************************************/
hGraphXYBk = GUI_MEMDEV_CreateFixed(0,
0,
210,
210,
GUI_MEMDEV_HASTRANS,
GUI_MEMDEV_APILIST_16,
GUICC_M565);
GUI_MEMDEV_Select(hGraphXYBk);
GRAPH_DrawBakFrame(0,0,209,209);
GUI_MEMDEV_Select(0);
// GUI_CURSOR_Show();
CreateStatusBar();
CreateNeutronMainI();
while(1)
{
GUI_Delay(5);
}
}
/*
*********************************************************************************************************
* 函数名: CreateNeutronMainI
* 功 能: 创建状态栏
* 形 参: 无
* 返回值: 无
*********************************************************************************************************
*/
void CreateNeutronMainI(void)
{
PARA Para;
PARA *pPara;
pPara = &Para;
pPara->Pos = 0;
/*设置滑动周期*/
WM_MOTION_SetDefaultPeriod(100);
GUI_AA_SetFactor(MAG);
GUI_AA_EnableHiRes();
/* 主界面1*/
hWinNeutronMain = WM_CreateWindowAsChild(0,
20,
480,
319,
WM_HBKWIN,
WM_CF_SHOW | WM_CF_MOTION_X ,
_cbMainWin,
sizeof(pPara));
WM_SetUserData(hWinNeutronMain, &pPara, sizeof(pPara));
}
/*
*********************************************************************************************************
* 函数名: _cbStatusWin
* 功 能: 状态栏回调函数
* 形 参: pMsg 窗口信息指针
* 返回值: 无
*********************************************************************************************************
*/
static void _cbMainWin(WM_MESSAGE * pMsg)
{
int i;
static double angle;
PARA * pPara;
PARA Para;
WM_MOTION_INFO Info;
WM_MOTION_INFO * pInfo;
pInfo = &Info;
pPara = &Para;
switch (pMsg->MsgId)
{
case WM_CREATE:
_InitMainI(pMsg);
break;
/* 定时器 */
case WM_TIMER:
WM_RestartTimer(pMsg->Data.v, 1000);
total_run_time ++; //实时测量运行时间加
if(graph_data.pIndex <41)
graph_data.pIndex++;
else
{
graph_data.maxData = 0;
for(i=1;i<graph_data.pIndex;i++)
{
graph_data.data[i-1] = graph_data.data;
if(graph_data.maxData <graph_data.data)//取40个数的最大数
graph_data.maxData = graph_data.data;
}
}
graph_data.data[graph_data.pIndex-1] = sin(angle)+1;
angle = angle+3.1415/80.0;
if(angle>2*3.1415)
angle = 3.1415/80.0;
if(graph_data.maxData <graph_data.data[graph_data.pIndex-1])
graph_data.maxData = graph_data.data[graph_data.pIndex-1]; //取最大数
/*最大值超过图形的%80或者小于40%刻度要进行变换*/
if((graph_data.maxData>(160*graph_data.pixelValue))||(graph_data.maxData<(80*graph_data.pixelValue)))
{
if(graph_data.maxData <10)//最小像素刻度0.0001,Y轴坐标值只能显示到小数点后3位
{
graph_data.pixelValue = graph_data.maxData/160.0;
if(fmod(graph_data.pixelValue,0.0001) != 0) //不是最小像素刻度的整数倍
graph_data.pixelValue = (graph_data.pixelValue/0.0001)*0.0001+0.0001; //确保是最小像素刻度0.0001的整数倍,保证刻度值的正确
}
else if(graph_data.maxData<100)//最小刻度0.0025,Y轴坐标值只能显示到小数点后2位
{
graph_data.pixelValue = graph_data.maxData/160.0;
if(fmod(graph_data.pixelValue,0.001) != 0) //不是最小像素刻度的整数倍
graph_data.pixelValue = (graph_data.pixelValue/0.001)*0.001+0.001; //确保是最小精度0.001的整数倍,保证刻度值的正确
}
else if(graph_data.maxData<1000)//最小刻度0.025,Y轴坐标值只能显示到小数点后1位
{
graph_data.pixelValue = graph_data.maxData/160.0;
if(fmod(graph_data.pixelValue,0.01) != 0) //不是最小刻度的整数倍
graph_data.pixelValue = (graph_data.pixelValue/0.01)*0.01+0.01; //确保是最小精度0.01的整数倍,保证刻度值的正确
}
else//最小刻度0.25,Y轴坐标值整数
{
graph_data.pixelValue = graph_data.maxData/160.0;
if(fmodl(graph_data.pixelValue,0.1) != 0) //不是最小刻度的整数倍
graph_data.pixelValue = (graph_data.pixelValue/0.01)*0.1+0.1; //确保是最小精度0.1的整数倍,保证刻度值的正确
}
}
for(i=0;i<graph_data.pIndex;i++)
{
graph_point_data.x = 30+i*5;
graph_point_data.y = 205-graph_data.data/graph_data.pixelValue;
}
WM_InvalidateWindow(pMsg->hWin);
break;
case WM_NOTIFY_PARENT:
break;
case WM_PAINT:
_PaintMainI(pMsg); //在此处把存储设备用函数GUI_MEMDEV_WriteAt 写进去
break;
case WM_MOTION:
WM_GetUserData(pMsg->hWin, &pPara, sizeof(pPara));
pInfo = (WM_MOTION_INFO *)pMsg->Data.p;
switch(pInfo->Cmd)
{
case WM_MOTION_INIT:
pInfo->Flags = WM_CF_MOTION_X | WM_MOTION_MANAGE_BY_WINDOW;
pInfo->SnapX = LCD_GetXSize(); //设置栅格大小
break;
case WM_MOTION_MOVE:
pPara->FinalMove = pInfo->FinalMove;
pPara->Pos += pInfo->dx;
/* 设置滑动到最左侧时的处理办法,超过一半就不可以再滑动了 */
if(pPara->Pos >= LCD_GetXSize()/2)
pPara->Pos = LCD_GetXSize()/2 - 1;
/* 设置滑动到最右侧时的处理办法,超过一半就不可以再滑动了 */
if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
pPara->Pos = -(LCD_GetXSize() + LCD_GetXSize()/2 - 1);
/*滑动松手后,会按照WM_MOTION_SetDefaultPeriod设置的时间减速并停止到最近的栅格*/
if(pPara->FinalMove)
{
/*if(pPara->Pos <= -(LCD_GetXSize() + LCD_GetXSize()/2))
{
s_ucIconSwitch = 2;
}
else if((pPara->Pos > -(LCD_GetXSize() + LCD_GetXSize()/2))&&(pPara->Pos <= -LCD_GetXSize()/2))
{
s_ucIconSwitch = 1;
}
else if(pPara->Pos > -LCD_GetXSize()/2)
{
s_ucIconSwitch = 0;
}*/
}
WM_MoveTo(pMsg->hWin, pPara->Pos, 20);
break;
case WM_MOTION_GETPOS:
pInfo->xPos = pPara->Pos;
break;
}
default:
WM_DefaultProc(pMsg);
}
}
|
|