// =========================================================================== // method definitions // =========================================================================== bool TraCIServerAPI_POI::processGet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { const int variable = inputStorage.readUnsignedByte(); const std::string id = inputStorage.readString(); server.initWrapper(libsumo::RESPONSE_GET_POI_VARIABLE, variable, id); try { if (!libsumo::POI::handleVariable(id, variable, &server)) { switch (variable) { case libsumo::VAR_PARAMETER: { std::string paramName = ""; if (!server.readTypeCheckingString(inputStorage, paramName)) { return server.writeErrorStatusCmd(libsumo::CMD_GET_POI_VARIABLE, "Retrieval of a parameter requires its name.", outputStorage); } server.getWrapperStorage().writeUnsignedByte(libsumo::TYPE_STRING); server.getWrapperStorage().writeString(libsumo::POI::getParameter(id, paramName)); break; } default: return server.writeErrorStatusCmd(libsumo::CMD_GET_POI_VARIABLE, "Get PoI Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage); } } } catch (libsumo::TraCIException& e) { return server.writeErrorStatusCmd(libsumo::CMD_GET_POI_VARIABLE, e.what(), outputStorage); } server.writeStatusCmd(libsumo::CMD_GET_POI_VARIABLE, libsumo::RTYPE_OK, "", outputStorage); server.writeResponseWithLength(outputStorage, server.getWrapperStorage()); return true; }
// =========================================================================== // method definitions // =========================================================================== bool TraCIServerAPI_MultiEntryExit::processGet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { const int variable = inputStorage.readUnsignedByte(); const std::string id = inputStorage.readString(); server.initWrapper(libsumo::RESPONSE_GET_MULTIENTRYEXIT_VARIABLE, variable, id); try { if (!libsumo::MultiEntryExit::handleVariable(id, variable, &server)) { return server.writeErrorStatusCmd(libsumo::CMD_GET_MULTIENTRYEXIT_VARIABLE, "Get Multi Entry Exit Detector Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage); } } catch (libsumo::TraCIException& e) { return server.writeErrorStatusCmd(libsumo::CMD_GET_MULTIENTRYEXIT_VARIABLE, e.what(), outputStorage); } server.writeStatusCmd(libsumo::CMD_GET_MULTIENTRYEXIT_VARIABLE, libsumo::RTYPE_OK, "", outputStorage); server.writeResponseWithLength(outputStorage, server.getWrapperStorage()); return true; }
// =========================================================================== // method definitions // =========================================================================== bool TraCIServerAPI_Simulation::processGet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { const int variable = inputStorage.readUnsignedByte(); const std::string id = inputStorage.readString(); server.initWrapper(RESPONSE_GET_SIM_VARIABLE, variable, id); try { switch (variable) { case VAR_TIME: server.getWrapperStorage().writeUnsignedByte(TYPE_DOUBLE); server.getWrapperStorage().writeDouble(SIMTIME); break; case VAR_TIME_STEP: server.getWrapperStorage().writeUnsignedByte(TYPE_INTEGER); server.getWrapperStorage().writeInt((int)libsumo::Simulation::getCurrentTime()); break; case VAR_LOADED_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_BUILT); break; case VAR_LOADED_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_BUILT); break; case VAR_DEPARTED_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_DEPARTED); break; case VAR_DEPARTED_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_DEPARTED); break; case VAR_TELEPORT_STARTING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_STARTING_TELEPORT); break; case VAR_TELEPORT_STARTING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_STARTING_TELEPORT); break; case VAR_TELEPORT_ENDING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ENDING_TELEPORT); break; case VAR_TELEPORT_ENDING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ENDING_TELEPORT); break; case VAR_ARRIVED_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ARRIVED); break; case VAR_ARRIVED_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ARRIVED); break; case VAR_PARKING_STARTING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_STARTING_PARKING); break; case VAR_PARKING_STARTING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_STARTING_PARKING); break; case VAR_PARKING_ENDING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ENDING_PARKING); break; case VAR_PARKING_ENDING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ENDING_PARKING); break; case VAR_STOP_STARTING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_STARTING_STOP); break; case VAR_STOP_STARTING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_STARTING_STOP); break; case VAR_STOP_ENDING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ENDING_STOP); break; case VAR_STOP_ENDING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_ENDING_STOP); break; case VAR_COLLIDING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_COLLISION); break; case VAR_COLLIDING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_COLLISION); break; case VAR_EMERGENCYSTOPPING_VEHICLES_NUMBER: writeVehicleStateNumber(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_EMERGENCYSTOP); break; case VAR_EMERGENCYSTOPPING_VEHICLES_IDS: writeVehicleStateIDs(server, server.getWrapperStorage(), MSNet::VEHICLE_STATE_EMERGENCYSTOP); break; case VAR_DELTA_T: server.getWrapperStorage().writeUnsignedByte(TYPE_INTEGER); server.getWrapperStorage().writeInt((int)libsumo::Simulation::getDeltaT()); break; case VAR_MIN_EXPECTED_VEHICLES: server.getWrapperStorage().writeUnsignedByte(TYPE_INTEGER); server.getWrapperStorage().writeInt(libsumo::Simulation::getMinExpectedNumber()); break; case VAR_BUS_STOP_WAITING: server.getWrapperStorage().writeUnsignedByte(TYPE_INTEGER); server.getWrapperStorage().writeInt(libsumo::Simulation::getBusStopWaiting(id)); break; case VAR_NET_BOUNDING_BOX: { server.getWrapperStorage().writeUnsignedByte(TYPE_POLYGON); libsumo::TraCIPositionVector tb = libsumo::Simulation::getNetBoundary(); server.getWrapperStorage().writeByte(2); server.getWrapperStorage().writeDouble(tb[0].x); server.getWrapperStorage().writeDouble(tb[0].y); server.getWrapperStorage().writeDouble(tb[1].x); server.getWrapperStorage().writeDouble(tb[1].y); break; } case POSITION_CONVERSION: if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Position conversion requires a compound object.", outputStorage); } if (inputStorage.readInt() != 2) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Position conversion requires a source position and a position type as parameter.", outputStorage); } if (!commandPositionConversion(server, inputStorage, server.getWrapperStorage(), CMD_GET_SIM_VARIABLE)) { return false; } break; case DISTANCE_REQUEST: if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of distance requires a compound object.", outputStorage); } if (inputStorage.readInt() != 3) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of distance requires two positions and a distance type as parameter.", outputStorage); } if (!commandDistanceRequest(server, inputStorage, server.getWrapperStorage(), CMD_GET_SIM_VARIABLE)) { return false; } break; case FIND_ROUTE: { if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a compound object.", outputStorage); } if (inputStorage.readInt() != 5) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires five parameter.", outputStorage); } std::string from, to, vtype; double depart; int routingMode; if (!server.readTypeCheckingString(inputStorage, from)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as first parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, to)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as second parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, vtype)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as third parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, depart)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as fourth parameter.", outputStorage); } if (!server.readTypeCheckingInt(inputStorage, routingMode)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires an integer as fifth parameter.", outputStorage); } writeStage(server.getWrapperStorage(), libsumo::Simulation::findRoute(from, to, vtype, TIME2STEPS(depart), routingMode)); break; } case FIND_INTERMODAL_ROUTE: { if (inputStorage.readUnsignedByte() != TYPE_COMPOUND) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of an intermodal route requires a compound object.", outputStorage); } if (inputStorage.readInt() != 13) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of an intermodal route requires thirteen parameters.", outputStorage); } std::string from, to, modes, ptype, vtype, destStop; double depart, speed, walkFactor, departPos, arrivalPos, departPosLat; int routingMode; if (!server.readTypeCheckingString(inputStorage, from)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as first parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, to)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as second parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, modes)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as third parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, depart)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as fourth parameter.", outputStorage); } if (!server.readTypeCheckingInt(inputStorage, routingMode)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires an integer as fifth parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, speed)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as sixth parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, walkFactor)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as seventh parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, departPos)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as eigth parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, arrivalPos)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as nineth parameter.", outputStorage); } if (!server.readTypeCheckingDouble(inputStorage, departPosLat)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a double as tenth parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, ptype)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as eleventh parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, vtype)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as twelvth parameter.", outputStorage); } if (!server.readTypeCheckingString(inputStorage, destStop)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a route requires a string as thirteenth parameter.", outputStorage); } const std::vector<libsumo::TraCIStage> result = libsumo::Simulation::findIntermodalRoute(from, to, modes, TIME2STEPS(depart), routingMode, speed, walkFactor, departPos, arrivalPos, departPosLat, ptype, vtype, destStop); server.getWrapperStorage().writeUnsignedByte(TYPE_COMPOUND); server.getWrapperStorage().writeInt((int)result.size()); for (const libsumo::TraCIStage s : result) { writeStage(server.getWrapperStorage(), s); } break; } case VAR_PARAMETER: { std::string paramName = ""; if (!server.readTypeCheckingString(inputStorage, paramName)) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Retrieval of a parameter requires its name.", outputStorage); } server.getWrapperStorage().writeUnsignedByte(TYPE_STRING); server.getWrapperStorage().writeString(libsumo::Simulation::getParameter(id, paramName)); break; } default: return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, "Get Simulation Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage); } } catch (libsumo::TraCIException& e) { return server.writeErrorStatusCmd(CMD_GET_SIM_VARIABLE, e.what(), outputStorage); } server.writeStatusCmd(CMD_GET_SIM_VARIABLE, RTYPE_OK, "", outputStorage); server.writeResponseWithLength(outputStorage, server.getWrapperStorage()); return true; }