226 lines
5.6 KiB
C++
226 lines
5.6 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(capacity);
|
|
|
|
// Deserialize the JSON document
|
|
DeserializationError error = deserializeJson(play, settings);
|
|
|
|
// JSON ERROR
|
|
if(error) {
|
|
dualcomm(JSON_ERROR);
|
|
return;
|
|
}
|
|
|
|
// PUBLIC VARIABLES
|
|
uint8_t minDelay = play["mx"];
|
|
uint8_t maxDelay = play["mn"];
|
|
uint16_t trials = play["lm"];
|
|
uint16_t temp = trials;
|
|
|
|
// Clearing Buffer
|
|
play.clear();
|
|
|
|
//------------------------------------------------------
|
|
// PREPARE FOR GAME START
|
|
//------------------------------------------------------
|
|
|
|
// Display Welcome Message
|
|
terminal("");
|
|
terminal("trials : " + String(trials) + " Strikes");
|
|
terminal("minDelay : " + String(minDelay) + " Seconds");
|
|
terminal("maxDelay : " + String(maxDelay) + " Seconds");
|
|
terminal("2 Seconds To Start Get Ready & Good Luck !!");
|
|
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);
|
|
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);
|
|
// 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
|
|
dualcomm(GAME_OVER);
|
|
|
|
// 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(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();
|
|
}
|