Example using the support package for LPC4088 DisplayModule

Dependencies:   DMBasicGUI DMSupport

Example using a lot of the features in the software package for the LPC4088 Display Module.

This project can be selected as a template when creating a new project based on the LPC4088 Display Module.

Information

This project works on the 4.3" display modules.

Some of the apps works on the 5" display modules. The ImageViewer and Slideshow app will show the images distorted as it does not take the resolution into consideration.

Information

The USB Status app is disabled. The Image viewer looks for images in the root of SD cards, USB memory sticks or the file system on the QSPI flash. The Slideshow app expects to find a slideshow script in /mci/elec14/ea_logo.txt.

This is what it looks like on the 4.3" display:

/media/uploads/embeddedartists/everything_cap_000.png /media/uploads/embeddedartists/everything_cap_001.png /media/uploads/embeddedartists/everything_cap_003.png /media/uploads/embeddedartists/everything_cap_004.png /media/uploads/embeddedartists/everything_cap_006.png /media/uploads/embeddedartists/everything_cap_008.png

Committer:
embeddedartists
Date:
Wed Dec 03 16:18:34 2014 +0000
Revision:
1:15ea03d72dd7
Parent:
0:dfad71908d59
Child:
2:070e9c054796
Corrected SPIFI to run at 60MHz. Added support for USB Host Keyboard+Mouse+Hub.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
embeddedartists 0:dfad71908d59 1 /******************************************************************************
embeddedartists 0:dfad71908d59 2 * Includes
embeddedartists 0:dfad71908d59 3 *****************************************************************************/
embeddedartists 0:dfad71908d59 4
embeddedartists 0:dfad71908d59 5 #include "mbed.h"
embeddedartists 0:dfad71908d59 6 #include "mbed_interface.h"
embeddedartists 0:dfad71908d59 7 #include "rtos.h"
embeddedartists 0:dfad71908d59 8 #include "EthernetInterface.h"
embeddedartists 0:dfad71908d59 9 #include "HTTPServer.h"
embeddedartists 0:dfad71908d59 10 #include "mbed_rpc.h"
embeddedartists 0:dfad71908d59 11 #include "USBHostMSD.h"
embeddedartists 1:15ea03d72dd7 12 #include "USBHostMouse.h"
embeddedartists 1:15ea03d72dd7 13 #include "USBHostKeyboard.h"
embeddedartists 0:dfad71908d59 14
embeddedartists 0:dfad71908d59 15 #include "DMBoard.h"
embeddedartists 0:dfad71908d59 16 #include "Graphics.h"
embeddedartists 0:dfad71908d59 17
embeddedartists 0:dfad71908d59 18 /******************************************************************************
embeddedartists 0:dfad71908d59 19 * Typedefs and defines
embeddedartists 0:dfad71908d59 20 *****************************************************************************/
embeddedartists 0:dfad71908d59 21
embeddedartists 0:dfad71908d59 22 /* Number of colors in 565 mode */
embeddedartists 0:dfad71908d59 23 #define NUM_COLORS 65536
embeddedartists 0:dfad71908d59 24 /* Number of red colors in 565 mode */
embeddedartists 0:dfad71908d59 25 #define RED_COLORS 0x20
embeddedartists 0:dfad71908d59 26 /* Number of green colors in 565 mode */
embeddedartists 0:dfad71908d59 27 #define GREEN_COLORS 0x40
embeddedartists 0:dfad71908d59 28 /* Number of blue colors in 565 mode */
embeddedartists 0:dfad71908d59 29 #define BLUE_COLORS 0x20
embeddedartists 0:dfad71908d59 30 /* Black color, 565 mode */
embeddedartists 0:dfad71908d59 31 #define BLACK 0x0000
embeddedartists 0:dfad71908d59 32
embeddedartists 0:dfad71908d59 33 /******************************************************************************
embeddedartists 0:dfad71908d59 34 * Local variables
embeddedartists 0:dfad71908d59 35 *****************************************************************************/
embeddedartists 0:dfad71908d59 36
embeddedartists 0:dfad71908d59 37 EthernetInterface eth;
embeddedartists 1:15ea03d72dd7 38 Mutex usbInitGuard;
embeddedartists 0:dfad71908d59 39
embeddedartists 0:dfad71908d59 40 /******************************************************************************
embeddedartists 0:dfad71908d59 41 * Global variables
embeddedartists 0:dfad71908d59 42 *****************************************************************************/
embeddedartists 0:dfad71908d59 43
embeddedartists 0:dfad71908d59 44 /******************************************************************************
embeddedartists 0:dfad71908d59 45 * Local functions
embeddedartists 0:dfad71908d59 46 *****************************************************************************/
embeddedartists 0:dfad71908d59 47
embeddedartists 0:dfad71908d59 48 static void verticalLine16(uint16_t* framebuffer, int w, int x, int y0, int y1, uint16_t color)
embeddedartists 0:dfad71908d59 49 {
embeddedartists 0:dfad71908d59 50 if (x < w) {
embeddedartists 0:dfad71908d59 51 int h = y1 - y0 + 1;
embeddedartists 0:dfad71908d59 52 uint16_t* fb = framebuffer;
embeddedartists 0:dfad71908d59 53 fb += x;
embeddedartists 0:dfad71908d59 54 fb += y0 * w;
embeddedartists 0:dfad71908d59 55 for (int i = 0; i < h; i++) {
embeddedartists 0:dfad71908d59 56 *fb = color;
embeddedartists 0:dfad71908d59 57 fb += w;
embeddedartists 0:dfad71908d59 58 }
embeddedartists 0:dfad71908d59 59 }
embeddedartists 0:dfad71908d59 60 }
embeddedartists 0:dfad71908d59 61
embeddedartists 0:dfad71908d59 62 /**
embeddedartists 0:dfad71908d59 63 * Draw color bars to the display
embeddedartists 0:dfad71908d59 64 */
embeddedartists 0:dfad71908d59 65 static void drawBars565(uint16_t* framebuffer, int w, int h)
embeddedartists 0:dfad71908d59 66 {
embeddedartists 0:dfad71908d59 67 uint16_t clr;
embeddedartists 0:dfad71908d59 68 uint16_t xgs, ygs, curx, cury, curym, xidx;
embeddedartists 0:dfad71908d59 69 int idx;
embeddedartists 0:dfad71908d59 70
embeddedartists 0:dfad71908d59 71 /* Compute vertical size for bars */
embeddedartists 0:dfad71908d59 72 ygs = h / 3;
embeddedartists 0:dfad71908d59 73
embeddedartists 0:dfad71908d59 74 /* Draw Red bars */
embeddedartists 0:dfad71908d59 75 cury = 0;
embeddedartists 0:dfad71908d59 76 curx = 0;
embeddedartists 0:dfad71908d59 77 curym = ygs - 1;
embeddedartists 0:dfad71908d59 78 xgs = w / RED_COLORS;
embeddedartists 0:dfad71908d59 79 clr = BLACK;
embeddedartists 0:dfad71908d59 80 for (xidx = 0; xidx < RED_COLORS; xidx++)
embeddedartists 0:dfad71908d59 81 {
embeddedartists 0:dfad71908d59 82 //swim_set_pen_color(win1, clr);
embeddedartists 0:dfad71908d59 83 for (idx = 0; idx <= xgs; idx++)
embeddedartists 0:dfad71908d59 84 {
embeddedartists 0:dfad71908d59 85 //swim_put_line(win1, curx, cury, curx, curym);
embeddedartists 0:dfad71908d59 86 //g.put_line(curx, cury, curx, curym, clr);
embeddedartists 0:dfad71908d59 87 verticalLine16(framebuffer, w, curx, cury, curym, clr);
embeddedartists 0:dfad71908d59 88 curx++;
embeddedartists 0:dfad71908d59 89 }
embeddedartists 0:dfad71908d59 90 clr = clr + 0x0800;
embeddedartists 0:dfad71908d59 91 }
embeddedartists 0:dfad71908d59 92
embeddedartists 0:dfad71908d59 93 /* Draw green bars */
embeddedartists 0:dfad71908d59 94 cury = cury + ygs;
embeddedartists 0:dfad71908d59 95 curx = 0;
embeddedartists 0:dfad71908d59 96 curym = cury + (ygs - 1);
embeddedartists 0:dfad71908d59 97 xgs = w / GREEN_COLORS;
embeddedartists 0:dfad71908d59 98 clr = BLACK;
embeddedartists 0:dfad71908d59 99 for (xidx = 0; xidx < GREEN_COLORS; xidx++)
embeddedartists 0:dfad71908d59 100 {
embeddedartists 0:dfad71908d59 101 //swim_set_pen_color(win1, clr);
embeddedartists 0:dfad71908d59 102 for (idx = 0; idx <= xgs; idx++)
embeddedartists 0:dfad71908d59 103 {
embeddedartists 0:dfad71908d59 104 //swim_put_line(win1, curx, cury, curx, curym);
embeddedartists 0:dfad71908d59 105 //g.put_line(curx, cury, curx, curym, clr);
embeddedartists 0:dfad71908d59 106 verticalLine16(framebuffer, w, curx, cury, curym, clr);
embeddedartists 0:dfad71908d59 107 curx++;
embeddedartists 0:dfad71908d59 108 }
embeddedartists 0:dfad71908d59 109 clr = clr + 0x0020;
embeddedartists 0:dfad71908d59 110 }
embeddedartists 0:dfad71908d59 111
embeddedartists 0:dfad71908d59 112 /* Draw blue bars */
embeddedartists 0:dfad71908d59 113 cury = cury + ygs;
embeddedartists 0:dfad71908d59 114 curx = 0;
embeddedartists 0:dfad71908d59 115 curym = h - 1;//cury + (ygs - 1);
embeddedartists 0:dfad71908d59 116 xgs = w / BLUE_COLORS;
embeddedartists 0:dfad71908d59 117 clr = BLACK;
embeddedartists 0:dfad71908d59 118 for (xidx = 0; xidx < BLUE_COLORS; xidx++)
embeddedartists 0:dfad71908d59 119 {
embeddedartists 0:dfad71908d59 120 //swim_set_pen_color(win1, clr);
embeddedartists 0:dfad71908d59 121 for (idx = 0; idx <= xgs; idx++)
embeddedartists 0:dfad71908d59 122 {
embeddedartists 0:dfad71908d59 123 //swim_put_line(win1, curx, cury, curx, curym);
embeddedartists 0:dfad71908d59 124 //g.put_line(curx, cury, curx, curym, clr);
embeddedartists 0:dfad71908d59 125 verticalLine16(framebuffer, w, curx, cury, curym, clr);
embeddedartists 0:dfad71908d59 126 curx++;
embeddedartists 0:dfad71908d59 127 }
embeddedartists 0:dfad71908d59 128 clr = clr + 0x0001;
embeddedartists 0:dfad71908d59 129 }
embeddedartists 0:dfad71908d59 130 }
embeddedartists 0:dfad71908d59 131
embeddedartists 0:dfad71908d59 132
embeddedartists 0:dfad71908d59 133
embeddedartists 0:dfad71908d59 134 void aliveTask(void const* args)
embeddedartists 0:dfad71908d59 135 {
embeddedartists 0:dfad71908d59 136 DMBoard* board = &DMBoard::instance();
embeddedartists 0:dfad71908d59 137
embeddedartists 0:dfad71908d59 138 while(true)
embeddedartists 0:dfad71908d59 139 {
embeddedartists 0:dfad71908d59 140 board->setLED(DMBoard::Led4, false);
embeddedartists 0:dfad71908d59 141 board->setLED(DMBoard::Led1, true);
embeddedartists 0:dfad71908d59 142 Thread::wait(300);
embeddedartists 0:dfad71908d59 143 board->setLED(DMBoard::Led1, false);
embeddedartists 0:dfad71908d59 144 board->setLED(DMBoard::Led2, true);
embeddedartists 0:dfad71908d59 145 Thread::wait(300);
embeddedartists 0:dfad71908d59 146 board->setLED(DMBoard::Led2, false);
embeddedartists 0:dfad71908d59 147 board->setLED(DMBoard::Led3, true);
embeddedartists 0:dfad71908d59 148 Thread::wait(300);
embeddedartists 0:dfad71908d59 149 board->setLED(DMBoard::Led3, false);
embeddedartists 0:dfad71908d59 150 board->setLED(DMBoard::Led4, true);
embeddedartists 0:dfad71908d59 151 Thread::wait(300);
embeddedartists 0:dfad71908d59 152 }
embeddedartists 0:dfad71908d59 153 }
embeddedartists 0:dfad71908d59 154
embeddedartists 0:dfad71908d59 155 /*
embeddedartists 0:dfad71908d59 156 * Reads the /message.txt file from the file system and prints the content
embeddedartists 0:dfad71908d59 157 */
embeddedartists 0:dfad71908d59 158 void readMessageFile(const char* prefix)
embeddedartists 0:dfad71908d59 159 {
embeddedartists 0:dfad71908d59 160 RtosLog* log = DMBoard::instance().logger();
embeddedartists 0:dfad71908d59 161 log->printf("%sTesting to read from USB\n", prefix);
embeddedartists 0:dfad71908d59 162
embeddedartists 1:15ea03d72dd7 163 FILE * fp = fopen("/usb/message.txt", "r");
embeddedartists 0:dfad71908d59 164
embeddedartists 0:dfad71908d59 165 if (fp != NULL) {
embeddedartists 0:dfad71908d59 166 uint8_t* buff = (uint8_t*)malloc(1024+1);
embeddedartists 0:dfad71908d59 167 if (buff == NULL) {
embeddedartists 0:dfad71908d59 168 log->printf("%sFailed to allocate memory for test\n", prefix);
embeddedartists 0:dfad71908d59 169 } else {
embeddedartists 0:dfad71908d59 170 int num = fread(buff, 1, 1024, fp);
embeddedartists 0:dfad71908d59 171 if (num <= 0) {
embeddedartists 0:dfad71908d59 172 log->printf("%sUnable to read file, got %d as result\n", prefix, num);
embeddedartists 0:dfad71908d59 173 } else if (num < 1024) {
embeddedartists 0:dfad71908d59 174 log->printf("%sHave read all %d bytes in the file\n", prefix, num);
embeddedartists 0:dfad71908d59 175 buff[num] = '\0';
embeddedartists 0:dfad71908d59 176 log->printf((const char*)buff);
embeddedartists 0:dfad71908d59 177 } else {
embeddedartists 0:dfad71908d59 178 log->printf("%sHave read %d bytes with more to read\n", prefix, num);
embeddedartists 0:dfad71908d59 179 }
embeddedartists 0:dfad71908d59 180 free(buff);
embeddedartists 0:dfad71908d59 181 }
embeddedartists 0:dfad71908d59 182 fclose(fp);
embeddedartists 0:dfad71908d59 183 } else {
embeddedartists 0:dfad71908d59 184 log->printf("%sFILE == NULL\r\n", prefix);
embeddedartists 0:dfad71908d59 185 }
embeddedartists 0:dfad71908d59 186 }
embeddedartists 0:dfad71908d59 187
embeddedartists 0:dfad71908d59 188
embeddedartists 0:dfad71908d59 189 #if defined(DM_BOARD_USE_DISPLAY)
embeddedartists 0:dfad71908d59 190 #define DISPLAY_TASK_PREFIX "[LCD] "
embeddedartists 0:dfad71908d59 191 void displayTask(void const* args)
embeddedartists 0:dfad71908d59 192 {
embeddedartists 0:dfad71908d59 193 // Start display in default mode (16-bit)
embeddedartists 0:dfad71908d59 194 RtosLog* log = DMBoard::instance().logger();
embeddedartists 0:dfad71908d59 195 Display* disp = DMBoard::instance().display();
embeddedartists 0:dfad71908d59 196 Display::DisplayError disperr;
embeddedartists 0:dfad71908d59 197 uint16_t* fb = (uint16_t*)disp->allocateFramebuffer();
embeddedartists 0:dfad71908d59 198 if (fb == NULL) {
embeddedartists 0:dfad71908d59 199 log->printf(DISPLAY_TASK_PREFIX"Failed to allocate memory for framebuffer\r\n");
embeddedartists 0:dfad71908d59 200 mbed_die();
embeddedartists 0:dfad71908d59 201 }
embeddedartists 0:dfad71908d59 202 drawBars565(fb, disp->width(), disp->height());
embeddedartists 0:dfad71908d59 203 disperr = disp->powerUp(fb);
embeddedartists 0:dfad71908d59 204 if (disperr != Display::Ok) {
embeddedartists 0:dfad71908d59 205 log->printf(DISPLAY_TASK_PREFIX"Failed to initialize the display, got error %d\r\n", disperr);
embeddedartists 0:dfad71908d59 206 mbed_die();
embeddedartists 0:dfad71908d59 207 }
embeddedartists 0:dfad71908d59 208
embeddedartists 0:dfad71908d59 209 int h = disp->height();
embeddedartists 0:dfad71908d59 210 int w = disp->width();
embeddedartists 0:dfad71908d59 211 uint16_t COLORS[] = { 0xFFF0, 0xF800, 0x07E0, 0x001F, 0x07FF, 0xF81F };
embeddedartists 0:dfad71908d59 212 int i = 0;
embeddedartists 0:dfad71908d59 213 while(true) {
embeddedartists 0:dfad71908d59 214 uint16_t color = COLORS[i++ % (sizeof(COLORS)/sizeof(COLORS[0]))];
embeddedartists 0:dfad71908d59 215 for (int y = 0; y < h; y++) {
embeddedartists 0:dfad71908d59 216 for (int x = 0; x < w; x++) {
embeddedartists 0:dfad71908d59 217 fb[y*w+x] = color;
embeddedartists 0:dfad71908d59 218 }
embeddedartists 0:dfad71908d59 219 Thread::wait(30);
embeddedartists 0:dfad71908d59 220 }
embeddedartists 0:dfad71908d59 221
embeddedartists 0:dfad71908d59 222 // test to read the message file
embeddedartists 0:dfad71908d59 223 //readMessageFile(DISPLAY_TASK_PREFIX);
embeddedartists 0:dfad71908d59 224 }
embeddedartists 0:dfad71908d59 225 }
embeddedartists 0:dfad71908d59 226 #endif //DM_BOARD_USE_DISPLAY
embeddedartists 0:dfad71908d59 227
embeddedartists 0:dfad71908d59 228 #define MSD_TASK_PREFIX "[MSD] "
embeddedartists 0:dfad71908d59 229
embeddedartists 0:dfad71908d59 230 void msdTask(void const* args)
embeddedartists 1:15ea03d72dd7 231 {
embeddedartists 1:15ea03d72dd7 232 usbInitGuard.lock();
embeddedartists 1:15ea03d72dd7 233 USBHostMSD* msd = new USBHostMSD("usb");
embeddedartists 1:15ea03d72dd7 234 usbInitGuard.unlock();
embeddedartists 0:dfad71908d59 235 USBHost* host = USBHost::getHostInst();
embeddedartists 0:dfad71908d59 236 RtosLog* log = DMBoard::instance().logger();
embeddedartists 0:dfad71908d59 237
embeddedartists 0:dfad71908d59 238 log->printf(MSD_TASK_PREFIX"msdTask started\n");
embeddedartists 0:dfad71908d59 239
embeddedartists 0:dfad71908d59 240 while(1) {
embeddedartists 0:dfad71908d59 241
embeddedartists 0:dfad71908d59 242 log->printf(MSD_TASK_PREFIX"Attempting to connect...\n");
embeddedartists 0:dfad71908d59 243
embeddedartists 0:dfad71908d59 244 // try to connect a MSD device
embeddedartists 1:15ea03d72dd7 245 bool connected = false;
embeddedartists 1:15ea03d72dd7 246 do {
embeddedartists 1:15ea03d72dd7 247 usbInitGuard.lock();
embeddedartists 1:15ea03d72dd7 248 connected = msd->connect();
embeddedartists 1:15ea03d72dd7 249 usbInitGuard.unlock();
embeddedartists 1:15ea03d72dd7 250 if (!connected) {
embeddedartists 1:15ea03d72dd7 251 //log->printf(MSD_TASK_PREFIX"Failed to connect, waiting and trying again!\n");
embeddedartists 1:15ea03d72dd7 252 Thread::wait(500);
embeddedartists 0:dfad71908d59 253 }
embeddedartists 1:15ea03d72dd7 254 } while(!connected);
embeddedartists 0:dfad71908d59 255
embeddedartists 0:dfad71908d59 256 log->printf(MSD_TASK_PREFIX"Connected!\n");
embeddedartists 0:dfad71908d59 257
embeddedartists 0:dfad71908d59 258 // read a file
embeddedartists 0:dfad71908d59 259 readMessageFile(MSD_TASK_PREFIX);
embeddedartists 0:dfad71908d59 260
embeddedartists 0:dfad71908d59 261 // if/when the device is disconnected, we try to connect it again
embeddedartists 0:dfad71908d59 262 while(1) {
embeddedartists 0:dfad71908d59 263
embeddedartists 0:dfad71908d59 264 Thread::wait(500);
embeddedartists 0:dfad71908d59 265
embeddedartists 0:dfad71908d59 266 // if device disconnected, try to connect again
embeddedartists 1:15ea03d72dd7 267 if (!msd->connected())
embeddedartists 0:dfad71908d59 268 break;
embeddedartists 0:dfad71908d59 269 }
embeddedartists 0:dfad71908d59 270 log->printf(MSD_TASK_PREFIX"Disconnected\n");
embeddedartists 0:dfad71908d59 271 }
embeddedartists 0:dfad71908d59 272 }
embeddedartists 0:dfad71908d59 273
embeddedartists 0:dfad71908d59 274 #define NET_TASK_PREFIX "[NET] "
embeddedartists 0:dfad71908d59 275
embeddedartists 0:dfad71908d59 276 void netTask(void const* args)
embeddedartists 0:dfad71908d59 277 {
embeddedartists 0:dfad71908d59 278 RtosLog* log = DMBoard::instance().logger();
embeddedartists 0:dfad71908d59 279 log->printf(NET_TASK_PREFIX"EthernetInterface Setting up...\r\n");
embeddedartists 0:dfad71908d59 280 if(eth.init()!=0) { //for DHCP Server
embeddedartists 0:dfad71908d59 281 //if(eth.init(IPAddress,NetMasks,Gateway)!=0) { //for Static IP Address
embeddedartists 0:dfad71908d59 282 log->printf(NET_TASK_PREFIX"EthernetInterface Initialize Error \r\n");
embeddedartists 0:dfad71908d59 283 mbed_die();
embeddedartists 0:dfad71908d59 284 }
embeddedartists 0:dfad71908d59 285 if(eth.connect()!=0) {
embeddedartists 0:dfad71908d59 286 log->printf(NET_TASK_PREFIX"EthernetInterface Connect Error \r\n");
embeddedartists 0:dfad71908d59 287 mbed_die();
embeddedartists 0:dfad71908d59 288 }
embeddedartists 0:dfad71908d59 289
embeddedartists 0:dfad71908d59 290 log->printf(NET_TASK_PREFIX"IP Address is %s\r\n", eth.getIPAddress());
embeddedartists 0:dfad71908d59 291 log->printf(NET_TASK_PREFIX"NetMask is %s\r\n", eth.getNetworkMask());
embeddedartists 0:dfad71908d59 292 log->printf(NET_TASK_PREFIX"Gateway Address is %s\r\n", eth.getGateway());
embeddedartists 0:dfad71908d59 293 log->printf(NET_TASK_PREFIX"Ethernet Setup OK\r\n");
embeddedartists 0:dfad71908d59 294
embeddedartists 0:dfad71908d59 295 HTTPServerAddHandler<SimpleHandler>("/hello"); //Default handler
embeddedartists 0:dfad71908d59 296 FSHandler::mount("/usb", "/");
embeddedartists 0:dfad71908d59 297 HTTPServerAddHandler<FSHandler>("/");
embeddedartists 0:dfad71908d59 298 //HTTPServerAddHandler<RPCHandler>("/rpc");
embeddedartists 0:dfad71908d59 299 //lcd.locate(0,0);
embeddedartists 0:dfad71908d59 300 //lcd.printf("%s",eth.getIPAddress());
embeddedartists 0:dfad71908d59 301 HTTPServerStart(80);
embeddedartists 0:dfad71908d59 302 }
embeddedartists 0:dfad71908d59 303
embeddedartists 1:15ea03d72dd7 304 static uint8_t mouse_button, mouse_x, mouse_y, mouse_z;
embeddedartists 1:15ea03d72dd7 305 void mouseEvent(uint8_t buttons, int8_t x, int8_t y, int8_t z)
embeddedartists 1:15ea03d72dd7 306 {
embeddedartists 1:15ea03d72dd7 307 mouse_button = buttons;
embeddedartists 1:15ea03d72dd7 308 mouse_x = x;
embeddedartists 1:15ea03d72dd7 309 mouse_y = y;
embeddedartists 1:15ea03d72dd7 310 mouse_z = z;
embeddedartists 1:15ea03d72dd7 311 }
embeddedartists 1:15ea03d72dd7 312
embeddedartists 1:15ea03d72dd7 313 #define MOUSE_TASK_PREFIX "[MOUSE] "
embeddedartists 1:15ea03d72dd7 314
embeddedartists 1:15ea03d72dd7 315 void mouseTask(void const* args)
embeddedartists 1:15ea03d72dd7 316 {
embeddedartists 1:15ea03d72dd7 317 usbInitGuard.lock();
embeddedartists 1:15ea03d72dd7 318 USBHostMouse* mouse = new USBHostMouse();
embeddedartists 1:15ea03d72dd7 319 usbInitGuard.unlock();
embeddedartists 1:15ea03d72dd7 320 RtosLog* log = DMBoard::instance().logger();
embeddedartists 1:15ea03d72dd7 321
embeddedartists 1:15ea03d72dd7 322 log->printf(MOUSE_TASK_PREFIX"mouseTask started\n");
embeddedartists 1:15ea03d72dd7 323
embeddedartists 1:15ea03d72dd7 324 while(1) {
embeddedartists 1:15ea03d72dd7 325
embeddedartists 1:15ea03d72dd7 326 log->printf(MOUSE_TASK_PREFIX"Attempting to connect...\n");
embeddedartists 1:15ea03d72dd7 327
embeddedartists 1:15ea03d72dd7 328 // try to connect a mouse
embeddedartists 1:15ea03d72dd7 329 bool connected = false;
embeddedartists 1:15ea03d72dd7 330 do {
embeddedartists 1:15ea03d72dd7 331 usbInitGuard.lock();
embeddedartists 1:15ea03d72dd7 332 connected = mouse->connect();
embeddedartists 1:15ea03d72dd7 333 usbInitGuard.unlock();
embeddedartists 1:15ea03d72dd7 334 if (!connected) {
embeddedartists 1:15ea03d72dd7 335 //log->printf(MOUSE_TASK_PREFIX"Failed to connect, waiting and trying again!\n");
embeddedartists 1:15ea03d72dd7 336 Thread::wait(500);
embeddedartists 1:15ea03d72dd7 337 }
embeddedartists 1:15ea03d72dd7 338 } while(!connected);
embeddedartists 1:15ea03d72dd7 339
embeddedartists 1:15ea03d72dd7 340 log->printf(MOUSE_TASK_PREFIX"Connected!\n");
embeddedartists 1:15ea03d72dd7 341 mouse->attachEvent(mouseEvent);
embeddedartists 1:15ea03d72dd7 342
embeddedartists 1:15ea03d72dd7 343 while(mouse->connected()) {
embeddedartists 1:15ea03d72dd7 344 log->printf(MOUSE_TASK_PREFIX"Buttons: 0x%02x, X %3d, Y %3d, Z %3d\n", mouse_button, mouse_x, mouse_y, mouse_z);
embeddedartists 1:15ea03d72dd7 345 Thread::wait(500);
embeddedartists 1:15ea03d72dd7 346 }
embeddedartists 1:15ea03d72dd7 347
embeddedartists 1:15ea03d72dd7 348 log->printf(MOUSE_TASK_PREFIX"Disconnected\n");
embeddedartists 1:15ea03d72dd7 349 }
embeddedartists 1:15ea03d72dd7 350 }
embeddedartists 1:15ea03d72dd7 351
embeddedartists 1:15ea03d72dd7 352 #define CIRCBUFF_SIZE 256
embeddedartists 1:15ea03d72dd7 353 static uint8_t circbuff[CIRCBUFF_SIZE];
embeddedartists 1:15ea03d72dd7 354 static uint32_t circbuff_read = 0;
embeddedartists 1:15ea03d72dd7 355 static uint32_t circbuff_write = 0;
embeddedartists 1:15ea03d72dd7 356 void keyEvent(uint8_t key)
embeddedartists 1:15ea03d72dd7 357 {
embeddedartists 1:15ea03d72dd7 358 circbuff[circbuff_write%CIRCBUFF_SIZE] = key;
embeddedartists 1:15ea03d72dd7 359 circbuff_write++;
embeddedartists 1:15ea03d72dd7 360 }
embeddedartists 1:15ea03d72dd7 361
embeddedartists 1:15ea03d72dd7 362 #define KEY_TASK_PREFIX "[KEY] "
embeddedartists 1:15ea03d72dd7 363
embeddedartists 1:15ea03d72dd7 364 void keyTask(void const* args)
embeddedartists 1:15ea03d72dd7 365 {
embeddedartists 1:15ea03d72dd7 366 usbInitGuard.lock();
embeddedartists 1:15ea03d72dd7 367 USBHostKeyboard* keyboard = new USBHostKeyboard();
embeddedartists 1:15ea03d72dd7 368 usbInitGuard.unlock();
embeddedartists 1:15ea03d72dd7 369
embeddedartists 1:15ea03d72dd7 370 RtosLog* log = DMBoard::instance().logger();
embeddedartists 1:15ea03d72dd7 371 uint8_t buff[10+1] = {0};
embeddedartists 1:15ea03d72dd7 372 int pos;
embeddedartists 1:15ea03d72dd7 373
embeddedartists 1:15ea03d72dd7 374 log->printf(KEY_TASK_PREFIX"keyTask started\n");
embeddedartists 1:15ea03d72dd7 375
embeddedartists 1:15ea03d72dd7 376 while(1) {
embeddedartists 1:15ea03d72dd7 377
embeddedartists 1:15ea03d72dd7 378 log->printf(KEY_TASK_PREFIX"Attempting to connect...\n");
embeddedartists 1:15ea03d72dd7 379
embeddedartists 1:15ea03d72dd7 380 // try to connect a keyboard
embeddedartists 1:15ea03d72dd7 381 bool connected = false;
embeddedartists 1:15ea03d72dd7 382 do {
embeddedartists 1:15ea03d72dd7 383 usbInitGuard.lock();
embeddedartists 1:15ea03d72dd7 384 connected = keyboard->connect();
embeddedartists 1:15ea03d72dd7 385 usbInitGuard.unlock();
embeddedartists 1:15ea03d72dd7 386 if (!connected) {
embeddedartists 1:15ea03d72dd7 387 //log->printf(KEY_TASK_PREFIX"Failed to connect, waiting and trying again!\n");
embeddedartists 1:15ea03d72dd7 388 Thread::wait(1000);
embeddedartists 1:15ea03d72dd7 389 }
embeddedartists 1:15ea03d72dd7 390 } while(!connected);
embeddedartists 1:15ea03d72dd7 391
embeddedartists 1:15ea03d72dd7 392 log->printf(KEY_TASK_PREFIX"Connected!\n");
embeddedartists 1:15ea03d72dd7 393 keyboard->attach(keyEvent);
embeddedartists 1:15ea03d72dd7 394
embeddedartists 1:15ea03d72dd7 395 while(keyboard->connected()) {
embeddedartists 1:15ea03d72dd7 396 for (pos = 0; pos < 10; pos++) {
embeddedartists 1:15ea03d72dd7 397 if (circbuff_read < circbuff_write) {
embeddedartists 1:15ea03d72dd7 398 buff[pos++] = circbuff[circbuff_read%CIRCBUFF_SIZE];
embeddedartists 1:15ea03d72dd7 399 circbuff_read++;
embeddedartists 1:15ea03d72dd7 400 } else {
embeddedartists 1:15ea03d72dd7 401 break;
embeddedartists 1:15ea03d72dd7 402 }
embeddedartists 1:15ea03d72dd7 403 }
embeddedartists 1:15ea03d72dd7 404 if (pos > 0) {
embeddedartists 1:15ea03d72dd7 405 log->printf(KEY_TASK_PREFIX"%s\n", buff);
embeddedartists 1:15ea03d72dd7 406 }
embeddedartists 1:15ea03d72dd7 407 Thread::wait(20);
embeddedartists 1:15ea03d72dd7 408 }
embeddedartists 1:15ea03d72dd7 409
embeddedartists 1:15ea03d72dd7 410 log->printf(KEY_TASK_PREFIX"Disconnected\n");
embeddedartists 1:15ea03d72dd7 411 }
embeddedartists 1:15ea03d72dd7 412 }
embeddedartists 1:15ea03d72dd7 413
embeddedartists 0:dfad71908d59 414 /******************************************************************************
embeddedartists 0:dfad71908d59 415 * Main function
embeddedartists 0:dfad71908d59 416 *****************************************************************************/
embeddedartists 0:dfad71908d59 417 int main()
embeddedartists 0:dfad71908d59 418 {
embeddedartists 0:dfad71908d59 419 DMBoard::BoardError err;
embeddedartists 0:dfad71908d59 420 DMBoard* board = &DMBoard::instance();
embeddedartists 0:dfad71908d59 421 RtosLog* log = board->logger();
embeddedartists 0:dfad71908d59 422 err = board->init();
embeddedartists 0:dfad71908d59 423 if (err != DMBoard::Ok) {
embeddedartists 0:dfad71908d59 424 log->printf("Failed to initialize the board, got error %d\r\n", err);
embeddedartists 0:dfad71908d59 425 mbed_die();
embeddedartists 0:dfad71908d59 426 }
embeddedartists 0:dfad71908d59 427
embeddedartists 0:dfad71908d59 428 log->printf("\n\n---\nMulti-threaded demo\nBuilt: " __DATE__ " at " __TIME__ "\n\n");
embeddedartists 0:dfad71908d59 429
embeddedartists 1:15ea03d72dd7 430 //log->printf("Press button to start...\r\n");
embeddedartists 1:15ea03d72dd7 431 //while(!board->buttonPressed());
embeddedartists 1:15ea03d72dd7 432 //while(board->buttonPressed());
embeddedartists 0:dfad71908d59 433
embeddedartists 0:dfad71908d59 434 Thread tAlive(aliveTask);
embeddedartists 0:dfad71908d59 435 #if defined(DM_BOARD_USE_DISPLAY)
embeddedartists 0:dfad71908d59 436 Thread tDisplay(displayTask, NULL, osPriorityNormal, 8192);
embeddedartists 0:dfad71908d59 437 #endif
embeddedartists 0:dfad71908d59 438 Thread tMemstick(msdTask, NULL, osPriorityNormal, 8192);
embeddedartists 0:dfad71908d59 439 Thread tNetwork(netTask, NULL, osPriorityNormal, 8192);
embeddedartists 1:15ea03d72dd7 440 Thread tMouse(mouseTask);
embeddedartists 1:15ea03d72dd7 441 Thread tKeyboard(keyTask);
embeddedartists 0:dfad71908d59 442
embeddedartists 0:dfad71908d59 443 while(1) { wait(5); }
embeddedartists 0:dfad71908d59 444 }