Demo for Embedded World 2015.

Dependencies:   DMBasicGUI DMSupport

Demo running on several LPC4088 Display Modules on the Embedded World 2015 exhibition.

Information

To run the demo first drag-n-drop the to_sync.fs3 file to the MBED drive and then drag-n-drop the demo itself. This way both the file system and software are up to date.

This is what the launcher will look like:

/media/uploads/embeddedartists/ew2015_cap_000.png /media/uploads/embeddedartists/ew2015_cap_002.png /media/uploads/embeddedartists/ew2015_cap_003.png /media/uploads/embeddedartists/ew2015_cap_004.png /media/uploads/embeddedartists/ew2015_cap_005.png /media/uploads/embeddedartists/ew2015_cap_006.png

Committer:
embeddedartists
Date:
Tue Nov 05 08:20:16 2019 +0000
Revision:
1:1a01ef434a72
Parent:
0:6bd24cbb88a1
Updates related to mbed OS 5

Who changed what in which revision?

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