2024-07-18 1:29 PM - edited 2024-07-18 1:33 PM
Hello,
i want to render frequency spectrum FFT in the small area of screen and handle touch in this area. This should be done by some custom widget/container. Can you help me how to do it?
Best Regards,
Petr
2025-01-06 12:41 AM
Hello @Petr3 ,
I assume you put your FFT graph inside a custom container.
You can just call
setTouchable(true);
in the setupScreen function of that custom container to enable touch on it.
This way you will be able to use the handleDragEvent and HandleClickEvent.
If you want to see how to use these 2 functions, have a look at this custom container example .
Regards,
2025-01-21 5:02 AM
Hello @Petr3 ,
Have you been able to move forward on your project?
Regards,
2025-01-21 11:08 AM - edited 2025-01-21 11:08 AM
Hello @GaetanGodart ,
yes a little bit. I created some space for dynamic bitmaps in the third bank of my SDRAM(in the second bank it doesn't work probably due to some TouchGFX protection/usage, screen buffer is located in the first bank):
FrontendApplication::FrontendApplication(Model& m, FrontendHeap& heap)
: FrontendApplicationBase(m, heap)
{
#ifdef SIMULATOR
const uint32_t cacheSize = 0x100000; //1 MB, as example
uint16_t* const cacheStartAddr = (uint16_t*)malloc(cacheSize);
Bitmap::setCache(cacheStartAddr, cacheSize, 4);
#else
// Place cache start address in SDRAM at address 0x60400000;
uint16_t* const cacheStartAddr = (uint16_t*)0x60400000;
const uint32_t cacheSize = 0x100000; //1 MB, as example
Bitmap::setCache(cacheStartAddr, cacheSize,4);
#endif
}
Next i insterted manually image13 in my ScreenView:
private:
Image image13;
Then i created bitmap in setupScreen:
void SDRScreenView::setupScreen()
{
SDRScreenViewBase::setupScreen();
BitmapId bmpId;
//Create (16bit) dynamic bitmap of size 100x150
const int width = 600;
const int height = 300;
bmpId = Bitmap::dynamicBitmapCreate(600, 300, Bitmap::RGB565);
//set all pixels white
if (bmpId != BITMAP_INVALID)
{
memset(Bitmap::dynamicBitmapGetAddress(bmpId), 0xFF, width*height*2);
}
//Make Image widget show the dynamic bitmap
image13.setBitmap(Bitmap(bmpId));
//Position image and add to View
image13.setXY(100, 100);
add(image13);
}
And finally fill it with single color:
void SDRScreenView::setWifi(bool state)
{
IMAGES_wifi_active.setVisible(state);
IMAGES_wifi_active.invalidate();
static bool state_prev;
if (state != state_prev)
{
static BitmapId bmpId;
const int width = 600;
const int height = 300;
Bitmap::dynamicBitmapDelete(bmpId);
bmpId = Bitmap::dynamicBitmapCreate(600, 300, Bitmap::RGB565);
if (bmpId != BITMAP_INVALID)
{
if(state) memset(Bitmap::dynamicBitmapGetAddress(bmpId), 0xFF, width*height*2);
else memset(Bitmap::dynamicBitmapGetAddress(bmpId), 0x55, width*height*2);
}
image13.setBitmap(Bitmap(bmpId));
image13.invalidate();
//image13.setXY(100, 100);
//add(image13);
}
state_prev = state;
}
The big rectangle is showed and changes color based on state variable.
Now i want to continue with create some touch "zones" inside this rectangle and call functions based on different locations inside of it.
2025-02-18 7:19 AM
Hello @Petr3 ,
I am not sure why you are doing everything by hand.
Couldn't you use the graph widget and put it inn a custom container and use the handleClickEvent?
Regards,
2025-03-07 12:57 PM - edited 2025-03-07 3:56 PM
Hello @GaetanGodart ,
maybe i could, this is my first project with TouchGFX. So i dont have any experience with it and i dont know about possibilities of built-in components.
Problem is that i have written older project without TouchGFX as direct writing of pixels into screen memory from application. Now i want to convert it or add it into TouchGFX framework.
The spectrum and waterfall that i mentioned above are refreshed every 100ms. This is not typical curve graph, it is something like histogram collored based on signal level. Waterfall is more different from typical graph too. This is the reason why i want to render graph with the same approach(generate screen/graph pixel by pixel in application and validate it for TouchGFX).
Petr3