Kill the bit game for Real Time Assignment

Dependencies:   mbed C12832 mbed-rtos

main.cpp

Committer:
spearson93
Date:
2022-04-10
Revision:
2:7309680cbb76
Parent:
1:617a3879630b

File content as of revision 2:7309680cbb76:

#include "mbed.h"
#include "rtos.h"
#include "Timer.h"
#include "C12832.h"
#include "stdio.h"
#include "stdlib.h"
// Samuel Pearson 19064819
// Joystick push kills LED bit on left, if it is on
// If bit is not on, another is created
// Goal is to kill off all of the bits
// LEDs flash and speaker beeps on a win

DigitalOut myled1(LED1);
DigitalOut myled2(LED2);
DigitalOut myled3(LED3);
DigitalOut myled4(LED4);
DigitalIn pb(p14);        //the player hits the switch connected here to respond
PwmOut spkr(p26);
PwmOut RGBLED_r(p23);
PwmOut RGBLED_g(p24);
PwmOut RGBLED_b(p25);
C12832 lcd(p5, p7, p6, p8, p11);  

// mutex to make the lcd lib thread safe
Mutex lcd_mutex;
Mutex mtx;

Timer t1, t2;                  //used to measure the response time
int player1, player2, player2Ready, StartGame, GameFinished = 0;
float Player1Time, Player2Time = 0;

void display(int number)
{
    myled1 = (number) & 0x01;
    myled2 = (number>>1) & 0x01;
    myled3 = (number>>2) & 0x01;
    myled4 = (number>>3) & 0x01;
}

void measure (int value)                 // calls when the joystick is pressed
{         
  if (pb)
  {                            //Check if button is held
    lcd_mutex.lock();
    lcd.cls();
    lcd.printf("Button Press!\n");
    lcd_mutex.unlock();
  }
}

void calculate (float T1, float T2)
{
    mtx.lock();
    if (T1 < T2)
    {
        lcd.printf("Player 1 Wins!!\n");
    }
    if (T1 > T2)
    {
        lcd.printf("Player 2 Wins!\n");
    }
    if (T1 == T2)
    {
        lcd.printf("Game was a Draw, Try Again\n");
    }
    mtx.unlock();
}

void thread3(void const *args)
{
    while(true) // thread loop
    {         
        RGBLED_r = 0.7 + (rand() % 11)/20.0;
        RGBLED_g = 0.7 + (rand() % 11)/20.0;
        RGBLED_b = 0.7 + (rand() % 11)/20.0;
        Thread::wait(1667);    // wait 1.5s
    }
}

int main()
{
    while(1)
    {
    Thread t3(thread3); //RGB LED
    lcd.printf("Destroy the Bit - \n\r");
    lcd.printf("Player 1 Start\n\r");
    lcd.printf("Press Joystick to Start\n\r");
    unsigned int value = 0x12;
    spkr.period(1.0/2000.0);
    while (StartGame == 0)
    {
        if (pb)
        {
            StartGame = 1;
            player2 = 1;
            player1 = 0;
            t1.start();
            t2.start();
        }
    }
    while(StartGame == 1) 
    {
        if (player1 == 0)
        {
            lcd.cls();
            lcd.printf("Press Joystick to kill bit\n\r");
            value = value ^ pb;
            if (value == 0) {
                for (int i=0; i<5; ++i) {
                spkr = 0.5;
                lcd.cls();
                display(0x0F);
                wait(.5);
                display(0);
                spkr = 0.0;
                wait(.25);
            }
            t1.stop();
            value = 0x012;
            lcd_mutex.lock();
            lcd.printf("Player 1 Finished!!!!!!!\n\r");
            lcd.printf("Finish time - %f secs\n\r", t1.read());
            wait(2);
            lcd_mutex.unlock();
            Player1Time = t1.read();
            player1 = 1;
            player2 = 0;
            t1.reset();
            t2.reset();
        }
        value = ((value & 0x01)<<3) | value >> 1;
        display(value);
        measure(value);
        wait(.25);
        }            
        if (player2 == 0)
        {
            if (player2Ready == 0)
            {
            lcd.cls();
            lcd.printf("Player 2 Start\n\r");
            lcd.printf("Press JoyStick to Start\n\r");
            }
            while(player2Ready == 0)
            {
                if (pb)
            {
                t2.start();
                player2Ready = 1;
                }
            }
            lcd.cls();
            lcd.printf("Press Joystick to kill bit\n\r");
            value = value ^ pb;
            if (value == 0) {
                for (int i=0; i<5; ++i) {
                spkr = 0.5;
                display(0x0F);
                wait(.5);
                display(0);
                spkr = 0.0;
                wait(.25);
            }
            t2.stop();
            value = 0x012;
            lcd_mutex.lock();
            lcd.printf("Player 2 Finished!!!!!!!\n\r");
            lcd.printf("Finish time - %f secs\n\r", t2.read());
            wait(2);
            lcd_mutex.unlock();
            Player2Time = t2.read();
            player2 = 1;
            StartGame = 0;
            GameFinished = 1;
            t2.reset();
        }
        value = ((value & 0x01)<<3) | value >> 1;
        display(value);
        measure(value);
        wait(.25);
        }
    }
if (GameFinished == 1)
{
    lcd.cls();
    wait(1);
    lcd.printf("Game has Ended\n");
    calculate(Player1Time, Player2Time);
    wait(1);
    lcd.cls();
    lcd.printf("Game will reset in 5 secs\n");
    wait(5);
    GameFinished = 0;
    Player1Time, Player2Time = 0;
    lcd.cls();
    }
}
}