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 <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <time.h>
#include <unistd.h>
#include <termios.h> //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;
}