bool TraCIServerAPI_Lane::processSet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { std::string warning = ""; // additional description for response // variable int variable = inputStorage.readUnsignedByte(); if (variable != VAR_MAXSPEED && variable != VAR_LENGTH && variable != LANE_ALLOWED && variable != LANE_DISALLOWED) { return server.writeErrorStatusCmd(CMD_SET_LANE_VARIABLE, "Change Lane State: unsupported variable specified", outputStorage); } // id std::string id = inputStorage.readString(); MSLane* l = MSLane::dictionary(id); if (l == 0) { return server.writeErrorStatusCmd(CMD_SET_LANE_VARIABLE, "Lane '" + id + "' is not known", outputStorage); } // process switch (variable) { case VAR_MAXSPEED: { double value = 0; if (!server.readTypeCheckingDouble(inputStorage, value)) { return server.writeErrorStatusCmd(CMD_SET_LANE_VARIABLE, "The speed must be given as a double.", outputStorage); } l->setMaxSpeed(value); } break; case VAR_LENGTH: { double value = 0; if (!server.readTypeCheckingDouble(inputStorage, value)) { return server.writeErrorStatusCmd(CMD_SET_LANE_VARIABLE, "The length must be given as a double.", outputStorage); } l->setLength(value); } break; case LANE_ALLOWED: { std::vector<std::string> classes; if (!server.readTypeCheckingStringList(inputStorage, classes)) { return server.writeErrorStatusCmd(CMD_SET_LANE_VARIABLE, "Allowed classes must be given as a list of strings.", outputStorage); } l->setPermissions(parseVehicleClasses(classes)); l->getEdge().rebuildAllowedLanes(); } break; case LANE_DISALLOWED: { std::vector<std::string> classes; if (!server.readTypeCheckingStringList(inputStorage, classes)) { return server.writeErrorStatusCmd(CMD_SET_LANE_VARIABLE, "Not allowed classes must be given as a list of strings.", outputStorage); } l->setPermissions(~parseVehicleClasses(classes)); // negation yields allowed l->getEdge().rebuildAllowedLanes(); } break; default: break; } server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_OK, warning, outputStorage); return true; }
bool TraCIServerAPI_Lane::processSet(TraCIServer &server, tcpip::Storage &inputStorage, tcpip::Storage &outputStorage) { std::string warning = ""; // additional description for response // variable int variable = inputStorage.readUnsignedByte(); if (variable!=VAR_MAXSPEED&&variable!=VAR_LENGTH&&variable!=LANE_ALLOWED&&variable!=LANE_DISALLOWED) { server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_ERR, "Change Lane State: unsupported variable specified", outputStorage); return false; } // id std::string id = inputStorage.readString(); MSLane *l = MSLane::dictionary(id); if (l==0) { server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_ERR, "Lane '" + id + "' is not known", outputStorage); return false; } // process int valueDataType = inputStorage.readUnsignedByte(); switch (variable) { case VAR_MAXSPEED: { // speed if (valueDataType!=TYPE_FLOAT) { server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_ERR, "The speed must be given as a float.", outputStorage); return false; } SUMOReal val = inputStorage.readFloat(); l->setMaxSpeed(val); } break; case VAR_LENGTH: { // speed if (valueDataType!=TYPE_FLOAT) { server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_ERR, "The length must be given as a float.", outputStorage); return false; } SUMOReal val = inputStorage.readFloat(); l->setLength(val); } break; case LANE_ALLOWED: { if (valueDataType!=TYPE_STRINGLIST) { server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_ERR, "Allowed classes must be given as a list of strings.", outputStorage); return false; } std::vector<SUMOVehicleClass> allowed; parseVehicleClasses(inputStorage.readStringList(), allowed); l->setAllowedClasses(allowed); l->getEdge().rebuildAllowedLanes(); } break; case LANE_DISALLOWED: { if (valueDataType!=TYPE_STRINGLIST) { server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_ERR, "Not allowed classes must be given as a list of strings.", outputStorage); return false; } std::vector<SUMOVehicleClass> disallowed; parseVehicleClasses(inputStorage.readStringList(), disallowed); l->setNotAllowedClasses(disallowed); l->getEdge().rebuildAllowedLanes(); } break; default: break; } server.writeStatusCmd(CMD_SET_LANE_VARIABLE, RTYPE_OK, warning, outputStorage); return true; }