주요 내용으로 건너뛰기

시뮬레이터

TouchGFX UI를 빌드하려면 보통 UI 사양에 맞게 세부적인 그래픽을 조정해야 합니다.

이때 개발 프로세스를 빠르게 진행하려면 애플리케이션의 테스트 및 디버깅 소요 시간을 단축할 수 있어야 합니다. 보드 플래싱은 보통 시간이 많이 걸리기 때문에 애플리케이션을 약간 변경할 때마다 일일이 플래싱을 한다면 개발이 지연됩니다. TouchGFX PC 시뮬레이터는 개발 도구에 추가하여 이러한 문제를 해결하는 데 매우 효과적입니다.

이제 PC에 맞게 애플리케이션을 컴파일하기만 하면 PC에서 실행할 수 있습니다. 실행하는 코드는 보드 브링 업(Board Bring Up) 코드와 추상화 계층이 아닌 PC에 맞게 작성된다는 점만 제외하면 타겟 하드웨어의 코드와 정확히 일치합니다. 이 말은 위젯 배치, 인터랙션, 애니메이션, 상태 기계 같은 것들을 마치 대상 하드웨어에서 테스트하는 것처럼 정밀하게 테스트할 수 있다는 것을 의미합니다. 심지어 Visual Studio와 같은 IDE를 사용해 코드를 디버깅할 수도 있습니다. 물론 이때는 성능 분석이나 실제 백엔드 시스템 상호작용과 같은 작업은 사용하는 보드에서 실행해야 합니다.

시뮬레이터 예

실행 방법

TouchGFX Designer 사용 시

TouchGFX Designer에서 시뮬레이터를 실행하려면 오른쪽 상단 모퉁이에 있는 "Run Simulator" 버튼을 누르거나 키보드에서 F5 키를 누르면 됩니다.

TouchGFX Designer에서 시뮬레이터 실행하기

TouchGFX 환경 사용 시

TouchGFX 환경에서 시뮬레이터를 실행하는 방법은 다음과 같습니다.

  1. TouchGFX 환경을 엽니다.
  2. TouchGFX 애플리케이션이 있는 위치로 이동합니다.
    1. 시뮬레이터 전용 프로젝트에서는 예를 들어 C:/TouchGFXProjects/MyApplication_1에 TouchGFX 애플리케이션이 있습니다.
    2. 타겟 프로젝트에서는 예를 들어 C:/TouchGFXProjects/MyApplication_1/TouchGFX/에 TouchGFX 애플리케이션이 있습니다.
  3. make -f simulator/gcc/Makefile -j6 명령을 실행하여 시뮬레이터를 컴파일합니다.
  4. ./build/bin/simulator.exe 명령을 실행하여 시뮬레이터를 시작합니다.

TouchGFX 애플리케이션을 변경할 때마다 3~4단계를 실행합니다.

시뮬레이터 기능

TouchGFX 시뮬레이터에는 마우스 입력을 캡처하는 것 외에도 아래와 같이 여러 가지 유용한 기능이 포함되어 있습니다.

단축키기능
F1포인터 좌표 표시와 해당 좌표(16진수) 픽셀의 RGB 색상 표시를 활성화/비활성화합니다.
F2무효화 영역의 강조 표시를 활성화/비활성화합니다.
F3스크린샷을 생성한 후 screenshots 폴더에 해당 이미지를 저장합니다.
CTRL + F3다음 프레임 50개의 스크린샷을 생성한 후 screenshots 폴더에 해당 이미지를 저장합니다.
SHIFT + F3스크린샷을 생성한 후 클립보드에 저장합니다.
F4시뮬레이터 스킨을 사용하는 경우 시뮬레이터 스킨을 활성화/비활성화합니다.
시뮬레이터 스킨을 사용하지 않는 경우에는 창 경계를 활성화/비활성화합니다.
F5FrontendApplication::changeToStartScreen()을 호출하여 애플리케이션을 시작 화면으로 바로 전송합니다.
F9애플리케이션으로 실행 이벤트(tick)를 전송하지 못하도록 시뮬레이터를 일시 중지합니다. 다시 F9를 누르면 정상적인 실행을 재개합니다.
F10F9를 눌러 시뮬레이터를 일시 중지했을 때도 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에서는 다음과 같은 오류 메시지가 표시됩니다.

프레임버퍼를 잠금 해제하지 않았을 때 표시되는 Windows 대화 상자

콘솔 프로그램에서는 다음과 같은 오류 메시지가 표시됩니다.

프레임버퍼를 잠금 해제하지 않았을 때 출력되는 콘솔 메시지

크기가 디스플레이와 다른 하드웨어 프레임 버퍼 시뮬레이션하기

일부 설정에서는 디스플레이 크기가 실제 하드웨어 프레임 버퍼보다 작을 수 있습니다. 이러한 문제는 시뮬레이션에서 처리할 수 있으며, touchgfx_generic_init()를 호출한 후 simulator/main.cpp 파일에서 바로 구성됩니다.

touchgfx_generic_init()로 전달되는 가로와 세로가 디스플레이와 프레임 버퍼의 크기를 정의합니다. 하지만 하드웨어 프레임 버퍼의 크기가 다른 경우에는 touchgfx_generic_init() 호출 후 setFrameBufferSize()를 호출하여 실제 프레임 버퍼의 크기를 지정하면 됩니다. 예를 들어 SIM_WIDTH=800이고, SIM_HEIGHT==480인 경우에 다음과 같이 지정합니다.

touchgfx::HAL& hal = touchgfx::touchgfx_generic_init<touchgfx::HALSDL2>(dma, lcd, tc, SIM_WIDTH, SIM_HEIGHT, 0, 0);
hal.setFrameBufferSize(832, 480); // Hardware framebuffer is wider