본문 바로가기
프로그래밍/C

C ] TUI ARINC429 비행 데이터 송신 앱 (Text-based User Interface)

by eteo 2025. 1. 7.

 

 

 

개발 배경 :

콘솔 창에 그래픽 요소를 추가하여 사용자 친화적인 인터페이스를 구현한 형태를 TUI(Text-based UI) 또는 CUI(Console UI)라고 한다. TUI 사용자로부터 키보드 입력을 받아 프로그램을 제어하고 데이터를 시각적으로 구분하기 위해 박스나 테두리를 활용해 레이아웃을 구성하고 색상을 입혀 데이터를 강조한다.

이런 TUI 앱을 한번 만들어봐야지 하고 생각했었는데 마침 적당한 사례를 발견해서 업무상 굳이 필요는 없었지만 개인 시간을 들여 한번 만들어 봤다.

 

 

어플리케이션 설명 :

이 어플리케이션은 대기 자료 컴퓨터(Air Data Computer)를 시뮬레이션하기 위한 도구로 특정 비행 정보를 정해진 주기로 송신하도록 제어할 수 있다. 현재 송신하고 있는 데이터를 시각적으로 표시하며, 다양한 해상도 설정을 통해 데이터 값을 조정할 수 있는 기능을 제공한다.

 

해당 어플리케이션은 이전 글에서 소개한 적있는 USB to ARINC429 장치와 그 드라이버를 사용한다.

2023.10.26 - [임베디드 개발/펌웨어] - Excalibur systems DAS-429UNET/RTx & Mystic

 

 

 

 

주요 기능 :

  • 실시간 데이터 시각화 및 제어 : 비행 데이터 수치를 Slider로 표현하여 사용자는 위/아래 방향키를 통해 정해진 범위 내에서 데이터를 설정할 수 있고, 데이터의 변화를 시각적으로 확인 가능하다.
  • 해상도 설정 기능 : 비행 데이터 수치 조절 시 정밀도를 직접 조정 가능해 fine tuning 또는 coarse tuning이 가능하다. 
  • 수신 시작/중단 제어 : START/STOP 버튼을 통해 송신을 시작하거나 중단할 수 있다. 현재 송신하고 있는 메시지의 개수는 실시간으로 업데이트 되어 화면 상단에 표시되고, 송신 도중에도 데이터 값을 바꿀 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

슬라이더는 처음엔 단순히 한 칸에 배경색을 채워 넣는 방식으로 구현했기 때문에, 표현할 수 있는 단계 수가 적었다. 이후에는 유니코드 블럭 문자들(U+2581 ~ U+2588)을 활용하는 방식으로 개선하였다. 슬라이더 한 칸에 8개의 레고 조각을 채울 수 있다고 보고, 퍼센트를 기준으로 해당 칸에 몇 조각을 채울지 환산한 뒤 그에 맞는 블럭 문자를 그리는 방식이다. 개선 후에는 훨씬 더 세밀한 슬라이더 표현이 가능해졌다.

const char* blocks[] = {
	" ", "▁", "▂", "▃", "▄", "▅", "▆", "▇", "█",
};


void draw_slider(int x, int y, int width, int height, int percent) {
	const int steps_per_block = 8;
	int total_steps = height * steps_per_block;
	percent = percent < 0 ? 0 : (percent > 100 ? 100 : percent);
	int filled_steps = percent * total_steps / 100;

	// draw_box(...);

	for (int i = 0; i < height; i++) {
		int slider_index = height - 1 - i;
		int step_level = filled_steps - (slider_index * steps_per_block);
		int block_index = (step_level > 0) ? (step_level >= steps_per_block) ? steps_per_block : step_level : 0;

		for (int j = 0; j < width; j++) {
			// draw_text(blocks[block_index]...);
		}
	}
}