First draft of a simple application to read a bitmap from a file in QSPI memory, and display it on the LPC4088 using the easyGUI library.

Dependencies:   DMBasicGUI DMSupport

Committer:
jmitc91516
Date:
Fri Jul 28 14:40:43 2017 +0000
Revision:
0:6db0d96b351d
Loads a bitmap file from a file in QSPI memory, and displays it.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jmitc91516 0:6db0d96b351d 1 #include "mbed.h"
jmitc91516 0:6db0d96b351d 2 #include "DMBoard.h"
jmitc91516 0:6db0d96b351d 3 #include "lpc_swim.h"
jmitc91516 0:6db0d96b351d 4 #include "lpc_swim_font.h"
jmitc91516 0:6db0d96b351d 5
jmitc91516 0:6db0d96b351d 6 #include "GuiLib.h"
jmitc91516 0:6db0d96b351d 7 #include "GuiDisplay.h"
jmitc91516 0:6db0d96b351d 8
jmitc91516 0:6db0d96b351d 9 #include "QSPIBitmap.h"
jmitc91516 0:6db0d96b351d 10
jmitc91516 0:6db0d96b351d 11 // Use QSPI - uncomment '#define DM_BOARD_USE_QSPI' in dm_board_config.h, and:
jmitc91516 0:6db0d96b351d 12 #include "QSPIFileSystem.h"
jmitc91516 0:6db0d96b351d 13 QSPIFileSystem qspifs("qspi");
jmitc91516 0:6db0d96b351d 14 // Can now use QSPI memory as file device '/qspi/'
jmitc91516 0:6db0d96b351d 15 //
jmitc91516 0:6db0d96b351d 16
jmitc91516 0:6db0d96b351d 17 /*
jmitc91516 0:6db0d96b351d 18 Bodge so GuiDisplay.c ('easyGUIFixed' file) can call Thread::wait
jmitc91516 0:6db0d96b351d 19 (giving it an accurate millisecond timer)
jmitc91516 0:6db0d96b351d 20 */
jmitc91516 0:6db0d96b351d 21 extern "C" {
jmitc91516 0:6db0d96b351d 22 void EasyGUIWaitMs(GuiConst_INT32U msec)
jmitc91516 0:6db0d96b351d 23 {
jmitc91516 0:6db0d96b351d 24 Thread::wait(msec);
jmitc91516 0:6db0d96b351d 25 }
jmitc91516 0:6db0d96b351d 26 }
jmitc91516 0:6db0d96b351d 27
jmitc91516 0:6db0d96b351d 28 // Defined in GuiDisplay.c - set the display frame address at runtime
jmitc91516 0:6db0d96b351d 29 extern "C" {
jmitc91516 0:6db0d96b351d 30 void GuiDisplay_SetFrameAddress(void *newFrameAddress);
jmitc91516 0:6db0d96b351d 31 }
jmitc91516 0:6db0d96b351d 32
jmitc91516 0:6db0d96b351d 33 /*
jmitc91516 0:6db0d96b351d 34 Displays the specified easyGUI 'structure' (or page, to use a more easily understood term).
jmitc91516 0:6db0d96b351d 35
jmitc91516 0:6db0d96b351d 36 Args are: the index of the structure to be displayed,
jmitc91516 0:6db0d96b351d 37
jmitc91516 0:6db0d96b351d 38 No return code.
jmitc91516 0:6db0d96b351d 39 */
jmitc91516 0:6db0d96b351d 40 void DisplayEasyGuiStructure(int structureIndex, QSPIBitmap* bitmapToDisplay, GuiConst_INT16S bitmapX, GuiConst_INT16S bitmapY)
jmitc91516 0:6db0d96b351d 41 {
jmitc91516 0:6db0d96b351d 42 GuiLib_Clear(); // Don't need this if we have drawn the background bitmap - it covers the entire screen
jmitc91516 0:6db0d96b351d 43
jmitc91516 0:6db0d96b351d 44 GuiLib_ShowScreen(structureIndex, GuiLib_NO_CURSOR, GuiLib_RESET_AUTO_REDRAW);
jmitc91516 0:6db0d96b351d 45
jmitc91516 0:6db0d96b351d 46 if(bitmapToDisplay != NULL) {
jmitc91516 0:6db0d96b351d 47 bitmapToDisplay->DisplayAt(bitmapX, bitmapY, -1); // No transparent colour
jmitc91516 0:6db0d96b351d 48 }
jmitc91516 0:6db0d96b351d 49
jmitc91516 0:6db0d96b351d 50 GuiLib_Refresh();
jmitc91516 0:6db0d96b351d 51
jmitc91516 0:6db0d96b351d 52 } // End of "DisplayEasyGUIStructure"
jmitc91516 0:6db0d96b351d 53
jmitc91516 0:6db0d96b351d 54 /*
jmitc91516 0:6db0d96b351d 55 Sets up the easyGUI user interface in an acceptable initial state.
jmitc91516 0:6db0d96b351d 56
jmitc91516 0:6db0d96b351d 57 No return code.
jmitc91516 0:6db0d96b351d 58 */
jmitc91516 0:6db0d96b351d 59 void InitEasyGUIDisplay(int initialEasyGUIPage, QSPIBitmap* bitmapToDisplay, GuiConst_INT16S bitmapX, GuiConst_INT16S bitmapY)
jmitc91516 0:6db0d96b351d 60 {
jmitc91516 0:6db0d96b351d 61 // easyGUI stuff - note function calls require 'extern "C"' in relevant header
jmitc91516 0:6db0d96b351d 62
jmitc91516 0:6db0d96b351d 63 GuiDisplay_Lock();
jmitc91516 0:6db0d96b351d 64
jmitc91516 0:6db0d96b351d 65 GuiLib_Init();
jmitc91516 0:6db0d96b351d 66
jmitc91516 0:6db0d96b351d 67 DisplayEasyGuiStructure(initialEasyGUIPage, bitmapToDisplay, bitmapX, bitmapY);
jmitc91516 0:6db0d96b351d 68
jmitc91516 0:6db0d96b351d 69 GuiDisplay_Unlock();
jmitc91516 0:6db0d96b351d 70 }
jmitc91516 0:6db0d96b351d 71
jmitc91516 0:6db0d96b351d 72
jmitc91516 0:6db0d96b351d 73 void InitialiseLPC4088(DMBoard* board, void **frameBufferAddress1, void **frameBufferAddress2)
jmitc91516 0:6db0d96b351d 74 {
jmitc91516 0:6db0d96b351d 75 RtosLog* log = board->logger();
jmitc91516 0:6db0d96b351d 76 Display* disp = board->display();
jmitc91516 0:6db0d96b351d 77
jmitc91516 0:6db0d96b351d 78 DMBoard::BoardError err;
jmitc91516 0:6db0d96b351d 79
jmitc91516 0:6db0d96b351d 80 do {
jmitc91516 0:6db0d96b351d 81 err = board->init();
jmitc91516 0:6db0d96b351d 82 if (err != DMBoard::Ok) {
jmitc91516 0:6db0d96b351d 83 log->printf("Failed to initialize the board, got error %d\r\n", err);
jmitc91516 0:6db0d96b351d 84 break;
jmitc91516 0:6db0d96b351d 85 }
jmitc91516 0:6db0d96b351d 86
jmitc91516 0:6db0d96b351d 87
jmitc91516 0:6db0d96b351d 88 #define COLOR_FLICKERING_FIX_1
jmitc91516 0:6db0d96b351d 89 #ifdef COLOR_FLICKERING_FIX_1
jmitc91516 0:6db0d96b351d 90 // Possible fix for display flickering on LPC4088
jmitc91516 0:6db0d96b351d 91 uint32_t* reg = ((uint32_t*)0x400fc188);
jmitc91516 0:6db0d96b351d 92 *reg |= (3<<10);
jmitc91516 0:6db0d96b351d 93 #undef COLOR_FLICKERING_FIX_1
jmitc91516 0:6db0d96b351d 94 #endif
jmitc91516 0:6db0d96b351d 95 log->printf("\n\nHello World!\n\n");
jmitc91516 0:6db0d96b351d 96
jmitc91516 0:6db0d96b351d 97 void* fb = disp->allocateFramebuffer();
jmitc91516 0:6db0d96b351d 98 if (fb == NULL) {
jmitc91516 0:6db0d96b351d 99 log->printf("Failed to allocate memory for a frame buffer\r\n");
jmitc91516 0:6db0d96b351d 100 err = DMBoard::MemoryError;
jmitc91516 0:6db0d96b351d 101 break;
jmitc91516 0:6db0d96b351d 102 }
jmitc91516 0:6db0d96b351d 103
jmitc91516 0:6db0d96b351d 104 *frameBufferAddress1 = fb;
jmitc91516 0:6db0d96b351d 105
jmitc91516 0:6db0d96b351d 106 // Allocate a second frame buffer - what will its address be?
jmitc91516 0:6db0d96b351d 107 void* fb2 = disp->allocateFramebuffer();
jmitc91516 0:6db0d96b351d 108 *frameBufferAddress2 = fb2;
jmitc91516 0:6db0d96b351d 109
jmitc91516 0:6db0d96b351d 110 Display::DisplayError disperr;
jmitc91516 0:6db0d96b351d 111 // disperr = disp->powerUp(fb, Display::Resolution_24bit_rgb888);
jmitc91516 0:6db0d96b351d 112 // Start display in default mode (16-bit) (24-bit uses too much memory)
jmitc91516 0:6db0d96b351d 113 #define COLOR_FLICKERING_FIX_2
jmitc91516 0:6db0d96b351d 114 #ifdef COLOR_FLICKERING_FIX_2
jmitc91516 0:6db0d96b351d 115 // Second possible fix for colour flickering problem,
jmitc91516 0:6db0d96b351d 116 // suggested by Embedded Artists - specify low frame rate
jmitc91516 0:6db0d96b351d 117 disp->powerDown();
jmitc91516 0:6db0d96b351d 118 disperr = disp->powerUp(fb, Display::Resolution_16bit_rgb565, FrameRate_Low);
jmitc91516 0:6db0d96b351d 119 #undef COLOR_FLICKERING_FIX_2
jmitc91516 0:6db0d96b351d 120 #else
jmitc91516 0:6db0d96b351d 121 disperr = disp->powerUp(fb);
jmitc91516 0:6db0d96b351d 122 #endif
jmitc91516 0:6db0d96b351d 123 if (disperr != Display::DisplayError_Ok) {
jmitc91516 0:6db0d96b351d 124 log->printf("Failed to initialize the display, got error %d\r\n", disperr);
jmitc91516 0:6db0d96b351d 125 break;
jmitc91516 0:6db0d96b351d 126 }
jmitc91516 0:6db0d96b351d 127
jmitc91516 0:6db0d96b351d 128 } while(false);
jmitc91516 0:6db0d96b351d 129
jmitc91516 0:6db0d96b351d 130 if (err != DMBoard::Ok) {
jmitc91516 0:6db0d96b351d 131 log->printf("\nTERMINATING\n");
jmitc91516 0:6db0d96b351d 132 wait_ms(2000); // allow RtosLog to flush messages
jmitc91516 0:6db0d96b351d 133 mbed_die();
jmitc91516 0:6db0d96b351d 134 }
jmitc91516 0:6db0d96b351d 135 }
jmitc91516 0:6db0d96b351d 136
jmitc91516 0:6db0d96b351d 137 int main()
jmitc91516 0:6db0d96b351d 138 {
jmitc91516 0:6db0d96b351d 139 DMBoard* board = &DMBoard::instance();
jmitc91516 0:6db0d96b351d 140 RtosLog* log = board->logger();
jmitc91516 0:6db0d96b351d 141 Display* disp = board->display();
jmitc91516 0:6db0d96b351d 142
jmitc91516 0:6db0d96b351d 143 QSPIBitmap* singlePhotoBitmap = new QSPIBitmap("GuiStruct_Bitmap_DSC_1836Reduced");
jmitc91516 0:6db0d96b351d 144
jmitc91516 0:6db0d96b351d 145 void *frameBuffer1;
jmitc91516 0:6db0d96b351d 146 void *frameBuffer2;
jmitc91516 0:6db0d96b351d 147 InitialiseLPC4088(board, &frameBuffer1, &frameBuffer2);
jmitc91516 0:6db0d96b351d 148 GuiDisplay_SetFrameAddress(frameBuffer1);
jmitc91516 0:6db0d96b351d 149
jmitc91516 0:6db0d96b351d 150 InitEasyGUIDisplay(GuiStruct_Demo_0, singlePhotoBitmap, 40, 0);
jmitc91516 0:6db0d96b351d 151
jmitc91516 0:6db0d96b351d 152 while(true) {
jmitc91516 0:6db0d96b351d 153 }
jmitc91516 0:6db0d96b351d 154 }