//====================================================== // MAIN COUNTER GAME LOOP //====================================================== /* COUNTER GAME SETTINGS PARAMETERS NOTE: * -------------------------------------- * * FORMAT : * -------- * {"le": false, "lm": 10} * * MEANNING : * ---------- * ct : count * le : stands for limit enable, if is TRUE the game end if target value is meet * lm : targeted amount of kicks * * THINGS THAT ENDS THE GAME : * --------------------------- * 1. BY A COMMAND "FROM APP VIA BLUETOOTH" * 2. BY LIMITS MEET "WHEN NUMBER OF YOUR KICKS REACH TO lm VALUE" * * WHAT DATA TO BE COLLECTED : * --------------------------- * 1. FOR EVERY KICK YOU RECEIVE THE COUNTER DISPLAY AND TIMESTAMP * WE NEED TO COLLECT TIMESTAMPS AS AN ARRAY IN JSON FORMAT * * CALCULATING RESULTS : * --------------------- * No calculation required, Its directly the count */ void game_counter(String settings) { //------------------------------------------------------ // START OF READING THE SETTINGS //------------------------------------------------------ // CONVERTING GAME TEXT TO JSON DynamicJsonDocument play(JSON_CAPACITY); // building JSON Buffer // Deserialize the JSON document DeserializationError error = deserializeJson(play, settings); // the main JSON body container // JSON ERROR if(error) { dualcomm(JSON_ERROR); return; } // PUBLIC VARIABLES uint16_t limit = play["lm"]; // Kick Target Limit bool limitEnable = play["le"]; // Enable Kick Target Limit // Clearing Buffer play.clear(); // Kick Counter uint16_t counter = 0; //------------------------------------------------------ // PREPARE FOR GAME START //------------------------------------------------------ // Display Welcome Message // TERMINAL(""); // TERMINAL("=================================================="); // TERMINAL(" -->> Counter Game Settings"); // TERMINAL("--------------------------------------------------"); // TERMINAL("Strike Limit : " + String(limit) + " Strikes"); // TERMINAL("Limits Enable : " + String(limitEnable)); // TERMINAL("--------------------------------------------------"); // TERMINAL("2 Seconds To Start Get Ready & Good Luck !!"); // TERMINAL("=================================================="); // TERMINAL(""); // Game Start Lights Counter_Start(); // staring Of time stamp unsigned long startStamp = millis(); while(1) { // Time Stamp unsigned long timeStamp = millis() - startStamp; // If Stop Command Came From Smart Phone if(isBluetooth) { String msg = BLUETOOTH.readString(); msg.trim(); if(msg == CM_STOP) { // TERMINAL(""); // TERMINAL("---------------------------------------------------"); dualcomm(GAME_OVER); // TERMINAL("==================================================="); // TERMINAL(""); Counter_End(); // Grean Light In //LED_GREEN_FADEOUT(); // RESET return; } else if(msg == CM_RESET) { Counter_Reset(); counter = 0; startStamp = millis(); timeStamp = startStamp; } } // If Limits Are Enabled And Meet if(limitEnable == true && counter == limit) { // END GAME // TERMINAL(""); // TERMINAL("---------------------------------------------------"); dualcomm(GAME_OVER); // TERMINAL("==================================================="); // TERMINAL(""); // Celebration Counter_Celebration(); // RESET return; } // Read Impact if(readImpact() > PWR) { counter++; dualcomm(counter_data_json(counter, timeStamp)); delay(100); } } } //====================================================== // COUNTER DATA JSON -> To Send Back To Server //====================================================== String counter_data_json(unsigned int ct, unsigned int st) { // Building The Buffer DynamicJsonDocument data(JSON_CAPACITY); // Convert Int To Float float stamp = st; stamp /= 1000; // Assignning Dataset data["ct"] = ct; data["st"] = String(stamp, 3).toFloat(); String output; serializeJson(data, output); data.clear(); return output; } //====================================================== // REACTION GAME START LED SIGNAL //====================================================== void Counter_Start() { // LightUp LED_WHITE_CROSSFADE(2); // Grean Light In LED_GREEN(); } //====================================================== // REACTION GAME END SINGNAL LED SIGNAL //====================================================== void Counter_End() { LED_RED_BLINK(2); LED_RED_FADEOUT(); } //====================================================== // REACTION GAME START LED CELEBRATION //====================================================== void Counter_Celebration() { // LightUp rainbowCycle(2); // Grean Light OUT LED_GREEN_FADEOUT(); } //====================================================== // REACTION GAME RESET LED SIGNAL //====================================================== void Counter_Reset() { // LED_BLUE(); delay(250); LED_BLUE_FADEOUT(); }