Image rotation Sample. This program uses GraphicsFramework library and L3GD20 sensor.
Dependencies: GR-PEACH_video GraphicsFramework L3GD20 R_BSP mbed-rtos mbed
Fork of RGA_HelloWorld by
About L3GD20
L3GD20 is a 3-axis gyroscope sensor and can be controlled by using theI2C.
- Datasheet of L3GD20
http://www.st.com/content/ccc/resource/technical/document/datasheet/43/37/e3/06/b0/bf/48/bd/DM00036465.pdf/files/DM00036465.pdf/jcr:content/translations/en.DM00036465.pdf
About wiring
| Sensor | GR-PEACH |
| VDD | 3.3V |
| SCL | D15 |
| SDA | D14 |
| SA0 | 3.3V |
| CS | 3.3V |
| GND | GND |
Diff: main.cpp
- Revision:
- 4:138b18a6ac7b
- Parent:
- 2:c7faef0ef374
--- a/main.cpp Thu Jan 21 10:21:28 2016 +0000
+++ b/main.cpp Mon May 23 10:03:17 2016 +0000
@@ -1,129 +1,45 @@
-/*
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-*/
-
#include "mbed.h"
+#include "math.h"
#include "rga_func.h"
#include "DisplayBace.h"
#include "rtos.h"
-
+#include "L3GD20.h"
-/* LCD Parameter */
-#define LCD_INPUT_CLOCK (66.67f)
-#define LCD_OUTPUT_CLOCK (33.26f)
+/**** LCD Parameter **********/
+#define LCD_DE_MODE (0)
+#define LCD_SYNC_MODE (1)
+
+#define LCD_DOT_CLOCK (13.40f) // 13.4MHz
-#define LCD_PIXEL_WIDTH (800)
-#define LCD_PIXEL_HEIGHT (480)
-#define LCD_H_BACK_PORCH (128 + 36)
-#define LCD_H_FRONT_PORCH (92)
-#define LCD_V_BACK_PORCH (35 + 5)
-#define LCD_V_FRONT_PORCH (5)
+#define LCD_H_WIDTH (480u)
+#define LCD_H_BACK_PORCH (43u)
+#define LCD_H_FRONT_PORCH (52u)
+#define LCD_H_SYNC_WIDTH (41u)
+
+#define LCD_V_WIDTH (272u)
+#define LCD_V_BACK_PORCH (12u)
+#define LCD_V_FRONT_PORCH (2u)
+#define LCD_V_SYNC_WIDTH (10u)
+
+#define LCD_MODE (LCD_SYNC_MODE)
+
+/*****************************/
/* FRAME BUFFER Parameter */
#define FRAME_BUFFER_BYTE_PER_PIXEL (2)
-#define FRAME_BUFFER_STRIDE (((LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
-
-#define DRAW_RECTANGLE_CNT_MAX (4)
-
-typedef enum {
- RGA_FUNC_NON,
- RGA_FUNC_DRAW_RECTANGLE,
- RGA_FUNC_DRAW_IMAGE,
- RGA_FUNC_DISSOLVE,
- RGA_FUNC_SCROLL,
- RGA_FUNC_ZOOM,
- RGA_FUNC_ROTATION,
- RGA_FUNC_ACCELERATE,
- RGA_FUNC_ANIME_EASE,
- RGA_FUNC_ANIME_LINEAR,
- RGA_FUNC_ANIME_EASE_IN,
- RGA_FUNC_ANIME_EASE_OUT,
- RGA_FUNC_ANIME_EASE_IN_OUT,
- RGA_FUNC_RETURN,
- RGA_FUNC_END
-}func_code_t;
+#define FRAME_BUFFER_STRIDE (((LCD_H_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL) + 31u) & ~31u)
DigitalOut lcd_pwon(P7_15);
DigitalOut lcd_blon(P8_1);
PwmOut lcd_cntrst(P8_15);
-I2C i2c(I2C_SDA, I2C_SCL);
DisplayBase Display;
+L3GD20 gyro(I2C_SDA, I2C_SCL);
-typedef struct {
- uint8_t y_h: 3,
- reserved: 1,
- x_h: 3,
- valid: 1;
- uint8_t x_l;
- uint8_t y_l;
- uint8_t z;
-} xyz_data_t;
-
-typedef struct {
- uint8_t fingers: 4,
- reserved: 4;
- uint8_t keys;
- xyz_data_t xyz_data;
-} stx_report_data_t;
-
-typedef struct {
- uint32_t pic_pos_x; /* X position of the key picture. */
- uint32_t pic_pos_y; /* Y position of the key picture. */
- uint32_t pic_width; /* Width of the key picture. */
- uint32_t pic_height; /* Height of the key picture. */
- func_code_t func_code; /* func code of the key picture. */
-} key_pic_info_t;
-
-static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
-static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_PIXEL_HEIGHT]__attribute((aligned(32))); /* 32 bytes aligned */
+static uint8_t user_frame_buffer[FRAME_BUFFER_STRIDE * LCD_V_WIDTH]__attribute((aligned(32))); /* 32 bytes aligned */
+static uint8_t user_frame_buffer2[FRAME_BUFFER_STRIDE * LCD_V_WIDTH]__attribute((aligned(32))); /* 32 bytes aligned */
static frame_buffer_t frame_buffer_info;
static volatile int32_t vsync_count = 0;
-static const key_pic_info_t top_screen_key_tbl[] = {
- /* X Y Width Height Func code */
- { 50, 350, 120, 52, RGA_FUNC_DRAW_RECTANGLE }, /* RGA Func1 */
- { 230, 350, 120, 52, RGA_FUNC_DRAW_IMAGE }, /* RGA Func2 */
- { 410, 350, 120, 52, RGA_FUNC_DISSOLVE }, /* RGA Func3 */
- { 50, 420, 120, 52, RGA_FUNC_SCROLL }, /* RGA Func4 */
- { 230, 420, 120, 52, RGA_FUNC_ZOOM }, /* RGA Func5 */
- { 410, 420, 120, 52, RGA_FUNC_ROTATION }, /* RGA Func6 */
- { 615, 420, 120, 52, RGA_FUNC_ACCELERATE }, /* RGA Func7 */
- { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
-};
-
-static const key_pic_info_t return_key_tbl[] = {
- /* X Y Width Height Func code */
- { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
- { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
-};
-
-static const key_pic_info_t animetion_timing_key_tbl[] = {
- /* X Y Width Height Func code */
- { 640, 10, 150, 84, RGA_FUNC_RETURN }, /* Return Top Screen */
- { 17, 372, 136, 50, RGA_FUNC_ANIME_EASE }, /* ease */
- { 173, 372, 136, 50, RGA_FUNC_ANIME_LINEAR }, /* linear */
- { 330, 372, 136, 50, RGA_FUNC_ANIME_EASE_IN }, /* ease-in */
- { 487, 372, 136, 50, RGA_FUNC_ANIME_EASE_OUT }, /* ease-out */
- { 644, 372, 136, 50, RGA_FUNC_ANIME_EASE_IN_OUT }, /* ease-in-out */
- { 0, 0, 0, 0, RGA_FUNC_END } /* table end */
-};
-
static void IntCallbackFunc_Vsync(DisplayBase::int_type_t int_type) {
/* Interrupt callback function for Vsync interruption */
if (vsync_count > 0) {
@@ -139,35 +55,87 @@
}
}
-static void Init_LCD_Display(uint8_t* disp_buf) {
+static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
+ if (frmbuf_info->draw_buffer_index == 1) {
+ frmbuf_info->draw_buffer_index = 0;
+ } else {
+ frmbuf_info->draw_buffer_index = 1;
+ }
+}
+
+static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
+ Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
+ (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
+ Wait_Vsync(1);
+}
+
+int main(void) {
/* Create DisplayBase object */
DisplayBase::graphics_error_t error;
- DisplayBase::rect_t rect;
+ float gx;
+ float gy;
+ float gz;
+
+ memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
+ memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
+ frame_buffer_info.buffer_address[0] = user_frame_buffer;
+ frame_buffer_info.buffer_address[1] = user_frame_buffer2;
+ frame_buffer_info.buffer_count = 2;
+ frame_buffer_info.show_buffer_index = 0;
+ frame_buffer_info.draw_buffer_index = 0;
+ frame_buffer_info.width = LCD_H_WIDTH;
+ frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
+ frame_buffer_info.stride = LCD_H_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
+ frame_buffer_info.height = LCD_V_WIDTH;
+ frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
+
+ lcd_pwon = 0;
+ lcd_blon = 0;
+ Thread::wait(100);
+
+ lcd_pwon = 1;
+ lcd_blon = 1;
+ Thread::wait(100);
+
DisplayBase::lcd_config_t lcd_config;
PinName lvds_pin[8] = {
/* data pin */
P5_7, P5_6, P5_5, P5_4, P5_3, P5_2, P5_1, P5_0
};
-
- lcd_pwon = 0;
- lcd_blon = 0;
- Thread::wait(100);
- lcd_pwon = 1;
- lcd_blon = 1;
- Thread::wait(100);
+ DisplayBase::rect_t rect;
lcd_config.lcd_type = DisplayBase::LCD_TYPE_LVDS;
- lcd_config.intputClock = LCD_INPUT_CLOCK;
- lcd_config.outputClock = LCD_OUTPUT_CLOCK;
+ lcd_config.intputClock = 66.67f;
+ lcd_config.outputClock = LCD_DOT_CLOCK;
lcd_config.lcd_outformat = DisplayBase::LCD_OUTFORMAT_RGB888;
lcd_config.lcd_edge = DisplayBase::EDGE_RISING;
- lcd_config.h_toatal_period = (LCD_PIXEL_WIDTH + LCD_H_FRONT_PORCH + LCD_H_BACK_PORCH);
- lcd_config.v_toatal_period = (LCD_PIXEL_HEIGHT + LCD_V_FRONT_PORCH + LCD_V_BACK_PORCH);
+#if(LCD_MODE) //SYNC Mode
+ lcd_config.h_toatal_period = (LCD_H_BACK_PORCH + LCD_H_WIDTH + LCD_H_FRONT_PORCH);
+ lcd_config.v_toatal_period = (LCD_V_BACK_PORCH + LCD_V_WIDTH + LCD_V_FRONT_PORCH);
+
+ lcd_config.h_disp_widht = (LCD_H_WIDTH);
+ lcd_config.v_disp_widht = (LCD_V_WIDTH);
+ lcd_config.h_back_porch = (LCD_H_BACK_PORCH);
+ lcd_config.v_back_porch = (LCD_V_BACK_PORCH);
+
+ lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_2;
+ lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
+ lcd_config.h_sync_width = LCD_H_SYNC_WIDTH;
+
+ lcd_config.v_sync_port = DisplayBase::LCD_TCON_PIN_0;
+ lcd_config.v_sync_port_polarity = DisplayBase::SIG_POL_INVERTED;
+ lcd_config.v_sync_width = LCD_V_SYNC_WIDTH;
+
+ lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
+ lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
+#else //DE Mode
+ lcd_config.h_toatal_period = (LCD_H_WIDTH + 80u);
+ lcd_config.v_toatal_period = (LCD_V_WIDTH);
- lcd_config.h_disp_widht = LCD_PIXEL_WIDTH;
- lcd_config.v_disp_widht = LCD_PIXEL_HEIGHT;
- lcd_config.h_back_porch = LCD_H_BACK_PORCH;
- lcd_config.v_back_porch = LCD_V_BACK_PORCH;
+ lcd_config.h_disp_widht = (LCD_H_WIDTH);
+ lcd_config.v_disp_widht = (LCD_V_WIDTH);
+ lcd_config.h_back_porch = (68u);
+ lcd_config.v_back_porch = (18u);
lcd_config.h_sync_port = DisplayBase::LCD_TCON_PIN_NON;
lcd_config.h_sync_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
@@ -178,7 +146,8 @@
lcd_config.v_sync_width = 0;
lcd_config.de_port = DisplayBase::LCD_TCON_PIN_3;
- lcd_config.de_port_polarity = DisplayBase::SIG_POL_NOT_INVERTED;
+ lcd_config.de_port_polarity = DisplayBase::SIG_POL_INVERTED;
+#endif
/* Graphics initialization process */
error = Display.Graphics_init(&lcd_config);
@@ -196,344 +165,39 @@
Display.Graphics_Lvds_Port_Init(lvds_pin, 8);
rect.vs = 0;
- rect.vw = LCD_PIXEL_HEIGHT;
+ rect.vw = LCD_V_WIDTH;
rect.hs = 0;
- rect.hw = LCD_PIXEL_WIDTH;
+ rect.hw = LCD_H_WIDTH;
Display.Graphics_Read_Setting(
DisplayBase::GRAPHICS_LAYER_0,
- (void *)disp_buf,
+ (void *)frame_buffer_info.buffer_address[0],
FRAME_BUFFER_STRIDE,
DisplayBase::GRAPHICS_FORMAT_RGB565,
DisplayBase::WR_RD_WRSWA_32_16BIT,
&rect
);
-}
-
-static void Start_LCD_Display(void) {
- Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
-
- lcd_cntrst.write(1.0);
-}
-
-static void Update_LCD_Display(frame_buffer_t * frmbuf_info) {
- Display.Graphics_Read_Change(DisplayBase::GRAPHICS_LAYER_0,
- (void *)frmbuf_info->buffer_address[frmbuf_info->draw_buffer_index]);
- Wait_Vsync(1);
-}
-
-static int Get_Coordinates(uint8_t *count, uint32_t *x0, uint32_t *y0) {
- char buf[6];
- stx_report_data_t *pdata;
- int ret = -1;
- *count = 0; // Set point detected count to 0
-
- if (i2c.read((0x55 << 1), buf, sizeof(buf)) == 0) {
- pdata = (stx_report_data_t *)buf;
- if (pdata->fingers) {
- if (pdata->xyz_data.valid) {
- *x0 = (pdata->xyz_data.x_h << 8) | pdata->xyz_data.x_l;
- *y0 = (pdata->xyz_data.y_h << 8) | pdata->xyz_data.y_l;
- (*count)++;
- }
- }
- ret = 0;
- }
-
- return ret;
-}
-
-static func_code_t Scan_Key(const key_pic_info_t * key_tbl, const uint32_t pos_x, const uint32_t pos_y) {
- func_code_t ret = RGA_FUNC_NON;
-
- while (ret == RGA_FUNC_NON) {
- if (key_tbl->func_code == RGA_FUNC_END) {
- break;
- }
- /* Check the range of the X position */
- if ((pos_x >= key_tbl->pic_pos_x) && (pos_x <= (key_tbl->pic_pos_x + key_tbl->pic_width))) {
- /* Check the range of the Y position */
- if ((pos_y >= key_tbl->pic_pos_y) && (pos_y <= (key_tbl->pic_pos_y + key_tbl->pic_height))) {
- /* Decide the func code. */
- ret = key_tbl->func_code;
- }
- }
- key_tbl++;
- }
-
- return ret;
-}
-
-static void Swap_FrameBuffer(frame_buffer_t * frmbuf_info) {
- if (frmbuf_info->draw_buffer_index == 1) {
- frmbuf_info->draw_buffer_index = 0;
- } else {
- frmbuf_info->draw_buffer_index = 1;
- }
-}
-
-static void Exe_RGA_Func(int func_name, frame_buffer_t* frmbuf_info) {
- uint8_t touch_num = 0;
- uint32_t pos_x0 = 0;
- uint32_t pos_y0 = 0;
- func_code_t func_code;
-
- switch (func_name) {
- case RGA_FUNC_DRAW_RECTANGLE:
- bool key_on = false;
- int cnt;
- int color_cnt = 0;
- int x_0 = 0;
- int y_0 = 0;
- draw_rectangle_pos_t pos_tbl[DRAW_RECTANGLE_CNT_MAX] = {0};
-
- pos_tbl[0].style = "#FF0000"; /* red */
- pos_tbl[1].style = "#00FF00"; /* green */
- pos_tbl[2].style = "#0000FF"; /* blue */
- pos_tbl[3].style = "#000000"; /* black */
-
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- if (Scan_Key(return_key_tbl, pos_x0, pos_y0) == RGA_FUNC_RETURN) {
- break;
- }
- if (key_on == false) {
- key_on = true;
- if (color_cnt == 0) {
- for (cnt = 0; cnt < DRAW_RECTANGLE_CNT_MAX; cnt++) {
- pos_tbl[cnt].x = 0;
- pos_tbl[cnt].y = 0;
- pos_tbl[cnt].w = 0;
- pos_tbl[cnt].h = 0;
- }
- }
- x_0 = pos_x0;
- y_0 = pos_y0;
- }
- if (x_0 < pos_x0) {
- pos_tbl[color_cnt].x = x_0;
- pos_tbl[color_cnt].w = pos_x0 - x_0;
- } else {
- pos_tbl[color_cnt].x = pos_x0;
- pos_tbl[color_cnt].w = x_0 - pos_x0;
- }
- if (y_0 < pos_y0) {
- pos_tbl[color_cnt].y = y_0;
- pos_tbl[color_cnt].h = pos_y0 - y_0;
- } else {
- pos_tbl[color_cnt].y = pos_y0;
- pos_tbl[color_cnt].h = y_0 - pos_y0;
- }
- } else {
- if (key_on != false) {
- color_cnt++;
- if (color_cnt == DRAW_RECTANGLE_CNT_MAX) {
- color_cnt = 0;
- }
- }
- key_on = false;
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_DrawRectangle(frmbuf_info, pos_tbl, DRAW_RECTANGLE_CNT_MAX);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- case RGA_FUNC_DRAW_IMAGE:
- int center_pos_x = 320;
- int center_pos_y = 110;
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- if (Scan_Key(return_key_tbl, pos_x0, pos_y0) == RGA_FUNC_RETURN) {
- break;
- }
- center_pos_x = pos_x0;
- center_pos_y = pos_y0;
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_DrawImage(frmbuf_info, center_pos_x, center_pos_y);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- case RGA_FUNC_DISSOLVE:
- float32_t work_alpha = 0.0f;
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- if (Scan_Key(return_key_tbl, pos_x0, pos_y0) == RGA_FUNC_RETURN) {
- break;
- }
- work_alpha = (float32_t)pos_x0 / (float32_t)(LCD_PIXEL_WIDTH);
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_Dissolve(frmbuf_info, work_alpha);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- case RGA_FUNC_SCROLL:
- int work_width_pos = 0;
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- if (Scan_Key(return_key_tbl, pos_x0, pos_y0) == RGA_FUNC_RETURN) {
- break;
- }
- work_width_pos = SCROLL_MAX_NUM * ((float32_t)pos_x0 / (float32_t)(LCD_PIXEL_WIDTH));
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_Scroll(frmbuf_info, work_width_pos);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- case RGA_FUNC_ZOOM:
- int work_height_pos = ZOOM_MAX_NUM;
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- if (Scan_Key(return_key_tbl, pos_x0, pos_y0) == RGA_FUNC_RETURN) {
- break;
- }
- work_height_pos = ZOOM_MAX_NUM * ((float32_t)pos_x0 / (float32_t)(LCD_PIXEL_WIDTH));
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_Zoom(frmbuf_info, work_height_pos);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- case RGA_FUNC_ROTATION:
- graphics_matrix_float_t work_angle = 0;
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- if (Scan_Key(return_key_tbl, pos_x0, pos_y0) == RGA_FUNC_RETURN) {
- break;
- }
- work_angle = ROTATION_MAX_NUM * ((float32_t)pos_x0 / (float32_t)(LCD_PIXEL_WIDTH));
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_Rotation(frmbuf_info, work_angle);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- case RGA_FUNC_ACCELERATE:
- int acce_frame_num = 0;
- int animation_timing = 0;
- float32_t work_relative_pos;
- while (1) {
- /* Get coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- func_code_t func_code;
-
- func_code = Scan_Key(animetion_timing_key_tbl, pos_x0, pos_y0);
- if (func_code == RGA_FUNC_RETURN) {
- break;
- }
- switch (func_code) {
- case RGA_FUNC_ANIME_EASE:
- animation_timing = 0;
- acce_frame_num = 0;
- break;
- case RGA_FUNC_ANIME_LINEAR:
- animation_timing = 1;
- acce_frame_num = 0;
- break;
- case RGA_FUNC_ANIME_EASE_IN:
- animation_timing = 2;
- acce_frame_num = 0;
- break;
- case RGA_FUNC_ANIME_EASE_OUT:
- animation_timing = 3;
- acce_frame_num = 0;
- break;
- case RGA_FUNC_ANIME_EASE_IN_OUT:
- animation_timing = 4;
- acce_frame_num = 0;
- break;
- default:
- /* Do Nothing */
- break;
- }
- }
- work_relative_pos = acce_frame_num / (float32_t)ACCELERATE_MAX_NUM;
- acce_frame_num++;
- if (acce_frame_num > ACCELERATE_MAX_NUM) {
- acce_frame_num = 0;
- }
- /* Draw screen */
- Swap_FrameBuffer(frmbuf_info);
- RGA_Func_Accelerate(frmbuf_info, animation_timing, work_relative_pos);
- Update_LCD_Display(frmbuf_info);
- }
- break;
- default :
- /* Do nothing */
- break;
- }
-}
-
-int main(void) {
- func_code_t func_code;
- uint8_t touch_num = 0;
- uint32_t pos_x0 = 0;
- uint32_t pos_y0 = 0;
-
- memset(user_frame_buffer, 0, sizeof(user_frame_buffer));
- memset(user_frame_buffer2, 0, sizeof(user_frame_buffer2));
- frame_buffer_info.buffer_address[0] = user_frame_buffer;
- frame_buffer_info.buffer_address[1] = user_frame_buffer2;
- frame_buffer_info.buffer_count = 2;
- frame_buffer_info.show_buffer_index = 0;
- frame_buffer_info.draw_buffer_index = 0;
- frame_buffer_info.width = LCD_PIXEL_WIDTH;
- frame_buffer_info.byte_per_pixel = FRAME_BUFFER_BYTE_PER_PIXEL;
- frame_buffer_info.stride = LCD_PIXEL_WIDTH * FRAME_BUFFER_BYTE_PER_PIXEL;
- frame_buffer_info.height = LCD_PIXEL_HEIGHT;
- frame_buffer_info.pixel_format = PIXEL_FORMAT_RGB565;
- Init_LCD_Display(frame_buffer_info.buffer_address[0]);
/* Display Top Screen */
Set_RGAObject(&frame_buffer_info);
- RGA_Func_DrawTopScreen(&frame_buffer_info);
- Start_LCD_Display();
+ Display.Graphics_Start(DisplayBase::GRAPHICS_LAYER_0);
+ lcd_cntrst.write(1.0);
+ graphics_matrix_float_t work_angle = 0;
while (1) {
- /* Get Coordinates */
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num != 0) {
- func_code = Scan_Key(top_screen_key_tbl, pos_x0, pos_y0);
- if (func_code != RGA_FUNC_NON) {
- /* Wait key off */
- while (1) {
- Get_Coordinates(&touch_num, &pos_x0, &pos_y0);
- if (touch_num == 0) {
- break;
- }
- Thread::wait(50);
- }
-
- /* Execute RGA functions */
- Exe_RGA_Func(func_code, &frame_buffer_info);
-
- /* Return Top Screen */
- Swap_FrameBuffer(&frame_buffer_info);
- RGA_Func_DrawTopScreen(&frame_buffer_info);
- Update_LCD_Display(&frame_buffer_info);
- }
+ gyro.read(&gx, &gy, &gz);
+ gz = gz * 0.146; //gz = [dps]. One loop is about 146ms(process[10ms] + printf[36ms] + wait[100ms])
+ if ((gz >= 1) || (gz <= -1)) {
+ /* When the sensor tilts to the right, the value becomes a negative, and the image is roteted to the right. */
+ /* When the sensor tilts to the left, the value becomes a active, and the image is roteted to the left. */
+ work_angle -= gz;
+ work_angle = (graphics_matrix_float_t)fmod(work_angle, ROTATION_MAX_NUM);
+ printf("acce : %f angle : %5.2f\n", gz, work_angle);
}
+ /* Draw screen */
+ Swap_FrameBuffer(&frame_buffer_info);
+ RGA_Func_Rotation(&frame_buffer_info, work_angle);
+ Update_LCD_Display(&frame_buffer_info);
Thread::wait(100);
}
}
