X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fstm-vga%2Fao_demo.c;h=3b582cc2ec41dfc46357e24f38942d4b16efe503;hb=fd05d495b463685d81e75115a93fdda2764c7113;hp=582e4156b1a5601dc9075931e61a8e1912db5a36;hpb=e6518cf1ddfc087ca25fa1494f993ce03e43e138;p=fw%2Faltos diff --git a/src/stm-vga/ao_demo.c b/src/stm-vga/ao_demo.c index 582e4156..3b582cc2 100644 --- a/src/stm-vga/ao_demo.c +++ b/src/stm-vga/ao_demo.c @@ -24,6 +24,67 @@ #include #include +struct ao_task ball_task; + +#define BALL_WIDTH 5 +#define BALL_HEIGHT 5 + +static int ball_x; +static int ball_y; +static int ball_dx, ball_dy; + +uint8_t ball_enable; + +void +ao_ball(void) +{ + ball_dx = 1; + ball_dy = 1; + ball_x = 0; + ball_y = 0; + for (;;) { + while (!ball_enable) + ao_sleep(&ball_enable); + for (;;) { + ao_solid(AO_ALLONES, + AO_ALLONES, + ao_vga_fb + ball_y * AO_VGA_STRIDE, + AO_VGA_STRIDE, + ball_x, + BALL_WIDTH, + BALL_HEIGHT); + ao_delay(AO_MS_TO_TICKS(10)); + ao_solid(AO_ALLONES, + AO_ALLONES, + ao_vga_fb + ball_y * AO_VGA_STRIDE, + AO_VGA_STRIDE, + ball_x, + BALL_WIDTH, + BALL_HEIGHT); + if (!ball_enable) + break; + ball_x += ball_dx; + ball_y += ball_dy; + if (ball_x + BALL_WIDTH > AO_VGA_WIDTH) { + ball_x = AO_VGA_WIDTH - BALL_WIDTH; + ball_dx = -ball_dx; + } + if (ball_x < 0) { + ball_x = -ball_x; + ball_dx = -ball_dx; + } + if (ball_y + BALL_HEIGHT > AO_VGA_HEIGHT) { + ball_y = AO_VGA_HEIGHT - BALL_HEIGHT; + ball_dy = -ball_dy; + } + if (ball_y < 0) { + ball_y = -ball_y; + ball_dy = -ball_dy; + } + } + } +} + static void ao_video_toggle(void) { @@ -31,8 +92,17 @@ ao_video_toggle(void) ao_vga_enable(ao_cmd_lex_i); } +static void +ao_ball_toggle(void) +{ + ao_cmd_decimal(); + ball_enable = ao_cmd_lex_i; + ao_wakeup(&ball_enable); +} + __code struct ao_cmds ao_demo_cmds[] = { { ao_video_toggle, "V\0Toggle video" }, + { ao_ball_toggle, "B\0Toggle ball" }, { 0, NULL } }; @@ -52,6 +122,7 @@ main(void) ao_vga_init(); ao_usb_init(); + ao_add_task(&ball_task, ao_ball, "ball"); ao_cmd_register(&ao_demo_cmds[0]); ao_start_scheduler();