Simple application to write a single bitmap to a file in QSPI memory.

Dependencies:   DMBasicGUI DMSupport

Committer:
jmitc91516
Date:
Fri Jul 28 14:32:15 2017 +0000
Revision:
0:7d6bc03009a3
Simple application to write a single bitmap to a file in QSPI memory.

Who changed what in which revision?

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