|
 |
| ¸ñ·ÏÀ¸·Î °¡±â.. |
|
STM TouchGFX¼³°èÇÒ¶§ main¿¡¼ View¿¡ Á¢±ÙÇÏ´Â ¼ø¼ |
±èÁ¾È£
|
»èÁ¦Çϱâ
|
|
'TouchGFX´Â ÀÌ ¹®Á¦¸¦ ÇØ°áÇϱâ À§ÇØ Model::tick()À̶ó´Â ÇÔ¼ö¸¦ Á¦°øÇÕ´Ï´Ù.
ÀÌ ÇÔ¼ö´Â ȸé ÁÖ»çÀ²¿¡ ¸ÂÃç 1ÃÊ¿¡ ¾à 60¹ø¾¿ UI ½º·¹µå ³»ºÎ¿¡¼ ÀÚµ¿À¸·Î ½ÇÇàµË´Ï´Ù.
µû¶ó¼ main.c¿¡¼´Â º¯¼ö°ª¸¸ ¹Ù²ãµÎ°í, Model::tick()ÀÌ ±× º¯¼ö¸¦ °¨½Ã(Polling)ÇÏ´Ù°¡ °ªÀÌ º¯Çϸé Presenter¸¦ ÅëÇØ View(ȸé)·Î Àü´ÞÇÏ´Â ¹æ½ÄÀ» »ç¿ëÇØ¾ß ÇÕ´Ï´Ù.
À̹ø¿¡µµ ÇÑ ¹ø¿¡ º¹»çÇÏ½Ç ¼ö ÀÖµµ·Ï Àüü ±¸Çö Äڵ带 ¸¶Å©´Ù¿î ºí·ÏÀ¸·Î Á¤¸®ÇØ µå¸³´Ï´Ù. (¿¹: ¼¾¼ °ªÀ» Àоî¿Í¼ ȸéÀÇ ÅØ½ºÆ®¸¦ ¾÷µ¥ÀÌÆ®ÇÏ´Â »óȲ)'
### 1. C ¾ð¾î ¿µ¿ª: µ¥ÀÌÅÍ Á¦°ø (`main.c`)
Çϵå¿þ¾î °ªÀ» ´ãÀ» º¯¼ö¿Í, ±× °ªÀ» ¹ÝÈ¯ÇØÁÙ Getter ÇÔ¼ö¸¦ ¸¸µì´Ï´Ù.
**`Core/Src/main.c`**
```c
/* USER CODE BEGIN 0 */
int hw_sensor_value = 0; // Çϵå¿þ¾î¿¡¼ ¾÷µ¥ÀÌÆ®ÇÒ º¯¼ö
// C++ ¿µ¿ª(Model)¿¡¼ °ªÀ» Àо ¼ö ÀÖµµ·Ï Á¦°øÇÏ´Â ÇÔ¼ö
int get_sensor_value(void)
{
return hw_sensor_value;
}
/* USER CODE END 0 */
```
---
### 2. Model ¿µ¿ª: µ¥ÀÌÅÍ °¨½Ã ¹× Àü´Þ (`Model.hpp` / `Model.cpp`)
`Model::tick()`¿¡¼ 1ÃÊ¿¡ 60¹ø¾¿ `get_sensor_value()`¸¦ È®ÀÎÇÕ´Ï´Ù.
**`gui/include/gui/model/Model.hpp`**
```cpp
#ifndef MODEL_HPP
#define MODEL_HPP
// 1. main.c¿¡ ÀÖ´Â C ÇÔ¼ö ¼±¾ð
extern "C" {
int get_sensor_value(void);
}
class ModelListener;
class Model
{
public:
Model();
void bind(ModelListener* listener) { modelListener = listener; }
// 1ÃÊ¿¡ 60¹ø¾¿ ÀÚµ¿ ½ÇÇàµÇ´Â ÇÔ¼ö
void tick();
protected:
ModelListener* modelListener;
// ÀÌÀü °ªÀ» ±â¾ïÇØµÑ º¯¼ö (°ªÀÌ º¯ÇßÀ» ¶§¸¸ ¾÷µ¥ÀÌÆ®Çϱâ À§ÇÔ)
int last_sensor_value;
};
#endif // MODEL_HPP
```
**`gui/src/model/Model.cpp`**
```cpp
#include
#include
Model::Model() : modelListener(0), last_sensor_value(0)
{
}
void Model::tick()
{
// ¸Å ÇÁ·¹ÀÓ¸¶´Ù Çϵå¿þ¾î °ªÀ» Àоî¿È
int current_value = get_sensor_value();
// °ªÀÌ ÀÌÀü°ú ´Þ¶óÁ³À» ¶§¸¸ UI ¾÷µ¥ÀÌÆ® ¿äû
if (current_value != last_sensor_value)
{
last_sensor_value = current_value;
// Listener(Presenter)°¡ ¿¬°áµÇ¾î ÀÖ´Ù¸é µ¥ÀÌÅÍ Àü´Þ
if (modelListener != 0)
{
modelListener->sensorValueChanged(current_value);
}
}
}
```
---
### 3. ModelListener ¿µ¿ª: ÀÎÅÍÆäÀ̽º Á¤ÀÇ (`ModelListener.hpp`)
ModelÀÌ Presenter¸¦ È£ÃâÇÒ ¼ö ÀÖµµ·Ï ¾à¼Ó(°¡»ó ÇÔ¼ö)À» Á¤ÀÇÇÕ´Ï´Ù. **(ÀÌ ºÎºÐÀ» ³õÄ¡´Â °æ¿ì°¡ ¸¹À¸´Ï ÁÖÀÇÇϼ¼¿ä!)**
**`gui/include/gui/model/ModelListener.hpp`**
```cpp
#ifndef MODELLISTENER_HPP
#define MODELLISTENER_HPP
#include
class ModelListener
{
public:
ModelListener() : model(0) {}
virtual ~ModelListener() {}
void bind(Model* m) { model = m; }
// Model¿¡¼ È£ÃâÇÒ °¡»ó ÇÔ¼ö Ãß°¡ (ºó °ýÈ£ {} ·Î ±âº» ±¸Çö Çʼö)
virtual void sensorValueChanged(int newValue) {}
protected:
Model* model;
};
#endif // MODELLISTENER_HPP
```
---
### 4. Presenter ¿µ¿ª: View·Î Áß°è (`Presenter.hpp` / `Presenter.cpp`)
Model¿¡¼ ¿Ã¶ó¿Â µ¥ÀÌÅ͸¦ ȸé(View)À¸·Î ³Ñ°ÜÁÝ´Ï´Ù.
**`gui/include/gui/screen1_screen/Screen1Presenter.hpp`**
```cpp
// ... ±âÁ¸ ÄÚµå »ý·« ...
class Screen1Presenter : public touchgfx::Presenter, public ModelListener
{
public:
// ... ±âÁ¸ ÄÚµå ...
// ModelListener¿¡ ¼±¾ðÇÑ ÇÔ¼ö ¿À¹ö¶óÀ̵ù
virtual void sensorValueChanged(int newValue);
};
```
**`gui/src/screen1_screen/Screen1Presenter.cpp`**
```cpp
// ... ±âÁ¸ ÄÚµå »ý·« ...
// Model¿¡¼ °ªÀÌ ¹Ù²î¸é ÀÌ ÇÔ¼ö°¡ È£ÃâµÊ
void Screen1Presenter::sensorValueChanged(int newValue)
{
// ViewÀÇ UI °»½Å ÇÔ¼ö È£Ãâ
view.updateSensorText(newValue);
}
```
---
### 5. View ¿µ¿ª: ÃÖÁ¾ È¸é °»½Å (`View.hpp` / `View.cpp`)
ȸ鿡 ÀÖ´Â ÅØ½ºÆ® À§Á¬(¿¹: `textArea1`)ÀÇ ¼ýÀÚ¸¦ ¹Ù²ß´Ï´Ù.
**`gui/include/gui/screen1_screen/Screen1View.hpp`**
```cpp
// ... ±âÁ¸ ÄÚµå »ý·« ...
class Screen1View : public Screen1ViewBase
{
public:
// ... ±âÁ¸ ÄÚµå ...
// Presenter°¡ È£ÃâÇÒ UI ¾÷µ¥ÀÌÆ® ÇÔ¼ö
void updateSensorText(int newValue);
};
```
**`gui/src/screen1_screen/Screen1View.cpp`**
```cpp
// ... ±âÁ¸ ÄÚµå »ý·« ...
// Designer¿¡¼ ¼³Á¤ÇÑ Wildcard Buffer°¡ ÄÑÁ® ÀÖ¾î¾ß ÇÕ´Ï´Ù.
void Screen1View::updateSensorText(int newValue)
{
// Á¤¼ö¸¦ ÅØ½ºÆ® ¹öÆÛ¿¡ Æ÷¸ËÆÃ (Designer¿¡¼ Wildcard ¼³Á¤ Çʼö)
Unicode::snprintf(textArea1Buffer, TEXTAREA1_SIZE, "%d", newValue);
// ÇØ´ç ÅØ½ºÆ® À§Á¬À» ´Ù½Ã ±×¸®µµ·Ï(Redraw) ¿äû
textArea1.invalidate();
}
```
|
| 
|