//====================================================== // 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 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(); }