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.

Composition

GR-PEACH, LCD Shield and two gesture sensors(Si1143).

About wiring

First Sensor

SensorGR-PEACH
VDD3.3V
SCLD15
SDAD14
GNDGND

Second Sensor

SensorGR-PEACH
VDD3.3V
SCLP1_6
SDAP1_7
GNDGND


How to use

  1. Please connect GR-PEACH ,LCD Shield and two jesture sensors. Then turn on the power to GR-PEACH.
  2. Please press the reset button of GR-PEACH.
  3. The screen which "Program Setting" is drawn is displayed on the LCD.
  4. When the sensor of the setting is completed, the screen which "Program Started!!" is drawn is displayed on the LCD.
  5. 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 onDraw
the upper of LED1 of the first sensor
/media/uploads/1050186/jesturesensor_handsonled1.png
red rectangle
/media/uploads/1050186/red_rectangle.png
the upper of LED2 of the first sensor
/media/uploads/1050186/jesturesensor_handsonled2.png
green rectangle
/media/uploads/1050186/green_rectangle.png
the upper of LED3 of the first sensor
/media/uploads/1050186/jesturesensor_handsonled3.png
blue rectangle
/media/uploads/1050186/blue_rectangle.png
the upper of LED1 of the second sensor
/media/uploads/1050186/jesturesensor_handsonled1.png
yellow rectangle
/media/uploads/1050186/yellow_rectangle.png
the upper of LED2 of the second sensor
/media/uploads/1050186/jesturesensor_handsonled2.png
light blue rectangle
/media/uploads/1050186/lightblue_rectangle.png
the upper of LED3 of the second sensor
/media/uploads/1050186/jesturesensor_handsonled3.png
pink rectangle
/media/uploads/1050186/pink_rectangle.png




概要

これは2つのジェスチャーセンサーを使ったサンプルプログラムです。
このプログラムは、センサーに応じて四角形の画像をLCDシールドの画面上に表示します。

Si1143について

Si1143はジェスチャーセンサであり、I2C通信を使ってセンサを制御します。
センサとの距離範囲は1cm200cmです。
Si1143は、基板上に搭載された3つの赤外線LEDを放射し、物体からの反射光を測定することによって、動きを検出します。

構成

GR-PEACH, LCD Shield and two gesture sensors(Si1143).

ジェスチャーセンサとGR-PEACHの接続

1つ目のSensor

SensorGR-PEACH
VDD3.3V
SCLD15
SDAD14
GNDGND

2つ目のSensor

SensorGR-PEACH
VDD3.3V
SCLP1_6
SDAP1_7
GNDGND


使い方

  1. GR-PEACHとLCDシールドを接続し、GR-PEACHに電源を入れます。
  2. GR-PEACHのリセットボタンを押します。
  3. "Program Setting"という画面がLCDに表示されます。
  4. センサのセットアップが終わると、"Program Start!!"という画面がLCDに表示されます。
  5. 2つのジェスチャーセンサのLED1~LED3に手をかざすと、6種類の四角形がLCD上に描画されます。
手をかざす場所描画
1つ目のセンサのLED1の上
/media/uploads/1050186/jesturesensor_handsonled1.png
赤色の四角形
/media/uploads/1050186/red_rectangle.png
1つ目のセンサのLED2の上
/media/uploads/1050186/jesturesensor_handsonled2.png
緑色の四角形
/media/uploads/1050186/green_rectangle.png
1つ目のセンサのLED3の上
/media/uploads/1050186/jesturesensor_handsonled3.png
青色の四角形
/media/uploads/1050186/blue_rectangle.png
2つ目のセンサのLED1の上
/media/uploads/1050186/jesturesensor_handsonled1.png
黄色の四角形
/media/uploads/1050186/yellow_rectangle.png
2つ目のセンサのLED2の上
/media/uploads/1050186/jesturesensor_handsonled2.png
水色の四角形
/media/uploads/1050186/lightblue_rectangle.png
2つ目のセンサのLED3の上
/media/uploads/1050186/jesturesensor_handsonled3.png
ピンク色の四角形
/media/uploads/1050186/pink_rectangle.png



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?

UserRevisionLine numberNew 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 }