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:
alindvall
Date:
Fri Mar 20 13:36:44 2015 +0000
Revision:
0:b94e330c98ac
Child:
2:229f88d6f56b
First version

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;
alindvall 0:b94e330c98ac 166 RtosTimer updateClockTimer(onTimeoutEvent, osTimerPeriodic, &updateClock);
alindvall 0:b94e330c98ac 167 updateClockTimer.start(1000);
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);
alindvall 0:b94e330c98ac 177 button.rise(this, &AppLauncherSpecial::onButtonEvent);
alindvall 0:b94e330c98ac 178 button.fall(this, &AppLauncherSpecial::onButtonEvent);
alindvall 0:b94e330c98ac 179 RtosTimer buttonTimer(onTimeoutEvent, osTimerOnce, &buttonTimeout);
alindvall 0:b94e330c98ac 180
alindvall 0:b94e330c98ac 181 // To prevent the "exit" click of a launched application to launch
alindvall 0:b94e330c98ac 182 // a new application. This could happen on a multitouch display if
alindvall 0:b94e330c98ac 183 // the launched applications' exit/ok/cancel button is located on
alindvall 0:b94e330c98ac 184 // top of one of the buttons in the launcher.
alindvall 0:b94e330c98ac 185 Timer tExit;
alindvall 0:b94e330c98ac 186 tExit.start();
alindvall 0:b94e330c98ac 187
alindvall 0:b94e330c98ac 188 // Wait for touches
alindvall 0:b94e330c98ac 189 TouchPanel* touch = board->touchPanel();
alindvall 0:b94e330c98ac 190 FunctionPointer* fpOld = touch->setListener(new FunctionPointer(this, &AppLauncherSpecial::onTouchEvent));
alindvall 0:b94e330c98ac 191 touch_coordinate_t coord;
alindvall 0:b94e330c98ac 192 while (true) {
alindvall 0:b94e330c98ac 193 Thread::signal_wait(APP_SIGID_TOUCH);
alindvall 0:b94e330c98ac 194 if (_newTouchEvent) {
alindvall 0:b94e330c98ac 195 if (buttonPressed) {
alindvall 0:b94e330c98ac 196 // cancel
alindvall 0:b94e330c98ac 197 buttonPressed = false;
alindvall 0:b94e330c98ac 198 buttonTimer.stop();
alindvall 0:b94e330c98ac 199 }
alindvall 0:b94e330c98ac 200 _newTouchEvent = false;
alindvall 0:b94e330c98ac 201 if (touch->read(coord) != TouchPanel::TouchError_Ok) {
alindvall 0:b94e330c98ac 202 log->printf("Failed to read touch coordinate\n");
alindvall 0:b94e330c98ac 203 continue;
alindvall 0:b94e330c98ac 204 }
alindvall 0:b94e330c98ac 205 // Process the touch coordinate for each button
alindvall 0:b94e330c98ac 206 for (int i = 0; i < NumberOfButtons; i++) {
alindvall 0:b94e330c98ac 207 if (_buttons[i] != NULL) {
alindvall 0:b94e330c98ac 208 if (_buttons[i]->handle(coord.x, coord.y, coord.z > 0)) {
alindvall 0:b94e330c98ac 209 _buttons[i]->draw();
alindvall 0:b94e330c98ac 210 }
alindvall 0:b94e330c98ac 211 }
alindvall 0:b94e330c98ac 212 }
alindvall 0:b94e330c98ac 213 } else if (buttonTimeout) {
alindvall 0:b94e330c98ac 214 if (board->buttonPressed()) {
alindvall 0:b94e330c98ac 215 appToLaunch = CalibrationApp;
alindvall 0:b94e330c98ac 216 }
alindvall 0:b94e330c98ac 217 buttonPressed = false;
alindvall 0:b94e330c98ac 218 buttonTimeout = false;
alindvall 0:b94e330c98ac 219 } else if (_newButtonEvent) {
alindvall 0:b94e330c98ac 220 _newButtonEvent = false;
alindvall 0:b94e330c98ac 221 if (board->buttonPressed()) {
alindvall 0:b94e330c98ac 222 buttonPressed = true;
alindvall 0:b94e330c98ac 223 buttonTimer.start(2000);
alindvall 0:b94e330c98ac 224 } else {
alindvall 0:b94e330c98ac 225 buttonPressed = false;
alindvall 0:b94e330c98ac 226 buttonTimer.stop();
alindvall 0:b94e330c98ac 227 }
alindvall 0:b94e330c98ac 228 continue;
alindvall 0:b94e330c98ac 229 } else if (updateClock) {
alindvall 0:b94e330c98ac 230 updateClock = false;
alindvall 0:b94e330c98ac 231 time_t seconds = time(0);
alindvall 0:b94e330c98ac 232 sprintf(_currentTime, "%-25s", ctime(&seconds));
alindvall 0:b94e330c98ac 233 swim_put_text_xy(_win, _currentTime, clockXOff, clockYOff);
alindvall 0:b94e330c98ac 234 continue;
alindvall 0:b94e330c98ac 235 }
alindvall 0:b94e330c98ac 236
alindvall 0:b94e330c98ac 237 if (appToLaunch != NO_APPLICATION) {
alindvall 0:b94e330c98ac 238 if (tExit.read_ms() < 500) {
alindvall 0:b94e330c98ac 239 appToLaunch = NO_APPLICATION;
alindvall 0:b94e330c98ac 240 continue;
alindvall 0:b94e330c98ac 241 }
alindvall 0:b94e330c98ac 242 App* a = NULL;
alindvall 0:b94e330c98ac 243 if (_callback != NULL) {
alindvall 0:b94e330c98ac 244 a = _callback(appToLaunch);
alindvall 0:b94e330c98ac 245 }
alindvall 0:b94e330c98ac 246 if (a != NULL) {
alindvall 0:b94e330c98ac 247 if (a->setup()) {
alindvall 0:b94e330c98ac 248 a->runToCompletion();
alindvall 0:b94e330c98ac 249 a->teardown();
alindvall 0:b94e330c98ac 250 }
alindvall 0:b94e330c98ac 251 delete a;
alindvall 0:b94e330c98ac 252 }
alindvall 0:b94e330c98ac 253 tExit.reset();
alindvall 0:b94e330c98ac 254 appToLaunch = NO_APPLICATION;
alindvall 0:b94e330c98ac 255 }
alindvall 0:b94e330c98ac 256 }
alindvall 0:b94e330c98ac 257
alindvall 0:b94e330c98ac 258 // restore old touch listener (get our listener in return)
alindvall 0:b94e330c98ac 259 fpOld = touch->setListener(fpOld);
alindvall 0:b94e330c98ac 260 delete fpOld;
alindvall 0:b94e330c98ac 261 }
alindvall 0:b94e330c98ac 262
alindvall 0:b94e330c98ac 263 bool AppLauncherSpecial::teardown()
alindvall 0:b94e330c98ac 264 {
alindvall 0:b94e330c98ac 265 if (_win != NULL) {
alindvall 0:b94e330c98ac 266 free(_win);
alindvall 0:b94e330c98ac 267 _win = NULL;
alindvall 0:b94e330c98ac 268 }
alindvall 0:b94e330c98ac 269 if (_fb != NULL) {
alindvall 0:b94e330c98ac 270 free(_fb);
alindvall 0:b94e330c98ac 271 _fb = NULL;
alindvall 0:b94e330c98ac 272 }
alindvall 0:b94e330c98ac 273 for (int i = 0; i < NumberOfButtons; i++) {
alindvall 0:b94e330c98ac 274 _buttons[i] = NULL;
alindvall 0:b94e330c98ac 275 if (_buttons[i] != NULL) {
alindvall 0:b94e330c98ac 276 delete _buttons[i];
alindvall 0:b94e330c98ac 277 _buttons[i] = NULL;
alindvall 0:b94e330c98ac 278 }
alindvall 0:b94e330c98ac 279 }
alindvall 0:b94e330c98ac 280 if (_bgImg.pointerToFree != NULL) {
alindvall 0:b94e330c98ac 281 free(_bgImg.pointerToFree);
alindvall 0:b94e330c98ac 282 _bgImg.pointerToFree = NULL;
alindvall 0:b94e330c98ac 283 }
alindvall 0:b94e330c98ac 284 return true;
alindvall 0:b94e330c98ac 285 }
alindvall 0:b94e330c98ac 286
alindvall 0:b94e330c98ac 287 void AppLauncherSpecial::setAppCreatorFunc(App*(*callback)(uint32_t buttonID))
alindvall 0:b94e330c98ac 288 {
alindvall 0:b94e330c98ac 289 _callback = callback;
alindvall 0:b94e330c98ac 290 }
alindvall 0:b94e330c98ac 291
alindvall 0:b94e330c98ac 292 bool AppLauncherSpecial::addButton(uint32_t buttonID, const char* caption)
alindvall 0:b94e330c98ac 293 {
alindvall 0:b94e330c98ac 294 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 295 int xspace = ((_disp->width() - ButtonColumns * ButtonWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 296 int yspace = ((_disp->height() - TitleHeight - ButtonRows * ButtonHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 297
alindvall 0:b94e330c98ac 298 _buttons[idx] = new Button(caption, (COLOR_T*)_fb,
alindvall 0:b94e330c98ac 299 xspace + (ButtonWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 300 TitleHeight + yspace + (ButtonHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 301 ButtonWidth, ButtonHeight);
alindvall 0:b94e330c98ac 302 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 303 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 304 return true;
alindvall 0:b94e330c98ac 305 }
alindvall 0:b94e330c98ac 306
alindvall 0:b94e330c98ac 307 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* imgUp, const char* imgDown)
alindvall 0:b94e330c98ac 308 {
alindvall 0:b94e330c98ac 309 return addImageButton(buttonID, NULL, BLACK, imgUp, imgDown);
alindvall 0:b94e330c98ac 310 }
alindvall 0:b94e330c98ac 311
alindvall 0:b94e330c98ac 312 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, const char* imgUp, const char* imgDown)
alindvall 0:b94e330c98ac 313 {
alindvall 0:b94e330c98ac 314 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 315 int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 316 int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 317
alindvall 0:b94e330c98ac 318 ImageButton* img = new ImageButton((COLOR_T*)_fb,
alindvall 0:b94e330c98ac 319 xspace + (_iconWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 320 TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 321 _iconWidth, _iconHeight, caption, color);
alindvall 0:b94e330c98ac 322 if (img->loadImages(imgUp, imgDown)) {
alindvall 0:b94e330c98ac 323 _buttons[idx] = img;
alindvall 0:b94e330c98ac 324 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 325 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 326 return true;
alindvall 0:b94e330c98ac 327 } else {
alindvall 0:b94e330c98ac 328 //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown);
alindvall 0:b94e330c98ac 329 return false;
alindvall 0:b94e330c98ac 330 }
alindvall 0:b94e330c98ac 331 }
alindvall 0:b94e330c98ac 332
alindvall 0:b94e330c98ac 333 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const unsigned char* imgUp, unsigned int imgUpSize, const unsigned char* imgDown, unsigned int imgDownSize)
alindvall 0:b94e330c98ac 334 {
alindvall 0:b94e330c98ac 335 return addImageButton(buttonID, NULL, BLACK, imgUp, imgUpSize, imgDown, imgDownSize);
alindvall 0:b94e330c98ac 336 }
alindvall 0:b94e330c98ac 337
alindvall 0:b94e330c98ac 338 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 339 {
alindvall 0:b94e330c98ac 340 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 341 int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 342 int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 343
alindvall 0:b94e330c98ac 344 ImageButton* img = new ImageButton((COLOR_T*)_fb,
alindvall 0:b94e330c98ac 345 xspace + (_iconWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 346 TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 347 _iconWidth, _iconHeight, caption, color);
alindvall 0:b94e330c98ac 348 img->setTransparency(RED);
alindvall 0:b94e330c98ac 349 if (img->loadImages(imgUp, imgUpSize, imgDown, imgDownSize)) {
alindvall 0:b94e330c98ac 350 _buttons[idx] = img;
alindvall 0:b94e330c98ac 351 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 352 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 353 return true;
alindvall 0:b94e330c98ac 354 } else {
alindvall 0:b94e330c98ac 355 //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown);
alindvall 0:b94e330c98ac 356 return false;
alindvall 0:b94e330c98ac 357 }
alindvall 0:b94e330c98ac 358 }
alindvall 0:b94e330c98ac 359
alindvall 0:b94e330c98ac 360 bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, Resource* resUp, Resource* resDown)
alindvall 0:b94e330c98ac 361 {
alindvall 0:b94e330c98ac 362 int idx = _usedButtons++;
alindvall 0:b94e330c98ac 363 int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1));
alindvall 0:b94e330c98ac 364 int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1));
alindvall 0:b94e330c98ac 365
alindvall 0:b94e330c98ac 366 ImageButton* img = new ImageButton((COLOR_T*)_fb,
alindvall 0:b94e330c98ac 367 xspace + (_iconWidth + xspace)*(idx%ButtonColumns),
alindvall 0:b94e330c98ac 368 TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns),
alindvall 0:b94e330c98ac 369 _iconWidth, _iconHeight, caption, color);
alindvall 0:b94e330c98ac 370 if (img->loadImages(resUp, resDown)) {
alindvall 0:b94e330c98ac 371 _buttons[idx] = img;
alindvall 0:b94e330c98ac 372 _buttons[idx]->setAction(buttonClicked, buttonID);
alindvall 0:b94e330c98ac 373 //_buttons[idx]->draw();
alindvall 0:b94e330c98ac 374 return true;
alindvall 0:b94e330c98ac 375 } else {
alindvall 0:b94e330c98ac 376 //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown);
alindvall 0:b94e330c98ac 377 return false;
alindvall 0:b94e330c98ac 378 }
alindvall 0:b94e330c98ac 379 }
alindvall 0:b94e330c98ac 380
alindvall 0:b94e330c98ac 381 void AppLauncherSpecial::addResource(Resources id, Resource* res)
alindvall 0:b94e330c98ac 382 {
alindvall 0:b94e330c98ac 383 _resBg = res;
alindvall 0:b94e330c98ac 384 }
alindvall 0:b94e330c98ac 385