Files
Projet_Embarque_1ere/src/main.c
T

225 lines
4.9 KiB
C

/*
===============================================================================
Name : labo2 Ecran SPI
Author : M-Rohmer
Copyright : HES-SO hepia
Year : 2024
===============================================================================
*/
#include "config_LPC1769.h"
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
#include "GPIO.h"
#include "SPI.h"
const Point SCREEN_ORIGIN = {0,0};
const Size SCREEN_SIZE = {240,320};
const Rectangle SCREEN = {SCREEN_ORIGIN,SCREEN_SIZE};
Player player;
void init(void)
{
ILI9341_Initial();
}
int scrolling = 0;
bool need_to_scroll = false;
bool on = true;
void TIMER0_IRQHandler(void){
//8000HZ smaple rate
ClearTimer0();
SetAudio(800);
on = true;
SetAudio(200);
}
void EINT3_IRQHandler(void){
int buttonPressed = Detect_AB_buttons();
if(buttonPressed == 2){
//button A pressed
}else{
//button B pressed
}
ClearButtons();
}
int timer_count = 0;
int scroller_divider = 25;
int scroll_increment = 1;
void increment_scroll(int value){
scrolling += value;
if(scrolling <= 0)
scrolling = 319;
if(scrolling >= 320)
scrolling = 1;
}
void SysTick_Handler(){
timer_count += 1;
//update the screen
if(timer_count >= scroller_divider){
increment_scroll(-scroll_increment);
need_to_scroll = true;
timer_count = 0;
}
}
int number_of_digits (int value){
int interVal = value;
int count = 0;
while(interVal > 0){
interVal = interVal /10;
count ++;
}
return count;
}
void convert_to_string(int value, int nbr_digits, char* str){
for(int i = nbr_digits-1; i >= 0; i--){
int interVal = value;
interVal /= 10;
int res = value - interVal * 10;
str[i] = '0'+res;
value /= 10;
}
str[nbr_digits] = '\0';
}
void scroll_array(int **array,int **newArray,int width,int height){
for(int y = 0;y < height;y++){
for(int x = 0;x < width;x++){
if(y < height-1 && x < width -1)
newArray[x+1][y+1] = array[x][y];
}
}
}
Player CreatePlayer(){
int HP = 100;
Size playerSize = {32,32};
Point position = {SCREEN_SIZE.Width / 2 - playerSize.Width /2,SCREEN_SIZE.Height / 2 - playerSize.Height/2};
Rectangle playerHitbox = {position,playerSize};
Player player = {playerHitbox,HP};
return player;
}
int min(int x,int y){
if(x > y){
return y;
}else{
return x;
}
}
void RefreshPlayer(Point vector){
if(player.Hitbox.Position.Y + vector.Y < 0){
//player.Hitbox.Position.Y = SCREEN_SIZE.Height + (player.Hitbox.Position.Y - (0-vector.Y));
player.Hitbox.Position.Y = player.Hitbox.Position.Y & SCREEN_SIZE.Height;
}else{
if(player.Hitbox.Position.Y + vector.Y >= SCREEN_SIZE.Height){
player.Hitbox.Position.Y = vector.Y - (SCREEN_SIZE.Height - player.Hitbox.Position.Y);
}else{
player.Hitbox.Position.Y += vector.Y;
}
}
player.Hitbox.Position.X += vector.X;
if(player.Hitbox.Position.X + player.Hitbox.Size.Width >= SCREEN_SIZE.Width)
player.Hitbox.Position.X = SCREEN_SIZE.Width - player.Hitbox.Size.Width -1;
if(player.Hitbox.Position.X < 0)
player.Hitbox.Position.X = 0;
Size bigSize = {0,0};
bigSize.Width = player.Hitbox.Size.Width + abs(vector.X);
bigSize.Height = player.Hitbox.Size.Height + abs(vector.Y);
Point bigPos = {0,0};
bigPos.X = min(player.Hitbox.Position.X, player.Hitbox.Position.X - vector.X);
bigPos.Y = min(player.Hitbox.Position.Y, player.Hitbox.Position.Y - vector.Y);
bigPos.Y = bigPos.Y % SCREEN_SIZE.Height;
Refresh_Player_Area((Rectangle){bigPos,bigSize},player.Hitbox);
//Rectangle rect = player.Hitbox;
//rect.Position = (Point){0,0};
//DrawPlayer(player,rect);
}
int main(void) {
init();
InitButtons();
InitTimer();
InitAudio();
LedSetState8(128+32+8+2);
Point text_origin = {240 / 2 - 8/2,(320 / 6) * 5 - 4};
player = CreatePlayer();
Resize_Window(SCREEN);
Draw_stars();
int increment = 3;
Point momentum = {0,0};
Size charSize = {7,11};
while (true)
{
int JoystickState = JoystickGetState();
Point vec = {0,0};
if(JoystickState & (1 << 4)){
vec.X -= increment;
}
if(JoystickState & (1 << 3)){
vec.Y += increment;
}
if(JoystickState & (1 << 2)){
vec.X += increment;
}
if(JoystickState & (1 << 1)){
vec.Y -= increment;
}
if(need_to_scroll){
//Refresh_Area((Rectangle){text_origin,(Size){charSize.Width * 3,charSize.Height}});
scroll(scrolling);
player.Hitbox.Position.Y -= 1;
need_to_scroll = false;
int digits = number_of_digits(scrolling);
char newStr[digits+1];
convert_to_string(scrolling,digits,&newStr);
Point new_origin = {text_origin.X,(text_origin.Y + scrolling)%320};
Rectangle areaToRefresh = {{new_origin.X,new_origin.Y+3},{charSize.Width* 4,charSize.Height+5}};
Refresh_Area(areaToRefresh);
DrawText(new_origin,newStr,charSize);
}
momentum.X += vec.X;
momentum.Y += vec.Y;
if(momentum.X > 20)
momentum.X = 20;
if(momentum.X < -25)
momentum.X = -25;
if(momentum.Y > 20)
momentum.Y = 20;
if(momentum.Y < -20)
momentum.Y = -20;
RefreshPlayer(momentum);
}
}