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
main.cpp@0:6db0d96b351d, 2017-07-28 (annotated)
- 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?
User | Revision | Line number | New 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 | } |