Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: GR-PEACH_video SI1143 mbed-rtos mbed
main.cpp@0:7e5105dee0cb, 2016-05-31 (annotated)
- Committer:
- 1050186
- Date:
- Tue May 31 01:54:23 2016 +0000
- Revision:
- 0:7e5105dee0cb
First Commit
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| 1050186 | 0:7e5105dee0cb | 1 | #include "mbed.h" |
| 1050186 | 0:7e5105dee0cb | 2 | #include "DisplayBace.h" |
| 1050186 | 0:7e5105dee0cb | 3 | #include "rtos.h" |
| 1050186 | 0:7e5105dee0cb | 4 | #include "SI1143.h" |
| 1050186 | 0:7e5105dee0cb | 5 | #include "image_data.h" |
| 1050186 | 0:7e5105dee0cb | 6 | |
| 1050186 | 0:7e5105dee0cb | 7 | /**** LCD Parameter **********/ |
| 1050186 | 0:7e5105dee0cb | 8 | #define LCD_DE_MODE (0) |
| 1050186 | 0:7e5105dee0cb | 9 | #define LCD_SYNC_MODE (1) |
| 1050186 | 0:7e5105dee0cb | 10 | |
| 1050186 | 0:7e5105dee0cb | 11 | #define LCD_DOT_CLOCK (13.40f) // 13.4MHz |
| 1050186 | 0:7e5105dee0cb | 12 | |
| 1050186 | 0:7e5105dee0cb | 13 | #define LCD_H_WIDTH (480u) |
| 1050186 | 0:7e5105dee0cb | 14 | #define LCD_H_BACK_PORCH (43u) |
| 1050186 | 0:7e5105dee0cb | 15 | #define LCD_H_FRONT_PORCH (52u) |
| 1050186 | 0:7e5105dee0cb | 16 | #define LCD_H_SYNC_WIDTH (41u) |
| 1050186 | 0:7e5105dee0cb | 17 | |
| 1050186 | 0:7e5105dee0cb | 18 | #define LCD_V_WIDTH (272u) |
| 1050186 | 0:7e5105dee0cb | 19 | #define LCD_V_BACK_PORCH (12u) |
| 1050186 | 0:7e5105dee0cb | 20 | #define LCD_V_FRONT_PORCH (2u) |
| 1050186 | 0:7e5105dee0cb | 21 | #define LCD_V_SYNC_WIDTH (10u) |
| 1050186 | 0:7e5105dee0cb | 22 | |
| 1050186 | 0:7e5105dee0cb | 23 | #define LCD_MODE (LCD_SYNC_MODE) |
| 1050186 | 0:7e5105dee0cb | 24 | |
| 1050186 | 0:7e5105dee0cb | 25 | /*****************************/ |
| 1050186 | 0:7e5105dee0cb | 26 | |
| 1050186 | 0:7e5105dee0cb | 27 | |
| 1050186 | 0:7e5105dee0cb | 28 | #define FRAME_BUFFER_BYTE_PER_PIXEL (2u) |
| 1050186 | 0:7e5105dee0cb | 29 | #define VIDEO_BUFFER_STRIDE (((LCD_H_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u) |
| 1050186 | 0:7e5105dee0cb | 30 | #define VIDEO_BUFFER_HEIGHT (LCD_V_WIDTH) |
| 1050186 | 0:7e5105dee0cb | 31 | |
| 1050186 | 0:7e5105dee0cb | 32 | #define IMG_RGB565 (0) |
| 1050186 | 0:7e5105dee0cb | 33 | #define IMG_ARGB1555 (2) |
| 1050186 | 0:7e5105dee0cb | 34 | #define IMG_ARGB4444 (3) |
| 1050186 | 0:7e5105dee0cb | 35 | #define IMG_CLUT8 (6) |
| 1050186 | 0:7e5105dee0cb | 36 | #define IMG_CLUT4 (7) |
| 1050186 | 0:7e5105dee0cb | 37 | #define IMG_CLUT1 (8) |
| 1050186 | 0:7e5105dee0cb | 38 | #define IMG_XRGB8888 (9) |
| 1050186 | 0:7e5105dee0cb | 39 | #define IMG_ARGB8888 (10) |
| 1050186 | 0:7e5105dee0cb | 40 | #define IMG_YUV422 (11) |
| 1050186 | 0:7e5105dee0cb | 41 | |
| 1050186 | 0:7e5105dee0cb | 42 | enum { |
| 1050186 | 0:7e5105dee0cb | 43 | IMG_SETTING, |
| 1050186 | 0:7e5105dee0cb | 44 | IMG_START, |
| 1050186 | 0:7e5105dee0cb | 45 | IMG_RED, |
| 1050186 | 0:7e5105dee0cb | 46 | IMG_GREEN, |
| 1050186 | 0:7e5105dee0cb | 47 | IMG_BLUE, |
| 1050186 | 0:7e5105dee0cb | 48 | IMG_YELLOW, |
| 1050186 | 0:7e5105dee0cb | 49 | IMG_LIGHTBLUE, |
| 1050186 | 0:7e5105dee0cb | 50 | IMG_PINK, |
| 1050186 | 0:7e5105dee0cb | 51 | IMG_WHITE |
| 1050186 | 0:7e5105dee0cb | 52 | }; |
| 1050186 | 0:7e5105dee0cb | 53 | |
| 1050186 | 0:7e5105dee0cb | 54 | enum { |
| 1050186 | 0:7e5105dee0cb | 55 | SENSE1_NON, |
| 1050186 | 0:7e5105dee0cb | 56 | SENSE1_1, |
| 1050186 | 0:7e5105dee0cb | 57 | SENSE1_2, |
| 1050186 | 0:7e5105dee0cb | 58 | SENSE1_3 |
| 1050186 | 0:7e5105dee0cb | 59 | }; |
| 1050186 | 0:7e5105dee0cb | 60 | |
| 1050186 | 0:7e5105dee0cb | 61 | enum { |
| 1050186 | 0:7e5105dee0cb | 62 | SENSE2_NON, |
| 1050186 | 0:7e5105dee0cb | 63 | SENSE2_1, |
| 1050186 | 0:7e5105dee0cb | 64 | SENSE2_2, |
| 1050186 | 0:7e5105dee0cb | 65 | SENSE2_3 |
| 1050186 | 0:7e5105dee0cb | 66 | }; |
| 1050186 | 0:7e5105dee0cb | 67 | |
| 1050186 | 0:7e5105dee0cb | 68 | DigitalOut lcd_pwon(P7_15); |
| 1050186 | 0:7e5105dee0cb | 69 | DigitalOut lcd_blon(P8_1); |
| 1050186 | 0:7e5105dee0cb | 70 | PwmOut lcd_cntrst(P8_15); |
| 1050186 | 0:7e5105dee0cb | 71 | SI1143 sensor1(I2C_SDA, I2C_SCL); |
| 1050186 | 0:7e5105dee0cb | 72 | SI1143 sensor2(P1_7, P1_6); |
| 1050186 | 0:7e5105dee0cb | 73 | |
| 1050186 | 0:7e5105dee0cb | 74 | typedef struct { |
| 1050186 | 0:7e5105dee0cb | 75 | uint32_t dummy1; |
| 1050186 | 0:7e5105dee0cb | 76 | uint32_t offset_to_image; |
| 1050186 | 0:7e5105dee0cb | 77 | uint32_t dummy2; |
| 1050186 | 0:7e5105dee0cb | 78 | uint16_t width; |
| 1050186 | 0:7e5105dee0cb | 79 | uint16_t height; |
| 1050186 | 0:7e5105dee0cb | 80 | uint8_t type; |
| 1050186 | 0:7e5105dee0cb | 81 | uint8_t dummy3; |
| 1050186 | 0:7e5105dee0cb | 82 | uint32_t dummy4; |
| 1050186 | 0:7e5105dee0cb | 83 | } graphics_image_t; |
| 1050186 | 0:7e5105dee0cb | 84 | |
| 1050186 | 0:7e5105dee0cb | 85 | typedef struct { |
| 1050186 | 0:7e5105dee0cb | 86 | const graphics_image_t* image; |
| 1050186 | 0:7e5105dee0cb | 87 | uint32_t pos_x; |
| 1050186 | 0:7e5105dee0cb | 88 | uint32_t pos_y; |
| 1050186 | 0:7e5105dee0cb | 89 | } draw_info_t; |
| 1050186 | 0:7e5105dee0cb | 90 | |
| 1050186 | 0:7e5105dee0cb | 91 | typedef struct { |
| 1050186 | 0:7e5105dee0cb | 92 | draw_info_t curr; |
| 1050186 | 0:7e5105dee0cb | 93 | draw_info_t last; |
| 1050186 | 0:7e5105dee0cb | 94 | } image_draw_t; |
| 1050186 | 0:7e5105dee0cb | 95 | |
| 1050186 | 0:7e5105dee0cb | 96 | static const graphics_image_t* image_file[9] = { |
| 1050186 | 0:7e5105dee0cb | 97 | g_setting, g_start, g_red, g_gren, g_blue, g_yellow, g_lightblue, g_pink, g_white |
| 1050186 | 0:7e5105dee0cb | 98 | }; |
| 1050186 | 0:7e5105dee0cb | 99 | |
| 1050186 | 0:7e5105dee0cb | 100 | static uint8_t user_frame_buffer[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(32))); //32 bytes aligned!; |
| 1050186 | 0:7e5105dee0cb | 101 | static uint8_t user_frame_buffer2[VIDEO_BUFFER_STRIDE * VIDEO_BUFFER_HEIGHT]__attribute((section("NC_BSS"),aligned(32))); //32 bytes aligned!; |
| 1050186 | 0:7e5105dee0cb | 102 | static volatile int32_t vsync_count; |
| 1050186 | 0:7e5105dee0cb | 103 | static uint8_t* disp_buff_addr; |
| 1050186 | 0:7e5105dee0cb | 104 | static int sense1[3] = {0, 0, 0}; |
| 1050186 | 0:7e5105dee0cb | 105 | static int sense2[3] = {0, 0, 0}; |
| 1050186 | 0:7e5105dee0cb | 106 | static image_draw_t img1_info; |
| 1050186 | 0:7e5105dee0cb | 107 | static image_draw_t img2_info; |
| 1050186 | 0:7e5105dee0cb | 108 | |
| 1050186 | 0:7e5105dee0cb | 109 | static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) |
| 1050186 | 0:7e5105dee0cb | 110 | { |
| 1050186 | 0:7e5105dee0cb | 111 | //Interrupt callback function for Vsync interruption |
| 1050186 | 0:7e5105dee0cb | 112 | if (vsync_count > 0) { |
| 1050186 | 0:7e5105dee0cb | 113 | vsync_count--; |
| 1050186 | 0:7e5105dee0cb | 114 | } |
| 1050186 | 0:7e5105dee0cb | 115 | } |
| 1050186 | 0:7e5105dee0cb | 116 | |
| 1050186 | 0:7e5105dee0cb | 117 | static void Wait_Vsync(const int32_t wait_count) |
| 1050186 | 0:7e5105dee0cb | 118 | { |
| 1050186 | 0:7e5105dee0cb | 119 | //Wait for the specified number of times Vsync occurs |
| 1050186 | 0:7e5105dee0cb | 120 | vsync_count = wait_count; |
| 1050186 | 0:7e5105dee0cb | 121 | while (vsync_count > 0) { |
| 1050186 | 0:7e5105dee0cb | 122 | /* Do nothing */ |
| 1050186 | 0:7e5105dee0cb | 123 | } |
| 1050186 | 0:7e5105dee0cb | 124 | } |
| 1050186 | 0:7e5105dee0cb | 125 | |
| 1050186 | 0:7e5105dee0cb | 126 | static void Clr_FrameBuffer(uint8_t frmbuf_num) { |
| 1050186 | 0:7e5105dee0cb | 127 | int vcnt, wcnt; |
| 1050186 | 0:7e5105dee0cb | 128 | uint16_t * fb_base; |
| 1050186 | 0:7e5105dee0cb | 129 | uint16_t * fb_pos; |
| 1050186 | 0:7e5105dee0cb | 130 | |
| 1050186 | 0:7e5105dee0cb | 131 | if ((frmbuf_num & 0x01) != 0) { |
| 1050186 | 0:7e5105dee0cb | 132 | fb_base = (uint16_t *)user_frame_buffer; |
| 1050186 | 0:7e5105dee0cb | 133 | for (vcnt = 0; vcnt < LCD_V_WIDTH; vcnt++) { |
| 1050186 | 0:7e5105dee0cb | 134 | fb_pos = fb_base + (vcnt * LCD_H_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 135 | for (wcnt = 0; wcnt < LCD_H_WIDTH; wcnt++) { |
| 1050186 | 0:7e5105dee0cb | 136 | fb_pos[wcnt] = 0xFFFF; |
| 1050186 | 0:7e5105dee0cb | 137 | } |
| 1050186 | 0:7e5105dee0cb | 138 | } |
| 1050186 | 0:7e5105dee0cb | 139 | } |
| 1050186 | 0:7e5105dee0cb | 140 | if ((frmbuf_num & 0x02) != 0) { |
| 1050186 | 0:7e5105dee0cb | 141 | fb_base = (uint16_t *)user_frame_buffer2; |
| 1050186 | 0:7e5105dee0cb | 142 | for (vcnt = 0; vcnt < LCD_V_WIDTH; vcnt++) { |
| 1050186 | 0:7e5105dee0cb | 143 | fb_pos = fb_base + (vcnt * LCD_H_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 144 | for (wcnt = 0; wcnt < LCD_H_WIDTH; wcnt++) { |
| 1050186 | 0:7e5105dee0cb | 145 | fb_pos[wcnt] = 0xFFFF; |
| 1050186 | 0:7e5105dee0cb | 146 | } |
| 1050186 | 0:7e5105dee0cb | 147 | } |
| 1050186 | 0:7e5105dee0cb | 148 | } |
| 1050186 | 0:7e5105dee0cb | 149 | } |
| 1050186 | 0:7e5105dee0cb | 150 | |
| 1050186 | 0:7e5105dee0cb | 151 | static void Draw_Image(void * dst_buff, uint32_t dst_stride, const graphics_image_t * src_image, uint32_t pos_x, uint32_t pos_y) { |
| 1050186 | 0:7e5105dee0cb | 152 | uint32_t offset_to_image; |
| 1050186 | 0:7e5105dee0cb | 153 | uint16_t width; |
| 1050186 | 0:7e5105dee0cb | 154 | uint16_t height; |
| 1050186 | 0:7e5105dee0cb | 155 | uint8_t type; |
| 1050186 | 0:7e5105dee0cb | 156 | uint16_t * pSrc16; |
| 1050186 | 0:7e5105dee0cb | 157 | uint32_t * pSrc32; |
| 1050186 | 0:7e5105dee0cb | 158 | uint16_t * pDst16; |
| 1050186 | 0:7e5105dee0cb | 159 | uint32_t * pDst32; |
| 1050186 | 0:7e5105dee0cb | 160 | uint32_t x,y; |
| 1050186 | 0:7e5105dee0cb | 161 | |
| 1050186 | 0:7e5105dee0cb | 162 | if (src_image != NULL) { |
| 1050186 | 0:7e5105dee0cb | 163 | offset_to_image = src_image->offset_to_image; |
| 1050186 | 0:7e5105dee0cb | 164 | width = src_image->width; |
| 1050186 | 0:7e5105dee0cb | 165 | height = src_image->height; |
| 1050186 | 0:7e5105dee0cb | 166 | type = src_image->type; |
| 1050186 | 0:7e5105dee0cb | 167 | |
| 1050186 | 0:7e5105dee0cb | 168 | if (type == IMG_ARGB4444) { |
| 1050186 | 0:7e5105dee0cb | 169 | pDst16 = (uint16_t *)dst_buff; |
| 1050186 | 0:7e5105dee0cb | 170 | pSrc16 = (uint16_t *)((uint8_t *)src_image + offset_to_image ); |
| 1050186 | 0:7e5105dee0cb | 171 | |
| 1050186 | 0:7e5105dee0cb | 172 | for (y = 0; y < height; y++) { |
| 1050186 | 0:7e5105dee0cb | 173 | for (x = 0; x < width; x++) { |
| 1050186 | 0:7e5105dee0cb | 174 | if ((pSrc16[(y * width) + x] & 0xf000) != 0) { |
| 1050186 | 0:7e5105dee0cb | 175 | /* Copy the pixel value if its alpha value is not 0 */ |
| 1050186 | 0:7e5105dee0cb | 176 | pDst16[((y + pos_y) * dst_stride / 2) + (x + pos_x)] = pSrc16[(y * width) + x]; |
| 1050186 | 0:7e5105dee0cb | 177 | } |
| 1050186 | 0:7e5105dee0cb | 178 | } |
| 1050186 | 0:7e5105dee0cb | 179 | } |
| 1050186 | 0:7e5105dee0cb | 180 | } else if (type == IMG_ARGB8888) { |
| 1050186 | 0:7e5105dee0cb | 181 | pDst32 = (uint32_t *)dst_buff; |
| 1050186 | 0:7e5105dee0cb | 182 | pSrc32 = (uint32_t *)((uint8_t *)src_image + offset_to_image); |
| 1050186 | 0:7e5105dee0cb | 183 | |
| 1050186 | 0:7e5105dee0cb | 184 | for (y = 0; y < height; y++) { |
| 1050186 | 0:7e5105dee0cb | 185 | for (x = 0; x < width; x++) { |
| 1050186 | 0:7e5105dee0cb | 186 | if ((pSrc32[(y * width) + x] & 0xff000000) != 0) { |
| 1050186 | 0:7e5105dee0cb | 187 | /* Copy the pixel value if its alpha value is not 0 */ |
| 1050186 | 0:7e5105dee0cb | 188 | pDst32[((y + pos_y) * dst_stride / 4) + (x + pos_x)] = pSrc32[(y * width) + x]; |
| 1050186 | 0:7e5105dee0cb | 189 | } |
| 1050186 | 0:7e5105dee0cb | 190 | } |
| 1050186 | 0:7e5105dee0cb | 191 | } |
| 1050186 | 0:7e5105dee0cb | 192 | } else if (type == IMG_RGB565) { |
| 1050186 | 0:7e5105dee0cb | 193 | pDst16 = (uint16_t *)dst_buff; |
| 1050186 | 0:7e5105dee0cb | 194 | pSrc16 = (uint16_t *)((uint8_t *)src_image + offset_to_image); |
| 1050186 | 0:7e5105dee0cb | 195 | |
| 1050186 | 0:7e5105dee0cb | 196 | for (y = 0; y < height; y++) { |
| 1050186 | 0:7e5105dee0cb | 197 | for (x = 0; x < width; x++) { |
| 1050186 | 0:7e5105dee0cb | 198 | pDst16[((y + pos_y) * dst_stride / 2) + (x + pos_x)] = pSrc16[(y * width) + x]; |
| 1050186 | 0:7e5105dee0cb | 199 | } |
| 1050186 | 0:7e5105dee0cb | 200 | } |
| 1050186 | 0:7e5105dee0cb | 201 | } |
| 1050186 | 0:7e5105dee0cb | 202 | } |
| 1050186 | 0:7e5105dee0cb | 203 | } |
| 1050186 | 0:7e5105dee0cb | 204 | |
| 1050186 | 0:7e5105dee0cb | 205 | static int Get_Sensor1(void) { |
| 1050186 | 0:7e5105dee0cb | 206 | int sense_num = SENSE1_NON; |
| 1050186 | 0:7e5105dee0cb | 207 | |
| 1050186 | 0:7e5105dee0cb | 208 | // Read each led sensor |
| 1050186 | 0:7e5105dee0cb | 209 | sense1[0] = sensor1.get_ps1(5); |
| 1050186 | 0:7e5105dee0cb | 210 | sense1[1] = sensor1.get_ps2(5); |
| 1050186 | 0:7e5105dee0cb | 211 | sense1[2] = sensor1.get_ps3(5); |
| 1050186 | 0:7e5105dee0cb | 212 | |
| 1050186 | 0:7e5105dee0cb | 213 | if (sense1[0] > 500 || sense1[1] > 500 || sense1[2] > 500) { |
| 1050186 | 0:7e5105dee0cb | 214 | if (sense1[0] > sense1[1] && sense1[0] > sense1[2]) { |
| 1050186 | 0:7e5105dee0cb | 215 | sense_num = SENSE1_1; |
| 1050186 | 0:7e5105dee0cb | 216 | } else if (sense1[1] > sense1[0] && sense1[1] > sense1[2]) { |
| 1050186 | 0:7e5105dee0cb | 217 | sense_num = SENSE1_2; |
| 1050186 | 0:7e5105dee0cb | 218 | } else if (sense1[2] > sense1[0] && sense1[2] > sense1[1]) { |
| 1050186 | 0:7e5105dee0cb | 219 | sense_num = SENSE1_3; |
| 1050186 | 0:7e5105dee0cb | 220 | } |
| 1050186 | 0:7e5105dee0cb | 221 | } |
| 1050186 | 0:7e5105dee0cb | 222 | |
| 1050186 | 0:7e5105dee0cb | 223 | return sense_num; |
| 1050186 | 0:7e5105dee0cb | 224 | } |
| 1050186 | 0:7e5105dee0cb | 225 | |
| 1050186 | 0:7e5105dee0cb | 226 | static int Get_Sensor2(void) { |
| 1050186 | 0:7e5105dee0cb | 227 | int sense_num = SENSE2_NON; |
| 1050186 | 0:7e5105dee0cb | 228 | |
| 1050186 | 0:7e5105dee0cb | 229 | // Read each led sensor |
| 1050186 | 0:7e5105dee0cb | 230 | sense2[0] = sensor2.get_ps1(5); |
| 1050186 | 0:7e5105dee0cb | 231 | sense2[1] = sensor2.get_ps2(5); |
| 1050186 | 0:7e5105dee0cb | 232 | sense2[2] = sensor2.get_ps3(5); |
| 1050186 | 0:7e5105dee0cb | 233 | |
| 1050186 | 0:7e5105dee0cb | 234 | if (sense2[0] > 500 || sense2[1] > 500 || sense2[2] > 500) { |
| 1050186 | 0:7e5105dee0cb | 235 | if (sense2[0] > sense2[1] && sense2[0] > sense2[2]) { |
| 1050186 | 0:7e5105dee0cb | 236 | sense_num = SENSE2_1; |
| 1050186 | 0:7e5105dee0cb | 237 | } else if (sense2[1] > sense2[0] && sense2[1] > sense2[2]) { |
| 1050186 | 0:7e5105dee0cb | 238 | sense_num = SENSE2_2; |
| 1050186 | 0:7e5105dee0cb | 239 | } else if (sense2[2] > sense2[0] && sense2[2] > sense2[1]) { |
| 1050186 | 0:7e5105dee0cb | 240 | sense_num = SENSE2_3; |
| 1050186 | 0:7e5105dee0cb | 241 | } |
| 1050186 | 0:7e5105dee0cb | 242 | } |
| 1050186 | 0:7e5105dee0cb | 243 | |
| 1050186 | 0:7e5105dee0cb | 244 | return sense_num; |
| 1050186 | 0:7e5105dee0cb | 245 | } |
| 1050186 | 0:7e5105dee0cb | 246 | |
| 1050186 | 0:7e5105dee0cb | 247 | static void Swap_FrameBuffer(void) { |
| 1050186 | 0:7e5105dee0cb | 248 | if (disp_buff_addr == user_frame_buffer) { |
| 1050186 | 0:7e5105dee0cb | 249 | disp_buff_addr = user_frame_buffer2; |
| 1050186 | 0:7e5105dee0cb | 250 | Clr_FrameBuffer(0x02); |
| 1050186 | 0:7e5105dee0cb | 251 | } else { |
| 1050186 | 0:7e5105dee0cb | 252 | disp_buff_addr = user_frame_buffer; |
| 1050186 | 0:7e5105dee0cb | 253 | Clr_FrameBuffer(0x01); |
| 1050186 | 0:7e5105dee0cb | 254 | } |
| 1050186 | 0:7e5105dee0cb | 255 | } |
| 1050186 | 0:7e5105dee0cb | 256 | |
| 1050186 | 0:7e5105dee0cb | 257 | int main(void) |
| 1050186 | 0:7e5105dee0cb | 258 | { |
| 1050186 | 0:7e5105dee0cb | 259 | /* Create DisplayBase object */ |
| 1050186 | 0:7e5105dee0cb | 260 | DisplayBase Display; |
| 1050186 | 0:7e5105dee0cb | 261 | DisplayBase::graphics_error_t error; |
| 1050186 | 0:7e5105dee0cb | 262 | DisplayBase::lcd_config_t lcd_config; |
| 1050186 | 0:7e5105dee0cb | 263 | disp_buff_addr = user_frame_buffer; |
| 1050186 | 0:7e5105dee0cb | 264 | int sense1 = SENSE1_NON; |
| 1050186 | 0:7e5105dee0cb | 265 | int sense2 = SENSE2_NON; |
| 1050186 | 0:7e5105dee0cb | 266 | img1_info.curr.image = image_file[IMG_START]; |
| 1050186 | 0:7e5105dee0cb | 267 | img1_info.curr.pos_x = 0; |
| 1050186 | 0:7e5105dee0cb | 268 | img1_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 269 | img1_info.last.image = image_file[IMG_WHITE]; |
| 1050186 | 0:7e5105dee0cb | 270 | img1_info.last.pos_x = 0; |
| 1050186 | 0:7e5105dee0cb | 271 | img1_info.last.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 272 | img2_info.curr.image = image_file[IMG_START]; |
| 1050186 | 0:7e5105dee0cb | 273 | img2_info.curr.pos_x = 0; |
| 1050186 | 0:7e5105dee0cb | 274 | img2_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 275 | img2_info.last.image = image_file[IMG_WHITE]; |
| 1050186 | 0:7e5105dee0cb | 276 | img2_info.last.pos_x = 240; |
| 1050186 | 0:7e5105dee0cb | 277 | img2_info.last.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 278 | |
| 1050186 | 0:7e5105dee0cb | 279 | lcd_pwon = 0; |
| 1050186 | 0:7e5105dee0cb | 280 | lcd_blon = 0; |
| 1050186 | 0:7e5105dee0cb | 281 | Thread::wait(100); |
| 1050186 | 0:7e5105dee0cb | 282 | lcd_pwon = 1; |
| 1050186 | 0:7e5105dee0cb | 283 | lcd_blon = 1; |
| 1050186 | 0:7e5105dee0cb | 284 | Thread::wait(100); |
| 1050186 | 0:7e5105dee0cb | 285 | |
| 1050186 | 0:7e5105dee0cb | 286 | // Setup display |
| 1050186 | 0:7e5105dee0cb | 287 | vsync_count = 0; |
| 1050186 | 0:7e5105dee0cb | 288 | PinName lvds_pin[8] = { |
| 1050186 | 0:7e5105dee0cb | 289 | /* data pin */ |
| 1050186 | 0:7e5105dee0cb | 290 | P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0 |
| 1050186 | 0:7e5105dee0cb | 291 | }; |
| 1050186 | 0:7e5105dee0cb | 292 | DisplayBase::rect_t rect; |
| 1050186 | 0:7e5105dee0cb | 293 | |
| 1050186 | 0:7e5105dee0cb | 294 | lcd_config.lcd_type = DisplayBase::LCD_TYPE_LVDS; |
| 1050186 | 0:7e5105dee0cb | 295 | lcd_config.intputClock = 66.67f; |
| 1050186 | 0:7e5105dee0cb | 296 | lcd_config.outputClock = LCD_DOT_CLOCK; |
| 1050186 | 0:7e5105dee0cb | 297 | lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888; |
| 1050186 | 0:7e5105dee0cb | 298 | lcd_config.lcd_edge = DisplayBase::EDGE_RISING; |
| 1050186 | 0:7e5105dee0cb | 299 | #if(LCD_MODE) //SYNC Mode |
| 1050186 | 0:7e5105dee0cb | 300 | lcd_config.h_toatal_period = (LCD_H_BACK_PORCH + LCD_H_WIDTH + LCD_H_FRONT_PORCH); |
| 1050186 | 0:7e5105dee0cb | 301 | lcd_config.v_toatal_period = (LCD_V_BACK_PORCH + LCD_V_WIDTH + LCD_V_FRONT_PORCH); |
| 1050186 | 0:7e5105dee0cb | 302 | |
| 1050186 | 0:7e5105dee0cb | 303 | lcd_config.h_disp_widht = (LCD_H_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 304 | lcd_config.v_disp_widht = (LCD_V_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 305 | lcd_config.h_back_porch = (LCD_H_BACK_PORCH); |
| 1050186 | 0:7e5105dee0cb | 306 | lcd_config.v_back_porch = (LCD_V_BACK_PORCH); |
| 1050186 | 0:7e5105dee0cb | 307 | |
| 1050186 | 0:7e5105dee0cb | 308 | lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_2; |
| 1050186 | 0:7e5105dee0cb | 309 | lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_INVERTED; |
| 1050186 | 0:7e5105dee0cb | 310 | lcd_config.h_sync_width = LCD_H_SYNC_WIDTH; |
| 1050186 | 0:7e5105dee0cb | 311 | |
| 1050186 | 0:7e5105dee0cb | 312 | lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_0; |
| 1050186 | 0:7e5105dee0cb | 313 | lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_INVERTED; |
| 1050186 | 0:7e5105dee0cb | 314 | lcd_config.v_sync_width = LCD_V_SYNC_WIDTH; |
| 1050186 | 0:7e5105dee0cb | 315 | |
| 1050186 | 0:7e5105dee0cb | 316 | lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3; |
| 1050186 | 0:7e5105dee0cb | 317 | lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED; |
| 1050186 | 0:7e5105dee0cb | 318 | #else //DE Mode |
| 1050186 | 0:7e5105dee0cb | 319 | lcd_config.h_toatal_period = (LCD_H_WIDTH + 80u); |
| 1050186 | 0:7e5105dee0cb | 320 | lcd_config.v_toatal_period = (LCD_V_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 321 | |
| 1050186 | 0:7e5105dee0cb | 322 | lcd_config.h_disp_widht = (LCD_H_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 323 | lcd_config.v_disp_widht = (LCD_V_WIDTH); |
| 1050186 | 0:7e5105dee0cb | 324 | lcd_config.h_back_porch = (68u); |
| 1050186 | 0:7e5105dee0cb | 325 | lcd_config.v_back_porch = (18u); |
| 1050186 | 0:7e5105dee0cb | 326 | |
| 1050186 | 0:7e5105dee0cb | 327 | lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_NON; |
| 1050186 | 0:7e5105dee0cb | 328 | lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED; |
| 1050186 | 0:7e5105dee0cb | 329 | lcd_config.h_sync_width = 0; |
| 1050186 | 0:7e5105dee0cb | 330 | |
| 1050186 | 0:7e5105dee0cb | 331 | lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_NON; |
| 1050186 | 0:7e5105dee0cb | 332 | lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED; |
| 1050186 | 0:7e5105dee0cb | 333 | lcd_config.v_sync_width = 0; |
| 1050186 | 0:7e5105dee0cb | 334 | |
| 1050186 | 0:7e5105dee0cb | 335 | lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3; |
| 1050186 | 0:7e5105dee0cb | 336 | lcd_config.de_port_polarity = DisplayBase::SIG_POL_INVERTED; |
| 1050186 | 0:7e5105dee0cb | 337 | #endif |
| 1050186 | 0:7e5105dee0cb | 338 | |
| 1050186 | 0:7e5105dee0cb | 339 | /* Graphics initialization process */ |
| 1050186 | 0:7e5105dee0cb | 340 | error = Display.Graphics_init(&lcd_config); |
| 1050186 | 0:7e5105dee0cb | 341 | if (error != DisplayBase::GRAPHICS_OK) { |
| 1050186 | 0:7e5105dee0cb | 342 | printf("Line %d, error %d\n", __LINE__, error); |
| 1050186 | 0:7e5105dee0cb | 343 | while (1); |
| 1050186 | 0:7e5105dee0cb | 344 | } |
| 1050186 | 0:7e5105dee0cb | 345 | |
| 1050186 | 0:7e5105dee0cb | 346 | /* Interrupt callback function setting (Vsync signal output from scaler 0) */ |
| 1050186 | 0:7e5105dee0cb | 347 | error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_Vsync); |
| 1050186 | 0:7e5105dee0cb | 348 | if (error != DisplayBase::GRAPHICS_OK) { |
| 1050186 | 0:7e5105dee0cb | 349 | printf("Line %d, error %d\n", __LINE__, error); |
| 1050186 | 0:7e5105dee0cb | 350 | while (1); |
| 1050186 | 0:7e5105dee0cb | 351 | } |
| 1050186 | 0:7e5105dee0cb | 352 | |
| 1050186 | 0:7e5105dee0cb | 353 | Display.Graphics_Lvds_Port_Init(lvds_pin, 8); |
| 1050186 | 0:7e5105dee0cb | 354 | rect.vs = 0; |
| 1050186 | 0:7e5105dee0cb | 355 | rect.vw = LCD_V_WIDTH; |
| 1050186 | 0:7e5105dee0cb | 356 | rect.hs = 0; |
| 1050186 | 0:7e5105dee0cb | 357 | rect.hw = LCD_H_WIDTH; |
| 1050186 | 0:7e5105dee0cb | 358 | |
| 1050186 | 0:7e5105dee0cb | 359 | Display.Graphics_Read_Setting( |
| 1050186 | 0:7e5105dee0cb | 360 | DisplayBase::GRAPHICS_LAYER_0, |
| 1050186 | 0:7e5105dee0cb | 361 | (void *)disp_buff_addr, |
| 1050186 | 0:7e5105dee0cb | 362 | VIDEO_BUFFER_STRIDE, |
| 1050186 | 0:7e5105dee0cb | 363 | DisplayBase::GRAPHICS_FORMAT_RGB565, |
| 1050186 | 0:7e5105dee0cb | 364 | DisplayBase::WR_RD_WRSWA_32_16BIT, |
| 1050186 | 0:7e5105dee0cb | 365 | &rect |
| 1050186 | 0:7e5105dee0cb | 366 | ); |
| 1050186 | 0:7e5105dee0cb | 367 | Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0); |
| 1050186 | 0:7e5105dee0cb | 368 | lcd_cntrst.write(1.0); |
| 1050186 | 0:7e5105dee0cb | 369 | |
| 1050186 | 0:7e5105dee0cb | 370 | // Setup the baseline |
| 1050186 | 0:7e5105dee0cb | 371 | Draw_Image(disp_buff_addr, VIDEO_BUFFER_STRIDE, image_file[IMG_SETTING], 0, 0); |
| 1050186 | 0:7e5105dee0cb | 372 | printf("SI1143 Gesture Sensor setting...\n"); |
| 1050186 | 0:7e5105dee0cb | 373 | sensor1.bias(1,5); |
| 1050186 | 0:7e5105dee0cb | 374 | sensor2.bias(1,5); |
| 1050186 | 0:7e5105dee0cb | 375 | Thread::wait(1000); |
| 1050186 | 0:7e5105dee0cb | 376 | Draw_Image(disp_buff_addr, VIDEO_BUFFER_STRIDE, image_file[IMG_START], 0, 0); |
| 1050186 | 0:7e5105dee0cb | 377 | printf("SI1143 Gesture Sensor setting finished!\n"); |
| 1050186 | 0:7e5105dee0cb | 378 | while (1) { |
| 1050186 | 0:7e5105dee0cb | 379 | sense1 = Get_Sensor1(); |
| 1050186 | 0:7e5105dee0cb | 380 | switch (sense1) { |
| 1050186 | 0:7e5105dee0cb | 381 | case SENSE1_1 : |
| 1050186 | 0:7e5105dee0cb | 382 | img1_info.curr.image = image_file[IMG_RED]; |
| 1050186 | 0:7e5105dee0cb | 383 | img1_info.curr.pos_x = 0; |
| 1050186 | 0:7e5105dee0cb | 384 | img1_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 385 | break; |
| 1050186 | 0:7e5105dee0cb | 386 | case SENSE1_2 : |
| 1050186 | 0:7e5105dee0cb | 387 | img1_info.curr.image = image_file[IMG_GREEN]; |
| 1050186 | 0:7e5105dee0cb | 388 | img1_info.curr.pos_x = 80; |
| 1050186 | 0:7e5105dee0cb | 389 | img1_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 390 | break; |
| 1050186 | 0:7e5105dee0cb | 391 | case SENSE1_3 : |
| 1050186 | 0:7e5105dee0cb | 392 | img1_info.curr.image = image_file[IMG_BLUE]; |
| 1050186 | 0:7e5105dee0cb | 393 | img1_info.curr.pos_x = 160; |
| 1050186 | 0:7e5105dee0cb | 394 | img1_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 395 | break; |
| 1050186 | 0:7e5105dee0cb | 396 | default : |
| 1050186 | 0:7e5105dee0cb | 397 | img1_info.curr.image = NULL; |
| 1050186 | 0:7e5105dee0cb | 398 | img1_info.curr.pos_x = 0; |
| 1050186 | 0:7e5105dee0cb | 399 | img1_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 400 | break; |
| 1050186 | 0:7e5105dee0cb | 401 | } |
| 1050186 | 0:7e5105dee0cb | 402 | sense2 = Get_Sensor2(); |
| 1050186 | 0:7e5105dee0cb | 403 | switch (sense2) { |
| 1050186 | 0:7e5105dee0cb | 404 | case SENSE2_1 : |
| 1050186 | 0:7e5105dee0cb | 405 | img2_info.curr.image = image_file[IMG_YELLOW]; |
| 1050186 | 0:7e5105dee0cb | 406 | img2_info.curr.pos_x = 240; |
| 1050186 | 0:7e5105dee0cb | 407 | img2_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 408 | break; |
| 1050186 | 0:7e5105dee0cb | 409 | case SENSE2_2 : |
| 1050186 | 0:7e5105dee0cb | 410 | img2_info.curr.image = image_file[IMG_LIGHTBLUE]; |
| 1050186 | 0:7e5105dee0cb | 411 | img2_info.curr.pos_x = 320; |
| 1050186 | 0:7e5105dee0cb | 412 | img2_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 413 | break; |
| 1050186 | 0:7e5105dee0cb | 414 | case SENSE2_3 : |
| 1050186 | 0:7e5105dee0cb | 415 | img2_info.curr.image = image_file[IMG_PINK]; |
| 1050186 | 0:7e5105dee0cb | 416 | img2_info.curr.pos_x = 400; |
| 1050186 | 0:7e5105dee0cb | 417 | img2_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 418 | break; |
| 1050186 | 0:7e5105dee0cb | 419 | default : |
| 1050186 | 0:7e5105dee0cb | 420 | img2_info.curr.image = NULL; |
| 1050186 | 0:7e5105dee0cb | 421 | img2_info.curr.pos_x = 0; |
| 1050186 | 0:7e5105dee0cb | 422 | img2_info.curr.pos_y = 0; |
| 1050186 | 0:7e5105dee0cb | 423 | break; |
| 1050186 | 0:7e5105dee0cb | 424 | } |
| 1050186 | 0:7e5105dee0cb | 425 | |
| 1050186 | 0:7e5105dee0cb | 426 | if ((sense1 != 0) || (sense2 != 0)) { |
| 1050186 | 0:7e5105dee0cb | 427 | /* Draw Image */ |
| 1050186 | 0:7e5105dee0cb | 428 | Swap_FrameBuffer(); |
| 1050186 | 0:7e5105dee0cb | 429 | if (sense1 != 0) { |
| 1050186 | 0:7e5105dee0cb | 430 | Draw_Image(disp_buff_addr, VIDEO_BUFFER_STRIDE, img1_info.curr.image, img1_info.curr.pos_x, img1_info.curr.pos_y); |
| 1050186 | 0:7e5105dee0cb | 431 | Draw_Image(disp_buff_addr, VIDEO_BUFFER_STRIDE, img2_info.last.image, img2_info.last.pos_x, img2_info.last.pos_y); |
| 1050186 | 0:7e5105dee0cb | 432 | img1_info.last.image = img1_info.curr.image; |
| 1050186 | 0:7e5105dee0cb | 433 | img1_info.last.pos_x = img1_info.curr.pos_x; |
| 1050186 | 0:7e5105dee0cb | 434 | img1_info.last.pos_y = img1_info.curr.pos_y; |
| 1050186 | 0:7e5105dee0cb | 435 | } |
| 1050186 | 0:7e5105dee0cb | 436 | if (sense2 != 0) { |
| 1050186 | 0:7e5105dee0cb | 437 | Draw_Image(disp_buff_addr, VIDEO_BUFFER_STRIDE, img1_info.last.image, img1_info.last.pos_x, img1_info.last.pos_y); |
| 1050186 | 0:7e5105dee0cb | 438 | Draw_Image(disp_buff_addr, VIDEO_BUFFER_STRIDE, img2_info.curr.image, img2_info.curr.pos_x, img2_info.curr.pos_y); |
| 1050186 | 0:7e5105dee0cb | 439 | img2_info.last.image = img2_info.curr.image; |
| 1050186 | 0:7e5105dee0cb | 440 | img2_info.last.pos_x = img2_info.curr.pos_x; |
| 1050186 | 0:7e5105dee0cb | 441 | img2_info.last.pos_y = img2_info.curr.pos_y; |
| 1050186 | 0:7e5105dee0cb | 442 | } |
| 1050186 | 0:7e5105dee0cb | 443 | Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0, (void *)disp_buff_addr); |
| 1050186 | 0:7e5105dee0cb | 444 | Wait_Vsync(1); |
| 1050186 | 0:7e5105dee0cb | 445 | } |
| 1050186 | 0:7e5105dee0cb | 446 | } |
| 1050186 | 0:7e5105dee0cb | 447 | } |