Commit ade9e053 authored by Giuseppe Carboni's avatar Giuseppe Carboni
Browse files

Updated the SRTMinorServoCommandLibrary

parent 24de1dda
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -14,6 +14,8 @@

#define CLOSER std::string("\r\n")

using SRTMinorServoAnswerMap = std::map<std::string, std::variant<int, double, std::string> >;

/**
 * SRT Minor Servo Command Library
 *
@@ -83,7 +85,7 @@ public:
     * @param answer the string containing the answer received from the VBrain proxy
     * @return a std::map (dictionary) containing the answer splitted into keys and values. The keys are always std::string, the values can either be int, double or std::string.
     */
    static std::map<std::string, std::variant<int, double, std::string> > parseAnswer(std::string answer);
    static SRTMinorServoAnswerMap parseAnswer(std::string answer);
};

#endif
+1 −1
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ boost::python::dict PySRTMinorServoCommandLibrary::parseAnswer(std::string answe

    boost::python::dict dictionary;

    typename std::map<std::string, std::variant<int, double, std::string> >::iterator iter;
    SRTMinorServoAnswerMap::iterator iter;

    for(iter = args.begin(); iter != args.end(); ++iter)
    {
+5 −3
Original line number Diff line number Diff line
@@ -87,14 +87,16 @@ std::string SRTMinorServoCommandLibrary::offset(std::string servo_id, std::vecto
    return command.str();
}

std::map<std::string, std::variant<int, double, std::string> > SRTMinorServoCommandLibrary::parseAnswer(std::string answer)
SRTMinorServoAnswerMap SRTMinorServoCommandLibrary::parseAnswer(std::string answer)
{
    // First thing first, standardize the separators
    // First thing first, standardize the separators and remove the newline/carriage return characters
    std::replace(answer.begin(), answer.end(), ':', '=');
    std::replace(answer.begin(), answer.end(), '|', ',');
    answer.erase(std::remove(answer.begin(), answer.end(), '\n'), answer.end());
    answer.erase(std::remove(answer.begin(), answer.end(), '\r'), answer.end());

    // Create the dictionary
    std::map<std::string, std::variant<int, double, std::string> > args;
    SRTMinorServoAnswerMap args;

    std::stringstream ss(answer);
    std::string token;
+7 −7
Original line number Diff line number Diff line
@@ -55,14 +55,14 @@ TEST(SRTMinorServoCommandLibraryTest, offset)
TEST(SRTMinorServoCommandLibraryTest, parseAnswer)
{
    // Minimal correct answer
    std::string answer = "OUTPUT:GOOD,1665743366.654321";
    std::map<std::string, std::variant<int, double, std::string> > args;
    std::string answer = "OUTPUT:GOOD,1665743366.654321\r\n";
    SRTMinorServoAnswerMap args;
    args["OUTPUT"] = "GOOD";
    args["TIMESTAMP"] = 1665743366.654321;
    EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args);

    // Complete correct answer
    answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94";
    answer = "OUTPUT:GOOD,1665743366.123456,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n";
    args.clear();
    args["OUTPUT"] = "GOOD";
    args["TIMESTAMP"] = 1665743366.123456;
@@ -78,22 +78,22 @@ TEST(SRTMinorServoCommandLibraryTest, parseAnswer)
    EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args);

    // Missing timestamp
    answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94";
    answer = "OUTPUT:GOOD,CURRENT_CONFIG=21|SIMULATION_ENABLED=34|PLC_TIME=78|PLC_VERSION=69|CONTROL=14|POWER=38|EMERGENCY=69|ENABLED=51|OPERATIVE_MODE=94\r\n";
    args.clear();
    EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args);

    // Wrong OUTPUT field
    answer = "OUTPUT:123456";
    answer = "OUTPUT:123456\r\n";
    args.clear();
    EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args);

    // Multiple values without key, cannot find the correct timestamp
    answer = "OUTPUT:GOOD,12345,67890";
    answer = "OUTPUT:GOOD,12345,67890\r\n";
    args.clear();
    EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args);

    // Wrong timestamp format
    answer = "OUTPUT:GOOD,12345.ABCD";
    answer = "OUTPUT:GOOD,12345.ABCD\r\n";
    args.clear();
    EXPECT_EQ(SRTMinorServoCommandLibrary::parseAnswer(answer), args);
}