Descripción general
El código proporciona funciones utilitarias para manejar y analizar respuestas
de comunicación serial.
Funciones
- La función
splitString
es una herramienta general para manipulación de
cadenas, mientras que la función ParseResponse
está específicamente diseñada
para manejar el formato de respuestas de la API del robot.
- Juntas, estas funciones facilitan la extracción de datos significativos de
cadenas de respuesta en bruto, permitiendo un procesamiento y toma de
decisiones adicionales en la aplicación.
Ejemplo
#include <sstream>
#include <string>
#include <vector>
// Una implementación bastante estándar de splitString.
std::vector<std::string> splitString(std::string str, char delimiter)
{
std::vector<std::string> splitVect;
std::stringstream ss(str);
std::string substr;
while (ss.good())
{
getline(ss, substr, delimiter);
splitVect.emplace_back(std::move(substr));
}
return splitVect;
}
/**
* @brief Toma una cadena formateada como respuesta y devuelve el mensaje original,
* el timestamp, cualquier error y/o los valores devueltos por el backend, si los hay.
* Ejemplo: "%?STTN=1 2_\r" devolvería std::vector<std::string> {"?STTN", "1 0"} donde 1
* es el nanosegundo desde el epoch y 0 es el estado de la estación }
*
* @param[in] response_string La cadena de respuesta formateada, devuelta por la API
*
* @return Un std::vector<std::string> con el mensaje original y la respuesta a ese mensaje
* con los delimitadores eliminados.
*/
std::vector<std::string> ParseResponse(std::string response_string)
{
// La cadena de respuesta se divide alrededor de un solo signo igual '='. Nunca habrá más de un (1) signo igual
// en una cadena de respuesta.
std::vector<std::string> split_response = splitString(response_string.substr(1), '=');
// Elimina el porcentaje inicial '%' que indica una respuesta. Aquí se puede realizar lógica para verificar que
// el mensaje esté correctamente formateado.
std::string s = split_response[1];
// El guion bajo '_' indica el final de una respuesta. Estará en la segunda posición del vector junto con el
// timestamp y los valores devueltos. Elimina cualquier carácter después de él.
int loc = s.find('_');
split_response[1] = s.substr(0, loc);
// Determina si hubo errores
if (split_response[1].find("#ERR") != split_response[1].npos)
{
std::string command = split_response[0];
// Si hubo errores, actualiza el elemento 0 del vector para reflejarlo.
split_response[0] = "La API devolvió un error para el comando " + command + ".";
}
// Devuelve el vector para saber qué respuesta corresponde a qué comando original.
return split_response;
}