# LED를 터치에서 제어하는 예제
### 1. TouchGFX Designer 설정 (이벤트 생성)
1. 화면에 **Button** 추가
2. Interactions 탭에서 **Add Interaction** 클릭
3. Trigger: **Button is clicked**
4. Action: **Call new virtual function**
5. Function Name: **`toggleLed`** 입력 후 **Generate Code** 클릭
---
### 2. C 언어 영역: 하드웨어 제어 함수 작성 (`main.c`)
STM32 HAL 제어 코드는 C++ 영역으로 넘기지 않고 `main.c`에 캡슐화합니다.
**`Core/Src/main.c`**
```c
/* USER CODE BEGIN 4 */
// TouchGFX에서 호출할 하드웨어 제어 함수
void hw_ToggleLD1(void)
{
HAL_GPIO_TogglePin(GPIOI, GPIO_PIN_12);
}
/* USER CODE END 4 */
```
---
### 3. Model 영역: 외부 C 함수 연결 및 호출 (`Model.hpp` / `Model.cpp`)
`main.h`를 인클루드하지 않고, `extern "C"`를 사용하여 `main.c`에서 만든 함수를 링킹(Linking)합니다.
**`gui/include/gui/model/Model.hpp`**
```cpp
#ifndef MODEL_HPP
#define MODEL_HPP
// 1. C 언어로 작성된 외부 함수를 C++ 컴파일러가 인식할 수 있도록 선언
extern "C" {
void hw_ToggleLD1(void);
}
class ModelListener;
class Model
{
public:
Model();
void bind(ModelListener* listener) { modelListener = listener; }
void tick();
// 2. Presenter에서 호출될 함수 선언
void toggleLed();
protected:
ModelListener* modelListener;
};
#endif // MODEL_HPP
```
**`gui/src/model/Model.cpp`**
```cpp
#include
#include
Model::Model() : modelListener(0)
{
}
void Model::tick()
{
}
// 3. 외부 C 함수 호출
void Model::toggleLed()
{
hw_ToggleLD1();
}
```
---
### 4. Presenter 영역: View와 Model 연결 (`Presenter.hpp` / `Presenter.cpp`)
View에서 올라온 명령을 Model로 넘겨줍니다. (화면 이름이 `Screen1`인 경우)
**`gui/include/gui/screen1_screen/Screen1Presenter.hpp`**
```cpp
#ifndef SCREEN1PRESENTER_HPP
#define SCREEN1PRESENTER_HPP
#include
#include
using namespace touchgfx;
class Screen1View;
class Screen1Presenter : public touchgfx::Presenter, public ModelListener
{
public:
Screen1Presenter(Screen1View& v);
virtual void activate();
virtual void deactivate();
virtual ~Screen1Presenter() {}
// View에서 호출될 함수 선언
void toggleLed();
private:
Screen1Presenter();
Screen1View& view;
};
#endif // SCREEN1PRESENTER_HPP
```
**`gui/src/screen1_screen/Screen1Presenter.cpp`**
```cpp
#include
#include
Screen1Presenter::Screen1Presenter(Screen1View& v)
: view(v)
{
}
void Screen1Presenter::activate()
{
}
void Screen1Presenter::deactivate()
{
}
// Model의 함수 호출
void Screen1Presenter::toggleLed()
{
model->toggleLed();
}
```
---
### 5. View 영역: UI 이벤트 수신 및 전달 (`View.hpp` / `View.cpp`)
Designer에서 생성한 가상 함수를 실제로 구현합니다.
**`gui/include/gui/screen1_screen/Screen1View.hpp`**
```cpp
#ifndef SCREEN1VIEW_HPP
#define SCREEN1VIEW_HPP
#include
#include
class Screen1View : public Screen1ViewBase
{
public:
Screen1View();
virtual ~Screen1View() {}
virtual void setupScreen();
virtual void tearDownScreen();
// Designer에서 설정한 가상 함수 오버라이딩
virtual void toggleLed();
protected:
};
#endif // SCREEN1VIEW_HPP
```
**`gui/src/screen1_screen/Screen1View.cpp`**
```cpp
#include
Screen1View::Screen1View()
{
}
void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
}
void Screen1View::tearDownScreen()
{
Screen1ViewBase::tearDownScreen();
}
// 버튼 클릭 시 호출되어 Presenter로 명령 전달
void Screen1View::toggleLed()
{
presenter->toggleLed();
}
```