fork_mon_premier_robot/server/src/server.hpp

147 lines
4 KiB
C++

/************************************
Configuration et handlers du server
************************************/
/**
* @brief Type de la variable globale command
*
*/
struct command_t
{
bool running; // Une commande doit être exécutée
bool stopped; // La commande doit être stoppée
String name; // Nom de la commande
int value; // Valeur (nombre de pas à effectuer)
};
/**
* @brief Met à jour la command globale.
* @internal
*
* @param commandName Nom de la nouvelle commande.
* @param commandValue Valeur de la nouvelle commande.
* @param globalCommand Commande globale (courante).
*/
void setGlobals(String commandName, float commandValue, command_t &globalCommand)
{
// Assert command before updating globals
if (commandName != "forward" && commandName != "backward" && commandName != "left" && commandName != "right")
{
return;
}
// Update globals
globalCommand.name = commandName;
globalCommand.running = true;
globalCommand.stopped = false;
globalCommand.value = convertLengthToSteps(commandValue);
}
/**
* @brief Lorsqu'une commande arrive au serveur, cette fonction permet.
* @internal
*
* @param commandName Nom de la commande.
* @param commandValue Valeur de la command (si 0 assigné à 474).
*/
void requestCheck(String commandName, float commandValue, command_t &globalCommand)
{
if (commandName == "stop")
{
globalCommand.name = "stop";
globalCommand.running = true;
globalCommand.stopped = true;
}
else
{
setGlobals(commandName, commandValue, globalCommand);
}
if (commandValue == 0)
{
globalCommand.value = 474;
}
}
/**
* @brief Parse la requête GET (vers "/get") du serveur et résout le nom de la commande et sa valeur.
*
* Exemple :
* ```
* String commandName;
* float commandValue;
* parseRequestParams(request, commandName, commandValue);
* ```
*
* @param request Requête contenant la commande.
* @param commandName Nom de la commande à assigner.
* @param commandValue Valeur de la commande à assigner.
* @param globalCommand Commande globale (courante) à mettre à jour.
*
*/
void parseRequestParams(AsyncWebServerRequest *request, String &commandName, float &commandValue, command_t &globalCommand)
{
// Stop here with error message if wrong command
if (!request->hasParam("command"))
{
commandName = "No command provided";
return;
}
// Update command from params
commandName = request->getParam("command")->value();
// Update value from params and use "0" as default
commandValue = request->hasParam("value") ? request->getParam("value")->value().toFloat() : 0;
requestCheck(commandName, commandValue, globalCommand);
}
/**
* @brief Configuration du serveur asynchrone.
*
* @param server Serveur à configurer.
* @param globalCommand Commande globale (courante) à mettre à jour lors des requêtes.
*/
void serverConfig(AsyncWebServer &server, command_t &globalCommand)
{
server.on("/get", HTTP_GET, [&globalCommand](AsyncWebServerRequest *request)
{
String commandName;
float commandValue;
// Parse request params and update command and value
parseRequestParams(request, commandName, commandValue, globalCommand);
Serial.print(commandName);
Serial.print(": ");
Serial.println(commandValue);
request->send(200, "text/plain", commandName); });
}
/**
* @brief Démarre le point d'accès WiFi.
*
* @param WiFi WiFi à configurer.
*/
void connectWiFi(WiFiClass &WiFi)
{
// For simulator only
WiFi.mode(WIFI_STA);
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
if (WiFi.waitForConnectResult() != WL_CONNECTED)
{
Serial.printf("WiFi Failed!\n");
return;
}
Serial.println(" Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
// WiFi.mode(WIFI_AP);
// WiFi.softAP(WIFI_SSID, WIFI_PASSWORD);
// Serial.print("[+] AP Created with IP Gateway ");
// Serial.println(WiFi.softAPIP());
// Serial.println("");
}