// =========================================================================== // method definitions // =========================================================================== bool TraCIServerAPI_Edge::processGet(TraCIServer& server, tcpip::Storage& inputStorage, tcpip::Storage& outputStorage) { // variable & id int variable = inputStorage.readUnsignedByte(); std::string id = inputStorage.readString(); // check variable if (variable != ID_LIST && variable != VAR_EDGE_TRAVELTIME && variable != VAR_EDGE_EFFORT && variable != VAR_CURRENT_TRAVELTIME && variable != VAR_CO2EMISSION && variable != VAR_COEMISSION && variable != VAR_HCEMISSION && variable != VAR_PMXEMISSION && variable != VAR_NOXEMISSION && variable != VAR_FUELCONSUMPTION && variable != VAR_NOISEEMISSION && variable != VAR_WAITING_TIME && variable != LAST_STEP_VEHICLE_NUMBER && variable != LAST_STEP_MEAN_SPEED && variable != LAST_STEP_OCCUPANCY && variable != LAST_STEP_VEHICLE_HALTING_NUMBER && variable != LAST_STEP_LENGTH && variable != LAST_STEP_PERSON_ID_LIST && variable != LAST_STEP_VEHICLE_ID_LIST && variable != ID_COUNT && variable != VAR_PARAMETER) { return server.writeErrorStatusCmd(CMD_GET_EDGE_VARIABLE, "Get Edge Variable: unsupported variable " + toHex(variable, 2) + " specified", outputStorage); } // begin response building tcpip::Storage tempMsg; // response-code, variableID, objectID tempMsg.writeUnsignedByte(RESPONSE_GET_EDGE_VARIABLE); tempMsg.writeUnsignedByte(variable); tempMsg.writeString(id); // process request if (variable == ID_LIST) { std::vector<std::string> ids; MSEdge::insertIDs(ids); tempMsg.writeUnsignedByte(TYPE_STRINGLIST); tempMsg.writeStringList(ids); } else if (variable == ID_COUNT) { std::vector<std::string> ids; MSEdge::insertIDs(ids); tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt((int) ids.size()); } else { MSEdge* e = MSEdge::dictionary(id); if (e == 0) { return server.writeErrorStatusCmd(CMD_GET_EDGE_VARIABLE, "Edge '" + id + "' is not known", outputStorage); } switch (variable) { case VAR_EDGE_TRAVELTIME: { // time int time = 0; if (!server.readTypeCheckingInt(inputStorage, time)) { return server.writeErrorStatusCmd(CMD_GET_EDGE_VARIABLE, "The message must contain the time definition.", outputStorage); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); SUMOReal value; if (!MSNet::getInstance()->getWeightsStorage().retrieveExistingTravelTime(e, time, value)) { tempMsg.writeDouble(-1); } else { tempMsg.writeDouble(value); } } break; case VAR_EDGE_EFFORT: { // time int time = 0; if (!server.readTypeCheckingInt(inputStorage, time)) { return server.writeErrorStatusCmd(CMD_GET_EDGE_VARIABLE, "The message must contain the time definition.", outputStorage); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); SUMOReal value; if (!MSNet::getInstance()->getWeightsStorage().retrieveExistingEffort(e, time, value)) { tempMsg.writeDouble(-1); } else { tempMsg.writeDouble(value); } } break; case VAR_CURRENT_TRAVELTIME: tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(e->getCurrentTravelTime()); break; case VAR_WAITING_TIME: { SUMOReal wtime = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { wtime += (*i)->getWaitingSeconds(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(wtime); } break; case LAST_STEP_PERSON_ID_LIST: { std::vector<std::string> personIDs; std::vector<MSTransportable*> persons = e->getSortedPersons(MSNet::getInstance()->getCurrentTimeStep()); for (std::vector<MSTransportable*>::iterator it = persons.begin(); it != persons.end(); ++it) { personIDs.push_back((*it)->getID()); } tempMsg.writeUnsignedByte(TYPE_STRINGLIST); tempMsg.writeStringList(personIDs); } break; case LAST_STEP_VEHICLE_ID_LIST: { std::vector<std::string> vehIDs; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { const MSLane::VehCont& vehs = (*i)->getVehiclesSecure(); for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) { vehIDs.push_back((*j)->getID()); } (*i)->releaseVehicles(); } tempMsg.writeUnsignedByte(TYPE_STRINGLIST); tempMsg.writeStringList(vehIDs); } break; case VAR_CO2EMISSION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getCO2Emissions(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum); } break; case VAR_COEMISSION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getCOEmissions(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum); } break; case VAR_HCEMISSION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getHCEmissions(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum); } break; case VAR_PMXEMISSION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getPMxEmissions(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum); } break; case VAR_NOXEMISSION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getNOxEmissions(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum); } break; case VAR_FUELCONSUMPTION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getFuelConsumption(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum); } break; case VAR_NOISEEMISSION: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (SUMOReal) pow(10., ((*i)->getHarmonoise_NoiseEmissions() / 10.)); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); if (sum != 0) { tempMsg.writeDouble(HelpersHarmonoise::sum(sum)); } else { tempMsg.writeDouble(0); } } break; case LAST_STEP_VEHICLE_NUMBER: { int sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getVehicleNumber(); } tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt(sum); } break; case LAST_STEP_MEAN_SPEED: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getMeanSpeed(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum / (SUMOReal) lanes.size()); } break; case LAST_STEP_OCCUPANCY: { SUMOReal sum = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { sum += (*i)->getNettoOccupancy(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); tempMsg.writeDouble(sum / (SUMOReal) lanes.size()); } break; case LAST_STEP_VEHICLE_HALTING_NUMBER: { int halting = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { const MSLane::VehCont& vehs = (*i)->getVehiclesSecure(); for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) { if ((*j)->getSpeed() < SUMO_const_haltingSpeed) { ++halting; } } (*i)->releaseVehicles(); } tempMsg.writeUnsignedByte(TYPE_INTEGER); tempMsg.writeInt(halting); } break; case LAST_STEP_LENGTH: { SUMOReal lengthSum = 0; int noVehicles = 0; const std::vector<MSLane*>& lanes = e->getLanes(); for (std::vector<MSLane*>::const_iterator i = lanes.begin(); i != lanes.end(); ++i) { const MSLane::VehCont& vehs = (*i)->getVehiclesSecure(); for (MSLane::VehCont::const_iterator j = vehs.begin(); j != vehs.end(); ++j) { lengthSum += (*j)->getVehicleType().getLength(); } noVehicles += (int) vehs.size(); (*i)->releaseVehicles(); } tempMsg.writeUnsignedByte(TYPE_DOUBLE); if (noVehicles == 0) { tempMsg.writeDouble(0); } else { tempMsg.writeDouble(lengthSum / (SUMOReal) noVehicles); } } break; case VAR_PARAMETER: { std::string paramName = ""; if (!server.readTypeCheckingString(inputStorage, paramName)) { return server.writeErrorStatusCmd(CMD_GET_EDGE_VARIABLE, "Retrieval of a parameter requires its name.", outputStorage); } tempMsg.writeUnsignedByte(TYPE_STRING); tempMsg.writeString(e->getParameter(paramName, "")); } break; default: break; } } server.writeStatusCmd(CMD_GET_EDGE_VARIABLE, RTYPE_OK, "", outputStorage); server.writeResponseWithLength(outputStorage, tempMsg); return true; }
void MSXMLRawOut::writeEdge(OutputDevice& of, const MSEdge& edge, SUMOTime timestep) { //en bool dump = !MSGlobals::gOmitEmptyEdgesOnDump; if (!dump) { #ifdef HAVE_INTERNAL if (MSGlobals::gUseMesoSim) { MESegment* seg = MSGlobals::gMesoNet->getSegmentForEdge(edge); while (seg != 0) { if (seg->getCarNumber() != 0) { dump = true; break; } seg = seg->getNextSegment(); } } else { #endif const std::vector<MSLane*>& lanes = edge.getLanes(); for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) { if (((**lane).getVehicleNumber() != 0)) { dump = true; break; } } #ifdef HAVE_INTERNAL } #endif } //en const std::vector<MSPerson*>& persons = edge.getSortedPersons(timestep); if (dump || persons.size() > 0) { of.openTag("edge") << " id=\"" << edge.getID() << "\""; if (dump) { #ifdef HAVE_INTERNAL if (MSGlobals::gUseMesoSim) { MESegment* seg = MSGlobals::gMesoNet->getSegmentForEdge(edge); while (seg != 0) { seg->writeVehicles(of); seg = seg->getNextSegment(); } } else { #endif const std::vector<MSLane*>& lanes = edge.getLanes(); for (std::vector<MSLane*>::const_iterator lane = lanes.begin(); lane != lanes.end(); ++lane) { writeLane(of, **lane); } #ifdef HAVE_INTERNAL } #endif } // write persons for (std::vector<MSPerson*>::const_iterator it_p = persons.begin(); it_p != persons.end(); ++it_p) { of.openTag(SUMO_TAG_PERSON); of.writeAttr(SUMO_ATTR_ID, (*it_p)->getID()); of.writeAttr(SUMO_ATTR_POSITION, (*it_p)->getEdgePos()); of.writeAttr(SUMO_ATTR_ANGLE, (*it_p)->getAngle()); of.writeAttr("stage", (*it_p)->getCurrentStageDescription()); of.closeTag(); } of.closeTag(); } }