Image Zoom In/out Sample. This program uses GraphicsFramework library and GP2Y0A21YK sensor. Please use distance sensor in the range of 10-30cm.

Dependencies:   GR-PEACH_video GraphicsFramework R_BSP mbed-rtos mbed

Fork of RGA_HelloWorld by Renesas

About GP2Y0A21YK

GP2Y0A21YK is a distance sensor and can be controlled by using the AnalogIn.
The range of this sensor is 10-80cm.

About wiring

SensorGR-PEACH
White wireA0
Orange wireGND
Black wire5.0V
Committer:
1050186
Date:
Fri May 13 07:10:27 2016 +0000
Revision:
5:ac895a9527ab
Parent:
4:ffbd2a93b02f
Child:
6:6cad61e4a4c1
Change main.cpp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
1050186 0:84e4649e7707 1 #include "mbed.h"
1050186 0:84e4649e7707 2 #include "rga_func.h"
1050186 0:84e4649e7707 3 #include "DisplayBace.h"
1050186 0:84e4649e7707 4 #include "rtos.h"
1050186 0:84e4649e7707 5
1050186 4:ffbd2a93b02f 6 /**** LCD Parameter **********/
1050186 4:ffbd2a93b02f 7 #define LCD_DE_MODE (0)
1050186 4:ffbd2a93b02f 8 #define LCD_SYNC_MODE (1)
1050186 0:84e4649e7707 9
1050186 4:ffbd2a93b02f 10 #define LCD_DOT_CLOCK (13.40f) // 13.4MHz
1050186 0:84e4649e7707 11
1050186 4:ffbd2a93b02f 12 #define LCD_H_WIDTH (480u)
1050186 4:ffbd2a93b02f 13 #define LCD_H_BACK_PORCH (43u)
1050186 4:ffbd2a93b02f 14 #define LCD_H_FRONT_PORCH (52u)
1050186 4:ffbd2a93b02f 15 #define LCD_H_SYNC_WIDTH (41u)
1050186 4:ffbd2a93b02f 16
1050186 4:ffbd2a93b02f 17 #define LCD_V_WIDTH (272u)
1050186 4:ffbd2a93b02f 18 #define LCD_V_BACK_PORCH (12u)
1050186 4:ffbd2a93b02f 19 #define LCD_V_FRONT_PORCH (2u)
1050186 4:ffbd2a93b02f 20 #define LCD_V_SYNC_WIDTH (10u)
1050186 4:ffbd2a93b02f 21
1050186 4:ffbd2a93b02f 22 #define LCD_MODE (LCD_SYNC_MODE)
1050186 4:ffbd2a93b02f 23
1050186 4:ffbd2a93b02f 24 /*****************************/
1050186 0:84e4649e7707 25
1050186 0:84e4649e7707 26 /* FRAME BUFFER Parameter */
dkato 2:c7faef0ef374 27 #define FRAME_BUFFER_BYTE_PER_PIXEL (2)
1050186 4:ffbd2a93b02f 28 #define FRAME_BUFFER_STRIDE (((LCD_H_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
1050186 0:84e4649e7707 29
1050186 0:84e4649e7707 30 DigitalOut lcd_pwon(P7_15);
1050186 0:84e4649e7707 31 DigitalOut lcd_blon(P8_1);
1050186 4:ffbd2a93b02f 32 DigitalOut touch_reset(P4_0);
1050186 0:84e4649e7707 33 PwmOut lcd_cntrst(P8_15);
1050186 0:84e4649e7707 34 DisplayBase Display;
1050186 4:ffbd2a93b02f 35 AnalogIn ain(A0);
1050186 0:84e4649e7707 36
1050186 4:ffbd2a93b02f 37 static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_V_WIDTH]__attribute((aligned(32))); /* 32 bytes aligned */
1050186 4:ffbd2a93b02f 38 static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_V_WIDTH]__attribute((aligned(32))); /* 32 bytes aligned */
1050186 0:84e4649e7707 39 static frame_buffer_t frame_buffer_info;
1050186 0:84e4649e7707 40 static volatile int32_t vsync_count = 0;
1050186 0:84e4649e7707 41
1050186 0:84e4649e7707 42 static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) {
1050186 0:84e4649e7707 43 /* Interrupt callback function for Vsync interruption */
1050186 0:84e4649e7707 44 if (vsync_count > 0) {
1050186 0:84e4649e7707 45 vsync_count--;
1050186 0:84e4649e7707 46 }
1050186 0:84e4649e7707 47 }
1050186 0:84e4649e7707 48
1050186 0:84e4649e7707 49 static void Wait_Vsync(const int32_t wait_count) {
1050186 0:84e4649e7707 50 /* Wait for the specified number of times Vsync occurs */
1050186 0:84e4649e7707 51 vsync_count = wait_count;
1050186 0:84e4649e7707 52 while (vsync_count > 0) {
1050186 0:84e4649e7707 53 /* Do nothing */
1050186 0:84e4649e7707 54 }
1050186 0:84e4649e7707 55 }
1050186 0:84e4649e7707 56
1050186 4:ffbd2a93b02f 57 static float get_distance(void) {
1050186 4:ffbd2a93b02f 58 float tmp[10];
1050186 4:ffbd2a93b02f 59 float data = 0;
1050186 4:ffbd2a93b02f 60 float distance = 0;
1050186 4:ffbd2a93b02f 61 int cnt;
1050186 4:ffbd2a93b02f 62
1050186 4:ffbd2a93b02f 63 for (cnt = 0; cnt < 10; cnt++) {
1050186 4:ffbd2a93b02f 64 tmp[cnt] = ain;
1050186 4:ffbd2a93b02f 65 if (tmp[cnt] == 0) {
1050186 4:ffbd2a93b02f 66 return 0;
1050186 4:ffbd2a93b02f 67 }
1050186 4:ffbd2a93b02f 68 }
1050186 4:ffbd2a93b02f 69 data = (tmp[0]+tmp[1]+tmp[2]+tmp[3]+tmp[4]+tmp[5]+tmp[6]+tmp[7]+tmp[8]+tmp[9]) / 10;
1050186 4:ffbd2a93b02f 70 if ((data >= 0.121) && (data <= 0.970)) {
1050186 4:ffbd2a93b02f 71 distance = 26.663 * pow((data * 3.3), -1.25);
1050186 4:ffbd2a93b02f 72 }
1050186 4:ffbd2a93b02f 73
1050186 4:ffbd2a93b02f 74 return distance;
1050186 4:ffbd2a93b02f 75 }
1050186 4:ffbd2a93b02f 76
1050186 4:ffbd2a93b02f 77 static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
1050186 4:ffbd2a93b02f 78 if (frmbuf_info->draw_buffer_index == 1) {
1050186 4:ffbd2a93b02f 79 frmbuf_info->draw_buffer_index = 0;
1050186 4:ffbd2a93b02f 80 } else {
1050186 4:ffbd2a93b02f 81 frmbuf_info->draw_buffer_index = 1;
1050186 4:ffbd2a93b02f 82 }
1050186 4:ffbd2a93b02f 83 }
1050186 4:ffbd2a93b02f 84
1050186 4:ffbd2a93b02f 85 static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
1050186 4:ffbd2a93b02f 86 Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
1050186 4:ffbd2a93b02f 87 (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
1050186 4:ffbd2a93b02f 88 Wait_Vsync(1);
1050186 4:ffbd2a93b02f 89 }
1050186 4:ffbd2a93b02f 90
1050186 4:ffbd2a93b02f 91 int main(void) {
1050186 0:84e4649e7707 92 /* Create DisplayBase object */
1050186 0:84e4649e7707 93 DisplayBase::graphics_error_t error;
1050186 4:ffbd2a93b02f 94 float distance;
1050186 4:ffbd2a93b02f 95
1050186 4:ffbd2a93b02f 96 memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
1050186 4:ffbd2a93b02f 97 memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
1050186 4:ffbd2a93b02f 98 frame_buffer_info.buffer_address[0] = user_frame_buffer;
1050186 4:ffbd2a93b02f 99 frame_buffer_info.buffer_address[1] = user_frame_buffer2;
1050186 4:ffbd2a93b02f 100 frame_buffer_info.buffer_count = 2;
1050186 4:ffbd2a93b02f 101 frame_buffer_info.show_buffer_index = 0;
1050186 4:ffbd2a93b02f 102 frame_buffer_info.draw_buffer_index = 0;
1050186 4:ffbd2a93b02f 103 frame_buffer_info.width = LCD_H_WIDTH;
1050186 4:ffbd2a93b02f 104 frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
1050186 4:ffbd2a93b02f 105 frame_buffer_info.stride = LCD_H_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
1050186 4:ffbd2a93b02f 106 frame_buffer_info.height = LCD_V_WIDTH;
1050186 4:ffbd2a93b02f 107 frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
1050186 4:ffbd2a93b02f 108
1050186 4:ffbd2a93b02f 109 lcd_pwon = 0;
1050186 4:ffbd2a93b02f 110 lcd_blon = 0;
1050186 4:ffbd2a93b02f 111 touch_reset = 0;
1050186 4:ffbd2a93b02f 112 Thread::wait(100);
1050186 4:ffbd2a93b02f 113
1050186 4:ffbd2a93b02f 114 lcd_pwon = 1;
1050186 4:ffbd2a93b02f 115 lcd_blon = 1;
1050186 4:ffbd2a93b02f 116 touch_reset = 1;
1050186 4:ffbd2a93b02f 117 Thread::wait(100);
1050186 4:ffbd2a93b02f 118
1050186 0:84e4649e7707 119 DisplayBase::lcd_config_t lcd_config;
1050186 0:84e4649e7707 120 PinName lvds_pin[8] = {
1050186 0:84e4649e7707 121 /* data pin */
1050186 0:84e4649e7707 122 P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
1050186 0:84e4649e7707 123 };
1050186 4:ffbd2a93b02f 124 DisplayBase::rect_t rect;
1050186 0:84e4649e7707 125
1050186 0:84e4649e7707 126 lcd_config.lcd_type = DisplayBase::LCD_TYPE_LVDS;
1050186 4:ffbd2a93b02f 127 lcd_config.intputClock = 66.67f;
1050186 4:ffbd2a93b02f 128 lcd_config.outputClock = LCD_DOT_CLOCK;
1050186 0:84e4649e7707 129 lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888;
1050186 0:84e4649e7707 130 lcd_config.lcd_edge = DisplayBase::EDGE_RISING;
1050186 4:ffbd2a93b02f 131 #if(LCD_MODE) //SYNC Mode
1050186 4:ffbd2a93b02f 132 lcd_config.h_toatal_period = (LCD_H_BACK_PORCH + LCD_H_WIDTH + LCD_H_FRONT_PORCH);
1050186 4:ffbd2a93b02f 133 lcd_config.v_toatal_period = (LCD_V_BACK_PORCH + LCD_V_WIDTH + LCD_V_FRONT_PORCH);
1050186 4:ffbd2a93b02f 134
1050186 4:ffbd2a93b02f 135 lcd_config.h_disp_widht = (LCD_H_WIDTH);
1050186 4:ffbd2a93b02f 136 lcd_config.v_disp_widht = (LCD_V_WIDTH);
1050186 4:ffbd2a93b02f 137 lcd_config.h_back_porch = (LCD_H_BACK_PORCH);
1050186 4:ffbd2a93b02f 138 lcd_config.v_back_porch = (LCD_V_BACK_PORCH);
1050186 4:ffbd2a93b02f 139
1050186 4:ffbd2a93b02f 140 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_2;
1050186 4:ffbd2a93b02f 141 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
1050186 4:ffbd2a93b02f 142 lcd_config.h_sync_width = LCD_H_SYNC_WIDTH;
1050186 4:ffbd2a93b02f 143
1050186 4:ffbd2a93b02f 144 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_0;
1050186 4:ffbd2a93b02f 145 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
1050186 4:ffbd2a93b02f 146 lcd_config.v_sync_width = LCD_V_SYNC_WIDTH;
1050186 4:ffbd2a93b02f 147
1050186 4:ffbd2a93b02f 148 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
1050186 4:ffbd2a93b02f 149 lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
1050186 4:ffbd2a93b02f 150 #else //DE Mode
1050186 4:ffbd2a93b02f 151 lcd_config.h_toatal_period = (LCD_H_WIDTH + 80u);
1050186 4:ffbd2a93b02f 152 lcd_config.v_toatal_period = (LCD_V_WIDTH);
1050186 0:84e4649e7707 153
1050186 4:ffbd2a93b02f 154 lcd_config.h_disp_widht = (LCD_H_WIDTH);
1050186 4:ffbd2a93b02f 155 lcd_config.v_disp_widht = (LCD_V_WIDTH);
1050186 4:ffbd2a93b02f 156 lcd_config.h_back_porch = (68u);
1050186 4:ffbd2a93b02f 157 lcd_config.v_back_porch = (18u);
1050186 0:84e4649e7707 158
1050186 0:84e4649e7707 159 lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_NON;
1050186 0:84e4649e7707 160 lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
1050186 0:84e4649e7707 161 lcd_config.h_sync_width = 0;
1050186 0:84e4649e7707 162
1050186 0:84e4649e7707 163 lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_NON;
1050186 0:84e4649e7707 164 lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
1050186 0:84e4649e7707 165 lcd_config.v_sync_width = 0;
1050186 0:84e4649e7707 166
1050186 0:84e4649e7707 167 lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
1050186 4:ffbd2a93b02f 168 lcd_config.de_port_polarity = DisplayBase::SIG_POL_INVERTED;
1050186 4:ffbd2a93b02f 169 #endif
1050186 0:84e4649e7707 170
1050186 0:84e4649e7707 171 /* Graphics initialization process */
1050186 0:84e4649e7707 172 error = Display.Graphics_init(&lcd_config);
1050186 0:84e4649e7707 173 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:84e4649e7707 174 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:84e4649e7707 175 while (1);
1050186 0:84e4649e7707 176 }
1050186 0:84e4649e7707 177
1050186 0:84e4649e7707 178 /* Interrupt callback function setting (Vsync signal output from scaler 0) */
1050186 0:84e4649e7707 179 error = Display.Graphics_Irq_Handler_Set(DisplayBase::INT_TYPE_S0_LO_VSYNC, 0, IntCallbackFunc_Vsync);
1050186 0:84e4649e7707 180 if (error != DisplayBase::GRAPHICS_OK) {
1050186 0:84e4649e7707 181 printf("Line %d, error %d\n", __LINE__, error);
1050186 0:84e4649e7707 182 while (1);
1050186 0:84e4649e7707 183 }
1050186 0:84e4649e7707 184
1050186 0:84e4649e7707 185 Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
1050186 0:84e4649e7707 186 rect.vs = 0;
1050186 4:ffbd2a93b02f 187 rect.vw = LCD_V_WIDTH;
1050186 0:84e4649e7707 188 rect.hs = 0;
1050186 4:ffbd2a93b02f 189 rect.hw = LCD_H_WIDTH;
1050186 0:84e4649e7707 190
1050186 0:84e4649e7707 191 Display.Graphics_Read_Setting(
1050186 0:84e4649e7707 192 DisplayBase::GRAPHICS_LAYER_0,
1050186 4:ffbd2a93b02f 193 (void *)frame_buffer_info.buffer_address[0],
1050186 0:84e4649e7707 194 FRAME_BUFFER_STRIDE,
1050186 0:84e4649e7707 195 DisplayBase::GRAPHICS_FORMAT_RGB565,
1050186 0:84e4649e7707 196 DisplayBase::WR_RD_WRSWA_32_16BIT,
1050186 0:84e4649e7707 197 &rect
1050186 0:84e4649e7707 198 );
1050186 0:84e4649e7707 199
1050186 0:84e4649e7707 200 /* Display Top Screen */
dkato 2:c7faef0ef374 201 Set_RGAObject(&frame_buffer_info);
1050186 4:ffbd2a93b02f 202 Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
1050186 4:ffbd2a93b02f 203 lcd_cntrst.write(1.0);
1050186 0:84e4649e7707 204
1050186 5:ac895a9527ab 205 int work_height_pos = ZOOM_MAX_NUM;
1050186 0:84e4649e7707 206 while (1) {
1050186 4:ffbd2a93b02f 207 distance = get_distance();
1050186 4:ffbd2a93b02f 208 /* range of use = 10-30[cm] */
1050186 4:ffbd2a93b02f 209 if ((distance >= 10) && (distance <= 30)) {
1050186 4:ffbd2a93b02f 210 work_height_pos = ZOOM_MAX_NUM * (((float32_t)distance - 10) / (float32_t)20);
1050186 0:84e4649e7707 211 }
1050186 4:ffbd2a93b02f 212 /* Draw screen */
1050186 4:ffbd2a93b02f 213 Swap_FrameBuffer(&frame_buffer_info);
1050186 4:ffbd2a93b02f 214 RGA_Func_Zoom(&frame_buffer_info, work_height_pos);
1050186 4:ffbd2a93b02f 215 Update_LCD_Display(&frame_buffer_info);
1050186 0:84e4649e7707 216 }
1050186 0:84e4649e7707 217 }