시뮬레이터
TouchGFX UI를 빌드하려면 보통 UI 사양에 맞게 세부적인 그래픽을 조정해야 합니다.
이때 개발 프로세스를 빠르게 진행하려면 애플리케이션의 테스트 및 디버깅 소요 시간을 단축할 수 있어야 합니다. 보드 플래싱은 보통 시간이 많이 걸리기 때문에 애플리케이션을 약간 변경할 때마다 일일이 플래싱을 한다면 개발이 지연됩니다. TouchGFX PC 시뮬레이터는 개발 도구에 추가하여 이러한 문제를 해결하는 데 매우 효과적입니다.
이제 PC에 맞게 애플리케이션을 컴파일하기만 하면 PC에서 실행할 수 있습니다. 실행하는 코드는 보드 브링 업(Board Bring Up) 코드와 추상화 계층이 아닌 PC에 맞게 작성된다는 점만 제외하면 타겟 하드웨어의 코드와 정확히 일치합니다. 이 말은 위젯 배치, 인터랙션, 애니메이션, 상태 기계 같은 것들을 마치 대상 하드웨어에서 테스트하는 것처럼 정밀하게 테스트할 수 있다는 것을 의미합니다. 심지어 Visual Studio와 같은 IDE를 사용해 코드를 디버깅할 수도 있습니다. 물론 이때는 성능 분석이나 실제 백엔드 시스템 상호작용과 같은 작업은 사용하는 보드에서 실행해야 합니다.
시뮬레이터 예
실행 방법
TouchGFX Designer 사용 시
TouchGFX Designer에서 시뮬레이터를 실행하려면 오른쪽 상단 모퉁이에 있는 "Run Simulator" 버튼을 누르거나 키보드에서 F5
키를 누르면 됩니다.
TouchGFX 환경 사용 시
TouchGFX 환경에서 시뮬레이터를 실행하는 방법은 다음과 같습니다.
- TouchGFX 환경을 엽니다.
- TouchGFX 애플리케이션이 있는 위치로 이동합니다.
make -f simulator/gcc/Makefile -j6
명령을 실행하여 시뮬레이터를 컴파일합니다../build/bin/simulator.exe
명령을 실행하여 시뮬레이터를 시작합니다.
TouchGFX 애플리케이션을 변경할 때마다 3~4단계를 실행합니다.
시뮬레이터 기능
TouchGFX 시뮬레이터에는 마우스 입력을 캡처하는 것 외에도 아래와 같이 여러 가지 유용한 기능이 포함되어 있습니다.
단축키 | 기능 |
---|---|
F1 | 포인터 좌표 표시와 해당 좌표(16진수) 픽셀의 RGB 색상 표시를 활성화/비활성화합니다. |
F2 | 무효화 영역의 강조 표시를 활성화/비활성화합니다. |
F3 | 스크린샷을 생성한 후 screenshots 폴더에 해당 이미지를 저장합니다. |
CTRL + F3 | 다음 프레임 50개의 스크린샷을 생성한 후 screenshots 폴더에 해당 이미지를 저장합니다. |
SHIFT + F3 | 스크린샷을 생성한 후 클립보드에 저장합니다. |
F4 | 시뮬레이터 스킨을 사용하는 경우 시뮬레이터 스킨을 활성화/비활성화합니다. 시뮬레이터 스킨을 사용하지 않는 경우에는 창 경계를 활성화/비활성화합니다. |
F9 | 애플리케이션으로 실행 이벤트(tick)를 전송하지 못하도록 시뮬레이터를 일시 중지합니다. 다시 F9를 누르면 정상적인 실행을 재개합니다. |
F10 | F9를 눌러 시뮬레이터를 일시 중지했을 때도 F10을 누르면 애플리케이션으로 단일 실행 이벤트(tick)를 전송하여 애플리케이션 "싱글 스텝"을 수행할 수 있습니다. |
ESC | 시뮬레이터를 닫습니다. |
시뮬레이터 전용 사용자 코드
TouchGFX 시뮬레이터를 사용할 때만 실행되는 코드가 있다면 다음과 같이 C++ 코드에서 #IFDEF Simulator
를 사용할 수 있습니다.
#IFDEF Simulator
// Your simulator specific user code here
#ENDIF
디버그 텍스트를 콘솔로 출력하려면 touchgfx_printf
함수를 사용하면 됩니다. 이 함수는 printf와 유사한 함수로서 시뮬레이터 코드를 빌드할 때만 포함되기 때문에 타겟 하드웨어에서 실행할 경우에는 간섭을 일으키지 않습니다. 따라서 이 경우에는 #IFDEF Simulator
를 사용할 필요가 없습니다.
int i = 0;
touchgfx_printf("Application is running through simulator! \n");
touchgfx_printf("Print our value for integer i = %i \n", i);
프레임버퍼 잠금 및 잠금 해제
코드를 작성해서 프레임버퍼를 직접 조작하려면 픽셀 데이터를 프레임버퍼 메모리에 작성하기 전에 먼저 프레임버퍼를 잠가야 합니다. 프레임버퍼 잠금은 프레임버퍼에 작성한 후 프레임버퍼를 잠금 해제하는 것 만큼이나 중요합니다.
프레임버퍼 잠금
프레임버퍼를 잠글 때 사용하는 코드 스니펫은 다음과 같습니다.
uint16_t* RESTRICT buf = HAL::getInstance()->lockFrameBuffer();
앞서 있었던 이유들 때문에 프레임버퍼를 가리키는 16비트 포인터 값이 반환됩니다. 프레임버퍼에 더욱 쉽게 액세스할 수 있도록 포인터를 해당하는 포인터 유형으로 캐스팅합니다.
프레임버퍼 잠금 해제
사용한 후 프레임버퍼를 잠금 해제할 때 사용하는 코드는 다음과 같습니다.
HAL::getInstance()->unlockFrameBuffer();
프레임버퍼의 잠금 해제를 잊은 경우
프레임버퍼의 잠금 해제를 잊으면 하드웨어가 프레임버퍼를 사용할 수 있을 때까지 작동을 멈추고 계속해서 대기합니다. 이때는 TouchGFX 프레임워크에서 프레임버퍼가 잠겨 있을 때도 프레임버퍼를 잠그도록 요청하는 가정 설정문(assert)을 가져오면 이러한 상황을 감지하는 데 효과적입니다. Microsoft Visual Studio에서는 다음과 같은 오류 메시지가 표시됩니다.
콘솔 프로그램에서는 다음과 같은 오류 메시지가 표시됩니다.