238 lines
6.1 KiB
C++

//======================================================
// REACTION GAME MAIN ROUTINE
//======================================================
/* REACTION GAME SETTINGS PARAMETERS NOTE:
* ------------------------------------------
*
* FORMAT :
* --------
* {"tr": 10, "mn": 1, "mx": 2}
*
* MEANNING :
* ----------
* tr : trials pre counter
* mn : minimum delay, between trials
* mx : maximum delay, between trials
*
* THINGS THAT ENDS THE GAME :
* ---------------------------
* 1. BY COUNT DOWN "tr" REACH TO ZERO
* 2. BY A COMMAND "FROM APP VIA BLUETOOTH"
*
* CALCULATING RESULTS :
* ---------------------
* Rapid Kick Speed = Number Of Kickes Made / Elasped Time In Sec
*/
//======================================================
void game_reaction(String settings)
{
//------------------------------------------------------
// START OF READING THE SETTINGS
//------------------------------------------------------
// CONVERTING GAME TEXT TO JSON
DynamicJsonDocument play(JSON_CAPACITY);
// Deserialize the JSON document
DeserializationError error = deserializeJson(play, settings);
// JSON ERROR
if(error) {
dualcomm(JSON_ERROR);
return;
}
// PUBLIC VARIABLES
uint8_t minDelay = play["mn"];
uint8_t maxDelay = play["mx"];
uint16_t trials = play["lm"];
uint16_t temp = trials;
// Clearing Buffer
play.clear();
//------------------------------------------------------
// PREPARE FOR GAME START
//------------------------------------------------------
// Display Welcome Message
// TERMINAL("");
// TERMINAL("==================================================");
// TERMINAL(" -->> Reaction Game Settings");
// TERMINAL("--------------------------------------------------");
// TERMINAL("trials : " + String(trials) + " Strikes");
// TERMINAL("try delay : " + String(minDelay) + " to " + String(maxDelay) + " Seconds");
// TERMINAL("--------------------------------------------------");
// TERMINAL("2 Seconds To Start Get Ready & Good Luck !!");
// TERMINAL("==================================================");
// TERMINAL("");
// Ready Signal
Reaction_Start();
// Main Variables
uint16_t sdelay = 0;
uint16_t power = 0;
uint16_t response = 0;
unsigned long startTime = 0;
unsigned long stopTime = 0;
// Processing Results
for(int i=0; i<trials; i++)
{
// Reading Kick Data
terminal(" ------ Trial Number (" + String(i + 1) + ") ------");
terminal(" -> Get Ready !!");
// Set Random Delay Time
sdelay = random(minDelay, (maxDelay + 1));
sdelay *= 1000;
delay(sdelay);
// Light Up Green
rgbLED(0, 150, 0);
// Start Timer
startTime = millis();
// Sensing Strike Power
while(power < PWR)
{
// Reading The Strike
power = readImpact();
// If Stop Command Came From Smart Phone
if(isBluetooth)
{
String msg = BLUETOOTH.readString();
msg.trim();
if(msg == CM_STOP) {
dualcomm(GAME_OVER);
Reaction_End();
// LightUp
//LED_RED();
//delay(2000);
// Red FadeOut
//LED_RED_FADEOUT();
// RESET
return;
}
else if(msg == CM_RESET) {
trials = temp;
break;
}
}
}
// Stop Timer
stopTime = millis();
// Stop Light
rgbLED(150, 0, 0);
// Calculating Response Time
response = stopTime - startTime - 1;
// Create Json Data
String msg = reaction_data_json(i+1, power, response, sdelay);
// Print To TERMINAL
dualcomm(msg);
// Clear All
sdelay = 0;
power = 0;
response = 0;
}
// Red Light Delay
delay(500);
// END GAME
// TERMINAL("");
// TERMINAL("---------------------------------------------------");
dualcomm(GAME_OVER);
// TERMINAL("===================================================");
// TERMINAL("");
// Celebration
Reaction_Celebration();
// Blink Red
//Reaction_End();
// Return To Game Selector
return;
}
//======================================================
// REACTION DATA JSON -> To Send Back To Server
//======================================================
String reaction_data_json(unsigned int count, unsigned int power, unsigned int response, unsigned int startDelay)
{
// Building The Buffer
DynamicJsonDocument data(JSON_CAPACITY);
// Convert To Seconds Unit
float re = response;
re /= 1000;
// Asignning Values
data["ct"] = count; // Strike Number
data["pw"] = power; // Strike Power In Analog Read
data["sd"] = startDelay/1000; // LED Strip Start Delay in Seconds
data["re"] = String(re, 3).toFloat(); // Strike Reaction Time In Milli Sec
String output;
serializeJson(data, output);
data.clear();
return output;
}
//======================================================
// REACTION GAME START LED SIGNAL
//======================================================
void Reaction_Start()
{
LED_WHITE_CROSSFADE(3);
LED_RED_FADEIN();
}
//======================================================
// REACTION GAME END SINGNAL LED SIGNAL
//======================================================
void Reaction_End()
{
LED_RED_BLINK(2);
LED_RED_FADEOUT();
}
//======================================================
// REACTION GAME START LED CELEBRATION
//======================================================
void Reaction_Celebration()
{
// LightUp
rainbowCycle(2);
// Grean Light OUT
LED_GREEN_FADEOUT();
}
//======================================================
// REACTION GAME RESET LED SIGNAL
//======================================================
void Reaction_Reset()
{
LED_BLUE();
delay(250);
LED_BLUE_FADEOUT();
}