Как показать значения АЦП на моем ЖК-экране с помощью TouchGFX? - PullRequest
1 голос
/ 03 ноября 2019

Я хотел бы показать значения АЦП на моем ЖК-экране на плате stm32f746G - DISCO . Основная проблема заключается в интеграции программного обеспечения TouchGFX. Это создает файлы модели, представления и презентатора, необходимые для вывода виджетов и подстановочных знаков. Я считаю, что правильно установил свой вывод АЦП, PF10, так как я могу получить значение АЦП в main.cpp, используя:

while (1)
   {
      HAL_ADC_Start(&hadc3);
      HAL_ADC_PollForConversion(&hadc3, 500);
      hullVoltage = HAL_ADC_GetValue(&hadc3)*0.00080586;
      HAL_Delay(1000);
   }

Но моя главная цель - показать это на моем ЖК-экране. У меня есть настройка touchGFX, где я могу ввести плавающий символ с подстановочным знаком в View.cpp. Например:

void Monitor_ScreenView::handleTickEvent()
{
     Unicode::snprintfFloat(textArea2Buffer, 4, "%f", 3.14f);
     textArea2.invalidate();
}

Я покажу вам мои cpp файлы моделей, представлений и презентаторов, чтобы продемонстрировать, где находится моя проблема.

model.cpp

#include <gui/model/Model.hpp>
#include <gui/model/ModelListener.hpp>

#ifndef SIMULATOR
#include "stm32746g_discovery.h"
#endif

void Model::getHullVoltage()
{
    HAL_ADC_Start(&hadc3);
    HAL_ADC_PollForConversion(&hadc3, 500);
    hullVoltage = HAL_ADC_GetValue(&hadc3);
}

View.cpp

#include <gui/monitor_screen_screen/Monitor_ScreenView.hpp>
#include <gui/model/Model.hpp>

#ifndef SIMULATOR
#include "stm32746g_discovery.h"
#endif

void Monitor_ScreenView::handleTickEvent()
{
     Unicode::snprintfFloat(textArea2Buffer, 4, "%f", presenter->getHullVoltage());
     textArea2.invalidate();
}

Presenter.cpp


#include <gui/monitor_screen_screen/Monitor_ScreenView.hpp>
#include <gui/monitor_screen_screen/Monitor_ScreenPresenter.hpp>

// my functions
float Monitor_ScreenPresenter::getHullVoltage()
{
    return(model->hullVoltage);
}

Единственная ошибка, которую я получаю из этой сборкиis "hadc3 не был объявлен в этой области" из model.cpp.

Я был бы очень любезен, если бы мог получить какую-либо информацию из моего кода. Помимо этого, мой код работает, так как я могу включать и выключать светодиод с помощью кнопки на сенсорном экране, я могу печатать плавающее на экране, где я хочу, и я могу получить значение АЦПв main.cpp. Мне просто нужно, чтобы он показывал на экране каждый тик.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2019

Код, написанный в классах представлений в приложении TouchGFX, должен быть переносимым, чтобы его можно было запускать в симуляторе или на цели. Например, если бы вы запускали приложение, используя gcc через конструктор TouchGFX в Windows, у вас были бы неразрешенные символы для HAL_ADC_. Замена кода вызовом предъявителя представлений, а затем и модели улучшит переносимость и лучше инкапсулирует функциональность, а не хранит ее в обработчике событий.

Хранение определенного кода цели внутри модели и защита его с помощью #ifdef SIMULATOR позволит вам запускать симулятор и целевые версии кода из события клавиатуры, тика или внешнего события из аппаратного обеспечения.

0 голосов
/ 05 ноября 2019

Мне кажется, я нашел ответ на свою проблему. В View.cpp я объявил hadc3 как внешний тип:

void Monitor_ScreenView::handleTickEvent()
{
    extern ADC_HandleTypeDef hadc3;
    float hullVoltage;


     HAL_ADC_Start(&hadc3);
     HAL_ADC_PollForConversion(&hadc3, 500);
     hullVoltage = HAL_ADC_GetValue(&hadc3)*0.00080586;

     Unicode::snprintfFloat(textArea2Buffer, 4, "%f", hullVoltage);
     textArea2.invalidate();
}

Я не думаю, что другие файлы были нужны! Приветствия ProXicT и переполнение стека.

...