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:
embeddedartists
Date:
Tue Nov 05 08:20:16 2019 +0000
Revision:
1:1a01ef434a72
Parent:
0:6bd24cbb88a1
Updates related to mbed OS 5

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