147 lines
4 KiB
C++
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("");
|
|
} |