Files
tft-ssd1351-template/ui/ui.ino
2024-07-01 22:38:28 +02:00

100 lines
2.7 KiB
C++
Executable File

//Arduino-TFT_eSPI board-template main routine. There's a TFT_eSPI create+flush driver already in LVGL-9.1 but we create our own here for more control (like e.g. 16-bit color swap).
#include <lvgl.h>
#include <TFT_eSPI.h>
#include <ui.h>
static const uint16_t screenWidth = 128;
static const uint16_t screenHeight = 128;
enum { SCREENBUFFER_SIZE_PIXELS = screenWidth * screenHeight };
uint16_t *buf = (uint16_t*)calloc(SCREENBUFFER_SIZE_PIXELS * 3, sizeof(uint16_t));
TFT_eSPI tft = TFT_eSPI( screenWidth, screenHeight ); /* TFT instance */
/* Display flushing */
void my_disp_flush (lv_display_t *disp, const lv_area_t *area, uint8_t *pixelmap)
{
uint32_t w = ( area->x2 - area->x1 + 1 );
uint32_t h = ( area->y2 - area->y1 + 1 );
size_t len = lv_area_get_size( area );
lv_draw_sw_rgb565_swap( pixelmap, len );
tft.startWrite();
tft.setAddrWindow( area->x1, area->y1, w, h );
tft.pushImageDMA(area->x1, area->y1, w, h, (uint16_t*) pixelmap);
tft.endWrite();
lv_disp_flush_ready( disp );
}
/*Read the touchpad*/
void my_touchpad_read (lv_indev_t * indev_driver, lv_indev_data_t * data)
{
uint16_t touchX = 0, touchY = 0;
bool touched = false;//tft.getTouch( &touchX, &touchY, 600 );
if (!touched)
{
data->state = LV_INDEV_STATE_REL;
}
else
{
data->state = LV_INDEV_STATE_PR;
/*Set the coordinates*/
data->point.x = touchX;
data->point.y = touchY;
Serial.print( "Data x " );
Serial.println( touchX );
Serial.print( "Data y " );
Serial.println( touchY );
}
}
/*Set tick routine needed for LVGL internal timings*/
static uint32_t my_tick_get_cb (void) { return millis(); }
void setup ()
{
Serial.begin( 115200 ); /* prepare for possible serial debug */
delay(3000);
lv_init();
tft.begin(); /* TFT init */
tft.initDMA();
tft.setRotation( 3 ); /* Landscape orientation, flipped */
static lv_disp_t* disp;
disp = lv_display_create( screenWidth, screenHeight );
lv_display_set_buffers( disp, buf, NULL, SCREENBUFFER_SIZE_PIXELS * sizeof(uint16_t)*3, LV_DISPLAY_RENDER_MODE_FULL );
lv_display_set_flush_cb( disp, my_disp_flush );
static lv_indev_t* indev;
indev = lv_indev_create();
lv_indev_set_type( indev, LV_INDEV_TYPE_POINTER );
lv_indev_set_read_cb( indev, my_touchpad_read );
lv_tick_set_cb( my_tick_get_cb );
ui_init();
String LVGL_Hello = String('V') + lv_version_major() + "." + lv_version_minor() + "." + lv_version_patch();
Serial.println( LVGL_Hello );
Serial.println( "Setup done" );
}
void loop()
{
lv_timer_handler(); /* let the GUI do its work */
delay(5);
}