====== 10. Cvičení ====== moving_square.c /******************************************************************* Project main function template for MicroZed based MZ_APO board designed by Petr Porazil at PiKRON change_me.c - main file include your name there and license for distribution. Remove next text: This line should not appear in submitted work and project name should be change to match real application. If this text is there I want 10 points subtracted from final evaluation. *******************************************************************/ #define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include //termios, TCSANOW, ECHO, ICANON #include "mzapo_parlcd.h" #include "mzapo_phys.h" #include "mzapo_regs.h" unsigned short *fb; void draw_pixel(int x, int y, unsigned short color) { if (x>=0 && x<480 && y>=0 && y<320) { fb[x+480*y] = color; } } int main(int argc, char *argv[]) { unsigned char *parlcd_mem_base; int i,j,k; int ptr; unsigned int c; fb = (unsigned short *)malloc(320*480*2); static struct termios oldt, newt; /*tcgetattr gets the parameters of the current terminal STDIN_FILENO will tell tcgetattr that it should write the settings of stdin to oldt*/ tcgetattr( STDIN_FILENO, &oldt); /*now the settings will be copied*/ newt = oldt; /*ICANON normally takes care that one line at a time will be processed that means it will return if it sees a "\n" or an EOF or an EOL*/ newt.c_lflag &= ~(ICANON); newt.c_cc[VMIN] = 0; // bytes until read unblocks. newt.c_cc[VTIME] = 0; /*Those new settings will be set to STDIN TCSANOW tells tcsetattr to change attributes immediately. */ tcsetattr( STDIN_FILENO, TCSANOW, &newt); printf("Hello world\n"); parlcd_mem_base = map_phys_address(PARLCD_REG_BASE_PHYS, PARLCD_REG_SIZE, 0); if (parlcd_mem_base == NULL) exit(1); parlcd_hx8357_init(parlcd_mem_base); parlcd_write_cmd(parlcd_mem_base, 0x2c); ptr=0; for (i = 0; i < 320 ; i++) { for (j = 0; j < 480 ; j++) { c = 0; fb[ptr]=c; parlcd_write_data(parlcd_mem_base, fb[ptr++]); } } struct timespec loop_delay; loop_delay.tv_sec = 0; loop_delay.tv_nsec = 150 * 1000 * 1000; int xx=0, yy=0; char ch1=' '; for (k=0; k<1000; k++) { for (ptr = 0; ptr < 320*480 ; ptr++) { fb[ptr]=0u; } for (j=0; j<60; j++) { for (i=0; i<60; i++) { draw_pixel(i+xx,j+yy,0x7ff); } } int r = read(0, &ch1, 1); while (r==1) { if (ch1=='d') { xx+=20; } else if (ch1=='a') { xx-=20; } else if (ch1=='w') { yy-=20; } else if (ch1=='s') { yy+=20; } else if (ch1=='q') { k=2000; } r = read(0, &ch1, 1); } printf("Znak %c pozice %i ret %i\n", ch1, xx, r); parlcd_write_cmd(parlcd_mem_base, 0x2c); for (ptr = 0; ptr < 480*320 ; ptr++) { parlcd_write_data(parlcd_mem_base, fb[ptr]); } clock_nanosleep(CLOCK_MONOTONIC, 0, &loop_delay, NULL); } parlcd_write_cmd(parlcd_mem_base, 0x2c); for (ptr = 0; ptr < 480*320 ; ptr++) { parlcd_write_data(parlcd_mem_base, 0); } tcsetattr( STDIN_FILENO, TCSANOW, &oldt); printf("Goodbye world\n"); return 0; } * pro vyučující: [[..:..:internal:tutorials:10:start|cvičení 10]]