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