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 * Includes
alindvall 0:6bd24cbb88a1 3 *****************************************************************************/
alindvall 0:6bd24cbb88a1 4
alindvall 0:6bd24cbb88a1 5 #include "mbed.h"
alindvall 0:6bd24cbb88a1 6 #include "mbed_interface.h"
alindvall 0:6bd24cbb88a1 7 #include "rtos.h"
alindvall 0:6bd24cbb88a1 8 #include "EthernetInterface.h"
alindvall 0:6bd24cbb88a1 9 #include "HTTPServer.h"
alindvall 0:6bd24cbb88a1 10 #include "mbed_rpc.h"
alindvall 0:6bd24cbb88a1 11 #include "USBHostMSD.h"
alindvall 0:6bd24cbb88a1 12 #include "USBHostMouse.h"
alindvall 0:6bd24cbb88a1 13 #include "USBHostKeyboard.h"
alindvall 0:6bd24cbb88a1 14
alindvall 0:6bd24cbb88a1 15 #include "DMBoard.h"
alindvall 0:6bd24cbb88a1 16
alindvall 0:6bd24cbb88a1 17 #include "AppLauncherSpecial.h"
alindvall 0:6bd24cbb88a1 18 #include "meas.h"
alindvall 0:6bd24cbb88a1 19
alindvall 0:6bd24cbb88a1 20 #include "AppNetworkSettings.h"
alindvall 0:6bd24cbb88a1 21 #include "AppStatus.h"
alindvall 0:6bd24cbb88a1 22 #include "AppTouchCalibration.h"
alindvall 0:6bd24cbb88a1 23 #include "AppColorPicker.h"
alindvall 0:6bd24cbb88a1 24 #include "AppImageViewer.h"
alindvall 0:6bd24cbb88a1 25 #include "AppSlideShow.h"
alindvall 0:6bd24cbb88a1 26 #include "AppRTCSettings.h"
alindvall 0:6bd24cbb88a1 27 #include "AppUSBStatus.h"
alindvall 0:6bd24cbb88a1 28 #include "AppDraw.h"
alindvall 0:6bd24cbb88a1 29 #include "image_data.h"
alindvall 0:6bd24cbb88a1 30
alindvall 0:6bd24cbb88a1 31
alindvall 0:6bd24cbb88a1 32 /******************************************************************************
alindvall 0:6bd24cbb88a1 33 * Typedefs and defines
alindvall 0:6bd24cbb88a1 34 *****************************************************************************/
alindvall 0:6bd24cbb88a1 35
alindvall 0:6bd24cbb88a1 36 /******************************************************************************
alindvall 0:6bd24cbb88a1 37 * Local variables
alindvall 0:6bd24cbb88a1 38 *****************************************************************************/
alindvall 0:6bd24cbb88a1 39
alindvall 0:6bd24cbb88a1 40 /******************************************************************************
alindvall 0:6bd24cbb88a1 41 * Global variables
alindvall 0:6bd24cbb88a1 42 *****************************************************************************/
alindvall 0:6bd24cbb88a1 43
alindvall 0:6bd24cbb88a1 44 EthernetInterface eth;
alindvall 0:6bd24cbb88a1 45 bool ethInitialized = false;
alindvall 0:6bd24cbb88a1 46 bool ethUsingDHCP = true;
alindvall 0:6bd24cbb88a1 47 bool haveUSBMSD = false;
alindvall 0:6bd24cbb88a1 48
alindvall 0:6bd24cbb88a1 49 /******************************************************************************
alindvall 0:6bd24cbb88a1 50 * Local functions
alindvall 0:6bd24cbb88a1 51 *****************************************************************************/
alindvall 0:6bd24cbb88a1 52
alindvall 0:6bd24cbb88a1 53 void aliveTask(void const* args)
alindvall 0:6bd24cbb88a1 54 {
alindvall 0:6bd24cbb88a1 55 DMBoard* board = &DMBoard::instance();
alindvall 0:6bd24cbb88a1 56
alindvall 0:6bd24cbb88a1 57 while(true)
alindvall 0:6bd24cbb88a1 58 {
alindvall 0:6bd24cbb88a1 59 board->setLED(DMBoard::Led4, false);
alindvall 0:6bd24cbb88a1 60 board->setLED(DMBoard::Led1, true);
alindvall 0:6bd24cbb88a1 61 Thread::wait(300);
alindvall 0:6bd24cbb88a1 62 board->setLED(DMBoard::Led1, false);
alindvall 0:6bd24cbb88a1 63 board->setLED(DMBoard::Led2, true);
alindvall 0:6bd24cbb88a1 64 Thread::wait(300);
alindvall 0:6bd24cbb88a1 65 board->setLED(DMBoard::Led2, false);
alindvall 0:6bd24cbb88a1 66 board->setLED(DMBoard::Led3, true);
alindvall 0:6bd24cbb88a1 67 Thread::wait(300);
alindvall 0:6bd24cbb88a1 68 board->setLED(DMBoard::Led3, false);
alindvall 0:6bd24cbb88a1 69 board->setLED(DMBoard::Led4, true);
alindvall 0:6bd24cbb88a1 70 Thread::wait(300);
alindvall 0:6bd24cbb88a1 71 }
alindvall 0:6bd24cbb88a1 72 }
alindvall 0:6bd24cbb88a1 73
alindvall 0:6bd24cbb88a1 74 #if defined(DM_BOARD_USE_DISPLAY)
alindvall 0:6bd24cbb88a1 75
alindvall 0:6bd24cbb88a1 76 typedef enum {
alindvall 0:6bd24cbb88a1 77 ColorPickerApp,
alindvall 0:6bd24cbb88a1 78 ImageViewerApp,
alindvall 0:6bd24cbb88a1 79 SlideshowApp,
alindvall 0:6bd24cbb88a1 80 SettingsApp,
alindvall 0:6bd24cbb88a1 81 StatusApp,
alindvall 0:6bd24cbb88a1 82 TouchTestApp,
alindvall 0:6bd24cbb88a1 83 RtcApp,
alindvall 0:6bd24cbb88a1 84 USBStatusApp,
alindvall 0:6bd24cbb88a1 85 DrawingApp,
alindvall 0:6bd24cbb88a1 86 CalibrationApp = AppLauncherSpecial::CalibrationApp,
alindvall 0:6bd24cbb88a1 87 Placeholder,
alindvall 0:6bd24cbb88a1 88 } myapps_t;
alindvall 0:6bd24cbb88a1 89
alindvall 0:6bd24cbb88a1 90 static App* launchApp(uint32_t id)
alindvall 0:6bd24cbb88a1 91 {
alindvall 0:6bd24cbb88a1 92 App* a = NULL;
alindvall 0:6bd24cbb88a1 93 switch ((myapps_t)id) {
alindvall 0:6bd24cbb88a1 94 case CalibrationApp:
alindvall 0:6bd24cbb88a1 95 a = new AppTouchCalibration();
alindvall 0:6bd24cbb88a1 96 break;
alindvall 0:6bd24cbb88a1 97 case SettingsApp:
alindvall 0:6bd24cbb88a1 98 a = new AppNetworkSettings();
alindvall 0:6bd24cbb88a1 99 break;
alindvall 0:6bd24cbb88a1 100 case ColorPickerApp:
alindvall 0:6bd24cbb88a1 101 a = new AppColorPicker();
alindvall 0:6bd24cbb88a1 102 break;
alindvall 0:6bd24cbb88a1 103 case ImageViewerApp:
alindvall 0:6bd24cbb88a1 104 a = new AppImageViewer();
alindvall 0:6bd24cbb88a1 105 break;
alindvall 0:6bd24cbb88a1 106 case SlideshowApp:
alindvall 0:6bd24cbb88a1 107 a = new AppSlideShow("/qspi/slides.txt", "/qspi", 0, 0);
alindvall 0:6bd24cbb88a1 108 break;
alindvall 0:6bd24cbb88a1 109 case StatusApp:
alindvall 0:6bd24cbb88a1 110 a = new AppStatus();
alindvall 0:6bd24cbb88a1 111 break;
alindvall 0:6bd24cbb88a1 112 case RtcApp:
alindvall 0:6bd24cbb88a1 113 a = new AppRTCSettings();
alindvall 0:6bd24cbb88a1 114 break;
alindvall 0:6bd24cbb88a1 115 case USBStatusApp:
alindvall 0:6bd24cbb88a1 116 a = new AppUSBStatus();
alindvall 0:6bd24cbb88a1 117 break;
alindvall 0:6bd24cbb88a1 118 case DrawingApp:
alindvall 0:6bd24cbb88a1 119 a = new AppDraw();
alindvall 0:6bd24cbb88a1 120 break;
alindvall 0:6bd24cbb88a1 121 default:
alindvall 0:6bd24cbb88a1 122 break;
alindvall 0:6bd24cbb88a1 123 }
alindvall 0:6bd24cbb88a1 124 return a;
alindvall 0:6bd24cbb88a1 125 }
alindvall 0:6bd24cbb88a1 126
alindvall 0:6bd24cbb88a1 127 #define SWIM_TASK_PREFIX "[SWIM] "
alindvall 0:6bd24cbb88a1 128 void swimTask(void const* args)
alindvall 0:6bd24cbb88a1 129 {
alindvall 0:6bd24cbb88a1 130 RtosLog* log = DMBoard::instance().logger();
alindvall 0:6bd24cbb88a1 131
alindvall 0:6bd24cbb88a1 132 log->printf(SWIM_TASK_PREFIX"swimTask started\n");
alindvall 0:6bd24cbb88a1 133
alindvall 0:6bd24cbb88a1 134 AppLauncherSpecial launcher;
alindvall 0:6bd24cbb88a1 135
alindvall 0:6bd24cbb88a1 136
alindvall 0:6bd24cbb88a1 137 if (launcher.setup()) {
alindvall 0:6bd24cbb88a1 138 launcher.addImageButton(SettingsApp, "Network", 0x2d5c, img_super_mono_3d_93, img_size_super_mono_3d_93);
alindvall 0:6bd24cbb88a1 139 //launcher.addImageButton(Placeholder, "Logo Splash", 0x2d5c, img_super_mono_3d_part2_83, img_size_super_mono_3d_part2_83);
alindvall 0:6bd24cbb88a1 140 launcher.addImageButton(DrawingApp, "Drawing", 0x2d5c, img_super_mono_3d_22, img_size_super_mono_3d_22);
alindvall 0:6bd24cbb88a1 141 launcher.addImageButton(SlideshowApp, "Slideshow", 0x2d5c, img_super_mono_3d_87, img_size_super_mono_3d_87);
alindvall 0:6bd24cbb88a1 142 launcher.addImageButton(ColorPickerApp, "Color Picker", 0x2d5c, img_super_mono_3d_part2_19, img_size_super_mono_3d_part2_19);
alindvall 0:6bd24cbb88a1 143 launcher.addImageButton(ImageViewerApp, "Image Viewer", 0x2d5c, img_super_mono_3d_48, img_size_super_mono_3d_48);
alindvall 0:6bd24cbb88a1 144 launcher.addImageButton(StatusApp, "About", 0x2d5c, img_super_mono_3d_part2_68, img_size_super_mono_3d_part2_68);
alindvall 0:6bd24cbb88a1 145 launcher.addImageButton(USBStatusApp, "USB Status", 0x2d5c, img_super_mono_3d_57, img_size_super_mono_3d_57);
alindvall 0:6bd24cbb88a1 146 launcher.addImageButton(RtcApp, "Clock", 0x2d5c, img_super_mono_3d_02, img_size_super_mono_3d_02);
alindvall 0:6bd24cbb88a1 147
alindvall 0:6bd24cbb88a1 148 launcher.setAppCreatorFunc(launchApp);
alindvall 0:6bd24cbb88a1 149 log->printf(SWIM_TASK_PREFIX"Starting menu system\n");
alindvall 0:6bd24cbb88a1 150 launcher.runToCompletion();
alindvall 0:6bd24cbb88a1 151 launcher.teardown();
alindvall 0:6bd24cbb88a1 152 } else {
alindvall 0:6bd24cbb88a1 153 log->printf(SWIM_TASK_PREFIX"Failed to prepare menu system\n");
alindvall 0:6bd24cbb88a1 154 }
alindvall 0:6bd24cbb88a1 155
alindvall 0:6bd24cbb88a1 156 // Should never end up here
alindvall 0:6bd24cbb88a1 157 mbed_die();
alindvall 0:6bd24cbb88a1 158 }
alindvall 0:6bd24cbb88a1 159
alindvall 0:6bd24cbb88a1 160 #endif //DM_BOARD_USE_DISPLAY
alindvall 0:6bd24cbb88a1 161
alindvall 0:6bd24cbb88a1 162
alindvall 0:6bd24cbb88a1 163 #define NET_TASK_PREFIX "[NET] "
alindvall 0:6bd24cbb88a1 164
alindvall 0:6bd24cbb88a1 165 void netTask(void const* args)
alindvall 0:6bd24cbb88a1 166 {
alindvall 0:6bd24cbb88a1 167 RtosLog* log = DMBoard::instance().logger();
alindvall 0:6bd24cbb88a1 168 log->printf(NET_TASK_PREFIX"EthernetInterface Setting up...\r\n");
alindvall 0:6bd24cbb88a1 169 if(eth.init()!=0) { //for DHCP Server
alindvall 0:6bd24cbb88a1 170 //if(eth.init(IPAddress,NetMasks,Gateway)!=0) { //for Static IP Address
alindvall 0:6bd24cbb88a1 171 log->printf(NET_TASK_PREFIX"EthernetInterface Initialize Error \r\n");
alindvall 0:6bd24cbb88a1 172 mbed_die();
alindvall 0:6bd24cbb88a1 173 }
alindvall 0:6bd24cbb88a1 174 while (eth.connect() != 0) {
alindvall 0:6bd24cbb88a1 175 Thread::wait(1000);
alindvall 0:6bd24cbb88a1 176 }
alindvall 0:6bd24cbb88a1 177
alindvall 0:6bd24cbb88a1 178 ethInitialized = true;
alindvall 0:6bd24cbb88a1 179 ethUsingDHCP = true;
alindvall 0:6bd24cbb88a1 180
alindvall 0:6bd24cbb88a1 181 log->printf(NET_TASK_PREFIX"IP Address is %s\r\n", eth.getIPAddress());
alindvall 0:6bd24cbb88a1 182 log->printf(NET_TASK_PREFIX"NetMask is %s\r\n", eth.getNetworkMask());
alindvall 0:6bd24cbb88a1 183 log->printf(NET_TASK_PREFIX"Gateway Address is %s\r\n", eth.getGateway());
alindvall 0:6bd24cbb88a1 184 log->printf(NET_TASK_PREFIX"Ethernet Setup OK\r\n");
alindvall 0:6bd24cbb88a1 185
alindvall 0:6bd24cbb88a1 186 HTTPServerAddHandler<SimpleHandler>("/hello"); //Default handler
alindvall 0:6bd24cbb88a1 187 FSHandler::mount("/usb", "/");
alindvall 0:6bd24cbb88a1 188 HTTPServerAddHandler<FSHandler>("/");
alindvall 0:6bd24cbb88a1 189 //HTTPServerAddHandler<RPCHandler>("/rpc");
alindvall 0:6bd24cbb88a1 190 //lcd.locate(0,0);
alindvall 0:6bd24cbb88a1 191 //lcd.printf("%s",eth.getIPAddress());
alindvall 0:6bd24cbb88a1 192 HTTPServerStart(80);
alindvall 0:6bd24cbb88a1 193 }
alindvall 0:6bd24cbb88a1 194
alindvall 0:6bd24cbb88a1 195 static volatile int8_t mouse_button, mouse_x, mouse_y, mouse_z;
alindvall 0:6bd24cbb88a1 196 static uint16_t cursor_x=0, cursor_y=0;
alindvall 0:6bd24cbb88a1 197 void mouseEvent(uint8_t buttons, int8_t x, int8_t y, int8_t z)
alindvall 0:6bd24cbb88a1 198 {
alindvall 0:6bd24cbb88a1 199 mouse_button = buttons;
alindvall 0:6bd24cbb88a1 200 mouse_x = x;
alindvall 0:6bd24cbb88a1 201 mouse_y = y;
alindvall 0:6bd24cbb88a1 202 mouse_z = z;
alindvall 0:6bd24cbb88a1 203
alindvall 0:6bd24cbb88a1 204 if (x < 0) {
alindvall 0:6bd24cbb88a1 205 if (cursor_x > -x) {
alindvall 0:6bd24cbb88a1 206 cursor_x += x;
alindvall 0:6bd24cbb88a1 207 } else {
alindvall 0:6bd24cbb88a1 208 cursor_x = 0;
alindvall 0:6bd24cbb88a1 209 }
alindvall 0:6bd24cbb88a1 210 } else {
alindvall 0:6bd24cbb88a1 211 if ((cursor_x + x) >= 480) {
alindvall 0:6bd24cbb88a1 212 cursor_x = 479;
alindvall 0:6bd24cbb88a1 213 } else {
alindvall 0:6bd24cbb88a1 214 cursor_x += x;
alindvall 0:6bd24cbb88a1 215 }
alindvall 0:6bd24cbb88a1 216 }
alindvall 0:6bd24cbb88a1 217 y = y/8;
alindvall 0:6bd24cbb88a1 218 if (y < 0) {
alindvall 0:6bd24cbb88a1 219 if (cursor_y > -y) {
alindvall 0:6bd24cbb88a1 220 cursor_y += y;
alindvall 0:6bd24cbb88a1 221 } else {
alindvall 0:6bd24cbb88a1 222 cursor_y = 0;
alindvall 0:6bd24cbb88a1 223 }
alindvall 0:6bd24cbb88a1 224 } else {
alindvall 0:6bd24cbb88a1 225 if ((cursor_y + y) >= 272) {
alindvall 0:6bd24cbb88a1 226 cursor_y = 271;
alindvall 0:6bd24cbb88a1 227 } else {
alindvall 0:6bd24cbb88a1 228 cursor_y += y;
alindvall 0:6bd24cbb88a1 229 }
alindvall 0:6bd24cbb88a1 230 }
alindvall 0:6bd24cbb88a1 231
alindvall 0:6bd24cbb88a1 232 //Chip_LCD_Cursor_SetPos(LPC_LCD, cursor_x, cursor_y);
alindvall 0:6bd24cbb88a1 233 LPC_LCD->CRSR_XY = (cursor_x & 0x3FF) | ((cursor_y & 0x3FF) << 16);
alindvall 0:6bd24cbb88a1 234 }
alindvall 0:6bd24cbb88a1 235
alindvall 0:6bd24cbb88a1 236 #define LCD_CURSOR_32x32 0
alindvall 0:6bd24cbb88a1 237 #define LCD_CURSOR_64x64 1
alindvall 0:6bd24cbb88a1 238 #define CURSOR_SIZE LCD_CURSOR_32x32
alindvall 0:6bd24cbb88a1 239 #define CURSOR_H_SIZE 32
alindvall 0:6bd24cbb88a1 240 #define CURSOR_V_SIZE 32
alindvall 0:6bd24cbb88a1 241 #define CURSOR_NUM 0
alindvall 0:6bd24cbb88a1 242 #define CURSOR_H_OFS (10)
alindvall 0:6bd24cbb88a1 243 #define CURSOR_V_OFS (6)
alindvall 0:6bd24cbb88a1 244
alindvall 0:6bd24cbb88a1 245 const unsigned char __attribute__ ((aligned(4))) Cursor[(CURSOR_H_SIZE / 4) * CURSOR_V_SIZE] =
alindvall 0:6bd24cbb88a1 246 {
alindvall 0:6bd24cbb88a1 247 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 248 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 249 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 250 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 251 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 252 0xAA, 0xAA, 0xAA, 0xFA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 253 0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 254 0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 255 0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 256 0xAA, 0xAA, 0xAB, 0xFE, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 257 0xAA, 0xAA, 0xAB, 0xFF, 0xEA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 258 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 259 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 260 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 261 0xAA, 0xAB, 0xFB, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 262 0xAA, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 263 0xAA, 0xAB, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 264 0xAA, 0xAA, 0xFF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 265 0xAA, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 266 0xAA, 0xAA, 0xBF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 267 0xAA, 0xAA, 0xAF, 0xFF, 0xFF, 0xFF, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 268 0xAA, 0xAA, 0xAF, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 269 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 270 0xAA, 0xAA, 0xAB, 0xFF, 0xFF, 0xFE, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 271 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 272 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 273 0xAA, 0xAA, 0xAA, 0xFF, 0xFF, 0xFA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 274 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 275 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 276 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 277 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA,
alindvall 0:6bd24cbb88a1 278 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA
alindvall 0:6bd24cbb88a1 279 };
alindvall 0:6bd24cbb88a1 280
alindvall 0:6bd24cbb88a1 281 void prepareCursor(bool enable) {
alindvall 0:6bd24cbb88a1 282 //Chip_LCD_Cursor_Disable(LPC_LCD, 0);
alindvall 0:6bd24cbb88a1 283 LPC_LCD->CRSR_CTRL = (CURSOR_NUM << 4);
alindvall 0:6bd24cbb88a1 284
alindvall 0:6bd24cbb88a1 285 if (enable) {
alindvall 0:6bd24cbb88a1 286 //Chip_LCD_Cursor_Config(LPC_LCD, LCD_CURSOR_32x32, true);
alindvall 0:6bd24cbb88a1 287 LPC_LCD->CRSR_CFG = ((true ? 1 : 0) << 1) | CURSOR_SIZE;
alindvall 0:6bd24cbb88a1 288
alindvall 0:6bd24cbb88a1 289 //Chip_LCD_Cursor_WriteImage(LPC_LCD, 0, (void *) Cursor);
alindvall 0:6bd24cbb88a1 290 {
alindvall 0:6bd24cbb88a1 291 int i, j;
alindvall 0:6bd24cbb88a1 292 uint32_t *fifoptr, *crsr_ptr = (uint32_t *) Cursor;
alindvall 0:6bd24cbb88a1 293
alindvall 0:6bd24cbb88a1 294 /* Check if Cursor Size was configured as 32x32 or 64x64*/
alindvall 0:6bd24cbb88a1 295 if (CURSOR_SIZE == LCD_CURSOR_32x32) {
alindvall 0:6bd24cbb88a1 296 i = CURSOR_NUM * 64;
alindvall 0:6bd24cbb88a1 297 j = i + 64;
alindvall 0:6bd24cbb88a1 298 }
alindvall 0:6bd24cbb88a1 299 else {
alindvall 0:6bd24cbb88a1 300 i = 0;
alindvall 0:6bd24cbb88a1 301 j = 256;
alindvall 0:6bd24cbb88a1 302 }
alindvall 0:6bd24cbb88a1 303 fifoptr = (uint32_t *) &(LPC_LCD->CRSR_IMG[0]);
alindvall 0:6bd24cbb88a1 304
alindvall 0:6bd24cbb88a1 305 /* Copy Cursor Image content to FIFO */
alindvall 0:6bd24cbb88a1 306 for (; i < j; i++) {
alindvall 0:6bd24cbb88a1 307
alindvall 0:6bd24cbb88a1 308 *fifoptr = *crsr_ptr;
alindvall 0:6bd24cbb88a1 309 crsr_ptr++;
alindvall 0:6bd24cbb88a1 310 fifoptr++;
alindvall 0:6bd24cbb88a1 311 }
alindvall 0:6bd24cbb88a1 312 }
alindvall 0:6bd24cbb88a1 313
alindvall 0:6bd24cbb88a1 314 //Chip_LCD_Cursor_SetClip(LPC_LCD, CURSOR_H_OFS, CURSOR_V_OFS);
alindvall 0:6bd24cbb88a1 315 LPC_LCD->CRSR_CLIP = (CURSOR_H_OFS & 0x3F) | ((CURSOR_V_OFS & 0x3F) << 8);
alindvall 0:6bd24cbb88a1 316
alindvall 0:6bd24cbb88a1 317 //Chip_LCD_Cursor_SetPos(LPC_LCD, cursor_x, cursor_y);
alindvall 0:6bd24cbb88a1 318
alindvall 0:6bd24cbb88a1 319 //Chip_LCD_Cursor_Enable(LPC_LCD, 0);
alindvall 0:6bd24cbb88a1 320 LPC_LCD->CRSR_CTRL = (CURSOR_NUM << 4) | 1;
alindvall 0:6bd24cbb88a1 321 }
alindvall 0:6bd24cbb88a1 322 }
alindvall 0:6bd24cbb88a1 323
alindvall 0:6bd24cbb88a1 324
alindvall 0:6bd24cbb88a1 325 #define CIRCBUFF_SIZE 256
alindvall 0:6bd24cbb88a1 326 static volatile uint8_t circbuff[CIRCBUFF_SIZE];
alindvall 0:6bd24cbb88a1 327 static volatile uint32_t circbuff_read = 0;
alindvall 0:6bd24cbb88a1 328 static uint32_t circbuff_write = 0;
alindvall 0:6bd24cbb88a1 329 void keyEvent(uint8_t key)
alindvall 0:6bd24cbb88a1 330 {
alindvall 0:6bd24cbb88a1 331 circbuff[circbuff_write%CIRCBUFF_SIZE] = key;
alindvall 0:6bd24cbb88a1 332 circbuff_write++;
alindvall 0:6bd24cbb88a1 333 }
alindvall 0:6bd24cbb88a1 334
alindvall 0:6bd24cbb88a1 335 bool msdConnected = false;
alindvall 0:6bd24cbb88a1 336 bool keyboardConnected = false;
alindvall 0:6bd24cbb88a1 337 bool mouseConnected = false;
alindvall 0:6bd24cbb88a1 338
alindvall 0:6bd24cbb88a1 339 #define USB_TASK_PREFIX "[USB] "
alindvall 0:6bd24cbb88a1 340 #define USB_CONNECTION_EVENT (1<<4)
alindvall 0:6bd24cbb88a1 341 void usbTask(void const* args)
alindvall 0:6bd24cbb88a1 342 {
alindvall 0:6bd24cbb88a1 343 USBHostMSD* msd = new USBHostMSD("usb");
alindvall 0:6bd24cbb88a1 344 USBHostKeyboard* keyboard = new USBHostKeyboard();
alindvall 0:6bd24cbb88a1 345 USBHostMouse* mouse = new USBHostMouse();
alindvall 0:6bd24cbb88a1 346 USBHost* host = USBHost::getHostInst();
alindvall 0:6bd24cbb88a1 347 host->signalOnConnections(Thread::gettid(), USB_CONNECTION_EVENT);
alindvall 0:6bd24cbb88a1 348
alindvall 0:6bd24cbb88a1 349 RtosLog* log = DMBoard::instance().logger();
alindvall 0:6bd24cbb88a1 350
alindvall 0:6bd24cbb88a1 351 log->printf(USB_TASK_PREFIX"usbTask started\n");
alindvall 0:6bd24cbb88a1 352
alindvall 0:6bd24cbb88a1 353 prepareCursor(false);
alindvall 0:6bd24cbb88a1 354
alindvall 0:6bd24cbb88a1 355 while (true) {
alindvall 0:6bd24cbb88a1 356 // wait for connect/disconnect message from USBHost
alindvall 0:6bd24cbb88a1 357 Thread::signal_wait(USB_CONNECTION_EVENT);
alindvall 0:6bd24cbb88a1 358 log->printf(USB_TASK_PREFIX"got USB event\n");
alindvall 0:6bd24cbb88a1 359
alindvall 0:6bd24cbb88a1 360 if (msd->connected()) {
alindvall 0:6bd24cbb88a1 361 if (!msdConnected) {
alindvall 0:6bd24cbb88a1 362 msdConnected = true;
alindvall 0:6bd24cbb88a1 363 haveUSBMSD = true;
alindvall 0:6bd24cbb88a1 364 log->printf(USB_TASK_PREFIX"USB MassStorage Device - Connected\n");
alindvall 0:6bd24cbb88a1 365 }
alindvall 0:6bd24cbb88a1 366 } else {
alindvall 0:6bd24cbb88a1 367 if (msdConnected) {
alindvall 0:6bd24cbb88a1 368 msdConnected = false;
alindvall 0:6bd24cbb88a1 369 haveUSBMSD = false;
alindvall 0:6bd24cbb88a1 370 log->printf(USB_TASK_PREFIX"USB MassStorage Device - Ejected\n");
alindvall 0:6bd24cbb88a1 371 }
alindvall 0:6bd24cbb88a1 372
alindvall 0:6bd24cbb88a1 373 if (msd->connect()) {
alindvall 0:6bd24cbb88a1 374 msdConnected = true;
alindvall 0:6bd24cbb88a1 375 haveUSBMSD = true;
alindvall 0:6bd24cbb88a1 376 log->printf(USB_TASK_PREFIX"USB MassStorage Device - Connected\n");
alindvall 0:6bd24cbb88a1 377 }
alindvall 0:6bd24cbb88a1 378 }
alindvall 0:6bd24cbb88a1 379
alindvall 0:6bd24cbb88a1 380 if (keyboard->connected()) {
alindvall 0:6bd24cbb88a1 381 if (!keyboardConnected) {
alindvall 0:6bd24cbb88a1 382 keyboardConnected = true;
alindvall 0:6bd24cbb88a1 383 log->printf(USB_TASK_PREFIX"USB Keyboard - Connected\n");
alindvall 0:6bd24cbb88a1 384 keyboard->attach(keyEvent);
alindvall 0:6bd24cbb88a1 385 }
alindvall 0:6bd24cbb88a1 386 } else {
alindvall 0:6bd24cbb88a1 387 if (keyboardConnected) {
alindvall 0:6bd24cbb88a1 388 keyboardConnected = false;
alindvall 0:6bd24cbb88a1 389 log->printf(USB_TASK_PREFIX"USB Keyboard - Ejected\n");
alindvall 0:6bd24cbb88a1 390 }
alindvall 0:6bd24cbb88a1 391 if (keyboard->connect()) {
alindvall 0:6bd24cbb88a1 392 keyboardConnected = true;
alindvall 0:6bd24cbb88a1 393 log->printf(USB_TASK_PREFIX"USB Keyboard - Connected\n");
alindvall 0:6bd24cbb88a1 394 keyboard->attach(keyEvent);
alindvall 0:6bd24cbb88a1 395 }
alindvall 0:6bd24cbb88a1 396 }
alindvall 0:6bd24cbb88a1 397
alindvall 0:6bd24cbb88a1 398 if (mouse->connected()) {
alindvall 0:6bd24cbb88a1 399 if (!mouseConnected) {
alindvall 0:6bd24cbb88a1 400 mouseConnected = true;
alindvall 0:6bd24cbb88a1 401 log->printf(USB_TASK_PREFIX"USB Mouse - Connected\n");
alindvall 0:6bd24cbb88a1 402 mouse->attachEvent(mouseEvent);
alindvall 0:6bd24cbb88a1 403 prepareCursor(true);
alindvall 0:6bd24cbb88a1 404 }
alindvall 0:6bd24cbb88a1 405 } else {
alindvall 0:6bd24cbb88a1 406 if (mouseConnected) {
alindvall 0:6bd24cbb88a1 407 prepareCursor(false);
alindvall 0:6bd24cbb88a1 408 mouseConnected = false;
alindvall 0:6bd24cbb88a1 409 log->printf(USB_TASK_PREFIX"USB Mouse - Ejected\n");
alindvall 0:6bd24cbb88a1 410 }
alindvall 0:6bd24cbb88a1 411 if (mouse->connect()) {
alindvall 0:6bd24cbb88a1 412 mouseConnected = true;
alindvall 0:6bd24cbb88a1 413 log->printf(USB_TASK_PREFIX"USB Mouse - Connected\n");
alindvall 0:6bd24cbb88a1 414 mouse->attachEvent(mouseEvent);
alindvall 0:6bd24cbb88a1 415 prepareCursor(true);
alindvall 0:6bd24cbb88a1 416 }
alindvall 0:6bd24cbb88a1 417 }
alindvall 0:6bd24cbb88a1 418 }
alindvall 0:6bd24cbb88a1 419 }
alindvall 0:6bd24cbb88a1 420
alindvall 0:6bd24cbb88a1 421
alindvall 0:6bd24cbb88a1 422
alindvall 0:6bd24cbb88a1 423 /******************************************************************************
alindvall 0:6bd24cbb88a1 424 * Main function
alindvall 0:6bd24cbb88a1 425 *****************************************************************************/
alindvall 0:6bd24cbb88a1 426 int main()
alindvall 0:6bd24cbb88a1 427 {
alindvall 0:6bd24cbb88a1 428 DMBoard::BoardError err;
alindvall 0:6bd24cbb88a1 429 DMBoard* board = &DMBoard::instance();
alindvall 0:6bd24cbb88a1 430 RtosLog* log = board->logger();
alindvall 0:6bd24cbb88a1 431 err = board->init();
alindvall 0:6bd24cbb88a1 432 if (err != DMBoard::Ok) {
alindvall 0:6bd24cbb88a1 433 log->printf("Failed to initialize the board, got error %d\r\n", err);
alindvall 0:6bd24cbb88a1 434 log->printf("\nTERMINATING\n");
alindvall 0:6bd24cbb88a1 435 wait_ms(2000); // allow RtosLog to flush messages
alindvall 0:6bd24cbb88a1 436 mbed_die();
alindvall 0:6bd24cbb88a1 437 }
alindvall 0:6bd24cbb88a1 438
alindvall 0:6bd24cbb88a1 439 board->buzzer(440,50);
alindvall 0:6bd24cbb88a1 440 wait_ms(30);
alindvall 0:6bd24cbb88a1 441 board->buzzer(660,50);
alindvall 0:6bd24cbb88a1 442 wait_ms(30);
alindvall 0:6bd24cbb88a1 443 board->buzzer(440,50);
alindvall 0:6bd24cbb88a1 444
alindvall 0:6bd24cbb88a1 445 log->printf("\n\n---\nDemo for Embedded World 2015\nBuilt: " __DATE__ " at " __TIME__ "\n\n");
alindvall 0:6bd24cbb88a1 446
alindvall 0:6bd24cbb88a1 447
alindvall 0:6bd24cbb88a1 448 Thread tAlive(aliveTask);
alindvall 0:6bd24cbb88a1 449 #if defined(DM_BOARD_USE_DISPLAY)
alindvall 0:6bd24cbb88a1 450 Thread tSwim(swimTask, NULL, osPriorityNormal, 8192);
alindvall 0:6bd24cbb88a1 451 #endif
alindvall 0:6bd24cbb88a1 452 Thread tNetwork(netTask, NULL, osPriorityNormal, 8192);
alindvall 0:6bd24cbb88a1 453 Thread tUSBHandler(usbTask, NULL, osPriorityNormal, 8192);
alindvall 0:6bd24cbb88a1 454
alindvall 0:6bd24cbb88a1 455 while(1) {
alindvall 0:6bd24cbb88a1 456 // Wait forever (in 1h increments) to prevent the tAlive, tSwim,
alindvall 0:6bd24cbb88a1 457 // tNetwork and tUSBHandler thread from being garbage collected.
alindvall 0:6bd24cbb88a1 458 Thread::wait(3600*1000);
alindvall 0:6bd24cbb88a1 459 }
alindvall 0:6bd24cbb88a1 460 }
alindvall 0:6bd24cbb88a1 461