Kill the bit game for Real Time Assignment

Dependencies:   mbed C12832 mbed-rtos

Revision:
1:617a3879630b
Parent:
0:ecbcef1609d9
Child:
2:7309680cbb76
--- a/main.cpp	Tue Nov 26 03:10:05 2013 +0000
+++ b/main.cpp	Sat Apr 09 10:54:41 2022 +0000
@@ -1,6 +1,10 @@
 #include "mbed.h"
-// Retro version of kill the bit
-// For application board
+#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
@@ -10,8 +14,20 @@
 DigitalOut myled2(LED2);
 DigitalOut myled3(LED3);
 DigitalOut myled4(LED4);
-DigitalIn pb(p14);
+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)
 {
@@ -20,14 +36,120 @@
     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");
+    }
+    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(1) {
-        value = value ^ pb;
-        if (value == 0) {
-            for (int i=0; i<5; ++i) {
+    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);
@@ -35,10 +157,38 @@
                 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();
     }
 }
+}
\ No newline at end of file