diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cortexelf-v1/Makefile | 37 | ||||
| -rw-r--r-- | src/cortexelf-v1/ao_cortexelf.c | 172 | ||||
| -rw-r--r-- | src/cortexelf-v1/ao_pins.h | 9 | 
3 files changed, 194 insertions, 24 deletions
| diff --git a/src/cortexelf-v1/Makefile b/src/cortexelf-v1/Makefile index a645d222..e0fdc8fd 100644 --- a/src/cortexelf-v1/Makefile +++ b/src/cortexelf-v1/Makefile @@ -15,18 +15,17 @@ INC = \  	ao_product.h \  	ao_profile.h \  	ao_task.h \ -	ao_whiten.h \ -	ao_quaternion.h \  	math.h \  	ao_mpu.h \  	stm32l.h \  	math.h \ +	ao_vga.h \ +	ao_draw.h \ +	ao_draw_int.h \ +	ao_font.h \ +	ao_ps2.h \  	Makefile -# -# Common AltOS sources -# -#	ao_hmc5883.c  #PROFILE=ao_profile.c  #PROFILE_DEF=-DAO_PROFILE=1 @@ -34,20 +33,6 @@ INC = \  #STACK_GUARD=ao_mpu_stm.c  #STACK_GUARD_DEF=-DHAS_STACK_GUARD=1 -MATH_SRC=\ -	ef_acos.c \ -	ef_sqrt.c \ -	ef_rem_pio2.c \ -	kf_cos.c \ -	kf_sin.c \ -	kf_rem_pio2.c \ -	sf_copysign.c \ -	sf_cos.c \ -	sf_fabs.c \ -	sf_floor.c \ -	sf_scalbn.c \ -	sf_sin.c \ -	ef_log.c  ALTOS_SRC = \  	ao_boot_chain.c \ @@ -63,8 +48,6 @@ ALTOS_SRC = \  	ao_timer.c \  	ao_mutex.c \  	ao_serial_stm.c \ -	ao_ignite.c \ -	ao_freq.c \  	ao_dma_stm.c \  	ao_spi_stm.c \  	ao_storage.c \ @@ -72,8 +55,14 @@ ALTOS_SRC = \  	ao_usb_stm.c \  	ao_exti_stm.c \  	ao_i2c_stm.c \ -	ao_convert_volt.c \ -	$(MATH_SRC) \ +	ao_vga.c \ +	ao_blt.c \ +	ao_copy.c \ +	ao_rect.c \ +	ao_text.c \ +	ao_line.c \ +	ao_ps2.c \ +	ao_console.c \  	$(PROFILE) \  	$(SAMPLE_PROFILE) \  	$(STACK_GUARD) diff --git a/src/cortexelf-v1/ao_cortexelf.c b/src/cortexelf-v1/ao_cortexelf.c index 01c5165b..776530e0 100644 --- a/src/cortexelf-v1/ao_cortexelf.c +++ b/src/cortexelf-v1/ao_cortexelf.c @@ -22,6 +22,171 @@  #if HAS_STACK_GUARD  #include <ao_mpu.h>  #endif +#include <ao_ps2.h> +#include <ao_vga.h> +#include <ao_console.h> + +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_line(&ao_vga_bitmap, +				-100, -100, ball_x*2, ball_y*2, +				1, AO_XOR); +			ao_text(&ao_vga_bitmap, +				ball_x, ball_y - 10, +				"Hello, Bdale!", +				1, AO_XOR); +			ao_rect(&ao_vga_bitmap, +				ball_x, ball_y, +				BALL_WIDTH, +				BALL_HEIGHT, +				1, +				AO_XOR); +			ao_delay(AO_MS_TO_TICKS(10)); +			ao_rect(&ao_vga_bitmap, +				ball_x, ball_y, +				BALL_WIDTH, +				BALL_HEIGHT, +				1, +				AO_XOR); +			ao_text(&ao_vga_bitmap, +				ball_x, ball_y - 10, +				"Hello, Bdale!", +				1, AO_XOR); +			ao_line(&ao_vga_bitmap, +				-100, -100, ball_x*2, ball_y*2, +				1, AO_XOR); +			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_fb_init(void) +{ +	ao_rect(&ao_vga_bitmap, +		0, 0, AO_VGA_WIDTH, AO_VGA_HEIGHT, +		1, AO_COPY); + +	ao_rect(&ao_vga_bitmap, +		10, 10, 10, 10, +		0, AO_COPY); + +	ao_rect(&ao_vga_bitmap, +		AO_VGA_WIDTH - 20, 10, 10, 10, +		0, AO_COPY); + +	ao_rect(&ao_vga_bitmap, +		10, AO_VGA_HEIGHT - 20, 10, 10, +		0, AO_COPY); + +	ao_rect(&ao_vga_bitmap, +		AO_VGA_WIDTH - 20, AO_VGA_HEIGHT - 20, 10, 10, +		0, AO_COPY); + +	ao_text(&ao_vga_bitmap, +		20, 100, +		"Hello, Bdale!", +		0, AO_COPY); + +	ao_text(&ao_vga_bitmap, +		1, ao_font.ascent, +		"UL", +		0, AO_COPY); + +	ao_text(&ao_vga_bitmap, +		1, AO_VGA_HEIGHT - ao_font.descent, +		"BL", +		0, AO_COPY); +} + +static void +ao_video_toggle(void) +{ +	ao_cmd_decimal(); +	if (ao_cmd_lex_i) +		ao_fb_init(); +	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); +} + +static void +ao_ps2_read_keys(void) +{ +	char	c; + +	for (;;) { +		c = ao_ps2_getchar(); +		printf("%02x %c\n", c, ' ' <= c && c < 0x7f ? c : '.'); +		flush(); +		if (c == ' ') +			break; +	} +} + +static void +ao_console_send(void) +{ +	char	c; + +	while ((c = getchar()) != '~') { +		ao_console_putchar(c); +		flush(); +	} +} + +__code struct ao_cmds ao_demo_cmds[] = { +	{ ao_video_toggle, "V\0Toggle video" }, +	{ ao_ball_toggle, "B\0Toggle ball" }, +	{ ao_ps2_read_keys, "K\0Read keys from keyboard" }, +	{ ao_console_send, "C\0Send data to console, end with ~" }, +	{ 0, NULL } +};  int  main(void) @@ -40,12 +205,19 @@ main(void)  	ao_dma_init();  	ao_exti_init(); +	ao_ps2_init(); +	ao_vga_init(); +	ao_console_init(); +  	ao_cmd_init();  	ao_usb_init();  	ao_config_init(); +	ao_add_task(&ball_task, ao_ball, "ball"); +	ao_cmd_register(&ao_demo_cmds[0]); +  	ao_start_scheduler();  	return 0;  } diff --git a/src/cortexelf-v1/ao_pins.h b/src/cortexelf-v1/ao_pins.h index 2c960a6b..e486038a 100644 --- a/src/cortexelf-v1/ao_pins.h +++ b/src/cortexelf-v1/ao_pins.h @@ -44,6 +44,15 @@  #define AO_APB2_PRESCALER	2  #define AO_RCC_CFGR_PPRE2_DIV	STM_RCC_CFGR_PPRE2_DIV_2 +/* Allow for non-maskable interrupts at priority 0 */ +#define AO_NONMASK_INTERRUPT	1 + +/* PS/2 keyboard connection */ +#define AO_PS2_CLOCK_PORT	(&stm_gpiod) +#define AO_PS2_CLOCK_BIT	9 +#define AO_PS2_DATA_PORT	(&stm_gpiod) +#define AO_PS2_DATA_BIT		8 +  #define HAS_SERIAL_1		1  #define USE_SERIAL_1_STDIN	0  #define SERIAL_1_PB6_PB7	1 | 
