193 lines
4.7 KiB
C++

//======================================================
// 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(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();
// Trying To Delete The Document
//play.delete();
// Kick Counter
uint16_t counter = 0;
// Game Start Lights
Counter_Start();
//------------------------------------------------------
// PREPARE FOR GAME 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)
{
dualcomm(GAME_OVER);
// 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
dualcomm(GAME_OVER);
// 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(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()
{
// LightUp
LED_RED();
delay(2000);
// Red FadeOut
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();
}