./../
  I D :    암호 :    ID저장      회원가입    네게(쥔장) 쪽지보내기    메모장    각종계산기    컬러빠렛    이모티콘(프레임, 새창)    보유장비
목록으로 가기..
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(); } ```

첨언 달기
이름 : 암호 :
번호    제목...(첨언) 작성일 접속
xxx [공지]자유겔러리 등록 오류 수정 완료 2017-12-22 685172
xxx [공지]자료실 다운로드 오류 처리 2017-12-01 31085
xxx [공지]비난, 광고 게시물을 신고, 차단, 삭제됩니다. 2005-06-26 26850
257 [일반]  VS Code에서 Google AI 사용할때 자동 agree 2026-10-02(금) 39
256 [C#]  asp.net .net core connectionString Encryption 표준 암호화 방법 2026-09-24(목) 51
255 [CPP]  MS Windows 64bit Time Converter 2026-09-23(수) 67
254 [M D]  STM32H747I-DISCO 이더넷(RMII) 및 LwIP 완벽 구현 및 트러블슈팅 가이드 2026-09-17(목) 105
253 [일반]  .net core Web 생성하면 나오는 구조 2026-09-12(토) 81
252 [M D]  STM32 개발 때 다양한 USB CDCs 사용CDC, CP210x, FTDI, CH34x, PL2303) 2026-09-11(금) 86
251 [M D]  STM32H747I-DISCO CP2102 USB Host 트러블슈팅 종합 보고서 2026-09-11(금) 75
250 [일반]  STM32H747I-DISCO에서 STM32CubeMX 템플릿때문에 USB OTG 문제 발생할때 2026-09-10(목) 111
249 [M D]  TouchGFX에서 버튼같은거 삭제 했을때 make: *** No rule to make target.. 오류 2026-08-20(목) 143
248 [M D] > STM TouchGFX설계할때 main에서 View에 접근하는 순서 < 2026-08-16(일) 120
247 [M D]  STM TouchGFX설계할때 View가 main에 접근하는 순서 2026-08-16(일) 165
246 [M D]  MCU Task관리할때 필요한 세마포어(Semaphore)와 뮤텍스(Mutex) 2026-08-09(일) 156
245 [M D]  STM32F 마이컴 공부할때 RAM에 올려서 시험하기.(속도 빠름) 2026-08-08(토) 161
244 [일반]  STM32F767과 FreeRTOS를 이용해 설계할때 Time base Source는? 2026-08-08(토) 150
243 [일반]  VSCode로 STM32 개발할때 printf에서 실수 출력 안되면 2026-07-16(목) 1017
242 [일반]  VisualStudio으로 만든 프로그램 .net 버전 올리기 위해 2026-07-02(목) 1235
241 [C#]  c# winform에서 URL QR생성 2026-06-30(화) 1078
240 [일반]  VC 컴파일할때 솔류션 폴더에 컴파일된 파일이 생성될때 2026-06-29(월) 484
239 [XML]  IIS 8.0 이상 IP 차단 web.config 설정 2026-06-13(토) 181
238 [일반]  C#.net 6이상 빌트할때 TargetFramework 폴더 생기는거 없애기 2026-04-16(목) 525
검색 :
Page : 이전 1  2  3  4  5  6  7  8  9  10  11  12  13  다음




Copyright 2003-2026 ⓒ 김종호. All rights reserved. kimjongho.co.kr kimjongho.kr kimjongho.net kimjongho.com