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;
}