Dependencies:   mbed

main.cpp

Committer:
HenryWTriff
Date:
2020-02-19
Revision:
6:5f76dd718dc3
Parent:
5:2d9f3c36bcb9
Child:
7:2ce6e90f6d47

File content as of revision 6:5f76dd718dc3:

/*
ELEC2645 Embedded Systems Project
School of Electronic & Electrical Engineering
University of Leeds
2019/20

Name: Henry Triff
Username: el18ht
Student ID Number: 201224295
Date: 10/02/2020
*/

//LIBRARIES
#include "mbed.h"
#include "Gamepad.h"
#include "N5110.h"
#include "FXOS8700CQ.h"
#include "Graphics.h"
#include "Controls.h"
#include "Mechanics.h"
#include "Menu.h"
#include "LEDs.h"
#include "Ghost.h"
#include <string>

//OBJECTS
Gamepad Device;
N5110 LCD;
FXOS8700CQ Gyro(I2C_SDA,I2C_SCL);
Graphics Graphics;
Controls Controls;
Mechanics Mechanics;
Menu Menu;
LEDs LEDs;
Ghost Ghost;

#ifndef STRUCTS
#define STRUCTS

//STRUCTS
struct Point_2D {
    float x;
    float y;
};
struct Line_2D {
    Point_2D from;
    Point_2D to;
};

struct Square_2D {
    Point_2D TL;
    Point_2D BR;
};
struct Triangle_2D {
    Point_2D TL;
    Point_2D BR;
    int Type;
};

struct Map_Data {
    int number_of_track_lines;
    int number_of_dotted_lines;
    int number_of_flags;
    int number_of_walls;
    int number_of_off_track_squares;
    int number_of_off_track_triangles;
    int number_of_out_of_bounds_squares;
    int number_of_out_of_bounds_triangles;
    int number_of_gates;
    int number_of_boost_plates;
};

struct Time {
    int mins;
    int secs;
    int milis;
};

struct Gyro_Data {
    float ax;
    float ay;
    float az;
    float mx;
    float my;
    float mz;
};

#endif

//MAP - 1
Map_Data Map_1 = {36,1,2,20,14,19,9,5,12,0};

//Lines
const Line_2D Map_1_Track_Lines[36] = {
    //Inside Line
    {{-20,0},{-20,80}},
    {{-20,80},{-40,100}},
    {{-40,100},{-80,100}},
    {{-80,100},{-100,80}},
    {{-100,80},{-100,40}},
    {{-100,40},{-140,0}},
    {{-140,0},{-220,0}},
    {{-220,0},{-260,40}},
    {{-260,40},{-260,80}},
    {{-260,80},{-280,100}},
    {{-280,100},{-320,100}},
    {{-320,100},{-360,60}},
    {{-360,60},{-360,-100}},
    {{-360,-100},{-300,-160}},
    {{-300,-160},{-220,-80}},
    {{-220,-80},{-100,-80}},
    {{-100,-80},{-20,0}},
    //Outside Line
    {{20,-20},{20,100}},
    {{20,100},{-20,140}},
    {{-20,140},{-100,140}},
    {{-100,140},{-140,100}},
    {{-140,100},{-140,60}},
    {{-140,60},{-160,40}},
    {{-160,40},{-200,40}},
    {{-200,40},{-220,60}},
    {{-220,60},{-220,100}},
    {{-220,100},{-260,140}},
    {{-260,140},{-340,140}},
    {{-340,140},{-400,80}},
    {{-400,80},{-400,-120}},
    {{-400,-120},{-320,-200}},
    {{-320,-200},{-280,-200}},
    {{-280,-200},{-200,-120}},
    {{-200,-120},{-80,-120}},
    {{-80,-120},{20,-20}},
};

//Dotted Lines
const Line_2D Map_1_Track_Dotted_Lines[1] = {
    {{-20,0},{20,0}},
};

//Flags
Point_2D Map_1_Flags[2] = {
    {-20,0},
    {24,0}
};

//Walls
Line_2D Map_1_Walls[20] = {
    //Inside
    {{-40,80},{-40,0}},
    {{-40,0},{-100,-60}},
    {{-100,-60},{-240,-60}},
    {{-240,-60},{-300,-120}},
    {{-300,-120},{-340,-60}},
    {{-340,-60},{-340,60}},
    {{-340,60},{-280,60}},
    {{-280,60},{-280,-20}},
    {{-280,-20},{-100,-20}},
    {{-100,-20},{-80,0}},
    {{-80,0},{-80,80}},
    {{-80,80},{-40,80}},
    //Outside
    {{40,160},{40,-220}},
    {{40,-220},{-420,-220}},
    {{-420,-220},{-420,160}},
    {{-420,160},{-200,160}},
    {{-200,160},{-200,60}},
    {{-200,60},{-160,60}},
    {{-160,60},{-160,160}},
    {{-160,160},{40,160}},
};

//Off track? objects
Square_2D Map_1_Off_Track_Square[14] = {
    //Inside
    {{-100,80},{-20,0}},
    {{-80,100},{-40,80}},
    {{-260,0},{-100,-80}},
    {{-360,60},{-260,-100}},
    {{-320,100},{-280,60}},
    {{-280,80},{-260,60}},
    {{-300,-100},{-260,-120}},
    {{-200,60},{-60,40}},
    {{-220,140},{-140,60}},
    {{-200,-120},{20,-200}},
    {{-400,200},{20,140}},
    {{-500,200},{-400,-300}},
    {{20,200},{100,-300}},
    {{-400,-200},{20,-300}}
};

//Off track? objects
Triangle_2D Map_1_Off_Track_Triangle[19] = {
    {{-40,100},{-20,80},1},
    {{-100,100},{-80,80},4},
    {{-140,40},{-100,0},4},
    {{-100,0},{-20,-80},2}, //
    {{-260,40},{-220,0},1},
    {{-260,-80},{-220,-120},2},
    {{-200,-120},{-260,-160},2},
    {{-280,100},{-260,80},1},
    {{-360,100},{-320,60},4},
    {{-360,-100},{-300,-160},3},
    //Outside
    {{-20,140},{20,100},3},
    {{-80,-20},{20,-120},4},
    {{-140,140},{-100,100},2},
    {{-160,60},{-140,40},2}, //
    {{-220,60},{-200,40},3},
    {{-280,-120},{-200,-200},4},
    {{-260,140},{-240,100},3},
    {{-400,140},{-340,80},2}, //
    {{-400,-120},{-320,-200},1}
};

Square_2D Map_1_Out_Of_Bounds_Square[9] = {
    //Inside
    {{-80,80},{-40,0}},
    {{-340,60},{-280,-60}},
    {{-280,-20},{-100,-60}},
    {{-80,0},{-60,-20}},
    //Outside
    {{40,160},{60,-220}},
    {{-420,-220},{40,-240}},
    {{-440,160},{-420,-220}},
    {{-420,180},{40,160}},
    {{-200,160},{-160,60}}
};

Triangle_2D Map_1_Out_Of_Bounds_Triangle[5] = {
    //Inside
    {{-60,0},{-40,-20},2},
    {{-100,0},{-80,-20},4},
    {{-100,-20},{-60,-60},2},
    {{-300,-60},{-240,-120},2},
    {{-340,-60},{-300,-120},3}
};

Square_2D Map_1_Gates[12] = {
    {{-40,0},{40,-10}},
    {{-40,80},{40,70}},
    {{-80,160},{-70,80}},
    {{-160,70},{-80,60}},
    {{-200,60},{-190,-20}},
    {{-310,160},{-300,60}},
    {{-420,10},{-340,0}},
    {{-420,-90},{-300, -100}},
    {{-300,-100},{-290,-220}},
    {{-200,-60},{-190,-220}},
    {{-110,-60},{-100,-220}},
    {{-100,-40},{40,-60}}
};

Triangle_2D Map_1_Boost_Plates[0] = {
};

//GLOBAL VARIABLES

//Transform
int angle = 0;
Point_2D translation = {0,0};
float squish = 0.15;

//Vehicle parameters
float speed = 0;
float max_speed = 4;
int handling = 2;

//Mechanics
bool off_track = false;
bool out_of_bounds = false;
int lap_gate = 0;
int laps = 1;
int number_of_laps = 3;
bool direction = true;
int race_time = 0;
bool ghost_available = false;

//Game parameters
int game_fps = 50;
bool back_light = true;
bool leds = true;
bool rumble = true;
bool gyro_enabled = false;

int main()
{
    LCD.init();
    Device.init();
    Gyro.init();
    Graphics.Change_Contrast(LCD,Device);

    //MENU

    /*int main_option_selected;
    int settings_option_selected;

    while(main_option_selected != 1) {
        main_option_selected = Menu.Main_Menu(LCD, Device);

        if(main_option_selected == 2) {
            while(settings_option_selected != 0) {
                //settings_option_selected = Menu.Settings_Menu(LCD, Device);
                if(settings_option_selected == 1) {

                }
                if(settings_option_selected == 2) {

                }
                if(settings_option_selected == 3) {

                }

            }
        }
        if(main_option_selected == 3) {
            Menu.Credits_Menu(LCD, Device);
        }

    }*/

    while(1) {

        //COUNTDOWN

        LCD.clear();
        Graphics.Draw_Map(
            translation,
            angle,
            squish,
            (Line_2D *) Map_1_Track_Lines,
            (Line_2D *)Map_1_Track_Dotted_Lines,
            (Line_2D *)Map_1_Walls,
            (Point_2D *)Map_1_Flags,
            (Triangle_2D *)Map_1_Boost_Plates,
            Map_1,
            Ghost.Play(ghost_available, race_time),
            LCD
        );
        Graphics.Start_Sequence(3, LCD);
        LCD.refresh();
        wait(1);

        LCD.clear();
        Graphics.Draw_Map(
            translation,
            angle,
            squish,
            (Line_2D *) Map_1_Track_Lines,
            (Line_2D *)Map_1_Track_Dotted_Lines,
            (Line_2D *)Map_1_Walls,
            (Point_2D *)Map_1_Flags,
            (Triangle_2D *)Map_1_Boost_Plates,
            Map_1,
            Ghost.Play(ghost_available, race_time),
            LCD
        );
        Graphics.Start_Sequence(2, LCD);
        LEDs.Start_Sequence(back_light, 2, Device);
        LCD.refresh();
        wait(1);

        LCD.clear();
        Graphics.Draw_Map(
            translation,
            angle,
            squish,
            (Line_2D *) Map_1_Track_Lines,
            (Line_2D *)Map_1_Track_Dotted_Lines,
            (Line_2D *)Map_1_Walls,
            (Point_2D *)Map_1_Flags,
            (Triangle_2D *)Map_1_Boost_Plates,
            Map_1,
            Ghost.Play(ghost_available, race_time),
            LCD
        );
        Graphics.Start_Sequence(1, LCD);
        LEDs.Start_Sequence(back_light, 1, Device);
        LCD.refresh();
        wait(1);
        LCD.clear();
        Graphics.Draw_Map(
            translation,
            angle,
            squish,
            (Line_2D *) Map_1_Track_Lines,
            (Line_2D *)Map_1_Track_Dotted_Lines,
            (Line_2D *)Map_1_Walls,
            (Point_2D *)Map_1_Flags,
            (Triangle_2D *)Map_1_Boost_Plates,
            Map_1,
            Ghost.Play(ghost_available, race_time),
            LCD
        );
        Graphics.Start_Sequence(0, LCD);
        LEDs.Start_Sequence(back_light, 0, Device);
        LCD.refresh();
        wait(1);
        LEDs.Clear(Device);

        while(laps <= number_of_laps) {
            //MECHANICS
            off_track = Mechanics.Is_Offtrack(translation, Map_1_Off_Track_Square, Map_1_Off_Track_Triangle, Map_1);
            out_of_bounds = Mechanics.Is_Out_Of_Bounds(translation, Map_1_Out_Of_Bounds_Square, Map_1_Out_Of_Bounds_Triangle, Map_1);
            laps = Mechanics.Get_Laps(laps, Map_1_Gates, Map_1.number_of_gates, translation, lap_gate);
            lap_gate = Mechanics.Get_Gate(Map_1_Gates, Map_1.number_of_gates, translation, lap_gate);

            //CONTROLS
            angle = Controls.Get_Angle(angle, handling, gyro_enabled, Gyro, Device);
            translation = Controls.Get_Translation(translation, angle, speed, out_of_bounds, Device);
            speed = Controls.Get_Speed(speed, max_speed, off_track, out_of_bounds, Device);
            speed = Mechanics.Get_Boost_Speed(Map_1_Boost_Plates, Map_1.number_of_boost_plates, translation, speed);

            //LEDS
            LEDs.Speed(leds, speed, max_speed, Device);

            //GHOST
            Ghost.Record(translation, race_time);

            //GRAPHICS
            LCD.clear();
            Graphics.Change_Contrast(LCD,Device);
            Graphics.Draw_Map(
                translation,
                angle,
                squish,
                (Line_2D *) Map_1_Track_Lines,
                (Line_2D *)Map_1_Track_Dotted_Lines,
                (Line_2D *)Map_1_Walls,
                (Point_2D *)Map_1_Flags,
                (Triangle_2D *)Map_1_Boost_Plates,
                Map_1,
                Ghost.Play(ghost_available, race_time),
                LCD
            );
            Graphics.Draw_Laps(laps, LCD);
            Graphics.Draw_Time(false, Mechanics.Convert_To_Time(game_fps, race_time), LCD);
            LCD.refresh();
            wait((1 / float(game_fps)));
            race_time++;

        }
        LEDs.Clear(Device);
        LCD.clear();
        Graphics.Draw_Map(
            translation,
            angle,
            squish,
            (Line_2D *) Map_1_Track_Lines,
            (Line_2D *)Map_1_Track_Dotted_Lines,
            (Line_2D *)Map_1_Walls,
            (Point_2D *)Map_1_Flags,
            (Triangle_2D *)Map_1_Boost_Plates,
            Map_1,
            Ghost.Play(ghost_available, race_time),
            LCD
        );
        Graphics.Finish(LCD);
        Graphics.Draw_Time(true, Mechanics.Convert_To_Time(game_fps, race_time), LCD);
        LCD.refresh();
        ghost_available = true;
        Ghost.Copy(race_time);

        //RESET
        angle = 0;
        Point_2D test = {0,0};
        translation = test;
        squish = 0.15;
        speed = 0;
        max_speed = 4;
        handling = 2;
        off_track = false;
        out_of_bounds = false;
        lap_gate = 0;
        laps = 1;
        direction = true;
        race_time = 0;

        wait(3);
    }
}