Skip to main content
Associate II
February 28, 2024
Question

Custom project set up using Touch GFX on Riverdi STM32H7 Embedded Display

  • February 28, 2024
  • 4 replies
  • 5126 views

I have generated a new project with Touch GFX Designer where I created a text area and also created a button, to which I have linked an interaction. This interaction will call on a new virtual function which I then plan on integrating with my external project files. I've created my projects .c and .h files in which I'm writing a simple arithmetic calculation. Note that my project files are in C whereas the Touch GFX generated files are in C++, I now want to call the arithmetic function in the model.cpp file and I'm unable to run the simulator on the Designer as it gives me an error. 

File Path for Touch GFX generated files -> C:\TouchGFXProjects\MyApplication_2\CM7\TouchGFX\gui\src

Below are the files:

 

view.cpp 
#include <gui/screen1_screen/Screen1View.hpp>



Screen1View::Screen1View()

{



}



void Screen1View::setupScreen()

{

 Screen1ViewBase::setupScreen();



}



void Screen1View::tearDownScreen()

{

 Screen1ViewBase::tearDownScreen();

}



void Screen1View::ButtonClicked(){

 presenter->MathTest(7, 4);



}



void Screen1View::GetResult(uint16_t Result){



 char buffer[20]; // Adjust the buffer size as needed

 snprintf(buffer, sizeof(buffer), "%u", Result);

 Unicode::strncpy(textArea1Buffer, buffer, TEXTAREA1_SIZE);

 textArea1.invalidate();

}

 

 

view.hpp 

#ifndef SCREEN1VIEW_HPP

#define SCREEN1VIEW_HPP

#include <gui_generated/screen1_screen/Screen1ViewBase.hpp>

#include <gui/screen1_screen/Screen1Presenter.hpp>

#include <cstdio>


class Screen1View : public Screen1ViewBase

{

public:

 Screen1View();

 virtual ~Screen1View() {}

 virtual void setupScreen();

 virtual void tearDownScreen();

 void ButtonClicked(); //remove virtual

 void GetResult(uint16_t Result);

protected:

};


#endif // SCREEN1VIEW_HPP

 

 

 

presenter.cpp 
#include <gui/screen1_screen/Screen1View.hpp>

#include <gui/screen1_screen/Screen1Presenter.hpp>


Screen1Presenter::Screen1Presenter(Screen1View& v)

 : view(v)

{

}


void Screen1Presenter::activate()

{

}


void Screen1Presenter::deactivate()

{

}


void Screen1Presenter::MathTest(uint16_t x, uint16_t y)

{

model->MathTest(x,y);

}


void Screen1Presenter::GetResult(uint16_t Result)

{

view.GetResult(Result);

}

 

 

 

presenter.hpp 
#ifndef SCREEN1PRESENTER_HPP

#define SCREEN1PRESENTER_HPP



#include <gui/model/ModelListener.hpp>

#include <mvp/Presenter.hpp>



using namespace touchgfx;



class Screen1View;



class Screen1Presenter : public touchgfx::Presenter, public ModelListener

{

public:

 Screen1Presenter(Screen1View& v);



 /**

 * The activate function is called automatically when this screen is "switched in"

 * (ie. made active). Initialization logic can be placed here.

 */

 virtual void activate();



 /**

 * The deactivate function is called automatically when this screen is "switched out"

 * (ie. made inactive). Teardown functionality can be placed here.

 */

 virtual void deactivate();



 virtual ~Screen1Presenter() {}



 virtual void MathTest(uint16_t x, uint16_t y);

 // ModelListener callback

 virtual void GetResult(uint16_t result);



private:

 Screen1Presenter();



 Screen1View& view;

};



#endif // SCREEN1PRESENTER_HPP

 

Model.cpp 

#include <gui/model/Model.hpp>

#include <gui/model/ModelListener.hpp>





#ifndef SIMULATOR

#include "Mytest.h"

#include "stdio.h"

#endif



Model::Model() : modelListener(0)

{



}



void Model::tick()

{



}

uint16_t Model::MathTest(uint16_t x, uint16_t y)

{

#ifdef SIMULATOR

 uint16_t Result = MathOp(x,y);///

 modelListener->GetResult(Result);

 return Result;

#else

 return 0.0;

#endif

}

 

 Model.hpp 
#ifndef MODEL_HPP

#define MODEL_HPP



#include <cstdint>



class ModelListener;



class Model

{

public:

 Model();



 void bind(ModelListener* listener)

 {

 modelListener = listener;

 }



 void tick();

 uint16_t MathTest(uint16_t x, uint16_t y);



protected:

 ModelListener* modelListener;

};



#endif // MODEL_HPP

 

 

A source file (Mytest.c) -> C:\TouchGFXProjects\MyApplication_2\CM7\Core\Src

Myfile.h -> C:\TouchGFXProjects\MyApplication_2\CM7\Core\Inc

 

#include "Mytest.h"


uint16_t MathOp(uint16_t x, uint16_t y)

{

return x+y;

}

 

#ifndef APPLICATION_USER_CORE_MYTEST_H_

#define APPLICATION_USER_CORE_MYTEST_H_


#include <stdint.h> // Include <cstdint> for uint16_t


uint16_t MathOp(uint16_t x, uint16_t y);



#endif /* APPLICATION_USER_CORE_MYTEST_H_ */

 

 

 

The function MathOp was created for the arithmetic calculation which was called in the model.cpp file. Below is the error from the simulator on Touch GFX Designer:

 

Compile
        make -f simulator/gcc/Makefile -j8
        Reading ./application.config
        Reading ./target.config
        Compiling gui/src/model/Model.cpp
        gui/src/model/Model.cpp: In member function 'uint16_t Model::MathTest(uint16_t, uint16_t)':
        gui/src/model/Model.cpp:22:23: error: 'MathOp' was not declared in this scope
             uint16_t Result = MathOp(x,y);///
                               ^~~~~~
        gui/src/model/Model.cpp:22:23: note: suggested alternative: 'MathTest'
             uint16_t Result = MathOp(x,y);///
                               ^~~~~~
                               MathTest
        generated/simulator/gcc/Makefile:196: recipe for target 'build/MINGW32_NT-6.2/gui/src/model/Model.o' failed
        make[2]: *** [build/MINGW32_NT-6.2/gui/src/model/Model.o] Error 1
        make[2]: *** Waiting for unfinished jobs....
        generated/simulator/gcc/Makefile:155: recipe for target 'generate_assets' failed
        make[1]: *** [generate_assets] Error 2
        make: *** [all] Error 2
        simulator/gcc/Makefile:32: recipe for target 'all' failed
        Failed
    Failed
 
 
@Smartembedded 
@Mohammad MORADI ESFAHANIASL 
@JTP1 
@mƎALLEm 
@Yoann KLEIN 

 

This topic has been closed for replies.

4 replies

Associate II
February 28, 2024

@SGill.5 

 

mƎALLEm
Technical Moderator
February 28, 2024

Normally you need to add the files and include paths related to your algorithm to the makefile under the path: simulator\gcc\Makefile

Example:

 

ADDITIONAL_SOURCES := ../Core/Src/Blabla.c
ADDITIONAL_INCLUDE_PATHS := ../Core/Inc

 

 

"To give better visibility on the answered topics, please click on ""Accept as Solution"" on the reply which solved your issue or answered your question."
mƎALLEm
Technical Moderator
February 28, 2024

@koderboi22  did this answer your question?

"To give better visibility on the answered topics, please click on ""Accept as Solution"" on the reply which solved your issue or answered your question."
mƎALLEm
Technical Moderator
February 28, 2024

Just a question: are you sure about the paths you added in the makefile?

"To give better visibility on the answered topics, please click on ""Accept as Solution"" on the reply which solved your issue or answered your question."
Associate II
February 28, 2024

Yes, I'm certain. I will give it another check and update on this.

 

Graduate II
February 28, 2024

Hello

You probably must also define MathOp-func as extern "C" in Mytest.h since it is called from cpp-module.

Br JTP

Associate II
February 28, 2024

Yes we've tried that but it didn't seem to work, I will give it another go with the files above and get back to you.

ST Employee
February 28, 2024

Hello @koderboi22 ,

Your architecture is correct, however, you have defined the include files to be called when the simulator is not running and then you have set to call the function MathOp when the simulator is running. So, if you like to test your code in simulator, you should either remove the Marcos for the simulator or set them both to #ifdef simulator

I hope this helps you, don't hesitate to ask more questions.

mƎALLEm
Technical Moderator
February 28, 2024

@Mohammad MORADI ESFAHANIASL 

Indeed, I didn't see this part of code:

#ifndef SIMULATOR

#include "Mytest.h"

#include "stdio.h"

#endif

 I focused on the makefile!

"To give better visibility on the answered topics, please click on ""Accept as Solution"" on the reply which solved your issue or answered your question."