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
About GP2Y0A21YK
GP2Y0A21YK is a distance sensor and can be controlled by using the AnalogIn.
The range of this sensor is 10-80cm.
- Datasheet of GP2Y0A21YK
https://www.sparkfun.com/datasheets/Components/GP2Y0A21YK.pdf
About wiring
Sensor | GR-PEACH |
White wire | A0 |
Orange wire | GND |
Black wire | 5.0V |
main.cpp@5:ac895a9527ab, 2016-05-13 (annotated)
- 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?
User | Revision | Line number | New 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 | } |