API Reference: LED & Button Control¶
📌 이 페이지를 읽고 나면: 내장 LED 3개 + 버튼 3개를 폴링/이벤트 양방향 모두 제어할 수 있습니다. ⏱️ 예상 학습 시간: 15분 🧰 사전 지식: Ex.01 (폴링) + Ex.02 (이벤트) + Ex.03 (롱프레스) 🎯 핵심 함수:
XM_SetLedState/XM_SetLedEffect/XM_GetButtonState/XM_GetButtonEvent/XM_SetChannelLedRGB(Rev2.0)
xm_api_led_btn.h에 정의된 내장 UI(LED, Button) 제어 API에 대한 상세 레퍼런스입니다.
XM10 펌웨어는 사용자가 복잡한 타이머 인터럽트나 디바운싱(Debouncing) 로직을 직접 구현할 필요 없이, 직관적인 함수 호출만으로 깜빡임(Blink), 클릭(Click), 롱 프레스(Long Press) 등의 고급 입출력 기능을 구현할 수 있도록 돕습니다.
1. 동작 원리 (Operating Principle)¶
이 모듈은 시간 기반(Time-driven)으로 동작하며, 이를 위해 시스템 내부의 Manager들이 백그라운드에서 열심히 일하고 있습니다.
The Core Engine: XM_IO_Update()¶
- 역할: LED의 깜빡임 타이밍을 계산하고, 버튼의 신호를 분석하여 노이즈를 제거(Debouncing)하고 이벤트를 생성하는 엔진입니다.
- 구동: 시스템이 1 ms(1 kHz) 주기로 자동 호출하므로, 사용자가 직접 호출할 필요는 없으나 그 존재와 역할은 이해하고 있어야 합니다.
- 흐름:
- 사용자가
XM_SetLedEffect호출 -> 설정값 저장. XM_IO_Update주기적 실행 -> 시간이 흐름에 따라 LED ON/OFF 토글.- 사용자가 버튼 누름 ->
XM_IO_Update가 시간 측정 -> '클릭' 또는 '롱 프레스' 판단 후 이벤트 큐에 저장. - 사용자가
XM_GetButtonEvent호출 -> 큐에서 꺼내서 반환.
- 사용자가
2. 데이터 구조 (Enumerations)¶
사용 편의성을 위해 모든 식별자와 상태 값은 Enum으로 정의되어 있습니다. 숫자(0, 1, 2...) 대신 이 상수를 사용하세요.
2.1. Identifiers (식별자)¶
XmLedId_t¶
제어할 Function LED의 번호입니다.
typedef enum {
XM_LED_1 = 1, /**< 왼쪽 LED */
XM_LED_2 = 2, /**< 가운데 LED */
XM_LED_3 = 3 /**< 오른쪽 LED */
} XmLedId_t;
XmBtnId_t¶
입력을 확인할 Function Button의 번호입니다.
typedef enum {
XM_BTN_1 = 1, /**< 왼쪽 버튼 */
XM_BTN_2 = 2, /**< 가운데 버튼 */
XM_BTN_3 = 3 /**< 오른쪽 버튼 */
} XmBtnId_t;
2.2. State Types (상태 정의)¶
XmState_t¶
LED 등의 논리적인 On/Off 상태를 표현합니다.
XmBtnState_t¶
버튼의 현재 물리적 눌림 상태를 표현합니다. (회로의 Active-High/Low 여부와 상관없이 추상화됨)
typedef enum {
XM_RELEASED = 0, /**< 버튼이 떨어져 있음 (안 눌림) */
XM_PRESSED = 1 /**< 버튼이 눌려 있음 */
} XmBtnState_t;
2.3. Modes & Events (모드 및 이벤트)¶
XmLedMode_t¶
LED의 동작 패턴을 결정합니다.
| Mode | Description |
|---|---|
XM_LED_OFF |
LED를 끕니다. |
XM_LED_SOLID |
LED를 계속 켭니다. |
XM_LED_BLINK |
일정 주기(Period)로 깜빡입니다. (50% Duty) |
XM_LED_HEARTBEAT |
심장 박동처럼 두 번 빠르게 깜빡입니다. (두근-두근) |
XM_LED_ONESHOT |
설정한 시간만큼 한 번 켜졌다가 자동으로 꺼집니다. (알림용) |
XmBtnEvent_t¶
버튼 조작을 분석하여 생성된 고수준 이벤트입니다.
| Event | Description |
|---|---|
XM_BTN_NONE |
발생한 이벤트 없음 |
XM_BTN_PRESSED |
버튼을 막 누른 순간 (Rising Edge) |
XM_BTN_RELEASED |
버튼을 막 뗀 순간 (Falling Edge) |
XM_BTN_CLICK |
짧게 눌렀다 뗌 (클릭) |
XM_BTN_LONG_PRESS |
1초 이상 길게 누름 (모드 변경 등에 사용) |
3. 함수 상세 (Function Reference)¶
3.1. LED Control Functions¶
XM_SetLedState¶
LED를 단순히 켜거나 끕니다. 가장 직관적인 제어 함수입니다.
- Syntax
- Parameters
led_id: 제어할 LED (XM_LED_1\~3)state: 목표 상태 (XM_ON,XM_OFF)
- Example
XM_SetLedEffect¶
LED에 특수 효과(깜빡임 등)를 설정합니다. 설정 후에는 XM_IO_Update()에 의해 자동으로 동작하므로, 별도의 타이머 코드를 작성할 필요가 없습니다.
- Syntax
- Parameters
led_id: 제어할 LEDmode: 동작 모드 (XM_LED_BLINK,XM_LED_HEARTBEAT등)period_ms: 효과의 주기 또는 지속 시간 (밀리초 단위)BLINK: 깜빡임 주기 (예: 500 = 0.5초 간격)ONESHOT: 켜져 있는 시간 (예: 200 = 0.2초간 점등 후 소등)SOLID/OFF: 무시됨 (0 입력 권장)
- Example
3.2. Button Control Functions¶
XM_GetButtonState¶
버튼의 현재 물리적 상태를 실시간으로 확인합니다. (Polling 방식)
- Syntax
- Parameters
btn_id: 확인할 버튼 (XM_BTN_1\~3)
- Returns:
XM_PRESSED(눌림) 또는XM_RELEASED(안 눌림) - Example
XM_GetButtonEvent¶
버튼에서 발생한 최신 이벤트를 가져옵니다. (Event-Driven 방식)
이벤트를 한 번 읽으면 내부 큐에서 사라집니다 (Read-Clear). 따라서 변수에 저장해서 사용하거나 switch 문에서 사용하는 것이 좋습니다.
- Syntax
- Parameters
btn_id: 확인할 버튼
- Returns: 감지된 이벤트 (
XM_BTN_CLICK,XM_BTN_LONG_PRESS등) - Example
3.3. Channel LED (Rev2.0 전용)¶
XM_SetChannelLedRGB¶
Rev2.0 전용 — Rev1.1에서는 사용할 수 없습니다.
PCA9957 기반의 채널별 RGB LED를 제어합니다. 센서 모듈 연결 상태를 시각적으로 표시하는 데 사용합니다.
- Syntax
-
Parameters
이름 설명 ch채널 식별자 ( XM_CH_LED_EMG,XM_CH_LED_FES,XM_CH_LED_IMU,XM_CH_LED_HMMG,XM_CH_LED_GRF_L,XM_CH_LED_GRF_R,XM_CH_LED_USB)rRed 밝기 (0~255) gGreen 밝기 (0~255) bBlue 밝기 (0~255) -
Note:
r=0, g=0, b=0으로 설정하면 시스템 자동 제어로 복구됩니다. -
Example
3.4. System Functions¶
XM_IO_Update¶
[시스템 필수] LED와 버튼의 상태를 업데이트하는 구동 함수입니다.
제어 루프 task (Control_Loop) 에서 주기적으로 호출되어야(Control_Loop 또는 XM_TSM_Run 내부) Blink나 Long Press 기능이 정상 동작합니다.
- Syntax
- Note: 시스템이 입력을 수집하는 단계에서 자동으로 호출해주므로, 일반적인 경우 End User가 직접 호출할 필요는 없습니다.
⚠️ 흔한 실수¶
| 증상 | 원인 | 해결 |
|---|---|---|
| LED 가 깜빡 모드 설정했는데 동작 안 함 | XM_IO_Update 가 호출 안 됨 (제어 루프 task (Control_Loop) 가 멈췄거나 XM_TSM_Run 누락) |
시스템이 자동 호출하므로 사용자 코드가 무한 루프에 빠지지 않았는지 확인 |
GetButtonEvent 가 같은 이벤트를 여러 번 반환 |
Run_Loop 안에서 다른 곳에서도 GetButtonEvent 호출 (Read-Clear 동시 소비) |
한 이벤트 채널 = 한 곳에서만 읽기 |
XM_BTN_LONG_PRESS 가 트리거 안 됨 |
누르고 있는 시간 < 1초 | 1초 이상 유지 필요 |
SetLedEffect 후에 SetLedState 가 안 먹힘 |
효과 모드가 우선 — SetLedState 가 무시되거나 덮어써짐 |
SetLedEffect(LED, XM_LED_OFF, 0) 으로 효과 해제 후 사용 |
가운데/우측 버튼 누름이 안 잡히거나 엉뚱한 XM_BTN_N 으로 잡힘 |
보드 Rev 와 다른 ZIP 으로 빌드 — 내장 버튼 MCU 핀이 Rev 1.1 (PC10/11/12) 과 Rev 2.0 (PC11/12/13) 에서 한 칸 시프트되었기 때문 | 보드 라벨에서 본인 Rev 확인 후 같은 Rev 의 ZIP 으로 재 import (보드 리비전 비교) |
| Channel LED RGB 가 동작 안 함 | Rev1.1 사용 — PCA9957 미장착 | Rev2.0 전용 — Rev1.1 은 내장 LED 3개만 |
ONESHOT LED 가 1회 후에 다시 안 켜짐 |
의도된 동작 (One-shot) | 매번 다시 트리거하려면 이벤트마다 SetLedEffect 호출 |
관련 예제¶
| 예제 | 난이도 | LED/버튼 활용 |
|---|---|---|
| 00_Quick_Start | 입문 | 부팅 시퀀스 + 토글 |
| 01_Button_LED_Basic | 초급 | 폴링 상태 미러링 |
| 02_Button_LED_Event | 초급 | 이벤트 + ONESHOT |
| 03_Button_LED_FSM | 중급 | 롱프레스 + Heartbeat/Blink |
| 18_Debug_Monitor | 중급 | 진단 LED 패턴 |