Demo for Embedded World 2015.

Dependencies:   DMBasicGUI DMSupport

Demo running on several LPC4088 Display Modules on the Embedded World 2015 exhibition.

Information

To run the demo first drag-n-drop the to_sync.fs3 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.

This is what the launcher will look like:

/media/uploads/embeddedartists/ew2015_cap_000.png /media/uploads/embeddedartists/ew2015_cap_002.png /media/uploads/embeddedartists/ew2015_cap_003.png /media/uploads/embeddedartists/ew2015_cap_004.png /media/uploads/embeddedartists/ew2015_cap_005.png /media/uploads/embeddedartists/ew2015_cap_006.png

Committer:
alindvall
Date:
Thu Feb 19 13:54:53 2015 +0000
Revision:
0:6bd24cbb88a1
Child:
1:1a01ef434a72
First public version

Who changed what in which revision?

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