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

serial_parser.cpp
#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;
}