void ServoMgr::setCalFromFile()

in servo_pkg/src/servo_mgr.cpp [226:291]


    void ServoMgr::setCalFromFile(std::unordered_map<int, std::unordered_map<std::string, int>> &calibrationMap,
                        const std::string &filePath) {
        Json::Value calJsonValue;
        Json::Reader reader;
        std::ifstream ifs(filePath);

        if (!reader.parse(ifs, calJsonValue)) {
            RCLCPP_ERROR(logger_, "Error parsing calibration.json");
            return;
        }
        if (!calJsonValue.isMember("Calibration")) {
            RCLCPP_ERROR(logger_, "Calibration file error: No calibration header");
            return;
        }
        if (!calJsonValue[HEADER_KEY].isMember(SERVO_KEY) || !calJsonValue[HEADER_KEY].isMember(MOTOR_KEY)) {
            RCLCPP_ERROR(logger_, "Calibration file error: Missing servo type");
            return;
        }

        std::string biosVersion;
        std::ifstream bioFile(BIOS_PATH);

        if(bioFile.is_open()) {
            std::getline (bioFile, biosVersion);
            bioFile.close();
        }
        else {
            RCLCPP_WARN(logger_, "Unable to read bios version, vechile needs to be calibrated");
        }

        if (BiosVersion(biosVersion, logger_) >= BiosVersion(BIOS_CUT_OFF, logger_)) {
            if (!calJsonValue[HEADER_KEY].isMember(VERSION_KEY)) {
                RCLCPP_INFO(logger_, "Old calibration file detected");
                writeCalJSON(calibrationMap, filePath);
                return;
            }
        }

        auto populateMap = [&](auto &map, const auto &servoType) {
            for (auto &servoMap : map) {
                if (calJsonValue[HEADER_KEY][servoType].isMember(servoMap.first)) {
                    servoMap.second = calJsonValue["Calibration"][servoType][servoMap.first].asInt();
                }
                else {
                    RCLCPP_ERROR(logger_, "Calibration file error:%s missing: %s", servoType.c_str(), servoMap.first.c_str());
                    return false;
                }
            }
            return true;
        };

        auto tmpMap = calibrationMap;
        auto itServo = tmpMap.find(servo);
        auto itMotor = tmpMap.find(motor);

        if (itServo != tmpMap.end() && itMotor != tmpMap.end()) {
            if (!populateMap(itServo->second, SERVO_KEY) || !populateMap(itMotor->second, MOTOR_KEY)) {
                return;
            }
        }
        else {
            RCLCPP_ERROR(logger_, "Invalid calibration map");
            return;
        }
        calibrationMap = tmpMap;
    }