Loads bitmaps into QSPI memory for GC500_2_5inch to use.

Dependencies:   DMBasicGUI DMSupport

Committer:
jmitc91516
Date:
Mon Jul 31 15:44:39 2017 +0000
Revision:
0:a5c253316af6
Background and scroll arrow bitmaps added to QSPI memory.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmitc91516 0:a5c253316af6 1 #include "mbed.h"
jmitc91516 0:a5c253316af6 2 #include "DMBoard.h"
jmitc91516 0:a5c253316af6 3 #include "lpc_swim.h"
jmitc91516 0:a5c253316af6 4 #include "lpc_swim_font.h"
jmitc91516 0:a5c253316af6 5
jmitc91516 0:a5c253316af6 6 #include "GuiLib.h"
jmitc91516 0:a5c253316af6 7 #include "GuiDisplay.h"
jmitc91516 0:a5c253316af6 8
jmitc91516 0:a5c253316af6 9 #include <fstream>
jmitc91516 0:a5c253316af6 10
jmitc91516 0:a5c253316af6 11 /*
jmitc91516 0:a5c253316af6 12 This application loads bitmaps into QSPI memory for use by the GC500_2_5inch application,
jmitc91516 0:a5c253316af6 13 since memory limits do not allow these bitmaps to be included in the application
jmitc91516 0:a5c253316af6 14 in the normal way.
jmitc91516 0:a5c253316af6 15
jmitc91516 0:a5c253316af6 16 The associated easyGUI project is C:/easyGUI Projects/GC500_2_5inch_BitmapLoader.gui
jmitc91516 0:a5c253316af6 17
jmitc91516 0:a5c253316af6 18 It is intended for use with the Embedded Artists LPC4088 board, 5 inch display.
jmitc91516 0:a5c253316af6 19 */
jmitc91516 0:a5c253316af6 20
jmitc91516 0:a5c253316af6 21 // Use QSPI - uncomment '#define DM_BOARD_USE_QSPI' in dm_board_config.h, and:
jmitc91516 0:a5c253316af6 22 #include "QSPIFileSystem.h"
jmitc91516 0:a5c253316af6 23 QSPIFileSystem qspifs("qspi");
jmitc91516 0:a5c253316af6 24 // Can now use QSPI memory as file device '/qspi/'
jmitc91516 0:a5c253316af6 25 //
jmitc91516 0:a5c253316af6 26
jmitc91516 0:a5c253316af6 27 /*
jmitc91516 0:a5c253316af6 28 Bodge so GuiDisplay.c ('easyGUIFixed' file) can call Thread::wait
jmitc91516 0:a5c253316af6 29 (giving it an accurate millisecond timer)
jmitc91516 0:a5c253316af6 30 */
jmitc91516 0:a5c253316af6 31 extern "C" {
jmitc91516 0:a5c253316af6 32 void EasyGUIWaitMs(GuiConst_INT32U msec)
jmitc91516 0:a5c253316af6 33 {
jmitc91516 0:a5c253316af6 34 Thread::wait(msec);
jmitc91516 0:a5c253316af6 35 }
jmitc91516 0:a5c253316af6 36 }
jmitc91516 0:a5c253316af6 37
jmitc91516 0:a5c253316af6 38
jmitc91516 0:a5c253316af6 39 void Save_easyGUI_bitmap(int bitmapIndex, char* bitmapName, int bitmapSize, SWIM_WINDOW_T* winPtr, int winX, int winY)
jmitc91516 0:a5c253316af6 40 {
jmitc91516 0:a5c253316af6 41 char bitmapSizeFilename[200];
jmitc91516 0:a5c253316af6 42 // sprintf(bitmapSizeFilename, "/mci/%s_BMP.size", bitmapName);
jmitc91516 0:a5c253316af6 43 sprintf(bitmapSizeFilename, "/qspi/%s_BMP.size", bitmapName);
jmitc91516 0:a5c253316af6 44
jmitc91516 0:a5c253316af6 45 char buff[100];
jmitc91516 0:a5c253316af6 46
jmitc91516 0:a5c253316af6 47 ofstream bitmapSizeStream;
jmitc91516 0:a5c253316af6 48 bitmapSizeStream.open(bitmapSizeFilename);
jmitc91516 0:a5c253316af6 49 if(bitmapSizeStream) {
jmitc91516 0:a5c253316af6 50 bitmapSizeStream << bitmapSize << "\n";
jmitc91516 0:a5c253316af6 51 bitmapSizeStream.close();
jmitc91516 0:a5c253316af6 52 sprintf(buff, "Wrote %d to bitmap size file: %s", bitmapSize, bitmapSizeFilename);
jmitc91516 0:a5c253316af6 53 swim_put_text_xy(winPtr, buff, winX, winY);
jmitc91516 0:a5c253316af6 54 } else {
jmitc91516 0:a5c253316af6 55 sprintf(buff, "Failed to open bitmap size file for writing: %s", bitmapSizeFilename);
jmitc91516 0:a5c253316af6 56 swim_put_text_xy(winPtr, buff, winX, winY);
jmitc91516 0:a5c253316af6 57 }
jmitc91516 0:a5c253316af6 58
jmitc91516 0:a5c253316af6 59 winY += 12;
jmitc91516 0:a5c253316af6 60
jmitc91516 0:a5c253316af6 61 char bitmapDataFilename[200];
jmitc91516 0:a5c253316af6 62 // sprintf(bitmapDataFilename, "/mci/%s_BMP.data", bitmapName);
jmitc91516 0:a5c253316af6 63 sprintf(bitmapDataFilename, "/qspi/%s_BMP.data", bitmapName);
jmitc91516 0:a5c253316af6 64
jmitc91516 0:a5c253316af6 65 ofstream bitmapDataStream;
jmitc91516 0:a5c253316af6 66 bitmapDataStream.open(bitmapDataFilename, (ios::out | ios::binary));
jmitc91516 0:a5c253316af6 67 if(bitmapDataStream) {
jmitc91516 0:a5c253316af6 68 bitmapDataStream.write((char*) GuiStruct_BitmapPtrList[bitmapIndex], bitmapSize);
jmitc91516 0:a5c253316af6 69 bitmapDataStream.close();
jmitc91516 0:a5c253316af6 70 sprintf(buff, "Wrote %d bytes to bitmap data file: %s", bitmapSize, bitmapDataFilename);
jmitc91516 0:a5c253316af6 71 swim_put_text_xy(winPtr, buff, winX, winY);
jmitc91516 0:a5c253316af6 72 } else {
jmitc91516 0:a5c253316af6 73 sprintf(buff, "Failed to open bitmap data file for writing: %s", bitmapDataFilename);
jmitc91516 0:a5c253316af6 74 swim_put_text_xy(winPtr, buff, winX, winY);
jmitc91516 0:a5c253316af6 75 }
jmitc91516 0:a5c253316af6 76 }
jmitc91516 0:a5c253316af6 77
jmitc91516 0:a5c253316af6 78 /*
jmitc91516 0:a5c253316af6 79 Displays the directory of files in QSPI memory.
jmitc91516 0:a5c253316af6 80
jmitc91516 0:a5c253316af6 81 Used for debugging/testing - not appropriate or required in the 'real' system.
jmitc91516 0:a5c253316af6 82
jmitc91516 0:a5c253316af6 83 Args: pointer to a 'swim window', and the X and Y coordinates at which to display the directory on the screen
jmitc91516 0:a5c253316af6 84 */
jmitc91516 0:a5c253316af6 85 void DisplayQSPIDirectory(SWIM_WINDOW_T* winPtr, int winX, int winY)
jmitc91516 0:a5c253316af6 86 {
jmitc91516 0:a5c253316af6 87 DIR *dp;
jmitc91516 0:a5c253316af6 88 dp = opendir("/qspi/");
jmitc91516 0:a5c253316af6 89
jmitc91516 0:a5c253316af6 90 if(dp != NULL) {
jmitc91516 0:a5c253316af6 91 struct dirent *dirp;
jmitc91516 0:a5c253316af6 92
jmitc91516 0:a5c253316af6 93 swim_put_text_xy(winPtr, "Start of QSPI directory", winX, winY);
jmitc91516 0:a5c253316af6 94 winY += 12;
jmitc91516 0:a5c253316af6 95
jmitc91516 0:a5c253316af6 96 // Indent file names
jmitc91516 0:a5c253316af6 97 while((dirp = readdir(dp)) != NULL) {
jmitc91516 0:a5c253316af6 98 swim_put_text_xy(winPtr, dirp->d_name, winX + 30, winY);
jmitc91516 0:a5c253316af6 99 winY += 12;
jmitc91516 0:a5c253316af6 100 }
jmitc91516 0:a5c253316af6 101 closedir(dp);
jmitc91516 0:a5c253316af6 102
jmitc91516 0:a5c253316af6 103 swim_put_text_xy(winPtr, "End of QSPI directory", winX, winY);
jmitc91516 0:a5c253316af6 104 } else {
jmitc91516 0:a5c253316af6 105 swim_put_text_xy(winPtr, "Failed to open QSPI directory", winX, winY);
jmitc91516 0:a5c253316af6 106 }
jmitc91516 0:a5c253316af6 107 }
jmitc91516 0:a5c253316af6 108
jmitc91516 0:a5c253316af6 109 /*
jmitc91516 0:a5c253316af6 110 Deletes all existing files in the QSPI directory.
jmitc91516 0:a5c253316af6 111
jmitc91516 0:a5c253316af6 112 So that we know there is only the bitmap files there, nothing else
jmitc91516 0:a5c253316af6 113 */
jmitc91516 0:a5c253316af6 114 void ClearQSPIDirectory(void)
jmitc91516 0:a5c253316af6 115 {
jmitc91516 0:a5c253316af6 116 DIR *dp;
jmitc91516 0:a5c253316af6 117 dp = opendir("/qspi/");
jmitc91516 0:a5c253316af6 118
jmitc91516 0:a5c253316af6 119 if(dp != NULL) {
jmitc91516 0:a5c253316af6 120 struct dirent *dirp;
jmitc91516 0:a5c253316af6 121
jmitc91516 0:a5c253316af6 122 while((dirp = readdir(dp)) != NULL) {
jmitc91516 0:a5c253316af6 123 char buff[200];
jmitc91516 0:a5c253316af6 124 sprintf(buff, "/qspi/%s", dirp->d_name);
jmitc91516 0:a5c253316af6 125 remove(buff);
jmitc91516 0:a5c253316af6 126 }
jmitc91516 0:a5c253316af6 127 closedir(dp);
jmitc91516 0:a5c253316af6 128 }
jmitc91516 0:a5c253316af6 129 }
jmitc91516 0:a5c253316af6 130
jmitc91516 0:a5c253316af6 131
jmitc91516 0:a5c253316af6 132 int main()
jmitc91516 0:a5c253316af6 133 {
jmitc91516 0:a5c253316af6 134 DMBoard::BoardError err;
jmitc91516 0:a5c253316af6 135 DMBoard* board = &DMBoard::instance();
jmitc91516 0:a5c253316af6 136 RtosLog* log = board->logger();
jmitc91516 0:a5c253316af6 137 Display* disp = board->display();
jmitc91516 0:a5c253316af6 138
jmitc91516 0:a5c253316af6 139 do {
jmitc91516 0:a5c253316af6 140 err = board->init();
jmitc91516 0:a5c253316af6 141 if (err != DMBoard::Ok) {
jmitc91516 0:a5c253316af6 142 log->printf("Failed to initialize the board, got error %d\r\n", err);
jmitc91516 0:a5c253316af6 143 break;
jmitc91516 0:a5c253316af6 144 }
jmitc91516 0:a5c253316af6 145
jmitc91516 0:a5c253316af6 146 log->printf("\n\nHello World!\n\n");
jmitc91516 0:a5c253316af6 147
jmitc91516 0:a5c253316af6 148 SWIM_WINDOW_T win;
jmitc91516 0:a5c253316af6 149 void* fb = disp->allocateFramebuffer();
jmitc91516 0:a5c253316af6 150 if (fb == NULL) {
jmitc91516 0:a5c253316af6 151 log->printf("Failed to allocate memory for a frame buffer\r\n");
jmitc91516 0:a5c253316af6 152 err = DMBoard::MemoryError;
jmitc91516 0:a5c253316af6 153 break;
jmitc91516 0:a5c253316af6 154 }
jmitc91516 0:a5c253316af6 155
jmitc91516 0:a5c253316af6 156 // Prepare fullscreen
jmitc91516 0:a5c253316af6 157 swim_window_open(&win,
jmitc91516 0:a5c253316af6 158 disp->width(), disp->height(), // full size
jmitc91516 0:a5c253316af6 159 (COLOR_T*)fb,
jmitc91516 0:a5c253316af6 160 0,0,disp->width()-1, disp->height()-1, // window position and size
jmitc91516 0:a5c253316af6 161 1, // border
jmitc91516 0:a5c253316af6 162 WHITE, BLUE, BLACK); // colors: pen, backgr, forgr
jmitc91516 0:a5c253316af6 163 swim_set_title(&win, "GC500_2_5inch Bitmap Loader", BLACK);
jmitc91516 0:a5c253316af6 164
jmitc91516 0:a5c253316af6 165 // Message
jmitc91516 0:a5c253316af6 166 // swim_put_text_xy(&win, "Checking for SD/MMC card", 100, 0);
jmitc91516 0:a5c253316af6 167 // if(mcifs.cardInserted()) {
jmitc91516 0:a5c253316af6 168 // swim_put_text_xy(&win, "Found SD/MMC card", 100, 10);
jmitc91516 0:a5c253316af6 169
jmitc91516 0:a5c253316af6 170 // Make sure QSPI filesystem is formatted before we try to use it
jmitc91516 0:a5c253316af6 171 if (!qspifs.isformatted()) {
jmitc91516 0:a5c253316af6 172 qspifs.format();
jmitc91516 0:a5c253316af6 173 }
jmitc91516 0:a5c253316af6 174
jmitc91516 0:a5c253316af6 175 #define START_DISPLAY_FIRST
jmitc91516 0:a5c253316af6 176 #ifdef START_DISPLAY_FIRST
jmitc91516 0:a5c253316af6 177 // Start display in default mode (16-bit)
jmitc91516 0:a5c253316af6 178 Display::DisplayError disperr = disp->powerUp(fb);
jmitc91516 0:a5c253316af6 179 if (disperr != Display::DisplayError_Ok) {
jmitc91516 0:a5c253316af6 180 log->printf("Failed to initialize the display, got error %d\r\n", disperr);
jmitc91516 0:a5c253316af6 181 break;
jmitc91516 0:a5c253316af6 182 }
jmitc91516 0:a5c253316af6 183 #endif // START_DISPLAY_FIRST
jmitc91516 0:a5c253316af6 184
jmitc91516 0:a5c253316af6 185 //#define CLEAR_DIRECTORY_FIRST // *** Need to consider whether to reinstate this in production version - or have a separate "ClearQSPI" application ***
jmitc91516 0:a5c253316af6 186 #ifdef CLEAR_DIRECTORY_FIRST
jmitc91516 0:a5c253316af6 187 ClearQSPIDirectory(); // Appears to cause LPC4088 error
jmitc91516 0:a5c253316af6 188 #endif
jmitc91516 0:a5c253316af6 189
jmitc91516 0:a5c253316af6 190 #define LOAD_THE_BITMAPS // May want to not load them (e.g. for testing purposes)
jmitc91516 0:a5c253316af6 191 #ifdef LOAD_THE_BITMAPS
jmitc91516 0:a5c253316af6 192
jmitc91516 0:a5c253316af6 193 // Values passed to Save_easyGUI_bitmap are manually copied
jmitc91516 0:a5c253316af6 194 // from GuiStruct.c and GuiStruct.h, and hard-coded here
jmitc91516 0:a5c253316af6 195
jmitc91516 0:a5c253316af6 196 // Component bitmaps
jmitc91516 0:a5c253316af6 197 Save_easyGUI_bitmap(GuiStruct_Bitmap_Column, "GuiStruct_Bitmap_Column", 17674, &win, 10, 10);
jmitc91516 0:a5c253316af6 198 Save_easyGUI_bitmap(GuiStruct_Bitmap_Detector, "GuiStruct_Bitmap_Detector", 19493, &win, 10, 40);
jmitc91516 0:a5c253316af6 199 Save_easyGUI_bitmap(GuiStruct_Bitmap_Injector, "GuiStruct_Bitmap_Injector", 18789, &win, 10, 70);
jmitc91516 0:a5c253316af6 200 Save_easyGUI_bitmap(GuiStruct_Bitmap_Gas, "GuiStruct_Bitmap_Gas", 21169, &win, 10, 100);
jmitc91516 0:a5c253316af6 201
jmitc91516 0:a5c253316af6 202 // Home page bitmaps
jmitc91516 0:a5c253316af6 203 Save_easyGUI_bitmap(GuiStruct_Bitmap_ColumnButton, "GuiStruct_Bitmap_ColumnButton", 19682, &win, 10, 140);
jmitc91516 0:a5c253316af6 204 Save_easyGUI_bitmap(GuiStruct_Bitmap_DetectorButton, "GuiStruct_Bitmap_DetectorButton", 21526, &win, 10, 170);
jmitc91516 0:a5c253316af6 205 Save_easyGUI_bitmap(GuiStruct_Bitmap_InjectorButton, "GuiStruct_Bitmap_InjectorButton", 20853, &win, 10, 200);
jmitc91516 0:a5c253316af6 206 Save_easyGUI_bitmap(GuiStruct_Bitmap_GasButton, "GuiStruct_Bitmap_GasButton", 23258, &win, 10, 230);
jmitc91516 0:a5c253316af6 207
jmitc91516 0:a5c253316af6 208 // Background bitmaps
jmitc91516 0:a5c253316af6 209 Save_easyGUI_bitmap(GuiStruct_Bitmap_BootScreen, "GuiStruct_Bitmap_BootScreen", 123419, &win, 10, 270);
jmitc91516 0:a5c253316af6 210 Save_easyGUI_bitmap(GuiStruct_Bitmap_BlankBackground, "GuiStruct_Bitmap_BlankBackground", 1157, &win, 10, 300);
jmitc91516 0:a5c253316af6 211
jmitc91516 0:a5c253316af6 212 // Scroll arrow bitmaps
jmitc91516 0:a5c253316af6 213 Save_easyGUI_bitmap(GuiStruct_Bitmap_UpArrowDoubled, "GuiStruct_Bitmap_UpArrowDoubled", 218, &win, 10, 340);
jmitc91516 0:a5c253316af6 214 Save_easyGUI_bitmap(GuiStruct_Bitmap_DownArrowDoubled, "GuiStruct_Bitmap_DownArrowDoubled", 218, &win, 10, 370);
jmitc91516 0:a5c253316af6 215 Save_easyGUI_bitmap(GuiStruct_Bitmap_UpArrow, "GuiStruct_Bitmap_UpArrow", 176, &win, 10, 400);
jmitc91516 0:a5c253316af6 216 Save_easyGUI_bitmap(GuiStruct_Bitmap_DownArrow, "GuiStruct_Bitmap_DownArrow", 176, &win, 10, 430);
jmitc91516 0:a5c253316af6 217 Save_easyGUI_bitmap(GuiStruct_Bitmap_UpArrow1point5, "GuiStruct_Bitmap_UpArrow1point5", 196, &win, 10, 470);
jmitc91516 0:a5c253316af6 218 Save_easyGUI_bitmap(GuiStruct_Bitmap_DownArrow1point5, "GuiStruct_Bitmap_DownArrow1point5", 196, &win, 10, 500);
jmitc91516 0:a5c253316af6 219
jmitc91516 0:a5c253316af6 220 #endif // LOAD_THE_BITMAPS
jmitc91516 0:a5c253316af6 221
jmitc91516 0:a5c253316af6 222 DisplayQSPIDirectory(&win, 450, 30);
jmitc91516 0:a5c253316af6 223 // } else {
jmitc91516 0:a5c253316af6 224 // swim_put_text_xy(&win, "SD/MMC card not found", 100, 30);
jmitc91516 0:a5c253316af6 225 // }
jmitc91516 0:a5c253316af6 226
jmitc91516 0:a5c253316af6 227
jmitc91516 0:a5c253316af6 228 #ifndef START_DISPLAY_FIRST
jmitc91516 0:a5c253316af6 229 // Start display in default mode (16-bit)
jmitc91516 0:a5c253316af6 230 Display::DisplayError disperr = disp->powerUp(fb);
jmitc91516 0:a5c253316af6 231 if (disperr != Display::DisplayError_Ok) {
jmitc91516 0:a5c253316af6 232 log->printf("Failed to initialize the display, got error %d\r\n", disperr);
jmitc91516 0:a5c253316af6 233 break;
jmitc91516 0:a5c253316af6 234 }
jmitc91516 0:a5c253316af6 235 #endif // START_DISPLAY_FIRST
jmitc91516 0:a5c253316af6 236 } while(false);
jmitc91516 0:a5c253316af6 237
jmitc91516 0:a5c253316af6 238 if (err != DMBoard::Ok) {
jmitc91516 0:a5c253316af6 239 log->printf("\nTERMINATING\n");
jmitc91516 0:a5c253316af6 240 wait_ms(2000); // allow RtosLog to flush messages
jmitc91516 0:a5c253316af6 241 mbed_die();
jmitc91516 0:a5c253316af6 242 }
jmitc91516 0:a5c253316af6 243
jmitc91516 0:a5c253316af6 244 while(true) {
jmitc91516 0:a5c253316af6 245 }
jmitc91516 0:a5c253316af6 246 }