본문 바로가기
코스웨어/11년 내장형하드웨어

[내장형]정선주 2011년 9월 9일

by 알 수 없는 사용자 2011. 9. 10.
728x90
반응형

ARM과 초음파 센서와의 선 연결

 

image

 

Trigger 와 Echo 타이밍도

 

image

 

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
현재 선을 그리고 있는 중인가에 대한 정보를 가진다

결과

image

SetROP2(hdc,R2_NOT) 주석 처리 하고 실행 하면

결과

image

728x90