Sample GUI for LPC4088. Base code to begin dev
Dependencies: DMBasicGUI DMSupport
Fork of lpc4088_displaymodule_shipped_demo by
AppLauncherSpecial.cpp@4:a7cbb22e4348, 2015-04-28 (annotated)
- Committer:
- alindvall
- Date:
- Tue Apr 28 12:21:14 2015 +0000
- Revision:
- 4:a7cbb22e4348
- Parent:
- 2:229f88d6f56b
Updated to latest version of the DMSupport and DMBasicGUI libraries
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:229f88d6f56b | 190 | 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 | |
alindvall | 0:b94e330c98ac | 259 | bool AppLauncherSpecial::teardown() |
alindvall | 0:b94e330c98ac | 260 | { |
alindvall | 0:b94e330c98ac | 261 | if (_win != NULL) { |
alindvall | 0:b94e330c98ac | 262 | free(_win); |
alindvall | 0:b94e330c98ac | 263 | _win = NULL; |
alindvall | 0:b94e330c98ac | 264 | } |
alindvall | 0:b94e330c98ac | 265 | if (_fb != NULL) { |
alindvall | 0:b94e330c98ac | 266 | free(_fb); |
alindvall | 0:b94e330c98ac | 267 | _fb = NULL; |
alindvall | 0:b94e330c98ac | 268 | } |
alindvall | 0:b94e330c98ac | 269 | for (int i = 0; i < NumberOfButtons; i++) { |
alindvall | 0:b94e330c98ac | 270 | _buttons[i] = NULL; |
alindvall | 0:b94e330c98ac | 271 | if (_buttons[i] != NULL) { |
alindvall | 0:b94e330c98ac | 272 | delete _buttons[i]; |
alindvall | 0:b94e330c98ac | 273 | _buttons[i] = NULL; |
alindvall | 0:b94e330c98ac | 274 | } |
alindvall | 0:b94e330c98ac | 275 | } |
alindvall | 0:b94e330c98ac | 276 | if (_bgImg.pointerToFree != NULL) { |
alindvall | 0:b94e330c98ac | 277 | free(_bgImg.pointerToFree); |
alindvall | 0:b94e330c98ac | 278 | _bgImg.pointerToFree = NULL; |
alindvall | 0:b94e330c98ac | 279 | } |
alindvall | 0:b94e330c98ac | 280 | return true; |
alindvall | 0:b94e330c98ac | 281 | } |
alindvall | 0:b94e330c98ac | 282 | |
alindvall | 0:b94e330c98ac | 283 | void AppLauncherSpecial::setAppCreatorFunc(App*(*callback)(uint32_t buttonID)) |
alindvall | 0:b94e330c98ac | 284 | { |
alindvall | 0:b94e330c98ac | 285 | _callback = callback; |
alindvall | 0:b94e330c98ac | 286 | } |
alindvall | 0:b94e330c98ac | 287 | |
alindvall | 0:b94e330c98ac | 288 | bool AppLauncherSpecial::addButton(uint32_t buttonID, const char* caption) |
alindvall | 0:b94e330c98ac | 289 | { |
alindvall | 0:b94e330c98ac | 290 | int idx = _usedButtons++; |
alindvall | 0:b94e330c98ac | 291 | int xspace = ((_disp->width() - ButtonColumns * ButtonWidth) / (ButtonColumns + 1)); |
alindvall | 0:b94e330c98ac | 292 | int yspace = ((_disp->height() - TitleHeight - ButtonRows * ButtonHeight) / (ButtonRows + 1)); |
alindvall | 0:b94e330c98ac | 293 | |
alindvall | 0:b94e330c98ac | 294 | _buttons[idx] = new Button(caption, (COLOR_T*)_fb, |
alindvall | 0:b94e330c98ac | 295 | xspace + (ButtonWidth + xspace)*(idx%ButtonColumns), |
alindvall | 0:b94e330c98ac | 296 | TitleHeight + yspace + (ButtonHeight + yspace)*(idx/ButtonColumns), |
alindvall | 0:b94e330c98ac | 297 | ButtonWidth, ButtonHeight); |
alindvall | 0:b94e330c98ac | 298 | _buttons[idx]->setAction(buttonClicked, buttonID); |
alindvall | 0:b94e330c98ac | 299 | //_buttons[idx]->draw(); |
alindvall | 0:b94e330c98ac | 300 | return true; |
alindvall | 0:b94e330c98ac | 301 | } |
alindvall | 0:b94e330c98ac | 302 | |
alindvall | 0:b94e330c98ac | 303 | bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* imgUp, const char* imgDown) |
alindvall | 0:b94e330c98ac | 304 | { |
alindvall | 0:b94e330c98ac | 305 | return addImageButton(buttonID, NULL, BLACK, imgUp, imgDown); |
alindvall | 0:b94e330c98ac | 306 | } |
alindvall | 0:b94e330c98ac | 307 | |
alindvall | 0:b94e330c98ac | 308 | bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, const char* imgUp, const char* imgDown) |
alindvall | 0:b94e330c98ac | 309 | { |
alindvall | 0:b94e330c98ac | 310 | int idx = _usedButtons++; |
alindvall | 0:b94e330c98ac | 311 | int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1)); |
alindvall | 0:b94e330c98ac | 312 | int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1)); |
alindvall | 0:b94e330c98ac | 313 | |
alindvall | 0:b94e330c98ac | 314 | ImageButton* img = new ImageButton((COLOR_T*)_fb, |
alindvall | 0:b94e330c98ac | 315 | xspace + (_iconWidth + xspace)*(idx%ButtonColumns), |
alindvall | 0:b94e330c98ac | 316 | TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns), |
alindvall | 0:b94e330c98ac | 317 | _iconWidth, _iconHeight, caption, color); |
alindvall | 0:b94e330c98ac | 318 | if (img->loadImages(imgUp, imgDown)) { |
alindvall | 0:b94e330c98ac | 319 | _buttons[idx] = img; |
alindvall | 0:b94e330c98ac | 320 | _buttons[idx]->setAction(buttonClicked, buttonID); |
alindvall | 0:b94e330c98ac | 321 | //_buttons[idx]->draw(); |
alindvall | 0:b94e330c98ac | 322 | return true; |
alindvall | 0:b94e330c98ac | 323 | } else { |
alindvall | 0:b94e330c98ac | 324 | //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown); |
alindvall | 0:b94e330c98ac | 325 | return false; |
alindvall | 0:b94e330c98ac | 326 | } |
alindvall | 0:b94e330c98ac | 327 | } |
alindvall | 0:b94e330c98ac | 328 | |
alindvall | 0:b94e330c98ac | 329 | bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const unsigned char* imgUp, unsigned int imgUpSize, const unsigned char* imgDown, unsigned int imgDownSize) |
alindvall | 0:b94e330c98ac | 330 | { |
alindvall | 0:b94e330c98ac | 331 | return addImageButton(buttonID, NULL, BLACK, imgUp, imgUpSize, imgDown, imgDownSize); |
alindvall | 0:b94e330c98ac | 332 | } |
alindvall | 0:b94e330c98ac | 333 | |
alindvall | 0:b94e330c98ac | 334 | 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 | 335 | { |
alindvall | 0:b94e330c98ac | 336 | int idx = _usedButtons++; |
alindvall | 0:b94e330c98ac | 337 | int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1)); |
alindvall | 0:b94e330c98ac | 338 | int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1)); |
alindvall | 0:b94e330c98ac | 339 | |
alindvall | 0:b94e330c98ac | 340 | ImageButton* img = new ImageButton((COLOR_T*)_fb, |
alindvall | 0:b94e330c98ac | 341 | xspace + (_iconWidth + xspace)*(idx%ButtonColumns), |
alindvall | 0:b94e330c98ac | 342 | TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns), |
alindvall | 0:b94e330c98ac | 343 | _iconWidth, _iconHeight, caption, color); |
alindvall | 0:b94e330c98ac | 344 | img->setTransparency(RED); |
alindvall | 0:b94e330c98ac | 345 | if (img->loadImages(imgUp, imgUpSize, imgDown, imgDownSize)) { |
alindvall | 0:b94e330c98ac | 346 | _buttons[idx] = img; |
alindvall | 0:b94e330c98ac | 347 | _buttons[idx]->setAction(buttonClicked, buttonID); |
alindvall | 0:b94e330c98ac | 348 | //_buttons[idx]->draw(); |
alindvall | 0:b94e330c98ac | 349 | return true; |
alindvall | 0:b94e330c98ac | 350 | } else { |
alindvall | 0:b94e330c98ac | 351 | //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown); |
alindvall | 0:b94e330c98ac | 352 | return false; |
alindvall | 0:b94e330c98ac | 353 | } |
alindvall | 0:b94e330c98ac | 354 | } |
alindvall | 0:b94e330c98ac | 355 | |
alindvall | 0:b94e330c98ac | 356 | bool AppLauncherSpecial::addImageButton(uint32_t buttonID, const char* caption, COLOR_T color, Resource* resUp, Resource* resDown) |
alindvall | 0:b94e330c98ac | 357 | { |
alindvall | 0:b94e330c98ac | 358 | int idx = _usedButtons++; |
alindvall | 0:b94e330c98ac | 359 | int xspace = ((_disp->width() - ButtonColumns * _iconWidth) / (ButtonColumns + 1)); |
alindvall | 0:b94e330c98ac | 360 | int yspace = ((_disp->height() - TitleHeight - ButtonRows * _iconHeight) / (ButtonRows + 1)); |
alindvall | 0:b94e330c98ac | 361 | |
alindvall | 0:b94e330c98ac | 362 | ImageButton* img = new ImageButton((COLOR_T*)_fb, |
alindvall | 0:b94e330c98ac | 363 | xspace + (_iconWidth + xspace)*(idx%ButtonColumns), |
alindvall | 0:b94e330c98ac | 364 | TitleHeight + yspace + (_iconHeight + yspace)*(idx/ButtonColumns), |
alindvall | 0:b94e330c98ac | 365 | _iconWidth, _iconHeight, caption, color); |
alindvall | 0:b94e330c98ac | 366 | if (img->loadImages(resUp, resDown)) { |
alindvall | 0:b94e330c98ac | 367 | _buttons[idx] = img; |
alindvall | 0:b94e330c98ac | 368 | _buttons[idx]->setAction(buttonClicked, buttonID); |
alindvall | 0:b94e330c98ac | 369 | //_buttons[idx]->draw(); |
alindvall | 0:b94e330c98ac | 370 | return true; |
alindvall | 0:b94e330c98ac | 371 | } else { |
alindvall | 0:b94e330c98ac | 372 | //DMBoard::instance().logger()->printf("Failed to load image for buttonID %u, %s[%s]\n", buttonID, imgUp, imgDown==NULL?"":imgDown); |
alindvall | 0:b94e330c98ac | 373 | return false; |
alindvall | 0:b94e330c98ac | 374 | } |
alindvall | 0:b94e330c98ac | 375 | } |
alindvall | 0:b94e330c98ac | 376 | |
alindvall | 0:b94e330c98ac | 377 | void AppLauncherSpecial::addResource(Resources id, Resource* res) |
alindvall | 0:b94e330c98ac | 378 | { |
alindvall | 0:b94e330c98ac | 379 | _resBg = res; |
alindvall | 0:b94e330c98ac | 380 | } |
alindvall | 0:b94e330c98ac | 381 |