Simple program to demo using the SimpleGUI with TouchScreen. Widgets demonstrate handling of single- and double-tap events, as well as touchMover

Dependencies:   SimpleGUI SimpleGUITouchScreen TouchScreen UniGraphic mbed-rtos mbed

Committer:
duncanFrance
Date:
Sun May 08 14:43:42 2016 +0000
Revision:
3:ca2285e07824
Parent:
2:fe93c85e8f0b
Work with new event-handling mechanism and Window->attach()

Who changed what in which revision?

UserRevisionLine numberNew contents of line
duncanFrance 0:402fb0c36182 1 #include "main.h"
duncanFrance 0:402fb0c36182 2
duncanFrance 2:fe93c85e8f0b 3 #include "FastFontRenderer.h"
duncanFrance 2:fe93c85e8f0b 4 #include "FFArial24x23.h"
duncanFrance 2:fe93c85e8f0b 5 #include "FFTerminal6x8.h"
duncanFrance 2:fe93c85e8f0b 6
duncanFrance 2:fe93c85e8f0b 7 #include "resources/radiator_64x64_on_bmp.h"
duncanFrance 0:402fb0c36182 8
duncanFrance 0:402fb0c36182 9 unsigned short backgroundcolor=Black;
duncanFrance 0:402fb0c36182 10 unsigned short foregroundcolor=White;
duncanFrance 0:402fb0c36182 11
duncanFrance 0:402fb0c36182 12 TouchScreen* touchScreen;
duncanFrance 0:402fb0c36182 13 TouchScreenEventSource* eventSource;
duncanFrance 0:402fb0c36182 14 EventDispatcher* eventDispatcher;
duncanFrance 0:402fb0c36182 15 TextWidget* widget1;
duncanFrance 0:402fb0c36182 16 TextWidget* widget2;
duncanFrance 0:402fb0c36182 17 TextWidget* widget3;
duncanFrance 2:fe93c85e8f0b 18 BitmapWidget* bm1;
duncanFrance 2:fe93c85e8f0b 19 ContainerWidget* cw1;
duncanFrance 2:fe93c85e8f0b 20 GUI* gui;
duncanFrance 3:ca2285e07824 21 GraphicsContext* context;
duncanFrance 2:fe93c85e8f0b 22 FastFontRenderer* fontRenderer;
duncanFrance 2:fe93c85e8f0b 23 FastFont* defaultFont;
duncanFrance 0:402fb0c36182 24
duncanFrance 3:ca2285e07824 25 Window* rootWindow;
duncanFrance 3:ca2285e07824 26 Window* win1;
duncanFrance 2:fe93c85e8f0b 27 ILI932x* tft;
duncanFrance 1:ece0ecedf40a 28
duncanFrance 0:402fb0c36182 29 Serial *pc;
duncanFrance 0:402fb0c36182 30
duncanFrance 0:402fb0c36182 31 volatile bool done;
duncanFrance 0:402fb0c36182 32 volatile int xt, yt;
duncanFrance 0:402fb0c36182 33 volatile int xmin = 9999;
duncanFrance 0:402fb0c36182 34 volatile int xmax = 0;
duncanFrance 0:402fb0c36182 35 volatile int ymin = 9999;
duncanFrance 0:402fb0c36182 36 volatile int ymax = 0;
duncanFrance 0:402fb0c36182 37
duncanFrance 0:402fb0c36182 38
duncanFrance 0:402fb0c36182 39 void touchStart(TouchPosition p) {
duncanFrance 0:402fb0c36182 40 eventSource->touchStartHandler(p);
duncanFrance 0:402fb0c36182 41 }
duncanFrance 0:402fb0c36182 42
duncanFrance 0:402fb0c36182 43 void touchMove(TouchPosition p) {
duncanFrance 0:402fb0c36182 44 eventSource->touchMoveHandler(p);
duncanFrance 0:402fb0c36182 45 }
duncanFrance 0:402fb0c36182 46
duncanFrance 0:402fb0c36182 47 void touchEnd(TouchPosition p) {
duncanFrance 0:402fb0c36182 48 eventSource->touchEndHandler(p);
duncanFrance 0:402fb0c36182 49 }
duncanFrance 0:402fb0c36182 50
duncanFrance 3:ca2285e07824 51 void tapHandler1(Event e) {
duncanFrance 3:ca2285e07824 52 TextWidget* w = (TextWidget*) e.target;
duncanFrance 0:402fb0c36182 53 if(done) {
duncanFrance 0:402fb0c36182 54 w->setBackground(Green);
duncanFrance 0:402fb0c36182 55 } else {
duncanFrance 0:402fb0c36182 56 w->setBackground(Blue);
duncanFrance 0:402fb0c36182 57 }
duncanFrance 0:402fb0c36182 58 done = !done;
duncanFrance 3:ca2285e07824 59 // w->draw();
duncanFrance 0:402fb0c36182 60 }
duncanFrance 3:ca2285e07824 61 void tapHandler2(Event e) {
duncanFrance 3:ca2285e07824 62 TextWidget* w = (TextWidget*) e.target;
duncanFrance 0:402fb0c36182 63 if(done) {
duncanFrance 0:402fb0c36182 64 w->setBackground(Green);
duncanFrance 0:402fb0c36182 65 } else {
duncanFrance 0:402fb0c36182 66 w->setBackground(Red);
duncanFrance 0:402fb0c36182 67 }
duncanFrance 0:402fb0c36182 68 done = !done;
duncanFrance 3:ca2285e07824 69 // w->draw();
duncanFrance 0:402fb0c36182 70 }
duncanFrance 0:402fb0c36182 71
duncanFrance 3:ca2285e07824 72 void dragHandler(Event e) {
duncanFrance 3:ca2285e07824 73 Widget* w = (Widget*) e.target;
duncanFrance 2:fe93c85e8f0b 74 w->clear();
duncanFrance 2:fe93c85e8f0b 75 w->setLocation(w->x(), e.screenY - w->height()/2);
duncanFrance 3:ca2285e07824 76 // w->draw();
duncanFrance 0:402fb0c36182 77 }
duncanFrance 0:402fb0c36182 78
duncanFrance 2:fe93c85e8f0b 79 void initSerial() {
duncanFrance 0:402fb0c36182 80 pc = new Serial(USBTX, USBRX);
duncanFrance 0:402fb0c36182 81 pc->baud (9600);
duncanFrance 0:402fb0c36182 82 pc->printf("\n\nSystem Core Clock = %.3f MHZ\r\n",(float)SystemCoreClock/1000000);
duncanFrance 2:fe93c85e8f0b 83 }
duncanFrance 0:402fb0c36182 84
duncanFrance 2:fe93c85e8f0b 85 void initGui() {
duncanFrance 1:ece0ecedf40a 86
duncanFrance 2:fe93c85e8f0b 87 tft = new ILI932x(PAR_8, PortC, LCD_CS, LCD_RESET, LCD_RS, LCD_WR, LCD_RD,"myLCD");
duncanFrance 2:fe93c85e8f0b 88 tft->set_orientation(0);
duncanFrance 2:fe93c85e8f0b 89 tft->cls(); // clear the screen
duncanFrance 2:fe93c85e8f0b 90 tft->locate(0,0);
duncanFrance 2:fe93c85e8f0b 91 tft->setBackground(backgroundcolor); // set background to black
duncanFrance 2:fe93c85e8f0b 92 tft->setForeground(foregroundcolor); // set chars to white
duncanFrance 2:fe93c85e8f0b 93 tft->set_font((unsigned char*) Arial24x23);
duncanFrance 2:fe93c85e8f0b 94 eventDispatcher = new EventDispatcher();
duncanFrance 2:fe93c85e8f0b 95 fontRenderer = new FastFontRenderer();
duncanFrance 2:fe93c85e8f0b 96 defaultFont = new FastFont((uint8_t*)FFArial24x23);
duncanFrance 3:ca2285e07824 97 context = new GraphicsContext(tft, eventDispatcher, fontRenderer, defaultFont);
duncanFrance 3:ca2285e07824 98 gui = new GUI(context);
duncanFrance 3:ca2285e07824 99 rootWindow = gui->rootWindow();
duncanFrance 2:fe93c85e8f0b 100 }
duncanFrance 0:402fb0c36182 101
duncanFrance 2:fe93c85e8f0b 102 void initTouchScreen() {
duncanFrance 0:402fb0c36182 103 touchScreen = new TouchScreen(T_DIN, T_DOUT, T_CLK, T_CS, T_IRQ);
duncanFrance 0:402fb0c36182 104 touchScreen->setTouchStartHandler(&touchStart);
duncanFrance 0:402fb0c36182 105 touchScreen->setTouchMoveHandler(&touchMove);
duncanFrance 0:402fb0c36182 106 touchScreen->setTouchEndHandler(&touchEnd);
duncanFrance 0:402fb0c36182 107 touchScreen->setLCDGeometry(LCD_X_RES, LCD_Y_RES, TOUCHSCREEN_ORIENTATION_PORTRAIT | TOUCHSCREEN_ORIENTATION_ROTATED);
duncanFrance 0:402fb0c36182 108 touchScreen->setCalibration(TOUCH_X_MIN, TOUCH_X_MAX, TOUCH_Y_MIN, TOUCH_Y_MAX);
duncanFrance 3:ca2285e07824 109 eventSource = new TouchScreenEventSource(touchScreen, gui);
duncanFrance 2:fe93c85e8f0b 110 }
duncanFrance 2:fe93c85e8f0b 111
duncanFrance 2:fe93c85e8f0b 112 int main()
duncanFrance 2:fe93c85e8f0b 113 {
duncanFrance 2:fe93c85e8f0b 114
duncanFrance 2:fe93c85e8f0b 115 initSerial();
duncanFrance 2:fe93c85e8f0b 116 initGui();
duncanFrance 2:fe93c85e8f0b 117 initTouchScreen();
duncanFrance 3:ca2285e07824 118
duncanFrance 0:402fb0c36182 119
duncanFrance 3:ca2285e07824 120 cw1 = new ContainerWidget(context);
duncanFrance 2:fe93c85e8f0b 121 cw1->setLocation(50,150);
duncanFrance 2:fe93c85e8f0b 122 cw1->setSize(20,20);
duncanFrance 2:fe93c85e8f0b 123 cw1->setBorder(4, Green);
duncanFrance 3:ca2285e07824 124 rootWindow->attach(cw1);
duncanFrance 3:ca2285e07824 125 {
duncanFrance 3:ca2285e07824 126
duncanFrance 3:ca2285e07824 127 widget1 = new TextWidget(context);
duncanFrance 3:ca2285e07824 128 widget1->setSize(100,60);
duncanFrance 3:ca2285e07824 129 widget1->setText("This widget will change\ncolour when tapped");
duncanFrance 3:ca2285e07824 130 widget1->setBorder(1,White);
duncanFrance 3:ca2285e07824 131 cw1->attach(widget1);
duncanFrance 3:ca2285e07824 132 widget1->setEventHandler(new EventHandler(TOUCH_TAP, &tapHandler1));
duncanFrance 3:ca2285e07824 133
duncanFrance 3:ca2285e07824 134
duncanFrance 3:ca2285e07824 135 bm1 = new BitmapWidget(context);
duncanFrance 3:ca2285e07824 136 bm1->setBitmap(radiator_64x64_on_bmp, 64, 64);
duncanFrance 3:ca2285e07824 137 cw1->attach(bm1);
duncanFrance 3:ca2285e07824 138 }
duncanFrance 3:ca2285e07824 139
duncanFrance 3:ca2285e07824 140 Widget *w = new Widget(context);
duncanFrance 3:ca2285e07824 141 w->setSize(60,60);
duncanFrance 3:ca2285e07824 142 w->setLocation(100,100);
duncanFrance 3:ca2285e07824 143 w->setBorder(2, Red);
duncanFrance 3:ca2285e07824 144 rootWindow->attach(w);
duncanFrance 3:ca2285e07824 145
duncanFrance 3:ca2285e07824 146 widget2 = new TextWidget(context);
duncanFrance 3:ca2285e07824 147 widget2->setLocation(10,80);
duncanFrance 3:ca2285e07824 148 widget2->setSize(200,60);
duncanFrance 3:ca2285e07824 149 widget2->setText("A double-tap will make this\nwidget change colour");
duncanFrance 3:ca2285e07824 150 rootWindow->attach(widget2);
duncanFrance 3:ca2285e07824 151 widget2->setEventHandler(new EventHandler(TOUCH_DOUBLE_TAP, &tapHandler2));
duncanFrance 3:ca2285e07824 152
duncanFrance 3:ca2285e07824 153 char *moveme = "ABCDEF\nGHIJKL\nMNOPQRS\nTUVWXYZ";
duncanFrance 3:ca2285e07824 154 widget3 = new TextWidget(context);
duncanFrance 3:ca2285e07824 155 widget3->setLocation(10,10);
duncanFrance 3:ca2285e07824 156 widget3->setSize(200,60);
duncanFrance 3:ca2285e07824 157 widget3->setText(moveme);
duncanFrance 3:ca2285e07824 158 rootWindow->attach(widget3);
duncanFrance 3:ca2285e07824 159 widget3->setEventHandler(new EventHandler(TOUCH_MOVE, &dragHandler));
duncanFrance 3:ca2285e07824 160
duncanFrance 3:ca2285e07824 161
duncanFrance 3:ca2285e07824 162 SpinnerWidget *sw = new SpinnerWidget(context);
duncanFrance 3:ca2285e07824 163 sw->setLocation(50,250);
duncanFrance 3:ca2285e07824 164 sw->setSize(128,96);
duncanFrance 3:ca2285e07824 165 sw->setIncrement(0.5);
duncanFrance 3:ca2285e07824 166 sw->setMax(20);
duncanFrance 3:ca2285e07824 167 sw->setMin(10);
duncanFrance 3:ca2285e07824 168 char *format = "%2.1f C";
duncanFrance 3:ca2285e07824 169 sw->setFormat(format);
duncanFrance 3:ca2285e07824 170 sw->setValue(9.5);
duncanFrance 3:ca2285e07824 171 rootWindow->attach(sw);
duncanFrance 3:ca2285e07824 172
duncanFrance 0:402fb0c36182 173 while (1) {
duncanFrance 3:ca2285e07824 174 gui->updateWindow();
duncanFrance 3:ca2285e07824 175 gui->pumpEvents();
duncanFrance 3:ca2285e07824 176 Thread::wait(1);
duncanFrance 0:402fb0c36182 177 }
duncanFrance 0:402fb0c36182 178 }