#include #include #include #include "neug.h" #include "sys.h" /* for set_led */ #include "stm32f103.h" #include "adc.h" #include "st7732.h" #include "primer2-switches.h" #include "primer2-ts.h" #include "board.h" #ifdef TEST_DISPLAY_LOGO static uint8_t buf[LCD_COLUMN*LCD_ROW*BYTES_PER_PIXEL] = { #include "chopstx-logo.data" }; void lcd_logo (void) { uint8_t args[4]; /* Set RA and CA. */ /* RASET, 0, 0, 0, 159 */ args[0] = 0x00; args[1] = 0; args[2] = 0x00; args[3] = LCD_ROW-1; lcd_command_writen (RASET, args, 4); /* CASET, 0, 0, 0, 127 */ args[0] = 0x00; args[1] = 0; args[2] = 0x00; args[3] = LCD_COLUMN-1; lcd_command_writen (CASET, args, 4); /* Write logo. */ lcd_command_writen (RAMWR, buf, LCD_COLUMN*LCD_ROW*BYTES_PER_PIXEL); } #endif /* Table of 32*(cos, sin) for range 0 to pi/2 with step pi/256. */ static uint8_t ctable[128*2] = { 32, 0, 31, 0, 31, 0, 31, 1, 31, 1, 31, 1, 31, 2, 31, 2, 31, 3, 31, 3, 31, 3, 31, 4, 31, 4, 31, 5, 31, 5, 31, 5, 31, 6, 31, 6, 31, 7, 31, 7, 31, 7, 30, 8, 30, 8, 30, 8, 30, 9, 30, 9, 30, 10, 30, 10, 30, 10, 29, 11, 29, 11, 29, 11, 29, 12, 29, 12, 29, 12, 29, 13, 28, 13, 28, 14, 28, 14, 28, 14, 28, 15, 28, 15, 27, 15, 27, 16, 27, 16, 27, 16, 27, 17, 26, 17, 26, 17, 26, 18, 26, 18, 25, 18, 25, 19, 25, 19, 25, 19, 24, 19, 24, 20, 24, 20, 24, 20, 23, 21, 23, 21, 23, 21, 23, 22, 22, 22, 22, 22, 22, 22, 22, 23, 21, 23, 21, 23, 21, 23, 20, 24, 20, 24, 20, 24, 19, 24, 19, 25, 19, 25, 19, 25, 18, 25, 18, 26, 18, 26, 17, 26, 17, 26, 17, 27, 16, 27, 16, 27, 16, 27, 15, 27, 15, 28, 15, 28, 14, 28, 14, 28, 14, 28, 13, 28, 13, 29, 12, 29, 12, 29, 12, 29, 11, 29, 11, 29, 11, 29, 10, 30, 10, 30, 10, 30, 9, 30, 9, 30, 8, 30, 8, 30, 8, 30, 7, 31, 7, 31, 7, 31, 6, 31, 6, 31, 5, 31, 5, 31, 5, 31, 4, 31, 4, 31, 3, 31, 3, 31, 3, 31, 2, 31, 2, 31, 1, 31, 1, 31, 1, 31, 0, 31, 0, 31, }; #ifdef TEST_LCD_CIRCLE void lcd_circle (void) { int i, j; uint8_t *p; int x, y; /* Clear display. */ /* Set RA and CA. */ /* RASET, 0, 0, 0, 159 */ args[0] = 0x00; args[1] = 0; args[2] = 0x00; args[3] = LCD_ROW-1; lcd_command_writen (RASET, args, 4); /* CASET, 0, 0, 0, 127 */ args[0] = 0x00; args[1] = 0; args[2] = 0x00; args[3] = LCD_COLUMN-1; lcd_command_writen (CASET, args, 4); lcd_command_writen (RAMWR, 0, LCD_COLUMN*LCD_ROW*BYTES_PER_PIXEL); /* Draw a circle. */ for (i = 0; i < 128; i++) { x = 64 + ctable[2*i]; y = 80 + ctable[2*i+1]; lcd_draw_point (x, y, 0xfc, 0xfc, 0xfc); } for (i = 0; i < 128; i++) { x = 64 - ctable[2*i+1]; y = 80 + ctable[2*i]; lcd_draw_point (x, y, 0xfc, 0, 0xfc); } for (i = 0; i < 128; i++) { x = 64 - ctable[2*i]; y = 80 - ctable[2*i+1]; lcd_draw_point (x, y, 0, 0xfc, 0xfc); } for (i = 0; i < 128; i++) { x = 64 + ctable[2*i+1]; y = 80 - ctable[2*i]; lcd_draw_point (x, y, 0xfc, 0xfc, 0); } } #endif #define RANDOM_BYTES_LENGTH 64 static uint32_t random_word[RANDOM_BYTES_LENGTH/sizeof (uint32_t)]; int main (int argc, const char *argv[]) { int count; int vx, vy; int r, g, b; uint8_t args[4]; (void)argc; (void)argv; set_led (1); set_backlight (1); adc_init (); neug_init (random_word, RANDOM_BYTES_LENGTH/sizeof (uint32_t)); lcd_init (); #ifdef TEST_LCD_LOGO lcd_logo (); while (! joystick ()) chopstx_usec_wait (500*1000); #endif /* Set RA and CA. */ /* RASET, 0, 0, 0, 159 */ args[0] = 0x00; args[1] = 0; args[2] = 0x00; args[3] = LCD_ROW-1; lcd_command_writen (RASET, args, 4); /* CASET, 0, 0, 0, 127 */ args[0] = 0x00; args[1] = 0; args[2] = 0x00; args[3] = LCD_COLUMN-1; lcd_command_writen (CASET, args, 4); /* Fill display. */ lcd_command_filln (RAMWR, 0xfc, LCD_COLUMN*LCD_ROW*BYTES_PER_PIXEL); vx = (LCD_COLUMN/2) << 5; vy = (LCD_ROW/2) << 5; r = g = b = 0; #if 1 adc3_init (); adc3_start (); count = 0; while (1) { uint32_t resv[4]; adc3_conversion (resv); if (ts_pushed (resv[2])) { int reg[3], point[2]; ts_conversion (resv, reg); #if 0 lcd_printhex (reg[0], 5, 8, 0x00, 0x00, 0xfc, 0xfc); lcd_printhex (reg[1], 5, 18, 0x00, 0x00, 0xfc, 0xfc); lcd_printhex (reg[2], 5, 28, 0x00, 0x00, 0xfc, 0xfc); #endif if (!ts_adjust (reg, point)) { chopstx_usec_wait (50*1000); continue; } lcd_draw_point (point[0], point[1], r, g, b); } else ts_adjust (NULL, NULL); chopstx_usec_wait (50*1000); count++; if ((count/10) & 1) set_led (0); else set_led (1); if (pbutton()) break; } adc3_stop (); #endif count = 0; while (1) { int jo; uint32_t th = neug_get (NEUG_KICK_FILLING) & 0x1ff; /* Get random point on a circle with the radius of 32 and walk towards it. */ if (th < 128) { vx += ctable[2*th]; vy += ctable[2*th+1]; } else if (th < 256) { vx -= ctable[2*(th & 0x7f)+1]; vy += ctable[2*(th & 0x7f)]; } else if (th < 384) { vx -= ctable[2*(th & 0x7f)]; vy -= ctable[2*(th & 0x7f)+1]; } else { vx += ctable[2*(th & 0x7f)+1]; vy -= ctable[2*(th & 0x7f)]; } if (vx < 0) vx += (LCD_COLUMN << 5); if (vy < 0) vy += (LCD_ROW << 5); /* Change draw color with joystick. */ jo = joystick (); if (JOYSTICK_L (jo)) r = 0xfc; if (JOYSTICK_R (jo)) g = 0xfc; if (JOYSTICK_U (jo)) b = 0xfc; if (JOYSTICK_D (jo)) r = g = b = 0; /* 2-dim random walk on torus. */ lcd_draw_point ((vx>>5)%LCD_COLUMN, (vy>>5)%LCD_ROW, r, g, b); chopstx_usec_wait (10*1000); if (pbutton ()) count++; /* Shutdown when p-button is held down for 5 sec. */ if (count > 500) { set_led (0); shutdown (); } else { /* Disable backlight when p-button is held down for 3 sec. */ if (count > 300) set_backlight (0); /* Blink led when p-button is held. */ if ((count/50) & 1) set_led (0); else set_led (1); } #if 1 lcd_printhex (count, 5, 8, 0x00, 0x00, 0xfc, 0xfc); #endif } return 0; }