ARM과 초음파 센서와의 선 연결
Trigger 와 Echo 타이밍도
Trigger가 최소한 10us 이상 만큼 유지가 되고 HIGH가 되면 ECHO로 초음파를 날리게 된다 그 순간 Timer count가 호출 되면서 시간을 재고 있다 Echo가 HIGH가 되는 순간
Timer count가 정지 하면서 시간을 거리로 바꾸는 것이다
ARM 초음파 센서 소스는 올릴 거 없습니다 제가 초음파 센서를 실패 했기 때문에 부득이 하게 이렇게 올립니다
API
흑백에서의 그리기 모드
그리기 모드의 종류
윈도우즈가 사용하는 그리기 모드 R2_COPYPEN 모드이다 그래서 그려지는 그림이 기존 그림을 덮어버린다.
그리기 모드를 변경하는 함수와 현재 설정된 그리기 모드를 구하는 함수는 다음과 같다
SetROP2(hdc,R2_NOT);
함수 원형
int SetROP2(HDC hdc, int fnDrawMode);
첫번째 인자 : hdc는 그리기 모드를 변경(또는 조사)하고자 하는 DC의 핸들
두번째 인자 : 그리기 모드 값을 넘겨 준다
그리기 모드 값
그리기 모드
R2_BLACK
항상 검정색이다
R2_WHITE
항상 흰색이다
R2_NOP
아무런 그리기토 하지 않는다
R2-NOT
원래의 그림을 반전 시긴다
R2_COPYPEN
원래의 그림을 덮어버리고 새 그림을 그린다
R2_NOTCOPYPEN
새 그림을 반전시켜 준다
R2_NOTXORPEN
XOR한 결과의 반대값을 써 넣는다
R2_MERGEPEN
OR연산으로 두 그림을 합친다
R2_MASKPEN
AND연산으로 겹치는 부분만 그린다
R2_XOEPEN
XOR연산으로 겹치는 부분만 반전 시킨다
int GetROP2(HDC hdc);
그리기 모드
#include <windows.h>
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
HINSTANCE g_hInst;
HWND hWndMain;
LPCTSTR lpszClass=TEXT("RopMode");
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance
,LPSTR lpszCmdParam,int nCmdShow)
{
HWND hWnd;
MSG Message;
WNDCLASS WndClass;
g_hInst=hInstance;
WndClass.cbClsExtra=0;
WndClass.cbWndExtra=0;
WndClass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
WndClass.hCursor=LoadCursor(NULL,IDC_ARROW);
WndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
WndClass.hInstance=hInstance;
WndClass.lpfnWndProc=WndProc;
WndClass.lpszClassName=lpszClass;
WndClass.lpszMenuName=NULL;
WndClass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&WndClass);
hWnd=CreateWindow(lpszClass,lpszClass,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,(HMENU)NULL,hInstance,NULL);
ShowWindow(hWnd,nCmdShow);
while (GetMessage(&Message,NULL,0,0)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
return (int)Message.wParam;
}
//*
LRESULT CALLBACK WndProc(HWND hWnd,UINT iMessage,WPARAM wParam,LPARAM lParam)
{
static int sx,sy,oldx,oldy;
static BOOL bNowDraw = FALSE;
HDC hdc;
switch (iMessage) {
case WM_LBUTTONDOWN:
sx = LOWORD(lParam);
sy = HIWORD(lParam);
oldx = sx;
oldy = sy;
bNowDraw = TRUE;
return 0;
case WM_MOUSEMOVE:
if (bNowDraw) {
hdc=GetDC(hWnd);
SetROP2(hdc,R2_NOT);
MoveToEx(hdc,sx,sy,NULL);
LineTo(hdc,oldx,oldy);
oldx=LOWORD(lParam);
oldy=HIWORD(lParam);
MoveToEx(hdc,sx,sy,NULL);
LineTo(hdc,oldx,oldy);
ReleaseDC(hWnd,hdc);
}
return 0;
case WM_LBUTTONUP:
bNowDraw = FALSE;
hdc=GetDC(hWnd);
MoveToEx(hdc,sx,sy,NULL);
LineTo(hdc,oldx,oldy);
ReleaseDC(hWnd, hdc);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return(DefWindowProc(hWnd,iMessage,wParam,lParam));
}
선을 겹쳐서 그리면 반전모드가 적용 된다 하지만 마우스를 때면 원래 그림을 덮어 버리고 새 그림을 그린다
sx, sy
처음 마우스를 누른 위치를 가진다
oldx, oldy
지워져야 할 선의 끝 좌표를 가진다
bNowDraw
현재 선을 그리고 있는 중인가에 대한 정보를 가진다
결과
SetROP2(hdc,R2_NOT) 주석 처리 하고 실행 하면
결과
'코스웨어 > 11년 내장형하드웨어' 카테고리의 다른 글
[내장형]한원우_9월19일 보고서 (36) | 2011.09.20 |
---|---|
[내장형]이동현_0916일일보고서 (23) | 2011.09.17 |
9월 15일 일일보고서-[내장형]김정우 (19) | 2011.09.15 |
[내장형]황세선 2011년 9월 14일 (24) | 2011.09.15 |
[내장형]심재원_2011년09월08일 (10) | 2011.09.08 |
[내장형]이수란_2011년9월7일 (9) | 2011.09.07 |
[내장형]김동화_2011년_9월6일_일일보고서 (17) | 2011.09.06 |
[내장형]최남식-2011년9월5일 일일보고서 (11) | 2011.09.06 |