
TI의 https://dev.ti.com/gallery/ 는 다양한 GUI를 제공하는 솔루션 소프트웨어로 JSON 형식 문자열을 사용하여 데이터를 전송하고 GUI 위젯과 연결하하여 간단히 입 출력 할수 있는 도구 이다.
GUI를 이용하려면 TI에서 제공하는 gui_composer 라이브러리를 이용하면 쉽게 데이터를 송 수신 할 수 있다.
[gc_simple_json 전체 예제 소소코드]
https://dev.ti.com/tirex/explore/node?node=A__AE1F5mI8zvPZ1GlsPcvVkw__MSPM0-SDK__a3PaaoK__LATEST
#include "ti_msp_dl_config.h"
#include <stdbool.h>
#include <stdint.h>
#include <ti/gui_composer/HAL.h> // GUI Composer 하드웨어 추상화 레이어
#include <ti/gui_composer/IQMathLib/QmathLib.h> // Qmath 고정소수점 수학 라이브러리
#include "MSP_GUI/GUIComm_JSON.h" // GUI와 JSON 통신용 함수
#include "MSP_GUI/GUI_JSON.h" // GUI JSON 구조
#include "callbacks_JSON.h" // GUI에서 받은 명령어 콜백 함수 선언
#define STR_LEN_TWO 2 // GUI 문자열 길이 2
#define STR_LEN_SEVEN 7 // GUI 문자열 길이 7
volatile uint8_t u8Counter; // 8비트 카운터 (스위치 1로 증가)
volatile uint16_t u16Counter; // 16비트 카운터 (스위치 2로 증가)
volatile uint32_t u32Counter; // 32비트 카운터 (타이머로 증가)
volatile _q qCounter; // Q8.8 고정소수점 카운터 (0.0 ~ 100.0 범위)
volatile bool bUpdateGUI; // GUI 갱신 필요 여부 플래그
extern volatile bool bEnableSwitch; // QMath 업데이트 스위치 (외부 선언됨)
extern volatile _q qIncrement; // QMath 증가 값 (외부 선언됨)
/* --- GUI RX 명령 구조체 ---
* GUI에서 특정 명령어를 수신하면 해당 콜백 함수가 호출됨
*/
const tGUI_RxCmd GUI_RXCommands[] = {
{"bEnable", callback_boolEnable}, // "bEnable" 명령어 → callback_boolEnable 실행
{"u16Data", callback_QMathData}, // "u16Data" 명령어 → callback_QMathData 실행
};
/* --- 메인 함수 --- */
int main(void)
{
HAL_System_Init(); // 시스템 초기화 (클럭/핀 설정 등)
GUI_Init(); // GUI 초기화
GUI_InitRxCmd(&GUI_RXCommands[0],
sizeof(GUI_RXCommands) / sizeof(GUI_RXCommands[0])); // RX 명령 등록
/* 변수 초기값 설정 */
bUpdateGUI = false;
u8Counter = 50; // 스위치1 누를 때마다 50씩 증가
u16Counter = 5000; // 스위치2 누를 때마다 5000씩 증가
u32Counter = 10000; // 타이머마다 10000씩 증가
bEnableSwitch = true; // QMath 카운터 업데이트 허용
qCounter = _Q(0.5); // 초기값 0.5 (Q8 형식)
qIncrement = _Q(0.5); // 증가값 0.5
/* GUI로 초기값 전송 */
GUIComm_sendUInt8("c1", STR_LEN_TWO, u8Counter);
GUIComm_sendUInt16("c2", STR_LEN_TWO, u16Counter);
GUIComm_sendUInt32("c3", STR_LEN_TWO, u32Counter);
GUIComm_sendInt16("c4", STR_LEN_TWO, (int16_t) qCounter);
GUIComm_sendInt16("u16Data", STR_LEN_SEVEN, (int16_t) qIncrement);
GUIComm_sendBool("bEnable", STR_LEN_SEVEN, bEnableSwitch);
__WFI(); // GUI의 ACK 대기 (저전력 대기 상태)
while (1) {
/* GUI 업데이트가 필요한 경우 */
while (bUpdateGUI == true) {
GUIComm_sendUInt8("c1", STR_LEN_TWO, u8Counter);
GUIComm_sendUInt16("c2", STR_LEN_TWO, u16Counter);
GUIComm_sendUInt32("c3", STR_LEN_TWO, u32Counter);
/* 스위치가 활성화된 경우 QMath 값도 전송 */
if (bEnableSwitch == true) {
GUIComm_sendInt16("c4", STR_LEN_TWO, (int16_t) qCounter);
}
bUpdateGUI = false; // 업데이트 완료 후 플래그 리셋
}
/* 업데이트 대기 상태 → 이벤트 발생 시 깨어남 */
if (bUpdateGUI == false) {
__WFE(); // Event 대기 (저전력 모드)
}
}
}
/* --- 타이머 인터럽트 핸들러 --- */
void TIMER_INST_IRQHandler(void)
{
u32Counter += 10000; // 32비트 카운터 10000씩 증가
bUpdateGUI = true; // GUI 업데이트 요청
if (bEnableSwitch == true) {
qCounter += qIncrement; // QMath 카운터 증가
if (qCounter > _Q(100.0)) {
qCounter = 0; // 100.0 초과 시 0으로 초기화
}
}
}
/* --- GPIO 그룹 인터럽트 핸들러 --- */
void GROUP1_IRQHandler(void)
{
switch (DL_Interrupt_getPendingGroup(DL_INTERRUPT_GROUP_1)) {
case DL_INTERRUPT_GROUP1_IIDX_GPIOA: // GPIOA에서 인터럽트 발생
switch (DL_GPIO_getPendingInterrupt(GPIO_SWITCHES_PORT)) {
case GPIO_SWITCHES_USER_SWITCH_1_IIDX:
u8Counter += 50; // 스위치1 → 8비트 카운터 증가
break;
case GPIO_SWITCHES_USER_SWITCH_2_IIDX:
u16Counter += 5000; // 스위치2 → 16비트 카운터 증가
break;
default:
break;
}
break;
default:
break;
}
}
GUI 소프트웨어는 gallery에서 실행하거나 실행파일로 다운 받아서 사용 가능하다.
https://dev.ti.com/gallery/view/TIMSPGC/MSPM0_SimpleGUI_JSON/ver/1.0.0/

반응형