A basic graphics package for the LPC4088 Display Module.

Dependents:   lpc4088_displaymodule_demo_sphere sampleGUI sampleEmptyGUI lpc4088_displaymodule_fs_aid ... more

Fork of DMBasicGUI by EmbeddedArtists AB

Committer:
embeddedartists
Date:
Mon Mar 09 10:40:55 2015 +0100
Revision:
13:bff2288c2c61
Parent:
11:265884fa7fdd
Child:
15:a68bb30ab95e
Added documentation of the SlideShow related classes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 5:f4de114c31c3 1 /*
embeddedartists 5:f4de114c31c3 2 * Copyright 2014 Embedded Artists AB
embeddedartists 5:f4de114c31c3 3 *
embeddedartists 5:f4de114c31c3 4 * Licensed under the Apache License, Version 2.0 (the "License");
embeddedartists 5:f4de114c31c3 5 * you may not use this file except in compliance with the License.
embeddedartists 5:f4de114c31c3 6 * You may obtain a copy of the License at
embeddedartists 5:f4de114c31c3 7 *
embeddedartists 5:f4de114c31c3 8 * http://www.apache.org/licenses/LICENSE-2.0
embeddedartists 5:f4de114c31c3 9 *
embeddedartists 5:f4de114c31c3 10 * Unless required by applicable law or agreed to in writing, software
embeddedartists 5:f4de114c31c3 11 * distributed under the License is distributed on an "AS IS" BASIS,
embeddedartists 5:f4de114c31c3 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
embeddedartists 5:f4de114c31c3 13 * See the License for the specific language governing permissions and
embeddedartists 5:f4de114c31c3 14 * limitations under the License.
embeddedartists 5:f4de114c31c3 15 */
embeddedartists 5:f4de114c31c3 16
embeddedartists 5:f4de114c31c3 17
embeddedartists 5:f4de114c31c3 18 #include "mbed.h"
embeddedartists 5:f4de114c31c3 19 #include "AppSlideShow.h"
embeddedartists 11:265884fa7fdd 20 #include "basic_image_data.h"
embeddedartists 5:f4de114c31c3 21
embeddedartists 5:f4de114c31c3 22 /******************************************************************************
embeddedartists 5:f4de114c31c3 23 * Defines and typedefs
embeddedartists 5:f4de114c31c3 24 *****************************************************************************/
embeddedartists 5:f4de114c31c3 25
embeddedartists 5:f4de114c31c3 26 #define TICKER_RESOLUTION_IN_MS 10
embeddedartists 5:f4de114c31c3 27
embeddedartists 11:265884fa7fdd 28 #define BTN_WIDTH 40
embeddedartists 11:265884fa7fdd 29 #define BTN_HEIGHT 40
embeddedartists 11:265884fa7fdd 30 #define BTN_OFF 20
embeddedartists 11:265884fa7fdd 31
embeddedartists 5:f4de114c31c3 32 /******************************************************************************
embeddedartists 5:f4de114c31c3 33 * Global variables
embeddedartists 5:f4de114c31c3 34 *****************************************************************************/
embeddedartists 5:f4de114c31c3 35
embeddedartists 5:f4de114c31c3 36 volatile uint32_t msTicks = 0;
embeddedartists 5:f4de114c31c3 37
embeddedartists 5:f4de114c31c3 38 /******************************************************************************
embeddedartists 5:f4de114c31c3 39 * Private functions
embeddedartists 5:f4de114c31c3 40 *****************************************************************************/
embeddedartists 5:f4de114c31c3 41
embeddedartists 5:f4de114c31c3 42 static void tRender(void const *args)
embeddedartists 5:f4de114c31c3 43 {
embeddedartists 5:f4de114c31c3 44 Renderer* s = (Renderer*)args;
embeddedartists 5:f4de114c31c3 45 s->render();
embeddedartists 5:f4de114c31c3 46 }
embeddedartists 5:f4de114c31c3 47
embeddedartists 5:f4de114c31c3 48 static void ticker(void const *n) {
embeddedartists 5:f4de114c31c3 49 msTicks += TICKER_RESOLUTION_IN_MS;
embeddedartists 5:f4de114c31c3 50 }
embeddedartists 5:f4de114c31c3 51
embeddedartists 11:265884fa7fdd 52 static void buttonClicked(uint32_t x)
embeddedartists 11:265884fa7fdd 53 {
embeddedartists 11:265884fa7fdd 54 bool* done = (bool*)x;
embeddedartists 11:265884fa7fdd 55 *done = true;
embeddedartists 11:265884fa7fdd 56 }
embeddedartists 11:265884fa7fdd 57
embeddedartists 5:f4de114c31c3 58 /******************************************************************************
embeddedartists 5:f4de114c31c3 59 * Public functions
embeddedartists 5:f4de114c31c3 60 *****************************************************************************/
embeddedartists 5:f4de114c31c3 61
embeddedartists 11:265884fa7fdd 62 AppSlideShow::AppSlideShow(const char* scriptFile, const char* pathPrefix, int xoff, int yoff) :
embeddedartists 11:265884fa7fdd 63 _fb(NULL), _disp(NULL), _show(NULL), _rend(NULL),
embeddedartists 11:265884fa7fdd 64 _fileMutex(), _btnDone(NULL), _btnRepeat(NULL), _script(NULL), _path(NULL)
embeddedartists 5:f4de114c31c3 65 {
embeddedartists 11:265884fa7fdd 66 _script = (char*)malloc(strlen(scriptFile)+1);
embeddedartists 11:265884fa7fdd 67 if (_script != NULL) {
embeddedartists 11:265884fa7fdd 68 strcpy(_script, scriptFile);
embeddedartists 11:265884fa7fdd 69 }
embeddedartists 11:265884fa7fdd 70 if (pathPrefix != NULL) {
embeddedartists 11:265884fa7fdd 71 _path = (char*)malloc(strlen(pathPrefix)+1);
embeddedartists 11:265884fa7fdd 72 if (_path != NULL) {
embeddedartists 11:265884fa7fdd 73 strcpy(_path, pathPrefix);
embeddedartists 11:265884fa7fdd 74 }
embeddedartists 11:265884fa7fdd 75 }
embeddedartists 11:265884fa7fdd 76 _xoff = xoff;
embeddedartists 11:265884fa7fdd 77 _yoff = yoff;
embeddedartists 5:f4de114c31c3 78 }
embeddedartists 5:f4de114c31c3 79
embeddedartists 5:f4de114c31c3 80 AppSlideShow::~AppSlideShow()
embeddedartists 5:f4de114c31c3 81 {
embeddedartists 5:f4de114c31c3 82 teardown();
embeddedartists 5:f4de114c31c3 83 }
embeddedartists 5:f4de114c31c3 84
embeddedartists 5:f4de114c31c3 85 bool AppSlideShow::setup()
embeddedartists 5:f4de114c31c3 86 {
embeddedartists 5:f4de114c31c3 87 SlideShow::SlideShowError err;
embeddedartists 5:f4de114c31c3 88
embeddedartists 5:f4de114c31c3 89 _disp = DMBoard::instance().display();
embeddedartists 5:f4de114c31c3 90
embeddedartists 5:f4de114c31c3 91 _fb = _disp->allocateFramebuffer();
embeddedartists 5:f4de114c31c3 92 if (_fb == NULL) {
embeddedartists 5:f4de114c31c3 93 err = SlideShow::OutOfMemory;
embeddedartists 5:f4de114c31c3 94 } else {
embeddedartists 5:f4de114c31c3 95 memset(_fb, 0xff, _disp->fbSize());
embeddedartists 5:f4de114c31c3 96 _rend = new Renderer();
embeddedartists 13:bff2288c2c61 97 _show = new SlideShow(_rend, _path, _xoff, _yoff, 1, &_fileMutex);
embeddedartists 11:265884fa7fdd 98 err = _show->prepare(_script);
embeddedartists 5:f4de114c31c3 99 }
embeddedartists 5:f4de114c31c3 100
embeddedartists 11:265884fa7fdd 101 _btnRepeat = new ImageButton((COLOR_T*)_fb, _disp->width() - 2*BTN_OFF - 2*BTN_WIDTH, _disp->height() - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
embeddedartists 11:265884fa7fdd 102 _btnRepeat->loadImages(img_repeat, img_size_repeat);
embeddedartists 11:265884fa7fdd 103 _btnDone = new ImageButton((COLOR_T*)_fb, _disp->width() - BTN_OFF - BTN_WIDTH, _disp->height() - BTN_OFF - BTN_HEIGHT, BTN_WIDTH, BTN_HEIGHT);
embeddedartists 11:265884fa7fdd 104 _btnDone->loadImages(img_ok, img_size_ok);
embeddedartists 11:265884fa7fdd 105
embeddedartists 5:f4de114c31c3 106 return (err == SlideShow::Ok);
embeddedartists 5:f4de114c31c3 107 }
embeddedartists 5:f4de114c31c3 108
embeddedartists 5:f4de114c31c3 109 void AppSlideShow::runToCompletion()
embeddedartists 5:f4de114c31c3 110 {
embeddedartists 5:f4de114c31c3 111 // Save existing frame buffer
embeddedartists 5:f4de114c31c3 112 void* oldFB = _disp->swapFramebuffer(_fb);
embeddedartists 5:f4de114c31c3 113
embeddedartists 11:265884fa7fdd 114 bool done = false;
embeddedartists 11:265884fa7fdd 115 bool repeat = false;
embeddedartists 11:265884fa7fdd 116 _btnDone->setAction(buttonClicked, (uint32_t)&done);
embeddedartists 11:265884fa7fdd 117 _btnRepeat->setAction(buttonClicked, (uint32_t)&repeat);
embeddedartists 11:265884fa7fdd 118
embeddedartists 11:265884fa7fdd 119
embeddedartists 5:f4de114c31c3 120 // Alternative 1: use the calling thread's context to run in
embeddedartists 5:f4de114c31c3 121 Thread tr(tRender, _rend, osPriorityHigh);
embeddedartists 5:f4de114c31c3 122 _rend->setRenderThread(&tr);
embeddedartists 5:f4de114c31c3 123
embeddedartists 5:f4de114c31c3 124 // Generate the millisecond ticks for the slideshow
embeddedartists 5:f4de114c31c3 125 RtosTimer rtosTimer(ticker, osTimerPeriodic);
embeddedartists 5:f4de114c31c3 126 rtosTimer.start(TICKER_RESOLUTION_IN_MS);
embeddedartists 5:f4de114c31c3 127
embeddedartists 11:265884fa7fdd 128 // Wait for touches
embeddedartists 11:265884fa7fdd 129 TouchPanel* touch = DMBoard::instance().touchPanel();
embeddedartists 11:265884fa7fdd 130 touch_coordinate_t coord;
embeddedartists 11:265884fa7fdd 131
embeddedartists 11:265884fa7fdd 132 do {
embeddedartists 5:f4de114c31c3 133 // Wait for slideshow to complete
embeddedartists 5:f4de114c31c3 134 _show->run();
embeddedartists 11:265884fa7fdd 135
embeddedartists 11:265884fa7fdd 136 // Temporary ugly way to get current framebuffer
embeddedartists 11:265884fa7fdd 137 _btnDone->draw((COLOR_T*)LPC_LCD->UPBASE);
embeddedartists 11:265884fa7fdd 138 _btnRepeat->draw((COLOR_T*)LPC_LCD->UPBASE);
embeddedartists 11:265884fa7fdd 139
embeddedartists 11:265884fa7fdd 140 done = repeat = false;
embeddedartists 11:265884fa7fdd 141 while (!done && !repeat) {
embeddedartists 11:265884fa7fdd 142 Thread::signal_wait(0x1);
embeddedartists 11:265884fa7fdd 143 if (touch->read(coord) == TouchPanel::TouchError_Ok) {
embeddedartists 11:265884fa7fdd 144 if (_btnDone->handle(coord.x, coord.y, coord.z > 0)) {
embeddedartists 11:265884fa7fdd 145 _btnDone->draw();
embeddedartists 11:265884fa7fdd 146 }
embeddedartists 11:265884fa7fdd 147 if (_btnRepeat->handle(coord.x, coord.y, coord.z > 0)) {
embeddedartists 11:265884fa7fdd 148 _btnRepeat->draw();
embeddedartists 11:265884fa7fdd 149 }
embeddedartists 11:265884fa7fdd 150 }
embeddedartists 11:265884fa7fdd 151 }
embeddedartists 11:265884fa7fdd 152
embeddedartists 11:265884fa7fdd 153 } while(!done);
embeddedartists 5:f4de114c31c3 154
embeddedartists 5:f4de114c31c3 155 tr.terminate();
embeddedartists 5:f4de114c31c3 156
embeddedartists 5:f4de114c31c3 157 // Restore the original FB
embeddedartists 5:f4de114c31c3 158 _disp->swapFramebuffer(oldFB);
embeddedartists 5:f4de114c31c3 159 }
embeddedartists 5:f4de114c31c3 160
embeddedartists 5:f4de114c31c3 161 bool AppSlideShow::teardown()
embeddedartists 5:f4de114c31c3 162 {
embeddedartists 5:f4de114c31c3 163 if (_show != NULL) {
embeddedartists 5:f4de114c31c3 164 free(_show);
embeddedartists 5:f4de114c31c3 165 _show = NULL;
embeddedartists 5:f4de114c31c3 166 }
embeddedartists 5:f4de114c31c3 167 if (_rend != NULL) {
embeddedartists 5:f4de114c31c3 168 free(_rend);
embeddedartists 5:f4de114c31c3 169 _rend = NULL;
embeddedartists 5:f4de114c31c3 170 }
embeddedartists 5:f4de114c31c3 171 if (_fb != NULL) {
embeddedartists 5:f4de114c31c3 172 free(_fb);
embeddedartists 5:f4de114c31c3 173 _fb = NULL;
embeddedartists 5:f4de114c31c3 174 }
embeddedartists 11:265884fa7fdd 175 if (_script != NULL) {
embeddedartists 11:265884fa7fdd 176 free(_script);
embeddedartists 11:265884fa7fdd 177 _script = NULL;
embeddedartists 11:265884fa7fdd 178 }
embeddedartists 11:265884fa7fdd 179 if (_path != NULL) {
embeddedartists 11:265884fa7fdd 180 free(_path);
embeddedartists 11:265884fa7fdd 181 _path = NULL;
embeddedartists 11:265884fa7fdd 182 }
embeddedartists 5:f4de114c31c3 183 return true;
embeddedartists 5:f4de114c31c3 184 }
embeddedartists 5:f4de114c31c3 185
embeddedartists 5:f4de114c31c3 186