The out-of-the-box demo application flashed on all display modules before they are shipped.

Dependencies:   DMBasicGUI DMSupport

This is the software that is flashed on the LPC4088 Display Modules before they are shipped from Embedded Artists.

Information

This project works on both the 4.3" and 5" display modules but requires different file systems to handle the different display resolutions.

For the 4.3" displays first drag-n-drop the media/fs_480_raw.fs5 (if you are using the new DAPLINK firmware use fs_480_raw.hex) file to the MBED drive and then drag-n-drop the demo itself. This way both the file system and software are up to date.

For the 5" displays first drag-n-drop the media/fs_800_raw.fsF (if you are using the new DAPLINK firmware use fs_800_raw.hex) file to the MBED drive and then drag-n-drop the demo itself. This way both the file system and software are up to date.

There is a prebuilt version of the demo binary here.

This is what it looks like on a 4.3" display:

/media/uploads/embeddedartists/demo480_cap_000.png /media/uploads/embeddedartists/demo480_cap_001.png /media/uploads/embeddedartists/demo480_cap_002.png /media/uploads/embeddedartists/demo480_cap_004.png /media/uploads/embeddedartists/demo480_cap_006.png /media/uploads/embeddedartists/demo480_cap_007.png /media/uploads/embeddedartists/demo480_cap_008.png
The first slide from the Slideshow:
/media/uploads/embeddedartists/demo480_cap_003.png
A couple of images from the Image Viewer
/media/uploads/embeddedartists/demo480_cap_009.png /media/uploads/embeddedartists/demo480_cap_010.png

Committer:
embeddedartists
Date:
Tue Nov 05 09:11:36 2019 +0000
Revision:
5:6ca8470ba8f8
Parent:
2:229f88d6f56b
Updates related to mbed OS 5

Who changed what in which revision?

UserRevisionLine numberNew contents of line
alindvall 0:b94e330c98ac 1 /*
alindvall 0:b94e330c98ac 2 * Copyright 2014 Embedded Artists AB
alindvall 0:b94e330c98ac 3 *
alindvall 0:b94e330c98ac 4 * Licensed under the Apache License, Version 2.0 (the "License");
alindvall 0:b94e330c98ac 5 * you may not use this file except in compliance with the License.
alindvall 0:b94e330c98ac 6 * You may obtain a copy of the License at
alindvall 0:b94e330c98ac 7 *
alindvall 0:b94e330c98ac 8 * http://www.apache.org/licenses/LICENSE-2.0
alindvall 0:b94e330c98ac 9 *
alindvall 0:b94e330c98ac 10 * Unless required by applicable law or agreed to in writing, software
alindvall 0:b94e330c98ac 11 * distributed under the License is distributed on an "AS IS" BASIS,
alindvall 0:b94e330c98ac 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
alindvall 0:b94e330c98ac 13 * See the License for the specific language governing permissions and
alindvall 0:b94e330c98ac 14 * limitations under the License.
alindvall 0:b94e330c98ac 15 */
alindvall 0:b94e330c98ac 16
alindvall 0:b94e330c98ac 17
alindvall 0:b94e330c98ac 18 #include "mbed.h"
alindvall 0:b94e330c98ac 19 #include "AppLauncherSpecial.h"
alindvall 0:b94e330c98ac 20 #include "lpc_swim_image.h"
alindvall 0:b94e330c98ac 21 #include "lpc_swim_font.h"
alindvall 0:b94e330c98ac 22 #include "Button.h"
alindvall 0:b94e330c98ac 23 #include "ImageButton.h"
alindvall 0:b94e330c98ac 24 #include "image_data.h"
alindvall 0:b94e330c98ac 25
alindvall 0:b94e330c98ac 26 /******************************************************************************
alindvall 0:b94e330c98ac 27 * Defines and typedefs
alindvall 0:b94e330c98ac 28 *****************************************************************************/
alindvall 0:b94e330c98ac 29
alindvall 0:b94e330c98ac 30 #define APP_PREFIX "[Launcher*] "
alindvall 0:b94e330c98ac 31
alindvall 0:b94e330c98ac 32 #define NO_APPLICATION (-1)
alindvall 0:b94e330c98ac 33
alindvall 0:b94e330c98ac 34 #define APP_SIGID_TOUCH 0x1
alindvall 0:b94e330c98ac 35
alindvall 0:b94e330c98ac 36 /******************************************************************************
alindvall 0:b94e330c98ac 37 * Private variables
alindvall 0:b94e330c98ac 38 *****************************************************************************/
alindvall 0:b94e330c98ac 39
alindvall 0:b94e330c98ac 40 static int appToLaunch = NO_APPLICATION;
alindvall 0:b94e330c98ac 41 static osThreadId appThread;
alindvall 0:b94e330c98ac 42
alindvall 0:b94e330c98ac 43 /******************************************************************************
alindvall 0:b94e330c98ac 44 * Private functions
alindvall 0:b94e330c98ac 45 *****************************************************************************/
alindvall 0:b94e330c98ac 46
alindvall 0:b94e330c98ac 47 static void buttonClicked(uint32_t x)
alindvall 0:b94e330c98ac 48 {
alindvall 0:b94e330c98ac 49 if (appToLaunch == NO_APPLICATION) {
alindvall 0:b94e330c98ac 50 appToLaunch = (int)x;
alindvall 0:b94e330c98ac 51 }
alindvall 0:b94e330c98ac 52 }
alindvall 0:b94e330c98ac 53
alindvall 0:b94e330c98ac 54 void AppLauncherSpecial::draw()
alindvall 0:b94e330c98ac 55 {
alindvall 0:b94e330c98ac 56 // Prepare fullscreen
alindvall 0:b94e330c98ac 57 swim_window_open(_win,
alindvall 0:b94e330c98ac 58 _disp->width(), _disp->height(), // full size
alindvall 0:b94e330c98ac 59 (COLOR_T*)_fb,
alindvall 0:b94e330c98ac 60 0,0,_disp->width()-1, _disp->height()-1, // window position and size
alindvall 0:b94e330c98ac 61 0, // border
alindvall 0:b94e330c98ac 62 BLACK, WHITE, /*WHITE, BLACK,*/ BLACK); // colors: pen, backgr, forgr
alindvall 0:b94e330c98ac 63 //swim_set_title(_win, "Demo Program", WHITE);
alindvall 0:b94e330c98ac 64
alindvall 0:b94e330c98ac 65 swim_put_image(_win, _bgImg.pixels, _bgImg.width, _bgImg.height);
alindvall 0:b94e330c98ac 66
alindvall 0:b94e330c98ac 67 if (_supportsCalibration) {
alindvall 0:b94e330c98ac 68 const char* msg = "(Press physical UserButton >2s to calibrate touch)";
alindvall 0:b94e330c98ac 69 int w, h;
alindvall 0:b94e330c98ac 70 swim_get_string_bounds(_win, msg, &w, &h);
alindvall 0:b94e330c98ac 71 swim_set_font_transparency(_win, 0); // 0=Transparent, 1=Opaque
alindvall 0:b94e330c98ac 72 swim_put_text_xy(_win, msg, (_disp->width()-w)/2, _disp->height()-(3*h)/2);
alindvall 0:b94e330c98ac 73 swim_set_font_transparency(_win, 1); // 0=Transparent, 1=Opaque
alindvall 0:b94e330c98ac 74 }
alindvall 0:b94e330c98ac 75
alindvall 0:b94e330c98ac 76 for (int i = 0; i < _usedButtons; i++) {
alindvall 0:b94e330c98ac 77 _buttons[i]->draw();
alindvall 0:b94e330c98ac 78 }
alindvall 0:b94e330c98ac 79 }
alindvall 0:b94e330c98ac 80
alindvall 0:b94e330c98ac 81 void AppLauncherSpecial::onTouchEvent()
alindvall 0:b94e330c98ac 82 {
alindvall 0:b94e330c98ac 83 _newTouchEvent = true;
alindvall 0:b94e330c98ac 84 osSignalSet(appThread, APP_SIGID_TOUCH);
alindvall 0:b94e330c98ac 85 }
alindvall 0:b94e330c98ac 86
alindvall 0:b94e330c98ac 87 void AppLauncherSpecial::onButtonEvent()
alindvall 0:b94e330c98ac 88 {
alindvall 0:b94e330c98ac 89 _newButtonEvent = true;
alindvall 0:b94e330c98ac 90 osSignalSet(appThread, APP_SIGID_TOUCH);
alindvall 0:b94e330c98ac 91 }
alindvall 0:b94e330c98ac 92
alindvall 0:b94e330c98ac 93 static void onTimeoutEvent(void const* arg)
alindvall 0:b94e330c98ac 94 {
alindvall 0:b94e330c98ac 95 *((bool*)arg) = true;
alindvall 0:b94e330c98ac 96 osSignalSet(appThread, APP_SIGID_TOUCH);
alindvall 0:b94e330c98ac 97 }
alindvall 0:b94e330c98ac 98
alindvall 0:b94e330c98ac 99 /******************************************************************************
alindvall 0:b94e330c98ac 100 * Public functions
alindvall 0:b94e330c98ac 101 *****************************************************************************/
alindvall 0:b94e330c98ac 102
alindvall 0:b94e330c98ac 103 AppLauncherSpecial::AppLauncherSpecial(int iconWidth, int iconHeight) :
alindvall 0:b94e330c98ac 104 _disp(NULL), _win(NULL), _fb(NULL), _usedButtons(0),
alindvall 0:b94e330c98ac 105 _resBg(NULL), _iconWidth(iconWidth), _iconHeight(iconHeight)
alindvall 0:b94e330c98ac 106 {
alindvall 0:b94e330c98ac 107 _bgImg.pointerToFree = NULL;
alindvall 0:b94e330c98ac 108 _bgImg.pixels = NULL;
alindvall 0:b94e330c98ac 109 _currentTime[0] = '\0';
alindvall 0:b94e330c98ac 110
alindvall 0:b94e330c98ac 111 for (int i = 0; i < NumberOfButtons; i++) {
alindvall 0:b94e330c98ac 112 _buttons[i] = NULL;
alindvall 0:b94e330c98ac 113 }
alindvall 0:b94e330c98ac 114 bool r;
alindvall 0:b94e330c98ac 115 int n;
alindvall 0:b94e330c98ac 116 if (DMBoard::instance().touchPanel()->info(&r, &n, &_supportsCalibration) != TouchPanel::TouchError_Ok) {
alindvall 0:b94e330c98ac 117 _supportsCalibration = false;
alindvall 0:b94e330c98ac 118 }
alindvall 0:b94e330c98ac 119 }
alindvall 0:b94e330c98ac 120
alindvall 0:b94e330c98ac 121 AppLauncherSpecial::~AppLauncherSpecial()
alindvall 0:b94e330c98ac 122 {
alindvall 0:b94e330c98ac 123 teardown();
alindvall 0:b94e330c98ac 124 }
alindvall 0:b94e330c98ac 125
alindvall 0:b94e330c98ac 126 bool AppLauncherSpecial::setup()
alindvall 0:b94e330c98ac 127 {
alindvall 0:b94e330c98ac 128 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b94e330c98ac 129
alindvall 0:b94e330c98ac 130 _disp = DMBoard::instance().display();
alindvall 0:b94e330c98ac 131 _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T));
alindvall 0:b94e330c98ac 132 _fb = _disp->allocateFramebuffer();
alindvall 0:b94e330c98ac 133
alindvall 0:b94e330c98ac 134 if (_win == NULL || _fb == NULL) {
alindvall 0:b94e330c98ac 135 log->printf(APP_PREFIX"Failed to allocate memory for framebuffer\r\n");
alindvall 0:b94e330c98ac 136 return false;
alindvall 0:b94e330c98ac 137 }
alindvall 0:b94e330c98ac 138
alindvall 0:b94e330c98ac 139 if (Image::decode(_resBg, Image::RES_16BIT, &_bgImg) != 0) {
alindvall 0:b94e330c98ac 140 log->printf(APP_PREFIX"Failed to load background image\n");
alindvall 0:b94e330c98ac 141 return false;
alindvall 0:b94e330c98ac 142 }
alindvall 0:b94e330c98ac 143
alindvall 0:b94e330c98ac 144 return true;
alindvall 0:b94e330c98ac 145 }
alindvall 0:b94e330c98ac 146
alindvall 0:b94e330c98ac 147 void AppLauncherSpecial::runToCompletion()
alindvall 0:b94e330c98ac 148 {
alindvall 0:b94e330c98ac 149 DMBoard* board = &DMBoard::instance();
alindvall 0:b94e330c98ac 150 RtosLog* log = board->logger();
alindvall 0:b94e330c98ac 151
alindvall 0:b94e330c98ac 152 appThread = osThreadGetId();
alindvall 0:b94e330c98ac 153
alindvall 0:b94e330c98ac 154 // Draw something on the framebuffer before using it so that it doesn't look garbled
alindvall 0:b94e330c98ac 155 draw();
alindvall 0:b94e330c98ac 156
alindvall 0:b94e330c98ac 157 // Start display in default mode (16-bit)
alindvall 0:b94e330c98ac 158 Display::DisplayError disperr = _disp->powerUp(_fb);
alindvall 0:b94e330c98ac 159 if (disperr != Display::DisplayError_Ok) {
alindvall 0:b94e330c98ac 160 log->printf(APP_PREFIX"Failed to initialize the display, got error %d\r\n", disperr);
alindvall 0:b94e330c98ac 161 return;
alindvall 0:b94e330c98ac 162 }
alindvall 0:b94e330c98ac 163
alindvall 0:b94e330c98ac 164 // Render the current time in the upper right corner once every second
alindvall 0:b94e330c98ac 165 bool updateClock = false;
embeddedartists 5:6ca8470ba8f8 166 EventQueue updateClockTimer(4*EVENTS_EVENT_SIZE);
embeddedartists 5:6ca8470ba8f8 167 int updateClockTimerId = updateClockTimer.call_in(1000, onTimeoutEvent, &updateClock);
alindvall 0:b94e330c98ac 168 int clockXOff, clockYOff;
alindvall 0:b94e330c98ac 169 swim_get_string_bounds(_win, "Fri Mar 20 10:32:58 2015", &clockXOff, &clockYOff);
alindvall 0:b94e330c98ac 170 clockXOff = _win->xpvmax - clockXOff - 20;
alindvall 0:b94e330c98ac 171 clockYOff = 5;
alindvall 0:b94e330c98ac 172
alindvall 0:b94e330c98ac 173 // To keep track of the button pushes
alindvall 0:b94e330c98ac 174 bool buttonPressed = false;
alindvall 0:b94e330c98ac 175 bool buttonTimeout = false;
alindvall 0:b94e330c98ac 176 InterruptIn button(P2_10);
embeddedartists 5:6ca8470ba8f8 177 button.rise(callback(this, &AppLauncherSpecial::onButtonEvent));
embeddedartists 5:6ca8470ba8f8 178 button.fall(callback(this, &AppLauncherSpecial::onButtonEvent));
embeddedartists 5:6ca8470ba8f8 179
embeddedartists 5:6ca8470ba8f8 180 EventQueue buttonTimer(4*EVENTS_EVENT_SIZE);
embeddedartists 5:6ca8470ba8f8 181 int buttonTimerId = buttonTimer.call_in(2000, onTimeoutEvent, &buttonTimeout);
alindvall 0:b94e330c98ac 182
alindvall 0:b94e330c98ac 183 // To prevent the "exit" click of a launched application to launch
alindvall 0:b94e330c98ac 184 // a new application. This could happen on a multitouch display if
alindvall 0:b94e330c98ac 185 // the launched applications' exit/ok/cancel button is located on
alindvall 0:b94e330c98ac 186 // top of one of the buttons in the launcher.
alindvall 0:b94e330c98ac 187 Timer tExit;
alindvall 0:b94e330c98ac 188 tExit.start();
alindvall 0:b94e330c98ac 189
alindvall 0:b94e330c98ac 190 // Wait for touches
alindvall 0:b94e330c98ac 191 TouchPanel* touch = board->touchPanel();
embeddedartists 5:6ca8470ba8f8 192 touch->setListener(callback(this, &AppLauncherSpecial::onTouchEvent));
alindvall 0:b94e330c98ac 193 touch_coordinate_t coord;
alindvall 0:b94e330c98ac 194 while (true) {
embeddedartists 5:6ca8470ba8f8 195 ThisThread::flags_wait_all(APP_SIGID_TOUCH);
alindvall 0:b94e330c98ac 196 if (_newTouchEvent) {
alindvall 0:b94e330c98ac 197 if (buttonPressed) {
alindvall 0:b94e330c98ac 198 // cancel
alindvall 0:b94e330c98ac 199 buttonPressed = false;
embeddedartists 5:6ca8470ba8f8 200 buttonTimer.cancel(buttonTimerId);
alindvall 0:b94e330c98ac 201 }
alindvall 0:b94e330c98ac 202 _newTouchEvent = false;
alindvall 0:b94e330c98ac 203 if (touch->read(coord) != TouchPanel::TouchError_Ok) {
alindvall 0:b94e330c98ac 204 log->printf("Failed to read touch coordinate\n");
alindvall 0:b94e330c98ac 205 continue;
alindvall 0:b94e330c98ac 206 }
alindvall 0:b94e330c98ac 207 // Process the touch coordinate for each button
alindvall 0:b94e330c98ac 208 for (int i = 0; i < NumberOfButtons; i++) {
alindvall 0:b94e330c98ac 209 if (_buttons[i] != NULL) {
alindvall 0:b94e330c98ac 210 if (_buttons[i]->handle(coord.x, coord.y, coord.z > 0)) {
alindvall 0:b94e330c98ac 211 _buttons[i]->draw();
alindvall 0:b94e330c98ac 212 }
alindvall 0:b94e330c98ac 213 }
alindvall 0:b94e330c98ac 214 }
alindvall 0:b94e330c98ac 215 } else if (buttonTimeout) {
alindvall 0:b94e330c98ac 216 if (board->buttonPressed()) {
alindvall 0:b94e330c98ac 217 appToLaunch = CalibrationApp;
alindvall 0:b94e330c98ac 218 }
alindvall 0:b94e330c98ac 219 buttonPressed = false;
alindvall 0:b94e330c98ac 220 buttonTimeout = false;
alindvall 0:b94e330c98ac 221 } else if (_newButtonEvent) {
alindvall 0:b94e330c98ac 222 _newButtonEvent = false;
alindvall 0:b94e330c98ac 223 if (board->buttonPressed()) {
alindvall 0:b94e330c98ac 224 buttonPressed = true;
embeddedartists 5:6ca8470ba8f8 225 buttonTimer.dispatch(0);
alindvall 0:b94e330c98ac 226 } else {
alindvall 0:b94e330c98ac 227 buttonPressed = false;
embeddedartists 5:6ca8470ba8f8 228 buttonTimer.cancel(buttonTimerId);
alindvall 0:b94e330c98ac 229 }
alindvall 0:b94e330c98ac 230 continue;
alindvall 0:b94e330c98ac 231 } else if (updateClock) {
alindvall 0:b94e330c98ac 232 updateClock = false;
alindvall 0:b94e330c98ac 233 time_t seconds = time(0);
alindvall 0:b94e330c98ac 234 sprintf(_currentTime, "%-25s", ctime(&seconds));
alindvall 0:b94e330c98ac 235 swim_put_text_xy(_win, _currentTime, clockXOff, clockYOff);
alindvall 0:b94e330c98ac 236 continue;
alindvall 0:b94e330c98ac 237 }
alindvall 0:b94e330c98ac 238
alindvall 0:b94e330c98ac 239 if (appToLaunch != NO_APPLICATION) {
alindvall 0:b94e330c98ac 240 if (tExit.read_ms() < 500) {
alindvall 0:b94e330c98ac 241 appToLaunch = NO_APPLICATION;
alindvall 0:b94e330c98ac 242 continue;
alindvall 0:b94e330c98ac 243 }
alindvall 0:b94e330c98ac 244 App* a = NULL;
alindvall 0:b94e330c98ac 245 if (_callback != NULL) {
alindvall 0:b94e330c98ac 246 a = _callback(appToLaunch);
alindvall 0:b94e330c98ac 247 }
alindvall 0:b94e330c98ac 248 if (a != NULL) {
alindvall 0:b94e330c98ac 249 if (a->setup()) {
alindvall 0:b94e330c98ac 250 a->runToCompletion();
alindvall 0:b94e330c98ac 251 a->teardown();
alindvall 0:b94e330c98ac 252 }
alindvall 0:b94e330c98ac 253 delete a;
alindvall 0:b94e330c98ac 254 }
alindvall 0:b94e330c98ac 255 tExit.reset();
alindvall 0:b94e330c98ac 256 appToLaunch = NO_APPLICATION;
alindvall 0:b94e330c98ac 257 }
alindvall 0:b94e330c98ac 258 }
alindvall 0:b94e330c98ac 259 }
alindvall 0:b94e330c98ac 260
alindvall 0:b94e330c98ac 261 bool AppLauncherSpecial::teardown()
alindvall 0:b94e330c98ac 262 {
alindvall 0:b94e330c98ac 263 if (_win != NULL) {
alindvall 0:b94e330c98ac 264 free(_win);
alindvall 0:b94e330c98ac 265 _win = NULL;
alindvall 0:b94e330c98ac 266 }
alindvall 0:b94e330c98ac 267 if (_fb != NULL) {
alindvall 0:b94e330c98ac 268 free(_fb);
alindvall 0:b94e330c98ac 269 _fb = NULL;
alindvall 0:b94e330c98ac 270 }
alindvall 0:b94e330c98ac 271 for (int i = 0; i < NumberOfButtons; i++) {
alindvall 0:b94e330c98ac 272 _buttons[i] = NULL;
alindvall 0:b94e330c98ac 273 if (_buttons[i] != NULL) {
alindvall 0:b94e330c98ac 274 delete _buttons[i];
alindvall 0:b94e330c98ac 275 _buttons[i] = NULL;
alindvall 0:b94e330c98ac 276 }
alindvall 0:b94e330c98ac 277 }
alindvall 0:b94e330c98ac 278 if (_bgImg.pointerToFree != NULL) {
alindvall 0:b94e330c98ac 279 free(_bgImg.pointerToFree);
alindvall 0:b94e330c98ac 280 _bgImg.pointerToFree = NULL;
alindvall 0:b94e330c98ac 281 }
alindvall 0:b94e330c98ac 282 return true;
alindvall 0:b94e330c98ac 283 }
alindvall 0:b94e330c98ac 284
alindvall 0:b94e330c98ac 285 void AppLauncherSpecial::setAppCreatorFunc(App*(*callback)(uint32_t buttonID))
alindvall 0:b94e330c98ac 286 {
alindvall 0:b94e330c98ac 287 _callback = callback;
alindvall 0:b94e330c98ac 288 }
alindvall 0:b94e330c98ac 289
alindvall 0:b94e330c98ac 290 bool AppLauncherSpecial::addButton(uint32_t buttonID, const char* caption)
alindvall 0:b94e330c98ac 291 {
alindvall 0:b94e330c98ac 292 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 293 int xspace = ((_disp->width() - ButtonColumns * ButtonWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 294 int yspace = ((_disp->height() - TitleHeight - ButtonRows * ButtonHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 295
alindvall 0:b94e330c98ac 296 _buttons[idx] = new Button(caption, (COLOR_T*)_fb,
alindvall 0:b94e330c98ac 297 xspace + (ButtonWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 298 TitleHeight + yspace + (ButtonHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 299 ButtonWidth, ButtonHeight);
alindvall 0:b94e330c98ac 300 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 301 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 302 return true;
alindvall 0:b94e330c98ac 303 }
alindvall 0:b94e330c98ac 304
alindvall 0:b94e330c98ac 305 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* imgUp, const char* imgDown)
alindvall 0:b94e330c98ac 306 {
alindvall 0:b94e330c98ac 307 return addImageButton(buttonID, NULL, BLACK, imgUp, imgDown);
alindvall 0:b94e330c98ac 308 }
alindvall 0:b94e330c98ac 309
alindvall 0:b94e330c98ac 310 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, const char* imgUp, const char* imgDown)
alindvall 0:b94e330c98ac 311 {
alindvall 0:b94e330c98ac 312 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 313 int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 314 int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 315
alindvall 0:b94e330c98ac 316 ImageButton* img = new ImageButton((COLOR_T*)_fb,
alindvall 0:b94e330c98ac 317 xspace + (_iconWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 318 TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 319 _iconWidth, _iconHeight, caption, color);
alindvall 0:b94e330c98ac 320 if (img->loadImages(imgUp, imgDown)) {
alindvall 0:b94e330c98ac 321 _buttons[idx] = img;
alindvall 0:b94e330c98ac 322 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 323 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 324 return true;
alindvall 0:b94e330c98ac 325 } else {
alindvall 0:b94e330c98ac 326 //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown);
alindvall 0:b94e330c98ac 327 return false;
alindvall 0:b94e330c98ac 328 }
alindvall 0:b94e330c98ac 329 }
alindvall 0:b94e330c98ac 330
alindvall 0:b94e330c98ac 331 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const unsigned char* imgUp, unsigned int imgUpSize, const unsigned char* imgDown, unsigned int imgDownSize)
alindvall 0:b94e330c98ac 332 {
alindvall 0:b94e330c98ac 333 return addImageButton(buttonID, NULL, BLACK, imgUp, imgUpSize, imgDown, imgDownSize);
alindvall 0:b94e330c98ac 334 }
alindvall 0:b94e330c98ac 335
alindvall 0:b94e330c98ac 336 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, const unsigned char* imgUp, unsigned int imgUpSize, const unsigned char* imgDown, unsigned int imgDownSize)
alindvall 0:b94e330c98ac 337 {
alindvall 0:b94e330c98ac 338 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 339 int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 340 int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 341
alindvall 0:b94e330c98ac 342 ImageButton* img = new ImageButton((COLOR_T*)_fb,
alindvall 0:b94e330c98ac 343 xspace + (_iconWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 344 TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 345 _iconWidth, _iconHeight, caption, color);
alindvall 0:b94e330c98ac 346 img->setTransparency(RED);
alindvall 0:b94e330c98ac 347 if (img->loadImages(imgUp, imgUpSize, imgDown, imgDownSize)) {
alindvall 0:b94e330c98ac 348 _buttons[idx] = img;
alindvall 0:b94e330c98ac 349 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 350 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 351 return true;
alindvall 0:b94e330c98ac 352 } else {
alindvall 0:b94e330c98ac 353 //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown);
alindvall 0:b94e330c98ac 354 return false;
alindvall 0:b94e330c98ac 355 }
alindvall 0:b94e330c98ac 356 }
alindvall 0:b94e330c98ac 357
alindvall 0:b94e330c98ac 358 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, Resource* resUp, Resource* resDown)
alindvall 0:b94e330c98ac 359 {
alindvall 0:b94e330c98ac 360 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 361 int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 362 int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 363
alindvall 0:b94e330c98ac 364 ImageButton* img = new ImageButton((COLOR_T*)_fb,
alindvall 0:b94e330c98ac 365 xspace + (_iconWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 366 TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 367 _iconWidth, _iconHeight, caption, color);
alindvall 0:b94e330c98ac 368 if (img->loadImages(resUp, resDown)) {
alindvall 0:b94e330c98ac 369 _buttons[idx] = img;
alindvall 0:b94e330c98ac 370 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 371 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 372 return true;
alindvall 0:b94e330c98ac 373 } else {
alindvall 0:b94e330c98ac 374 //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown);
alindvall 0:b94e330c98ac 375 return false;
alindvall 0:b94e330c98ac 376 }
alindvall 0:b94e330c98ac 377 }
alindvall 0:b94e330c98ac 378
alindvall 0:b94e330c98ac 379 void AppLauncherSpecial::addResource(Resources id, Resource* res)
alindvall 0:b94e330c98ac 380 {
alindvall 0:b94e330c98ac 381 _resBg = res;
alindvall 0:b94e330c98ac 382 }
alindvall 0:b94e330c98ac 383