cancel
Showing results for 
Search instead for 
Did you mean: 

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

koderboi22
Associate III

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
 
 

 

21 REPLIES 21

Hello again,
Unfortunately, I can see there is an issue with adding additional sources to the simulator Makefile. I suggest placing your files (Mytest.h and Mytest.c) inside the gui/include/gui/common and gui/src/common respectively for testing (although, it ruins the purpose of calling MathOP from the Model.cpp, but still it is a test). 
But, when you want to flash your board with the GUI, remember to add the correct include and the function call under the #ifndef SIMULATOR guard. 

Sorry for the inconvenience, we will try to fix that issue as soon as possible. 

Good luck

Mohammad MORADI
ST Software Developer | TouchGFX

Hi Mohammad, yes I've added my files into the gui and tried adding the correct includes and the function to call under the #ifndef SIMULATOR guard but that didn't work either. I've started the project again and provided the files and what we have done again, please have a look and let me know if there is anyway around the issue, that would help. Thank you.

 

I added a new source and header file (.cpp and .hpp) with the following locations: 
 
"C:\TouchGFXProjects\Test1\CM7\TouchGFX\gui\src\model\MathOperations.cpp"
"C:\TouchGFXProjects\Test1\CM7\TouchGFX\gui\include\gui\model\MathOperations.hpp"
 
We added these files in the default project that was initiated by Touch GFX Designer. In these MathOperations.cpp file we have two functions, addition and subtraction, which are being called in the model.cpp file to perform the arithmetic operations.
 
Below is the code for both MathOperations.cpp and Model.cpp:
 
MathOperations.cpp

 

#include "../../include/gui/model/MathOperations.hpp"

#include <cstdint>

uint16_t MathOperations::Addition(uint16_t x, uint16_t y) {

   return x+y;

}


uint16_t MathOperations::Subtraction(uint16_t a, uint16_t b) {

   return a-b;

}

 

 

Model.cpp

 

#include <gui/model/Model.hpp>

#include <gui/model/ModelListener.hpp>

#include "../../include/gui/model/MathOperations.hpp"

Model::Model() : modelListener(0)
{

}


void Model::tick()
{

}

// Define the MathTest function for the Model class

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

uint16_t Result = MathOperations::Addition(x, y);

   modelListener->GetResult(Result);

   return Result;

}

uint16_t Model::MathTest1(uint16_t a, uint16_t b) {

   uint16_t Result = MathOperations::Subtraction(a, b);

   modelListener->GetResult(Result);

   return Result;

}

 

 

Currently, the code builds fine with no error at simulator and does what its intended for. When the yellow button is pressed, we get the sum of the values (The values which were passed from Screen1View ).

Similarly, when the blue button is pressed, we get the difference of the values.

 

image (1).png

 

Problem: 
When I include 'main.h' or any other files that are in core (such as gpio.h, spi.h, ...), inside the gui folder (MathOperations.cpp), the project builds fine in the IDE but shows an error in the simulator. We will be needing the core files in our projects and therefore we need to be able to link them with the gui files.
 
This is the error I get in the simulator:
 
 koderboi22_1-1710154102010.png
I tried creating a source and header file in core but the error still persists. From what I understand, the issue seems to be with the paths since we are not able to call the files from one directory to another (Core -> Gui).
 
Waiting to hear from you.