diff --git a/.vscode/settings.json b/.vscode/settings.json index 7bc958f..5704791 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,6 +6,8 @@ "ui.h": "c", "DATA_A.C": "cpp", "data.C": "cpp", - "stdlib.h": "c" + "stdlib.h": "c", + "mman.h": "c", + "device_manager.h": "c" } } \ No newline at end of file diff --git a/docs/a-font.png b/docs/a-font.png new file mode 100644 index 0000000..f6bd13f Binary files /dev/null and b/docs/a-font.png differ diff --git a/docs/c-font.png b/docs/c-font.png new file mode 100644 index 0000000..cffdec8 Binary files /dev/null and b/docs/c-font.png differ diff --git a/docs/cactus-sprite-pixilart.png b/docs/cactus-sprite-pixilart.png new file mode 100644 index 0000000..7756227 Binary files /dev/null and b/docs/cactus-sprite-pixilart.png differ diff --git a/docs/frog-back.png b/docs/frog-back.png new file mode 100644 index 0000000..4d7e8b8 Binary files /dev/null and b/docs/frog-back.png differ diff --git a/docs/frog-front.png b/docs/frog-front.png new file mode 100644 index 0000000..cac34ba Binary files /dev/null and b/docs/frog-front.png differ diff --git a/docs/h-font.png b/docs/h-font.png new file mode 100644 index 0000000..e95603c Binary files /dev/null and b/docs/h-font.png differ diff --git a/docs/k-font.png b/docs/k-font.png new file mode 100644 index 0000000..e396aa9 Binary files /dev/null and b/docs/k-font.png differ diff --git a/docs/lilypad1.png b/docs/lilypad1.png new file mode 100644 index 0000000..bf680a2 Binary files /dev/null and b/docs/lilypad1.png differ diff --git a/docs/lilypad2.png b/docs/lilypad2.png new file mode 100644 index 0000000..07b3bf5 Binary files /dev/null and b/docs/lilypad2.png differ diff --git a/docs/notes.txt b/docs/notes.txt deleted file mode 100644 index de201e4..0000000 --- a/docs/notes.txt +++ /dev/null @@ -1,48 +0,0 @@ -IDEIAS --> Fazer verificação do status da fila antes de adicionar uma nova instrução no barramento. --> Localizar quais coordenadas x e y correspondem ao centro da tela. --> Tentar animar alguma coisa no monitor. --> Tentar definir um polígono no registrador 0. --> Implementar função para definir o valor de todos os registradores como 0 após finalizar o programa ('apagar' a tela). --> Funções que poderíamos implementar também: - - animate_sprite: Uma função para animar os sprites ao longo do tempo, alterando seus frames de acordo com uma sequência predefinida de imagens. - - check_collision_bounds: Uma função para verificar se um sprite está dentro dos limites da tela ou de uma área específica, evitando que ele saia da área visível. - - handle_input: Uma função para lidar com a entrada do jogador, como movimento do teclado ou cliques do mouse, e atualizar as posições dos sprites de acordo. - - update_game_state: Uma função para atualizar o estado do jogo, processando eventos, verificando colisões, atualizando pontuações, etc. - - render_sprites: Uma função para renderizar os sprites na tela, levando em consideração sua posição, estado e quaisquer efeitos visuais. - - load_level: Uma função para carregar e inicializar um novo nível do jogo, incluindo a posição inicial dos sprites, configurações de fundo, obstáculos, etc. - - save_game_state: Uma função para salvar o estado atual do jogo, permitindo que os jogadores continuem de onde pararam em uma sessão anterior. - - handle_powerups: Uma função para lidar com power-ups ou itens especiais que os sprites podem coletar durante o jogo, alterando seu comportamento ou concedendo benefícios temporários. - - play_sound: Uma função para reproduzir efeitos sonoros ou músicas de fundo durante o jogo, melhorando a experiência auditiva do jogador. - - spawn_enemy: Uma função para gerar novos inimigos em locais específicos da tela ou em intervalos de tempo definidos, aumentando gradualmente a dificuldade do jogo. - -QUESTÕES --> A memória de sprites é volátil? Isto é, os sprites criados através da instrução WSM são mantidos após o desligamento da placa? --> Tendo em vista que cada FIFO possui a capacidade de armazenar 16 palavras de 32 bits, então elas podem armazenar, juntas, no máximo 16 instruções? --> Quantos sprites podem ser atualizados ao mesmo tempo? Isso porque se a FIFO armazenar no máximo 8 instruções, no caso de termos 9 sprites ou polígonos, apenas 8 deles poderiam ser atualizados de uma vez. --> Qual é o sinal que indica quando a tela deve ser renderizada? É o vsync? Como funciona a sincronização com o sinal start (que envia as instruções)? --> Dado que conseguimos escrever um polígono no reg 0, ele é um registrador para a escrita de polígonos no geral? --> O ideal é encher a fila e depois descarregar todas as instruções de vez ou enviar uma instrução a cada pulso? --> Qual o máximo de polígonos e sprites que conseguimos exibir na tela? (Acredito que 31 elementos no total, de qualquer natureza) - -FATOS --> A arquitetura dispões de 32 registradores. O primeiro registrador é reservado para o background e o restante aos sprites. --> A memória de sprites armazena o bitmap para cada sprite. --> A memória de sprites consiste em 12.800 palavras de 9 bits, 3 bits para cada componente RGB. --> Cada sprite deve possuir o tamanho 20x20, cada um ocupando 400 posições de memória. Sendo assim, é possível armazenar na memória de sprites 32 sprites para uso (Acho que já responde uma das questões). --> A memória de background é utilizada para modificar pequenas partes do background e consiste em 4.800 palavras de 9 bits. --> O padrão gráfico escolhido foi o VGA com uma resolução de 640x480 pixels. --> Para 'apagar' um polígono ou sprite é necessário definir o bit SP ou o tamanho do polígono como 0. --> As instruções nos registradores persistem mesmo após a finalização do programa. --> O algoritmo de geração de bitmaps ficará a cargo do desenvolvedor. --> Foi possível perceber que realizar uma animação com o limite de 31 sprites na tela ocasiona uma perda na velocidade de atualização devido ao limite de envio de 13 instruções por frame. (mas como chegamos a essa conclusão?) \ No newline at end of file diff --git a/docs/o-font.png b/docs/o-font.png new file mode 100644 index 0000000..d67d3f6 Binary files /dev/null and b/docs/o-font.png differ diff --git a/docs/r-font.png b/docs/r-font.png new file mode 100644 index 0000000..27db4f5 Binary files /dev/null and b/docs/r-font.png differ diff --git a/docs/s-font.png b/docs/s-font.png new file mode 100644 index 0000000..66579ea Binary files /dev/null and b/docs/s-font.png differ diff --git a/docs/truck-back.png b/docs/truck-back.png new file mode 100644 index 0000000..8758a34 Binary files /dev/null and b/docs/truck-back.png differ diff --git a/docs/truck-front.png b/docs/truck-front.png new file mode 100644 index 0000000..b46e3ae Binary files /dev/null and b/docs/truck-front.png differ diff --git a/docs/truck-middle.png b/docs/truck-middle.png new file mode 100644 index 0000000..5b6c1d8 Binary files /dev/null and b/docs/truck-middle.png differ diff --git a/docs/trunktree-back.png b/docs/trunktree-back.png new file mode 100644 index 0000000..c809ccd Binary files /dev/null and b/docs/trunktree-back.png differ diff --git a/docs/trunktree-front.png b/docs/trunktree-front.png new file mode 100644 index 0000000..ad10a80 Binary files /dev/null and b/docs/trunktree-front.png differ diff --git a/docs/trunktree-middle.png b/docs/trunktree-middle.png new file mode 100644 index 0000000..7179b3f Binary files /dev/null and b/docs/trunktree-middle.png differ diff --git a/docs/u-font.png b/docs/u-font.png new file mode 100644 index 0000000..03342d8 Binary files /dev/null and b/docs/u-font.png differ diff --git a/src/Device_manager.c b/src/Device_manager.c new file mode 100644 index 0000000..1c273be --- /dev/null +++ b/src/Device_manager.c @@ -0,0 +1,83 @@ +#include "Device_manager.h" + +#include +#include +#include +#include +#include + +void read_mouse(mouse_t* mouse) { + u8_t data[3] = {0}; + + if (read(mouse->fd, data, sizeof(data))) { + mouse->left = (data[0] & 0x1) ? 1 : 0; + mouse->right = (data[0] & 0x02) ? 1 : 0; + mouse->middle = (data[0] & 0x04) ? 1 : 0; + + mouse->x += (data[1] / ((SENSIBILITY > 0) ? SENSIBILITY : 1)); + + if (mouse->x < 0) { + mouse->x = 0; + } + if (mouse->x > WIDTH) { + mouse->x = WIDTH; + } + + mouse->y += ((data[2] * -1) / ((SENSIBILITY > 0) ? SENSIBILITY : 1)); + + if (mouse->y < 0) { + mouse->y = 0; + } + if (mouse->y > HEIGHT) { + mouse->y = HEIGHT; + } + } +} + +mouse_t init_mouse(u64_t fd_mouse) { + fd_mouse = open("/dev/input/event0", O_RDONLY); + + if (fd_mouse == -1) { + perror("Erro ao abrir o dispositivo de memória"); + exit(EXIT_FAILURE); + } + + return (mouse_t){ + .fd = fd_mouse, + .x = 50, + .y = 50, + .left = 0, + .right = 0, + .middle = 0, + .read = read_mouse, + }; +} + +u64_t* read_KEY(u64_t fd_map, void* LW_virtual) { + fd_map = open("/dev/mem", (O_RDWR | O_SYNC)); + if (fd_map == -1) { + perror("Erro ao abrir o dispositivo de memória"); + exit(EXIT_FAILURE); + } + + LW_virtual = mmap(NULL, LW_BRIDGE_SPAN, (PROT_READ | PROT_WRITE), MAP_SHARED, fd_map, LW_BRIDGE_BASE); + if (LW_virtual == MAP_FAILED) { + perror("Erro ao mapear memória"); + exit(EXIT_FAILURE); + } + + u64_t* KEY_ptr = (u64_t*)(LW_virtual + KEY_BASE); + return KEY_ptr; +} + +void close_KEY(u64_t fd_map, void* LW_virtual) { + if (munmap(LW_virtual, LW_BRIDGE_SPAN) == -1) { + perror("Erro ao desmapear memória"); + exit(EXIT_FAILURE); + } + + if (close(fd_map) == -1) { + perror("Erro ao fechar dispositivo de memória"); + exit(EXIT_FAILURE); + } +} diff --git a/src/Device_manager.h b/src/Device_manager.h new file mode 100644 index 0000000..66db044 --- /dev/null +++ b/src/Device_manager.h @@ -0,0 +1,37 @@ +#ifndef DEVICE_MANAGER_H_ +#define DEVICE_MANAGER_H_ + +#include +#include +#include +#include +#include + +#include "utils/types.h" +#include "utils/ui.h" + +#define KEY_BASE 0x0 +#define LW_BRIDGE_SPAN 0x00005000 +#define LW_BRIDGE_BASE 0xff200000 + +#define HEIGHT 360 +#define WIDTH 480 +#define SENSIBILITY 2 + +typedef struct mouse_t { + u64_t fd; + u32_t x; + u32_t y; + u8_t left; + u8_t middle; + u8_t right; + + void (*read)(struct mouse_t* mouse); +} mouse_t; + +void read_mouse(mouse_t* mouse); +mouse_t init_mouse(u64_t fd_mouse); +u64_t* read_KEY(u64_t fd_map, void* LW_virtual); +void close_KEY(u64_t fd_map, void* LW_virtual); + +#endif // DEVICE_MANAGER_H_ \ No newline at end of file diff --git a/src/GraphSync.c b/src/GraphSync.c index 067424b..8f87b0f 100644 --- a/src/GraphSync.c +++ b/src/GraphSync.c @@ -11,7 +11,18 @@ #include #include -#include "utils/aux.h" +#define DEVICE_PATH "/dev/gpp_data_bus" /**< Path to device data bus */ +#define FROG "frog" +#define A_font "a-font" +#define C_font "c-font" +#define H_font "h-font" +#define K_font "k-font" +#define O_font "o-font" +#define R_font "r-font" +#define S_font "s-font" +#define U_font "u-font" + +#define SIZE 20 static int device_fd = -1; @@ -197,348 +208,202 @@ void clean_background() { } } -// u8_t increase_coordinate_sprite(sprite_t *sprite, int mirror) { -// u64_t angle_rad = sprite->direction * M_PI() / 180.0; +u8_t increase_coordinate_sprite(sprite_t *sprite) { + sprite->coord_x += sprite->step_x; + sprite->coord_y += sprite->step_y; -// int delta_x = (int)round(sprite->step_x * cos(angle_rad)); -// int delta_y = (int)round(sprite->step_y * sin(angle_rad)); - -// if (sprite->coord_x < 0 || sprite->coord_x > 639 || sprite->coord_y < 0 || sprite->coord_y > 479) { -// if (mirror) { -// // Espelhar as coordenadas do sprite -// sprite->coord_x = clamp(sprite->coord_x, 0, 639); -// sprite->coord_y = clamp(sprite->coord_y, 0, 479); -// } -// return -1; -// } - -// sprite->coord_x += delta_x; -// sprite->coord_y += delta_y; + return 0; +} -// sprite_t sprite_copy = *sprite; -// set_dynamic_sprite(sprite_copy); +u8_t collision(sprite_t *sp1, sprite_t *sp2) { + if (sp1->coord_x < sp2->coord_x + SIZE && sp1->coord_x + SIZE > sp2->coord_x && sp1->coord_y < sp2->coord_y + SIZE && + sp1->coord_y + SIZE > sp2->coord_y) { + return 1; + } + return 0; +} -// return 0; -// } +sprite_t set_new_sprite(u16_t sprite_offset) { + u32_t dataA, dataB; -void draw_picture() { - // BACKGROUND - u64_t instruction1 = set_background_color(2, 2, 3); + char instruction_str[65]; + instruction_str[64] = '\0'; - // BACKGROUND BLOCKS - ground_block_t block; - block.address = 3000; - block.R = 1; - block.G = 4; - block.B = 1; + u8_t opcode = 0b0001; + u16_t init_addr = sprite_offset * 400; + + // Cores da imagem para a sprite + char sprite_name[5] = FROG; + u8_t pixel_data[400][3] = { + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {3, 7, 4}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {3, 7, 4}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {7, 7, 7}, {7, 7, 7}, {3, 7, 4}, {6, 7, 7}, + {6, 7, 7}, {3, 7, 4}, {7, 7, 7}, {7, 7, 7}, {3, 7, 4}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {3, 7, 4}, + {3, 7, 4}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {1, 5, 2}, + {1, 5, 2}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {2, 5, 3}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, + {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {2, 5, 3}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, + {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, + {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {5, 6, 1}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 6, 1}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {5, 7, 0}, {5, 6, 1}, {5, 6, 1}, {5, 6, 1}, + {5, 6, 1}, {5, 6, 1}, {5, 6, 1}, {5, 7, 0}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, + {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, + {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {3, 5, 0}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {2, 5, 3}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, + {5, 7, 0}, {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {2, 5, 3}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {2, 5, 3}, {2, 5, 3}, {2, 5, 3}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, + {5, 7, 0}, {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {2, 5, 3}, {2, 5, 3}, {2, 5, 3}, {6, 7, 7}, + {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, + {5, 7, 0}, {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, + {6, 7, 7}, {0, 3, 1}, {0, 3, 1}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, + {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {0, 3, 1}, {0, 3, 1}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {3, 5, 0}, + {3, 5, 0}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, + {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {0, 2, 1}, {0, 3, 1}, {0, 3, 1}, {6, 7, 7}, {6, 7, 7}, {0, 3, 1}, {6, 7, 7}, {0, 3, 1}, + {0, 3, 1}, {6, 7, 7}, {0, 3, 1}, {6, 7, 7}, {6, 7, 7}, {0, 3, 1}, {0, 3, 1}, {0, 2, 1}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, + {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}}; + + u16_t max_addr = init_addr + 400; + u16_t addr; + + for (addr = init_addr; addr < max_addr; addr++) { + u16_t pixel_idx = addr - init_addr; + u8_t R = pixel_data[pixel_idx][0]; + u8_t G = pixel_data[pixel_idx][1]; + u8_t B = pixel_data[pixel_idx][2]; + + dataA = addr << 4 | opcode; + dataB = B << 6 | G << 3 | R; + + snprintf(instruction_str, sizeof(instruction_str), "%x%08x", dataA, dataB); + + u64_t instruction = strtoull(instruction_str, NULL, 16); + + write_data(instruction); + } - int i = 3600; + sprite_t new_sprite; + new_sprite.offset = sprite_offset; - for (i; i < 4800; i++) { - block.address = i; - set_background_block(block); - } + close_data(device_fd); - // ÁRVORES - sprite_fixed_t sprite_tree1; - sprite_tree1.ativo = 1; - sprite_tree1.data_register = 1; - sprite_tree1.offset = 4; - sprite_tree1.coord_x = 100; - sprite_tree1.coord_y = 400; - - set_fixed_sprite(sprite_tree1); - - sprite_fixed_t sprite_tree2; - sprite_tree2.ativo = 1; - sprite_tree2.data_register = 2; - sprite_tree2.offset = 4; - sprite_tree2.coord_x = 150; - sprite_tree2.coord_y = 350; - - set_fixed_sprite(sprite_tree2); - - sprite_fixed_t sprite_tree3; - sprite_tree3.ativo = 1; - sprite_tree3.data_register = 3; - sprite_tree3.offset = 4; - sprite_tree3.coord_x = 200; - sprite_tree3.coord_y = 450; - - set_fixed_sprite(sprite_tree3); - - sprite_fixed_t sprite_tree4; - sprite_tree4.ativo = 1; - sprite_tree4.data_register = 4; - sprite_tree4.offset = 4; - sprite_tree4.coord_x = 320; - sprite_tree4.coord_y = 460; - - set_fixed_sprite(sprite_tree4); - - sprite_fixed_t sprite_tree5; - sprite_tree5.ativo = 1; - sprite_tree5.data_register = 5; - sprite_tree5.offset = 4; - sprite_tree5.coord_x = 360; - sprite_tree5.coord_y = 400; - - set_fixed_sprite(sprite_tree5); - - sprite_fixed_t sprite_tree6; - sprite_tree6.ativo = 1; - sprite_tree6.data_register = 6; - sprite_tree6.offset = 4; - sprite_tree6.coord_x = 230; - sprite_tree6.coord_y = 400; - - set_fixed_sprite(sprite_tree6); - - sprite_fixed_t sprite_tree7; - sprite_tree7.ativo = 1; - sprite_tree7.data_register = 7; - sprite_tree7.offset = 4; - sprite_tree7.coord_x = 295; - sprite_tree7.coord_y = 350; - - set_fixed_sprite(sprite_tree7); - - sprite_fixed_t sprite_tree8; - sprite_tree8.ativo = 1; - sprite_tree8.data_register = 8; - sprite_tree8.offset = 4; - sprite_tree8.coord_x = 30; - sprite_tree8.coord_y = 355; - - set_fixed_sprite(sprite_tree8); - - sprite_fixed_t sprite_tree9; - sprite_tree9.ativo = 1; - sprite_tree9.data_register = 9; - sprite_tree9.offset = 4; - sprite_tree9.coord_x = 40; - sprite_tree9.coord_y = 450; - - set_fixed_sprite(sprite_tree9); - - sprite_fixed_t sprite_tree10; - sprite_tree10.ativo = 1; - sprite_tree10.data_register = 10; - sprite_tree10.offset = 4; - sprite_tree10.coord_x = 500; - sprite_tree10.coord_y = 450; - - set_fixed_sprite(sprite_tree10); - - sprite_fixed_t sprite_tree11; - sprite_tree11.ativo = 1; - sprite_tree11.data_register = 11; - sprite_tree11.offset = 4; - sprite_tree11.coord_x = 550; - sprite_tree11.coord_y = 350; - - set_fixed_sprite(sprite_tree11); - - // BASE DO CASTELO - polygon_t polygon_1; - polygon_1.data_register = 14; - polygon_1.type = 0; - polygon_1.size = 14; - polygon_1.ref_point_x = 450; - polygon_1.ref_point_y = 320; - polygon_1.R = 5; - polygon_1.G = 3; - polygon_1.B = 4; - - set_polygon(polygon_1); - - // TORRES DO CASTELO - - // TORRE 1 - polygon_t pol_tower_1; - pol_tower_1.data_register = 5; - pol_tower_1.type = 0; - pol_tower_1.size = 2; - pol_tower_1.ref_point_x = 390; - pol_tower_1.ref_point_y = 235; - pol_tower_1.R = 5; - pol_tower_1.G = 3; - pol_tower_1.B = 4; - - set_polygon(pol_tower_1); - - polygon_t pol_tower_11; - pol_tower_11.data_register = 6; - pol_tower_11.type = 0; - pol_tower_11.size = 2; - pol_tower_11.ref_point_x = 390; - pol_tower_11.ref_point_y = 220; - pol_tower_11.R = 5; - pol_tower_11.G = 3; - pol_tower_11.B = 4; - - set_polygon(pol_tower_11); - - // TORRE 2 - polygon_t pol_tower_2; - pol_tower_2.data_register = 7; - pol_tower_2.type = 0; - pol_tower_2.size = 2; - pol_tower_2.ref_point_x = 510; - pol_tower_2.ref_point_y = 235; - pol_tower_2.R = 5; - pol_tower_2.G = 3; - pol_tower_2.B = 4; - - set_polygon(pol_tower_2); - - polygon_t pol_tower_22; - pol_tower_22.data_register = 8; - pol_tower_22.type = 0; - pol_tower_22.size = 2; - pol_tower_22.ref_point_x = 510; - pol_tower_22.ref_point_y = 220; - pol_tower_22.R = 5; - pol_tower_22.G = 3; - pol_tower_22.B = 4; - - set_polygon(pol_tower_22); - - // TORRE 3 - polygon_t pol_tower_3; - pol_tower_3.data_register = 9; - pol_tower_3.type = 0; - pol_tower_3.size = 2; - pol_tower_3.ref_point_x = 450; - pol_tower_3.ref_point_y = 235; - pol_tower_3.R = 5; - pol_tower_3.G = 3; - pol_tower_3.B = 4; - - set_polygon(pol_tower_3); - - polygon_t pol_tower_33; - pol_tower_33.data_register = 10; - pol_tower_33.type = 0; - pol_tower_33.size = 2; - pol_tower_33.ref_point_x = 450; - pol_tower_33.ref_point_y = 210; - pol_tower_33.R = 5; - pol_tower_33.G = 3; - pol_tower_33.B = 4; - - set_polygon(pol_tower_33); - - // TELHADOS - polygon_t pol_tel_1; - pol_tel_1.data_register = 11; - pol_tel_1.type = 1; - pol_tel_1.size = 3; - pol_tel_1.ref_point_x = 390; - pol_tel_1.ref_point_y = 185; - pol_tel_1.R = 3; - pol_tel_1.G = 1; - pol_tel_1.B = 1; - - set_polygon(pol_tel_1); - - polygon_t pol_tel_2; - pol_tel_2.data_register = 12; - pol_tel_2.type = 1; - pol_tel_2.size = 3; - pol_tel_2.ref_point_x = 510; - pol_tel_2.ref_point_y = 185; - pol_tel_2.R = 3; - pol_tel_2.G = 1; - pol_tel_2.B = 1; - - set_polygon(pol_tel_2); - - polygon_t pol_tel_3; - pol_tel_3.data_register = 13; - pol_tel_3.type = 1; - pol_tel_3.size = 5; - pol_tel_3.ref_point_x = 450; - pol_tel_3.ref_point_y = 165; - pol_tel_3.R = 3; - pol_tel_3.G = 1; - pol_tel_3.B = 1; - - set_polygon(pol_tel_3); - - // PORTA DO CASTELO - polygon_t pol_door; - pol_door.data_register = 4; - pol_door.type = 0; - pol_door.size = 5; - pol_door.ref_point_x = 450; - pol_door.ref_point_y = 365; - pol_door.R = 3; - pol_door.G = 1; - pol_door.B = 1; - - set_polygon(pol_door); - - // SOL - polygon_t pol_sun; - pol_sun.data_register = 1; - pol_sun.type = 0; - pol_sun.size = 5; - pol_sun.ref_point_x = 80; - pol_sun.ref_point_y = 80; - pol_sun.R = 7; - pol_sun.G = 5; - pol_sun.B = 0; - - set_polygon(pol_sun); - - // NÚVENS - ground_block_t block_cloud; - block_cloud.R = 7; - block_cloud.G = 7; - block_cloud.B = 7; - - block_cloud.address = 500; - set_background_block(block_cloud); - block_cloud.address = 501; - set_background_block(block_cloud); - block_cloud.address = 502; - set_background_block(block_cloud); - block_cloud.address = 503; - set_background_block(block_cloud); - - block_cloud.address = 579; - set_background_block(block_cloud); - block_cloud.address = 580; - set_background_block(block_cloud); - block_cloud.address = 581; - set_background_block(block_cloud); - block_cloud.address = 582; - set_background_block(block_cloud); - block_cloud.address = 583; - set_background_block(block_cloud); - block_cloud.address = 584; - set_background_block(block_cloud); - - block_cloud.address = 905; - set_background_block(block_cloud); - block_cloud.address = 906; - set_background_block(block_cloud); - block_cloud.address = 907; - set_background_block(block_cloud); - block_cloud.address = 908; - set_background_block(block_cloud); - - block_cloud.address = 984; - set_background_block(block_cloud); - block_cloud.address = 985; - set_background_block(block_cloud); - block_cloud.address = 986; - set_background_block(block_cloud); - block_cloud.address = 987; - set_background_block(block_cloud); - block_cloud.address = 988; - set_background_block(block_cloud); - block_cloud.address = 989; - set_background_block(block_cloud); + return new_sprite; } + +// u8_t select_sprite(char sprite_name) { +// u8_t pixel_data[400][3]; + +// switch (sprite_name) { +// case FROG: +// pixel_data = { +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {3, 7, 4}, {6, 7, 7}, +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {3, 7, 4}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {7, 7, 7}, {7, 7, 7}, {3, +// 7, 4}, {6, 7, 7}, {6, 7, 7}, {3, 7, 4}, {7, 7, 7}, {7, 7, 7}, {3, 7, 4}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {7, 7, 7}, {3, 7, 4}, {3, 7, 4}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, +// {6, 7, 7}, {7, 7, 7}, {1, 5, 2}, {1, 5, 2}, {7, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {2, 5, 3}, {1, 5, 2}, {1, +// 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {2, 5, 3}, +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, +// 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, +// 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, +// {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, +// 2}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {1, 5, 2}, {5, 6, 1}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 6, 1}, +// {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {1, 5, 2}, {5, 7, 0}, {5, 6, 1}, {5, 6, 1}, {5, 6, 1}, {5, 6, 1}, {5, 6, 1}, {5, 6, 1}, {5, +// 7, 0}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, +// {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, +// 0}, {5, 7, 0}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, +// {5, 7, 0}, {3, 5, 0}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {2, 5, 3}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, 0}, {5, +// 7, 0}, {3, 5, 0}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {2, 5, 3}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, +// {2, 5, 3}, {2, 5, 3}, {2, 5, 3}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, {5, 7, +// 0}, {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {2, 5, 3}, {2, 5, 3}, {2, 5, 3}, {6, 7, 7}, {6, +// 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {3, 5, 0}, {5, 7, 0}, {5, 7, 0}, +// {5, 7, 0}, {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {1, 5, 2}, {6, 7, +// 7}, {6, 7, 7}, {0, 3, 1}, {0, 3, 1}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, 7, 7}, {3, 5, 0}, {5, +// 7, 0}, {5, 7, 0}, {3, 5, 0}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {0, 3, 1}, {0, 3, 1}, +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {6, 7, +// 7}, {3, 5, 0}, {3, 5, 0}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, +// {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {1, 5, 2}, {6, 7, 7}, {1, 5, 2}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {0, 2, 1}, {0, 3, 1}, {0, 3, 1}, {6, 7, 7}, {6, 7, 7}, {0, +// 3, 1}, {6, 7, 7}, {0, 3, 1}, {0, 3, 1}, {6, 7, 7}, {0, 3, 1}, {6, 7, 7}, {6, 7, 7}, {0, 3, 1}, {0, 3, 1}, +// {0, 2, 1}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}}; +// break; + +// case A_font: +// pixel_data = { +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {5, 4, 0}, {5, 4, 0}, {5, 4, 0}, +// {5, 4, 0}, {5, 4, 0}, {5, 4, 0}, {5, 4, 0}, {5, 4, 0}, {5, 4, 0}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, +// 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {6, 7, 7}, {6, 7, 7}, +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, +// 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, +// {7, 6, 0}, {7, 6, 0}, {7, 0, 1}, {7, 0, 1}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, +// 0}, {7, 6, 0}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, +// 6, 0}, {7, 6, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, +// {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, +// 0}, {7, 6, 0}, {7, 6, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, +// 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {6, 7, 7}, {6, 7, 7}, {5, 4, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, +// {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 0, 1}, {5, 0, 0}, {5, 0, 0}, {7, 0, 1}, {7, 6, 0}, {7, 6, 0}, {7, 6, +// 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {7, 6, 0}, {6, 7, 7}, {6, 7, 7}, {5, 4, 3}, {7, 7, 4}, {7, 7, 4}, {7, +// 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 0, 1}, {6, 7, 7}, {6, 7, 7}, {7, 0, 1}, {7, 7, 4}, {7, 7, 4}, +// {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {6, 7, 7}, {6, 7, 7}, {5, 4, 3}, {7, 7, 4}, {7, 7, +// 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, +// 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {7, 7, 4}, {6, 7, 7}, {6, 7, 7}, {5, 2, 0}, {7, 3, 0}, +// {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, +// 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {6, 7, 7}, {6, 7, 7}, {5, 2, 0}, {7, +// 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, +// {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {6, 7, 7}, {6, 7, 7}, {5, 2, +// 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, +// 0, 1}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {6, 7, 7}, {6, 7, 7}, +// {5, 2, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, +// 1}, {7, 0, 1}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {6, 7, 7}, {6, +// 7, 7}, {5, 2, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {5, 0, 0}, {5, 0, 0}, +// {5, 0, 0}, {5, 0, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {7, 3, 0}, {6, 7, +// 7}, {6, 7, 7}, {5, 0, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, +// {6, 7, 7}, {6, 7, 7}, {5, 0, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, +// 0, 1}, {6, 7, 7}, {6, 7, 7}, {5, 0, 0}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, +// {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, 1}, {7, 0, +// 1}, {7, 0, 1}, {6, 7, 7}, {6, 7, 7}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, {5, +// 0, 0}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, {5, 0, 0}, +// {5, 0, 0}, {5, 0, 0}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, +// 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, +// 7, 7}, {6, 7, 7}, {6, 7, 7}, {6, 7, 7}}; +// break; + +// case C_font: +// pixel_data = ; +// break; + +// default: +// break; +// } +// } \ No newline at end of file diff --git a/src/GraphSync.h b/src/GraphSync.h index 4065009..b043574 100644 --- a/src/GraphSync.h +++ b/src/GraphSync.h @@ -1,7 +1,6 @@ #include #include "utils/types.h" -#include "utils/ui.h" // Structure definition for dynamic sprite typedef struct sprite_t sprite_t; @@ -124,4 +123,10 @@ void clean_polygon(); void clean_background(); +sprite_t set_new_sprite(u16_t sprite_offset); + void draw_picture(); + +u8_t increase_coordinate_sprite(sprite_t *sprite); + +u8_t collision(sprite_t *sp1, sprite_t *sp2); \ No newline at end of file diff --git a/src/Makefile b/src/Makefile index 01b4653..9d62430 100644 --- a/src/Makefile +++ b/src/Makefile @@ -8,7 +8,7 @@ KERNEL_DIR = /lib/modules/$(shell uname -r)/build SOURCES = GraphSync.c main.c # All *.h files. -HEADERS = utils/ui.h utils/types.h GraphSync.h +HEADERS = utils/types.h GraphSync.h all: build kernel @@ -17,16 +17,19 @@ build: build/dir build/main build/dir: @mkdir -p build -build/main: build/GraphSync.o build/aux.o build/main.o - @gcc build/GraphSync.o build/aux.o build/main.o -o build/main +build/main: build/GraphSync.o build/main.o build/Device_manager.o build/State_machine.o + @gcc build/GraphSync.o build/main.o build/Device_manager.o build/State_machine.o -o build/main -build/aux.o: utils/aux.c utils/types.h - @gcc -c utils/aux.c -o build/aux.o -Isrc -Iutils - -build/GraphSync.o: GraphSync.c GraphSync.h utils/ui.h utils/types.h build/aux.o +build/GraphSync.o: GraphSync.c GraphSync.h utils/ui.h utils/types.h @gcc -c GraphSync.c -o build/GraphSync.o -Isrc -Iutils -build/main.o: main.c GraphSync.h utils/ui.h utils/types.h +build/Device_manager.o: Device_manager.c Device_manager.h utils/ui.h utils/types.h + @gcc -c Device_manager.c -o build/Device_manager.o -Isrc -Iutils + +build/State_machine.o: State_machine.c State_machine.h utils/types.h + @gcc -c State_machine.c -o build/State_machine.o -Isrc -Iutils + +build/main.o: main.c GraphSync.h utils/ui.h utils/types.h @gcc -c main.c -o build/main.o -Isrc -Iutils run: build diff --git a/src/State_machine.c b/src/State_machine.c new file mode 100644 index 0000000..99731d9 --- /dev/null +++ b/src/State_machine.c @@ -0,0 +1,57 @@ +#include "State_machine.h" + +void change_state(u64_t *state, u64_t *button) { + switch (*state) { + case INICIO: + + if (*button == 0b0111) { + *state = JOGO; + while (*button == 0b0111) { + /* code */ + } + } + + else { + *state = INICIO; + } + + break; + + case JOGO: + if (*button == 0b0111) { + *state = PAUSA; + while (*button == 0b0111) { + /* code */ + } + } else { + *state = JOGO; + } + // set_dynamic_sprite(sprite_car); + + break; + + case PAUSA: + + if (*button == 0b0111) { + *state = JOGO; + while (*button == 0b0111) { + /* code */ + } + } else if (*button == 0b1011) { + *state = REINICIAR; + } else if (*button == 0b1101) { + *state = INICIO; + } else { + *state = PAUSA; + } + break; + + case REINICIAR: + sleep(2); + *state = JOGO; + break; + + default: + break; + } +} \ No newline at end of file diff --git a/src/State_machine.h b/src/State_machine.h new file mode 100644 index 0000000..6893f59 --- /dev/null +++ b/src/State_machine.h @@ -0,0 +1,13 @@ +#ifndef STATE_MACHINE_H_ +#define STATE_MACHINE_H_ + +#include "utils/types.h" + +#define INICIO 0 +#define JOGO 1 +#define PAUSA 2 +#define REINICIAR 3 + +void change_state(u64_t *state, u64_t *button); + +#endif // STATE_MACHINE_H_ \ No newline at end of file diff --git a/src/kernel/gpp_data_bus.c b/src/kernel/gpp_data_bus.c index b7a9522..4086244 100644 --- a/src/kernel/gpp_data_bus.c +++ b/src/kernel/gpp_data_bus.c @@ -158,7 +158,7 @@ static ssize_t data_bus_write(struct file *filep, const char *buffer, size_t len instruction_buffer = ioread32(wrfull_mem); while (instruction_buffer) { - msleep(10); + // msleep(10); instruction_buffer = ioread32(wrfull_mem); if (instruction_buffer == 0) { break; diff --git a/src/main.c b/src/main.c index 8f47010..6b08146 100644 --- a/src/main.c +++ b/src/main.c @@ -1,21 +1,80 @@ #include #include +#include #include #include #include #include +#include +#include #include +#include "Device_manager.h" #include "GraphSync.h" +#include "State_machine.h" + +#define HEX5_BASE 0x10 +#define HEX4_BASE 0x20 +#define HEX3_BASE 0x30 +#define HEX2_BASE 0x40 +#define HEX1_BASE 0x50 +#define HEX0_BASE 0x60 + +#define HEX5_BASE_PHY (LW_VIRTUAL + HEX5_BASE) +#define HEX4_BASE_PHY (LW_VIRTUAL + HEX4_BASE) +#define HEX3_BASE_PHY (LW_VIRTUAL + HEX3_BASE) +#define HEX2_BASE_PHY (LW_VIRTUAL + HEX2_BASE) +#define HEX1_BASE_PHY (LW_VIRTUAL + HEX1_BASE) +#define HEX0_BASE_PHY (LW_VIRTUAL + HEX0_BASE) + +#define INICIO 0 +#define JOGO 1 +#define PAUSA 2 +#define REINICIAR 3 + +#define KEY_BASE 0x0 + +#define LW_BRIDGE_SPAN 0x00005000 +#define LW_BRIDGE_BASE 0xff200000 + +static u64_t fd_mouse = -1; +static u64_t fd_map = -1; +static void* LW_virtual = NULL; int main(void) { - clean_polygon(); - clean_sprite(); - clean_background(); + // --------------------- TESTE DA MUDANÇA DE TELA COM OS BOTÕES ------------------------------------- + + sprite_t sprite_car; + sprite_car.coord_x = 50; + sprite_car.coord_y = 10; + sprite_car.step_x = 1; + sprite_car.step_y = 0; + sprite_car.offset = 8; + sprite_car.ativo = 1; + + mouse_t mouse = init_mouse(fd_mouse); + u64_t* KEY_ptr = (u64_t*)read_KEY(fd_map, LW_virtual); + u64_t state_game = INICIO; + + set_background_color(6, 7, 7); + + while (1) { + change_state(&state_game, KEY_ptr); + + if (state_game == INICIO) { + set_background_color(1, 1, 1); + + } else if (state_game == JOGO) { + set_background_color(6, 1, 1); + set_dynamic_sprite(sprite_car); - sleep(5); + } else if (state_game == PAUSA) { + set_background_color(1, 6, 1); - draw_picture(); + } else if (state_game == REINICIAR) { + set_background_color(1, 1, 6); + } + } return 0; } diff --git a/src/makingSprite.py b/src/makingSprite.py new file mode 100644 index 0000000..8faa132 --- /dev/null +++ b/src/makingSprite.py @@ -0,0 +1,26 @@ +from PIL import Image + +spritePixels = Image.open("docs/frog.png") + +matrizRGB = [] +rgb = [] + +for line in range(20): + for col in range(20): + coordinates = col, line + rgbValues = spritePixels.getpixel(coordinates) + rgb.append(rgbValues[:3]) + +transparentColor = [6, 7, 7] + +for color in rgb: + if color == (0, 0, 0): + matrizRGB.append(transparentColor) + else: + newColor = [] + for number in color: + convertedRGB = int(number/32) + newColor.append(convertedRGB) + matrizRGB.append(newColor) + +print(matrizRGB) diff --git a/src/utils/aux.c b/src/utils/aux.c deleted file mode 100644 index d244a29..0000000 --- a/src/utils/aux.c +++ /dev/null @@ -1,55 +0,0 @@ -#include "aux.h" - -#include -#include - -void reverse(char str[], u32_t length) { - u32_t start = 0; - u32_t end = length - 1; - - while (start < end) { - char temp = str[start]; - str[start] = str[end]; - str[end] = temp; - start++; - end--; - } -} - -char* itoa(u32_t num, char* str, u32_t base) { - u32_t i = 0; - u32_t isNegative = 0; - - if (num == 0) { - str[i++] = '0'; - str[i] = '\0'; - return str; - } - - if (num < 0 && base == 10) { - isNegative = 1; - num = -num; - } - - while (num != 0) { - int rem = num % base; - str[i++] = (rem > 9) ? (rem - 10) + 'a' : rem + '0'; - num = num / base; - } - - if (isNegative) { - str[i++] = '-'; - } - - str[i] = '\0'; - - reverse(str, i); - - return str; -} - -int clamp(int value, int min, int max) { - if (value < min) return min; - if (value > max) return max; - return value; -} \ No newline at end of file diff --git a/src/utils/aux.h b/src/utils/aux.h deleted file mode 100644 index cc6e05f..0000000 --- a/src/utils/aux.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef AUX_H_ -#define AUX_H_ - -#include "types.h" // Include necessary for u32_t type definition - -/** - * @brief Reverses a string. - * - * This function reverses the characters in the given string `str` of length `length`. - * - * @param str The string to be reversed. - * @param length The length of the string. - */ -void reverse(char str[], u32_t length); - -/** - * @brief Converts an unsigned integer to a string representation in a specified base. - * - * This function converts the unsigned integer `num` to a string `str` in the given `base`. - * The base must be between 2 and 36 (inclusive). The function returns a pointer to `str`. - * - * @param num The unsigned integer to be converted. - * @param str The buffer to store the resulting string. - * @param base The base for conversion (must be between 2 and 36). - * @return A pointer to the resulting string `str`. - */ -char* itoa(u32_t num, char* str, u32_t base); - -/** - * @brief Clamps a value within a specified range. - * - * This function ensures that the given `value` is within the inclusive range specified by `min` and `max`. - * If `value` is less than `min`, it returns `min`. If `value` is greater than `max`, it returns `max`. - * Otherwise, it returns `value` unchanged. - * - * @param value The value to be clamped. - * @param min The minimum allowable value. - * @param max The maximum allowable value. - * @return The clamped value. - */ -int clamp(int value, int min, int max); - -#endif // !AUX_H_