📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* WIN32 PORT & LINUX PORT
* (c) Copyright 2004, Werner.Zimmermann@fht-esslingen.de
* All Rights Reserved
*
* EXAMPLE #0
* Used to study the scheduling behaviour of the WIN32 and LINUX port during development
*********************************************************************************************************
*/
#include "includes.h"
#include <windows.h>
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
TMQ *task1_tmq; // 任务1的任务消息队列(指针),
HWND hwnd ; //定义一个句柄
HDC hdc;
// GetMessage()等待消息时使用
extern TemiStatus TStatus; //终端状态全局变量
extern uint8 WinId; //当前窗体状态
extern uint8 debug; //调试开关
void *task1_tmq_buf[30]; // 任务1的任务消息队列存储区,
#define TASK_STK_SIZE 4069 // Stack size, in bytes
//#define SUSPEND_RESUME // Task 1 and 2 use suspend and resume for scheduling
// (if not defined: use time delays)
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TestTaskStk1[TASK_STK_SIZE]; // Task stacks
OS_STK TestTaskStk2[TASK_STK_SIZE];
OS_STK TestTaskStk3[TASK_STK_SIZE];
OS_STK TestTaskStk4[TASK_STK_SIZE];
OS_STK TestTaskStk6[TASK_STK_SIZE];
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void TestTask1(void *pdata); // The 3 tasks
void TestTask2(void *pdata);
void TestTask3(void *pdata);
void TestTask4(void *pdata);
void TestTask6(void *pdata);
void OurIsr1(void); // The interrupt service routine for IRQ 1
void validate()
{
WinId = 0;
debug = 0;
TStatus = 0;
}
//SetRect(&rc,x-4,y-4,x+72,y+24);
uint8 checkpoint(uint32 sx,uint32 sy)
{
if(((sx <= 472) && (sx >=396))
&&((sy >= 156) && (sy <= 184))) //left
return 0;
if(((sx <= 672) && (sx >=596))
&&((sy >= 159) && (sy <= 184))) //right
return 1;
if(((sx <= 572) && (sx >=496))
&&((sy >= 36) && (sy <= 64))) //measure
return 3;
if(((sx <= 572) && (sx >=496))
&&((sy >= 116) && (sy <= 144))) //up
return 4;
if(((sx <= 572) && (sx >=496))
&&((sy >= 156) && (sy <= 184))) //ok
return 5;
if(((sx <= 572) && (sx >=496))
&&((sy >= 196) && (sy <= 224))) //left
return 6;
else
return 9;
}
//窗口进程说明
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
//主函数
int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance
HINSTANCE hPrevInstance, // handle to previous instance
LPSTR lpCmdLine, // pointer to command line
int nCmdShow // show state of window
)
{
WNDCLASS wndcls; //定义一个WNDCLASS类的对象
MSG msg; //定义消息
wndcls.cbClsExtra=0; //类的附加参数
wndcls.cbWndExtra=0; //窗口的附加参数
wndcls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH); //窗口背景
wndcls.hCursor=LoadCursor(NULL,IDC_ARROW); //鼠标类型
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR); //光标类型
wndcls.hInstance=hInstance; //应用程序
wndcls.lpfnWndProc=WinSunProc; //窗口进程
wndcls.lpszClassName="LvSong"; //类的名字
wndcls.lpszMenuName=NULL; //定义窗口菜单
wndcls.style=CS_HREDRAW | CS_VREDRAW; //窗口的类型
RegisterClass(&wndcls); //注册窗口类
hwnd=CreateWindow(wndcls.lpszClassName,"血压终端演示",WS_OVERLAPPEDWINDOW,
100,100,670,240+34,
NULL,NULL,hInstance,NULL); //创建一个窗口
ShowWindow(hwnd,SW_SHOWNORMAL); //显示窗口
UpdateWindow(hwnd); //窗口重绘
while(GetMessage(&msg,NULL,0,0)) //消息循环 保证窗口存在
{
TranslateMessage(&msg); //传输消息
DispatchMessage(&msg);
OSTimeDly(OS_TICKS_PER_SEC/50);
}
//OSTimeDly(OS_TICKS_PER_SEC / 50); // 延时20毫秒
return 0;
}
//窗口进程描述
LRESULT CALLBACK WinSunProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
static int cxClient;//客户区的宽度
static int cyClient;//客户区的高度
static RECT rect ;//被绘制的矩形
//SetMenutemp();
char szChar[20];
MSGtemp msg_key;
uint32 key = 0;
uint8 val;
POINT ptOrigin,ptCurrent;
//HDC hdc; //定义一个DC的句柄
PAINTSTRUCT ps;
msg_key.message = 0;
//HDC hDC;
switch(uMsg) //判断消息
{
case WM_CREATE:
case WM_WINDOWPOSCHANGED:
rect.left=0;
rect.top=0;
rect.right=320;
rect.bottom=240;
return 0;
case WM_CHAR: //按键消息
//msg->message = wParam;
//SendMessagetemp(&msg);
key = wParam ;
msg_key.message = key;
SendMessagetemp(&msg_key); // 发送消息
while (key != 0)
key = 0;
OSTimeDly(OS_TICKS_PER_SEC / 20);
//sprintf(szChar,"char is %d",wParam); //获得按键并保存在字符串里
//MessageBox(hwnd,szChar,"检查按键",0); //弹出消息框 0==MB_OK
break;
case WM_LBUTTONDOWN: //鼠标左键
GetCursorPos(&ptOrigin); //得到鼠标按下时的点坐标
ScreenToClient(hwnd,&ptOrigin);//坐标转换
val = 9;
val = checkpoint(ptOrigin.x,ptOrigin.y);
switch(val)
{
case 0:
key = TM_KEYLEFT;
break;
case 1:
key = TM_KEYRIGHT;
break;
case 2:
key = TM_KEYLEFT;
break;
case 3:
key = TM_KEYMEASURE;
break;
case 4:
key = TM_KEYUP;
break;
case 5:
key = TM_KEYOK;
break;
case 6:
key = TM_KEYDOWN;
break;
default:
break;
}
if(val != 9)
{
//sprintf(szChar,"char is %d",key); //获得按键并保存在字符串里
//MessageBox(hwnd,szChar,"键值",0); //弹出消息框 0==MB_OK
msg_key.message = key;
SendMessagetemp(&msg_key);
while (key != 0)
key = 0;
OSTimeDly(OS_TICKS_PER_SEC / 20);
}
break;
/*case WM_PAINT: //窗口背景
//hdc =BeginPaint(hwnd,&ps);
//TextOut(hDC,0,0,"VC++ Lesson1",strlen("VC++ Lesson1"));
//EndPaint(hwnd,&ps);
break; */
case WM_CLOSE: //关闭窗口
if(IDYES==MessageBox(hwnd,"是否真的结束?","VC++学习",MB_YESNO))
{
DestroyWindow(hwnd); //销毁窗口 传递一个WM_DESTROY消息
}
break;
case WM_DESTROY: //销毁消息
PostQuitMessage(0);
break;
default:
OSTimeDly(OS_TICKS_PER_SEC / 50);
return DefWindowProc(hwnd,uMsg,wParam,lParam);
// // 延时20毫秒
}
OSTimeDly(OS_TICKS_PER_SEC / 50);
return 0;
//默认窗口进程
}
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
//int main(void)
int main(int argc, char* argv[])
{
// Display a banner.
char arg[200]={0};
int len,i;
#ifdef __WIN32__
printf("##### uCOS-II V%4.2f Port V%4.2f for WIN32 #####\n", ((FP32)OSVersion())/100, ((FP32)OSPortVersion())/100);
#endif
#ifdef __LINUX__
printf("##### uCOS-II V%4.2f Port V%4.2f for LINUX #####\n", ((FP32)OSVersion())/100, ((FP32)OSPortVersion())/100);
#endif
// Initialize uCOS-II.
OSInit(); //Calling sequence -->OSInitHookBegin-->OSTaskStkInit-->OSTCBInitHook-->OSTaskCreateHook-->OSInitHookEnd
validate();
// Create the first task
task1_tmq = TMQ_Create(task1_tmq_buf, 30);
OSTaskCreate(TestTask1, (void *) 11, &TestTaskStk1[TASK_STK_SIZE], 11); //Calling sequence -->OSTaskStkInit-->OSTCBInitHook-->OSTaskCreateHook
PC_IntVectSet(1, OurIsr1); //Install an interrupt service routine for IRQ 1
arg[0]='\"';
strcpy(arg+1,argv[0]);
len=strlen(arg);
arg[len]='\"';
// Start multitasking.
OSStart(); //Calling sequence -->OSTaskSwHook-->OSStartHighRdy
printf("main(): We should never execute this line\n");
return 0;
}
/*
*********************************************************************************************************
* First Task (startup task)
*********************************************************************************************************
*/
void TestTask1(void *pdata)
{ //printf("%4u: ***** Test Task 1 First call *****\n", OSTime);
int i;
#if OS_TASK_STAT_EN > 0
OSStatInit(); //Initialize the statistics task
#endif
OSTaskCreate(TestTask2, (void *) 22, &TestTaskStk2[TASK_STK_SIZE], 15); //Create 3 other tasks
OSTaskCreate(TestTask3, (void *) 33, &TestTaskStk3[TASK_STK_SIZE], 8);
OSTaskCreate(TestTask4, (void *) 10, &TestTaskStk4[TASK_STK_SIZE], 10);
i = WinMain(NULL,NULL,NULL,0); //找到程序运行窗口的句柄
//OSTaskCreate(TestTask6, (void *) 8, &TestTaskStk6[TASK_STK_SIZE], 8);
//
//SetMenutemp();
}
/*
*********************************************************************************************************
* Second Task
*********************************************************************************************************
*/
void TestTask2(void *pdata)
{
MSGtemp msg_key;
uint32 key = 0;
msg_key.message = 0; // 设置消息值
while(1)
{ OSTimeDly(OS_TICKS_PER_SEC / 20); // 延时20毫秒
PC_GetKey(&key);
if (key == 0)
{ continue;
}
if (key == 0x1b)
{ exit(0);
}
msg_key.message = key;
SendMessagetemp(&msg_key); // 发送消息
while (key != 0)
key = 0;
OSTimeDly(OS_TICKS_PER_SEC / 20); // 延时20毫秒
}
}
/*
*********************************************************************************************************
* Third Task
*********************************************************************************************************
*/
void TestTask3(void *pdata)
{
uint8 i;
OSTimeDly(OS_TICKS_PER_SEC);
hdc=GetDC(hwnd); //获得句柄
SetMenutemp();
}
/*
*********************************************************************************************************
* Forth Task
*********************************************************************************************************
*/
void TestTask4(void *pdata)
{
char s[40],vali[40],temp[60],temp1[60];
int i;
//HDC hdc;
pdata = pdata;
OSTimeDly(OS_TICKS_PER_SEC*2);
strcpy(vali,(char *)"用户帐号 028 000 0061");
for (;;)
{
PC_GetDateTime(s);
hdc=GetDC(hwnd); //获得句柄
SetTextColor(hdc,RGB(0,0,255));
SetBkColor(hdc,RGB(128,128,128));
TextOut(hdc,100,0,s,strlen(s)-3); //打印文字
//TextOut(hdc,160,0,vali,strlen(vali)); //打印文字
ShowBattery(260,2,30,10,30);
//DispString (80, 60, (char *)"时间设定", 1);
//ReleaseDC(hwnd,hdc); //释放DC
//PC_DispStr(1, 0, s, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
//DispString(0,0,(char *)"帐号 0280000061",0);
OSTimeDly(OS_TICKS_PER_SEC);
//SetMenutemp();
}
}
void TestTask6(void *pdata)
{
/* HWND hWnd;
HDC hDC;
HPEN hPen, hOldPen;
int i;
i = WinMain(NULL,NULL,NULL,0); //找到程序运行窗口的句柄
hWnd = hwnd;
hDC=GetDC(hWnd);//通过窗口句柄得到该窗口的设备场境句柄
hPen,hOldPen; //画笔
i = 0;
for(;i<500;++i)
SetPixel(hDC,10+i,10+i,0x0000ff);//用画点的办法画一根线,最后一个参数是颜色(32位)
hPen=CreatePen(PS_SOLID,2,0x00ff00);//生成绿色画笔
hOldPen=(HPEN)SelectObject(hDC,hPen);//把画笔引入设备场境
MoveToEx(hDC,20,50,NULL); //设置画线起点
LineTo(hDC,100,100); //画到终点
//Arc(hDC,100,100,300,300,350,500,350,500);//画圆
SelectObject(hDC,hOldPen); */
}
/*
*********************************************************************************************************
* Interrupt service routine for IRQ 1
* (use "irqGenerator 1" to trigger this interrupt)
*********************************************************************************************************
*/
void OurIsr1(void)
{ OSIntEnter();
printf("##### Interrupt service routine for IRQ 1 #####\n");
OSTaskResume(10); //Trigger task 4
OSIntExit();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -