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:
Tue Apr 28 12:21:14 2015 +0000
Revision:
4:a7cbb22e4348
Parent:
0:b94e330c98ac
Child:
5:6ca8470ba8f8
Updated to latest version of the DMSupport and DMBasicGUI libraries

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 "EthernetInterface.h"
alindvall 0:b94e330c98ac 20 #include "AppUSBStatus.h"
alindvall 0:b94e330c98ac 21 #include "lpc_swim_image.h"
alindvall 0:b94e330c98ac 22 #include "lpc_swim_font.h"
alindvall 0:b94e330c98ac 23 #include "image_data.h"
alindvall 0:b94e330c98ac 24 #include "BiosLoader.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 HEADER_X_OFF (20-5)
alindvall 0:b94e330c98ac 31 #define HEADER_Y_SPACING (20-5)
alindvall 0:b94e330c98ac 32 #define ITEM_CAPTION_X_OFF (40-15)
alindvall 0:b94e330c98ac 33 #define ITEM_CAPTION_Y_SPACING (swim_get_font_height(_win) + 5)
alindvall 0:b94e330c98ac 34 #define ITEM_VALUE_X_OFF (140-25)
alindvall 0:b94e330c98ac 35 #define COL3_OFF (230+70)
alindvall 0:b94e330c98ac 36 #define COL4 (COL3_OFF + ITEM_VALUE_X_OFF - 5)
alindvall 0:b94e330c98ac 37
alindvall 0:b94e330c98ac 38 #define BTN_OFF 20
alindvall 0:b94e330c98ac 39
alindvall 0:b94e330c98ac 40 #define DEMO_VERSION "v0.9"
alindvall 0:b94e330c98ac 41 #define DEMO_BUILD_INFO __DATE__ " " __TIME__
alindvall 0:b94e330c98ac 42
alindvall 0:b94e330c98ac 43 #define DESCR(__res, __disp) \
alindvall 0:b94e330c98ac 44 (((__res) == ((__disp)->currentResolution())) ? ("Active") : (((__disp)->isSupported(__res)) ? ("Supported") : ("N/A")))
alindvall 0:b94e330c98ac 45
alindvall 0:b94e330c98ac 46
alindvall 0:b94e330c98ac 47 static const unsigned char* IMAGES[] = {
alindvall 0:b94e330c98ac 48 img_usb_masstorage,
alindvall 0:b94e330c98ac 49 img_usb_masstorage_ejected,
alindvall 0:b94e330c98ac 50 img_usb_mouse,
alindvall 0:b94e330c98ac 51 img_usb_mouse_ejected,
alindvall 0:b94e330c98ac 52 img_usb_keyboard,
alindvall 0:b94e330c98ac 53 img_usb_keyboard_ejected,
alindvall 0:b94e330c98ac 54 };
alindvall 0:b94e330c98ac 55 static const unsigned int IMAGE_SIZES[] = {
alindvall 0:b94e330c98ac 56 img_size_usb_masstorage,
alindvall 0:b94e330c98ac 57 img_size_usb_masstorage_ejected,
alindvall 0:b94e330c98ac 58 img_size_usb_mouse,
alindvall 0:b94e330c98ac 59 img_size_usb_mouse_ejected,
alindvall 0:b94e330c98ac 60 img_size_usb_keyboard,
alindvall 0:b94e330c98ac 61 img_size_usb_keyboard_ejected,
alindvall 0:b94e330c98ac 62 };
alindvall 0:b94e330c98ac 63 static const char* CAPTIONS[] = {
alindvall 0:b94e330c98ac 64 "Memory Stick",
alindvall 0:b94e330c98ac 65 "No Memory Stick",
alindvall 0:b94e330c98ac 66 "Mouse",
alindvall 0:b94e330c98ac 67 "No Mouse",
alindvall 0:b94e330c98ac 68 "Keyboard",
alindvall 0:b94e330c98ac 69 "No Keyboard",
alindvall 0:b94e330c98ac 70 };
alindvall 0:b94e330c98ac 71
alindvall 0:b94e330c98ac 72 /******************************************************************************
alindvall 0:b94e330c98ac 73 * Global variables
alindvall 0:b94e330c98ac 74 *****************************************************************************/
alindvall 0:b94e330c98ac 75
alindvall 0:b94e330c98ac 76 extern bool msdConnected;
alindvall 0:b94e330c98ac 77 extern bool keyboardConnected;
alindvall 0:b94e330c98ac 78 extern bool mouseConnected;
alindvall 0:b94e330c98ac 79
alindvall 0:b94e330c98ac 80 /******************************************************************************
alindvall 0:b94e330c98ac 81 * Private functions
alindvall 0:b94e330c98ac 82 *****************************************************************************/
alindvall 0:b94e330c98ac 83
alindvall 0:b94e330c98ac 84 static void buttonClicked(uint32_t x)
alindvall 0:b94e330c98ac 85 {
alindvall 0:b94e330c98ac 86 bool* done = (bool*)x;
alindvall 0:b94e330c98ac 87 *done = true;
alindvall 0:b94e330c98ac 88 }
alindvall 0:b94e330c98ac 89
alindvall 0:b94e330c98ac 90 void AppUSBStatus::draw()
alindvall 0:b94e330c98ac 91 {
alindvall 0:b94e330c98ac 92 // Prepare fullscreen
alindvall 0:b94e330c98ac 93 swim_window_open(_win,
alindvall 0:b94e330c98ac 94 _disp->width(), _disp->height(), // full size
alindvall 0:b94e330c98ac 95 (COLOR_T*)_fb,
alindvall 0:b94e330c98ac 96 0,0,_disp->width()-1, _disp->height()-1, // window position and size
alindvall 0:b94e330c98ac 97 0, // border
alindvall 0:b94e330c98ac 98 BLACK, WHITE, BLACK); // colors: pen, backgr, forgr
alindvall 0:b94e330c98ac 99 //swim_set_title(_win, "USB Status", BLACK);
alindvall 0:b94e330c98ac 100
alindvall 0:b94e330c98ac 101 // Start by drawing all USB Devices disconnected. Each device is drawn in
alindvall 0:b94e330c98ac 102 // its own window so that the positioning information can be kept here
alindvall 0:b94e330c98ac 103 int images = NumImages/2;
alindvall 0:b94e330c98ac 104 int xspace = (_disp->width() - (_images[0].width * images)) / 4;
alindvall 0:b94e330c98ac 105 int yoff = (_disp->height() - _images[0].height)/3;
alindvall 0:b94e330c98ac 106 int xoff = xspace;
alindvall 0:b94e330c98ac 107 for (int i = 1; i < NumImages; i+=2) {
alindvall 0:b94e330c98ac 108 swim_window_open(&_imageWindows[i/2],
alindvall 0:b94e330c98ac 109 _disp->width(), _disp->height(), // full size
alindvall 0:b94e330c98ac 110 (COLOR_T*)_fb,
alindvall 0:b94e330c98ac 111 xoff,yoff,xoff+_images[0].width-1, yoff+_images[0].height+20-1, // window position and size
alindvall 0:b94e330c98ac 112 0, // border
alindvall 0:b94e330c98ac 113 BLACK, WHITE, BLACK); // colors: pen, backgr, forgr
alindvall 0:b94e330c98ac 114 swim_put_image(&_imageWindows[i/2], _images[i].pixels, _images[i].width, _images[i].height);
alindvall 0:b94e330c98ac 115
alindvall 0:b94e330c98ac 116 swim_put_text_centered_win(&_imageWindows[i/2], CAPTIONS[i], _images[i].height);
alindvall 0:b94e330c98ac 117 xoff += _images[i].width + xspace;
alindvall 0:b94e330c98ac 118 }
alindvall 0:b94e330c98ac 119
alindvall 0:b94e330c98ac 120 _btn = new ImageButton(_win->fb, _win->xpmax - BTN_OFF - _resOk->width(), _win->ypmax - BTN_OFF - _resOk->height(), _resOk->width(), _resOk->height());
alindvall 0:b94e330c98ac 121 _btn->loadImages(_resOk);
alindvall 0:b94e330c98ac 122 _btn->draw();
alindvall 0:b94e330c98ac 123 }
alindvall 0:b94e330c98ac 124
alindvall 0:b94e330c98ac 125 void AppUSBStatus::updateStatus(Ids id)
alindvall 0:b94e330c98ac 126 {
alindvall 0:b94e330c98ac 127 SWIM_WINDOW_T* pWin = &_imageWindows[id/2];
alindvall 0:b94e330c98ac 128 swim_clear_screen(pWin, WHITE);
alindvall 0:b94e330c98ac 129 swim_put_image(pWin, _images[id].pixels, _images[id].width, _images[id].height);
alindvall 0:b94e330c98ac 130 swim_put_text_centered_win(pWin, CAPTIONS[id], _images[id].height);
alindvall 0:b94e330c98ac 131 }
alindvall 0:b94e330c98ac 132
alindvall 0:b94e330c98ac 133 /******************************************************************************
alindvall 0:b94e330c98ac 134 * Public functions
alindvall 0:b94e330c98ac 135 *****************************************************************************/
alindvall 0:b94e330c98ac 136
alindvall 0:b94e330c98ac 137 AppUSBStatus::AppUSBStatus() : _disp(NULL), _win(NULL), _fb(NULL),
alindvall 0:b94e330c98ac 138 _btn(NULL), _resOk(NULL)
alindvall 0:b94e330c98ac 139 {
alindvall 0:b94e330c98ac 140 for (int i = 0; i < NumImages; i++) {
alindvall 0:b94e330c98ac 141 _images[i].pointerToFree = NULL;
alindvall 0:b94e330c98ac 142 _images[i].pixels = NULL;
alindvall 0:b94e330c98ac 143 }
alindvall 0:b94e330c98ac 144 }
alindvall 0:b94e330c98ac 145
alindvall 0:b94e330c98ac 146 AppUSBStatus::~AppUSBStatus()
alindvall 0:b94e330c98ac 147 {
alindvall 0:b94e330c98ac 148 teardown();
alindvall 0:b94e330c98ac 149 }
alindvall 0:b94e330c98ac 150
alindvall 0:b94e330c98ac 151 bool AppUSBStatus::setup()
alindvall 0:b94e330c98ac 152 {
alindvall 0:b94e330c98ac 153 RtosLog* log = DMBoard::instance().logger();
alindvall 0:b94e330c98ac 154
alindvall 0:b94e330c98ac 155 _disp = DMBoard::instance().display();
alindvall 0:b94e330c98ac 156 _win = (SWIM_WINDOW_T*)malloc(sizeof(SWIM_WINDOW_T));
alindvall 0:b94e330c98ac 157 _fb = _disp->allocateFramebuffer();
alindvall 0:b94e330c98ac 158
alindvall 0:b94e330c98ac 159 if (_win == NULL || _fb == NULL) {
alindvall 0:b94e330c98ac 160 log->printf("Failed to allocate memory for framebuffer\r\n");
alindvall 0:b94e330c98ac 161 return false;
alindvall 0:b94e330c98ac 162 }
alindvall 0:b94e330c98ac 163
alindvall 0:b94e330c98ac 164 for (int i = 0; i < NumImages; i++) {
alindvall 0:b94e330c98ac 165 if (Image::decode(IMAGES[i], IMAGE_SIZES[i], Image::RES_16BIT, &_images[i]) != 0) {
alindvall 0:b94e330c98ac 166 log->printf("Failed to load image %d of %d\n", i+1, NumImages);
alindvall 0:b94e330c98ac 167 return false;
alindvall 0:b94e330c98ac 168 }
alindvall 0:b94e330c98ac 169 }
alindvall 0:b94e330c98ac 170
alindvall 0:b94e330c98ac 171 return true;
alindvall 0:b94e330c98ac 172 }
alindvall 0:b94e330c98ac 173
alindvall 0:b94e330c98ac 174 void AppUSBStatus::runToCompletion()
alindvall 0:b94e330c98ac 175 {
alindvall 0:b94e330c98ac 176 // Alternative 1: use the calling thread's context to run in
alindvall 0:b94e330c98ac 177 bool done = false;
alindvall 0:b94e330c98ac 178 draw();
alindvall 0:b94e330c98ac 179 _btn->setAction(buttonClicked, (uint32_t)&done);
alindvall 0:b94e330c98ac 180 void* oldFB = _disp->swapFramebuffer(_fb);
alindvall 0:b94e330c98ac 181
alindvall 0:b94e330c98ac 182 // Wait for touches, but the AppLauncher is already listening
alindvall 0:b94e330c98ac 183 // for new touch event and sends a signal to its thread which
alindvall 0:b94e330c98ac 184 // is the same as runs this function so it is enough to wait
alindvall 0:b94e330c98ac 185 // for that signal.
alindvall 0:b94e330c98ac 186 TouchPanel* touch = DMBoard::instance().touchPanel();
alindvall 0:b94e330c98ac 187 touch_coordinate_t coord;
alindvall 0:b94e330c98ac 188 bool lastMassStorage = false;
alindvall 0:b94e330c98ac 189 bool lastMouse = false;
alindvall 0:b94e330c98ac 190 bool lastKeyboard = false;
alindvall 0:b94e330c98ac 191 while(!done) {
alindvall 0:b94e330c98ac 192 Thread::signal_wait(0x1, 500);
alindvall 0:b94e330c98ac 193 if (touch->read(coord) == TouchPanel::TouchError_Ok) {
alindvall 0:b94e330c98ac 194 if (_btn->handle(coord.x, coord.y, coord.z > 0)) {
alindvall 0:b94e330c98ac 195 _btn->draw();
alindvall 0:b94e330c98ac 196 }
alindvall 0:b94e330c98ac 197 }
alindvall 0:b94e330c98ac 198 if (lastMassStorage != msdConnected) {
alindvall 0:b94e330c98ac 199 lastMassStorage = msdConnected;
alindvall 0:b94e330c98ac 200 updateStatus(lastMassStorage ? USBHost_MassStorage_Inserted : USBHost_MassStorage_Ejected);
alindvall 0:b94e330c98ac 201 }
alindvall 0:b94e330c98ac 202 if (lastKeyboard != keyboardConnected) {
alindvall 0:b94e330c98ac 203 lastKeyboard = keyboardConnected;
alindvall 0:b94e330c98ac 204 updateStatus(lastKeyboard ? USBHost_Keyboard_Inserted : USBHost_Keyboard_Ejected);
alindvall 0:b94e330c98ac 205 }
alindvall 0:b94e330c98ac 206 if (lastMouse != mouseConnected) {
alindvall 0:b94e330c98ac 207 lastMouse = mouseConnected;
alindvall 0:b94e330c98ac 208 updateStatus(lastMouse ? USBHost_Mouse_Inserted : USBHost_Mouse_Ejected);
alindvall 0:b94e330c98ac 209 }
alindvall 0:b94e330c98ac 210 }
alindvall 0:b94e330c98ac 211
alindvall 0:b94e330c98ac 212 // User has clicked the button, restore the original FB
alindvall 0:b94e330c98ac 213 _disp->swapFramebuffer(oldFB);
alindvall 0:b94e330c98ac 214 swim_window_close(_win);
alindvall 0:b94e330c98ac 215 }
alindvall 0:b94e330c98ac 216
alindvall 0:b94e330c98ac 217 bool AppUSBStatus::teardown()
alindvall 0:b94e330c98ac 218 {
alindvall 0:b94e330c98ac 219 if (_win != NULL) {
alindvall 0:b94e330c98ac 220 free(_win);
alindvall 0:b94e330c98ac 221 _win = NULL;
alindvall 0:b94e330c98ac 222 }
alindvall 0:b94e330c98ac 223 if (_fb != NULL) {
alindvall 0:b94e330c98ac 224 free(_fb);
alindvall 0:b94e330c98ac 225 _fb = NULL;
alindvall 0:b94e330c98ac 226 }
alindvall 0:b94e330c98ac 227 if (_btn != NULL) {
alindvall 0:b94e330c98ac 228 delete _btn;
alindvall 0:b94e330c98ac 229 _btn = NULL;
alindvall 0:b94e330c98ac 230 }
alindvall 0:b94e330c98ac 231 for (int i = 0; i < NumImages; i++) {
alindvall 0:b94e330c98ac 232 if (_images[i].pointerToFree != NULL) {
alindvall 0:b94e330c98ac 233 free(_images[i].pointerToFree);
alindvall 0:b94e330c98ac 234 _images[i].pointerToFree = NULL;
alindvall 0:b94e330c98ac 235 }
alindvall 0:b94e330c98ac 236 }
alindvall 0:b94e330c98ac 237 return true;
alindvall 0:b94e330c98ac 238 }
alindvall 0:b94e330c98ac 239
alindvall 0:b94e330c98ac 240
alindvall 0:b94e330c98ac 241 void AppUSBStatus::addResource(Resources id, Resource* res)
alindvall 0:b94e330c98ac 242 {
alindvall 0:b94e330c98ac 243 _resOk = res;
alindvall 0:b94e330c98ac 244 }
alindvall 0:b94e330c98ac 245