This is a sample program that uses two Si1143 sensors.
Dependencies: GR-PEACH_video SI1143 mbed-rtos mbed
Information
Japanese version is available in lower part of this page.
このページの後半に日本語版が用意されています.
What is this ?
This is a sample program that uses two gesture sensors.
This program displays image of rectangle on the screen of the LCD shield depending on the sensors.
About Si1143
Si1143 is a gesture sensor and can be controlled by using the I2C.
This can be detected from the shortest 1cm up to 200cm.
Si1143 emits three infrared LED that is mounted on a substrate, and detects the movement by measuring the reflected light from the external object.
- Datasheet of Si1143
http://www.silabs.com/Support%20Documents/TechnicalDocs/Si114x.pdf
Composition
GR-PEACH, LCD Shield and two gesture sensors(Si1143).
About wiring
First Sensor
Sensor | GR-PEACH |
VDD | 3.3V |
SCL | D15 |
SDA | D14 |
GND | GND |
Second Sensor
Sensor | GR-PEACH |
VDD | 3.3V |
SCL | P1_6 |
SDA | P1_7 |
GND | GND |
How to use
- Please connect GR-PEACH ,LCD Shield and two jesture sensors. Then turn on the power to GR-PEACH.
- Please press the reset button of GR-PEACH.
- The screen which "Program Setting" is drawn is displayed on the LCD.
- When the sensor of the setting is completed, the screen which "Program Started!!" is drawn is displayed on the LCD.
- When you hold your hand on the upper of LED1 - LED3 of the two jesture sensors, six rectangles is drawn on the screen of LCD Shield.
hand on | Draw |
the upper of LED1 of the first sensor | red rectangle |
the upper of LED2 of the first sensor | green rectangle |
the upper of LED3 of the first sensor | blue rectangle |
the upper of LED1 of the second sensor | yellow rectangle |
the upper of LED2 of the second sensor | light blue rectangle |
the upper of LED3 of the second sensor | pink rectangle |
概要
これは2つのジェスチャーセンサーを使ったサンプルプログラムです。
このプログラムは、センサーに応じて四角形の画像をLCDシールドの画面上に表示します。
Si1143について
Si1143はジェスチャーセンサであり、I2C通信を使ってセンサを制御します。
センサとの距離範囲は1cm200cmです。
Si1143は、基板上に搭載された3つの赤外線LEDを放射し、物体からの反射光を測定することによって、動きを検出します。
構成
GR-PEACH, LCD Shield and two gesture sensors(Si1143).
ジェスチャーセンサとGR-PEACHの接続
1つ目のSensor
Sensor | GR-PEACH |
VDD | 3.3V |
SCL | D15 |
SDA | D14 |
GND | GND |
2つ目のSensor
Sensor | GR-PEACH |
VDD | 3.3V |
SCL | P1_6 |
SDA | P1_7 |
GND | GND |
使い方
- GR-PEACHとLCDシールドを接続し、GR-PEACHに電源を入れます。
- GR-PEACHのリセットボタンを押します。
- "Program Setting"という画面がLCDに表示されます。
- センサのセットアップが終わると、"Program Start!!"という画面がLCDに表示されます。
- 2つのジェスチャーセンサのLED1~LED3に手をかざすと、6種類の四角形がLCD上に描画されます。
手をかざす場所 | 描画 |
1つ目のセンサのLED1の上 | 赤色の四角形 |
1つ目のセンサのLED2の上 | 緑色の四角形 |
1つ目のセンサのLED3の上 | 青色の四角形 |
2つ目のセンサのLED1の上 | 黄色の四角形 |
2つ目のセンサのLED2の上 | 水色の四角形 |
2つ目のセンサのLED3の上 | ピンク色の四角形 |
main.cpp@1:8eddef24a632, 2016-05-31 (annotated)
- Committer:
- 1050186
- Date:
- Tue May 31 04:55:21 2016 +0000
- Revision:
- 1:8eddef24a632
- Parent:
- 0:7e5105dee0cb
delete R_BSP library.
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 | } |