2010년 3월 17일 수요일

HCI Tool Final

HCI Tool

Target Description
 - Bluetooth HCI GUI command tool
 - Dialog type
 - Implement 3 basic commands: RESET, READ BD ADDR, Enable DUT Mode.
 - Show transfered packets and its interpretation.
 - For the RS232 module, can use general open source code.
   (I don't have to implement this part for myself)

Procedure
 1. Bluetooth HCI spec study.(Data format. Refer to previous article, titled "HCI GUI Tool #2")
 2. Dialog Box concept, draw outline, Place buttons and boxes.
 3. This is the main frame of this tool.

 4. Set event control / rename all the "ID name" and "caption"
  1) 6 Events (2 kinds event, 6 buttons)
    OnBnClickedButton~~: Button click시에 발생되는 event
      -OnBnClickedButtonOpen() // port open을 위한 button
      -OnBnClickedButtonClose() // port close를 위한 button
      -OnBnClickedButtonOgf1() // OGF(opcode group field) button
      -OnBnClickedButtonOgf2()
      -OnBnClickedButtonOgf3()
    OnLbnSelChangeList~~: Listbox의 내용에 마우스 click시 발생되는 event
      -OnLbnSelChangeListOcf()  // OCF(opcode command field)를 발생시키기 위한 함수.
 5. Add Variables
   1) 4 EditBoxes(CEdit type, Control type)
      -m_cPort_Status //'Set port'의 Edit box
      -m_cPort_Read //'Set port'의 Edit box
      -m_vHCI_Cmd //'HCI Command & Event'의 Edit box.
//이것만 value type(CString type). 그냥 test용..
      -m_cHCI_Event //'HCI Command & Event'의 Edit box.
   2) 1 ListBox(CListBox type, Control type)
      -m_List_OCF
   3) 5 ComboBoxes and its variables: 가져온 RS-232 module에 포함된 내용.
     CComboBox type(control type)
      -m_cPort
      -m_cBaud
      -m_cData
      -m_cStop
      -m_cParity
     int type(value type)
      -m_intPort
      -m_intBaud
      -m_intData
      -m_intStop
      -m_intParity
 6. Add 'CommThread.cpp', 'CommThread.h' files to the solution(project)
      > HCI_ToolDlg.h에 include "CommThread.h"
 7. Add long type function to display received packet.
    1) long CHCI_ToolDlg::OnCommunication(WPARAM wParam, LPARAM lParam)
    2) Add "ON_MESSAGE(WM_COMM_READ,OnCommunication)" in the Message Map
    3) HCI_ToolDlg.cpp에 전역으로 "HWND hCommWnd;" 선언 //안하면 link error발생.
    4) "OnInitDialog()"에 "hCommWnd=m_hWnd;" 추가.
        //이게 없으면 OnCommunication()이 호출되지 않음

Functions used.
 - GetCurSel(): ComboBox, 혹은 Listbox 에서 선택된 항목을 int type으로 return
   ex) m_intPort = m_cPort.GetCurSel(); //m_cPort는 Control type
 - wsprintf() :
   ex)
wsprintf(rtSize,"Right = %d, Bottom = %d", rt.right, rt.bottom);
rtSize는 문자열 버퍼(char*형식), 두번째부터는 printf와 사용이 동일.
다만 화면에 출력하지 않고 문자열 버퍼(rtSize)에 " "의 내용을 기록만 함.
 - SetSel(): 커서 놓기, 혹은 블럭 선택하기
   ex) SetSel(시작위치,끝위치);
  m_cPort_Status.SetSel(0,-1); //전체선택
 - ReplaceSel(): 현재의 데이터로 다시 치환
   ex) m_cPort_Status.ReplaceSel(msgStr);
  //위의 함수와 같이 사용해서, 전체 선택영역을 msgStr 문자열 버퍼의 내용으로 치환.
 - EnableWindow(): ComboBox를 enable / disable
   ex) m_cPort.EnableWindow(false); // false이면 비활성화, true이면 활성화
 - ResetContent(): ListBox의 contents를 지움
   ex) m_cList_OCF.ResetContent(); // Control type, CListBox type.
 - AddString(): ListBox에 출력
   ex) m_cList_OCF.AddString(_T("Reset")); 
 - UpdateData(): buffer의 내용을 화면에 출력 혹은 화면의 내용을 buffer로 읽어들임.
   ex) m_vHCI_Cmd.Format(_T("not implemented yet")); UpdateData(FALSE); //화면에 출력 TRUE의 경우는 화면의 내용을 읽어옴.

Result & Debug
 - It works.
 - 기본적이며 실제 BT test시에 주로 쓰이는 세가지 command에 대해서만 구현.
   > RESET, READ BD ADDR, Enable Device Under Test Mode
 - "PortMon"이라는 serial port monitoring program을 통하여 실제 port에서의 입출력결과 확인.
 - in the "Property"
   > Character set 설정
    1) Use Multi byte character Set
    2) Use Uni-Code character Set
    VS2003(?)이하 버전에서는 1)번이 default setting이나,
    VS2008에서는 2)번이 default setting. 이 세팅이 다를 경우 특정 함수에서 compile error발생.
    ex) wsprintf, ReplaceSel() 등.
 - Handler 등록
   > HCI_ToolDlg.cpp에 전역으로 "HWND hCommWnd;" 선언 //안하면 link error발생
   > CommThread.cpp에 이미 extern으로 선언이 되어 있으나 HCI_ToolDlg.cpp 에도 선언해야함.
   > extern: 파일과 파일간에 공유 변수를 만들어서 사용하고자 할 경우에 사용하는 키워드.
 - Insert "Sleep(10);"
  > ReadComm() in the CommThread.cpp.
  > READ_BD_ADDR와 같은 event packet의 길이가 긴 것의 경우(8 byte이상)
    Editbox 화면에 8개 단위로 끊어서 출력되는 현상이 발생
       >> 8 byte출력 >> 화면 Update >> 나머지 byte출력(이전 8byte는 update로인해 보이지않음)
  > Debug mode로 line by line trace시에는 정상적으로 한 화면에 출력됨.
  > 즉, 시간에 따른 결과값의 변화가 관찰됨.
  > Trace결과 "ClearCommError(m_hComm, &dwErrorFlags, &comstat);" 로 넘어가는 부분이 수상함.
  > ClearCommError()함수 바로 위에 "Sleep(10)" 삽입하여 문제 해결.
 - Resource View >> Edit Box's Property >> Multi Line >> True
  > 화면에 문자가 깨지는등 원하는 결과가 출력되지 않음.
  > Resource dialog에서 Multi Line >> True, Auto Vscroll >> True로 변경
 - Resource View >> Property >> Sort >> False
  > 입력한 명령어 및 List등이 오름차순으로 정렬되는 문제.
  > Sort >> False로 변경하여 문제 해결 (List Box, Combo Box 에 적용)

[Port Open]

["Reset" Command ]

["Read BD Address" Command ]

["Enable Device Under Test Mode" Command ]

[Close Port]


Summary
 - MFC Programming Procedure I did
  1. Design GUI and overall functions .
  2. Place Buttons and boxes as u designed.
  3. Register events and variables according to the functions you want to implement.
  4. Not how, but where.
     > Implement the logic and function you want to make where suitable function.
 - Value type & Control type
  > 'Add Variable'의 category중 Value type과 Control type을 선택할 수 있게 되어 있는데..
  1. Value type :CString type의 자료형으로 변수를 선언,
 이때는 *.Format()함수와 UpdateData()를 이용하여 화면에 입출력
  2. Control type: CEdit type(Editbox의 경우)의 자료형으로 변수를 선언.
   이때는 *.AddString()등 CEdit의 멤버함수를 이용하여 화면에 출력
  > 두 type모두 각기 다른 함수 및 방법으로 동일(혹은 비슷)한 기능들을 수행 가능하지만
    일반적으로 Value type이 다루기 쉬운 장점. Control type은 복잡하지만 보다 detail하고
    powerful한 control이 가능하며 program도 보다 가벼운 장점.

TODO next is
 
          

댓글 없음:

댓글 쓰기