X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=olm%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Ftransportpce%2Folm%2Fpower%2FPowerMgmtImpl.java;h=acd5c6d10f91bff8828731543df28f75d7287966;hb=268165cb2822b6ce4c55f00cac63eed2bb222ec7;hp=4538ef9b0940e2b99cb53d751b71b44641675713;hpb=32dca3cd3f1894f783980b982ea4aaf527a274e2;p=transportpce.git diff --git a/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtImpl.java b/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtImpl.java index 4538ef9b0..acd5c6d10 100644 --- a/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtImpl.java +++ b/olm/src/main/java/org/opendaylight/transportpce/olm/power/PowerMgmtImpl.java @@ -8,6 +8,8 @@ package org.opendaylight.transportpce.olm.power; import java.math.BigDecimal; +import java.math.MathContext; +import java.math.RoundingMode; import java.util.HashMap; import java.util.Locale; import java.util.Map; @@ -21,10 +23,10 @@ import org.opendaylight.transportpce.common.openroadminterfaces.OpenRoadmInterfa import org.opendaylight.transportpce.olm.util.OlmUtils; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerSetupInput; import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.olm.rev210618.ServicePowerTurndownInput; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.OpenroadmNodeVersion; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.Mapping; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.mapping.MappingKey; -import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210426.network.Nodes; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.OpenroadmNodeVersion; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.Mapping; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.mapping.MappingKey; +import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220316.network.Nodes; import org.opendaylight.yang.gen.v1.http.org.openroadm.common.types.rev161014.OpticalControlMode; import org.opendaylight.yang.gen.v1.http.org.openroadm.device.rev170206.interfaces.grp.Interface; import org.opendaylight.yang.gen.v1.http.org.openroadm.optical.transport.interfaces.rev161014.Interface1; @@ -40,6 +42,7 @@ public class PowerMgmtImpl implements PowerMgmt { private static final BigDecimal DEFAULT_TPDR_PWR_100G = new BigDecimal(-5); private static final BigDecimal DEFAULT_TPDR_PWR_400G = new BigDecimal(0); private static final String INTERFACE_NOT_PRESENT = "Interface {} on node {} is not present!"; + private static final double MC_WIDTH_GRAN = 2 * GridConstant.GRANULARITY; private long timer1 = 120000; // openroadm spec value is 120000, functest value is 3000 @@ -172,9 +175,10 @@ public class PowerMgmtImpl implements PowerMgmt { destTpId, nodeId, openroadmVersion.getIntValue()); LOG.info("Spanloss TX is {}", spanLossTx); - if (spanLossTx == null || spanLossTx.intValue() <= 0 || spanLossTx.intValue() > 28) { - LOG.error("Power Value is null: spanLossTx null or out of openROADM range ]0,28] {}", - spanLossTx); + // TODO: The span-loss limits should be obtained from optical specifications + if (spanLossTx == null || spanLossTx.intValue() <= 0 || spanLossTx.intValue() > 27) { + LOG.error("Power Value is null: spanLossTx null or out of openROADM range ]0,27] {}", + spanLossTx); return false; } BigDecimal powerValue = getRdmPowerValue(spanLossTx, input); @@ -367,20 +371,42 @@ public class PowerMgmtImpl implements PowerMgmt { private BigDecimal getRdmPowerValue(BigDecimal spanLossTx, ServicePowerSetupInput input) { - BigDecimal powerValue = spanLossTx.subtract(BigDecimal.valueOf(9)).min(BigDecimal.valueOf(2)); + // TODO: These values will be obtained from the specifications + // power-value here refers to the Pin[50GHz] + BigDecimal powerValue; + if (spanLossTx.doubleValue() >= 23.0) { + powerValue = BigDecimal.valueOf(2.0); + } else if (spanLossTx.doubleValue() >= 8.0) { + powerValue = BigDecimal.valueOf(- (8.0 - spanLossTx.doubleValue()) / 3.0 - 3.0); + } else if (spanLossTx.doubleValue() >= 6.0) { + powerValue = BigDecimal.valueOf(-3.0); + } else { + powerValue = spanLossTx.subtract(BigDecimal.valueOf(9)); + } + BigDecimal mcWidth = new BigDecimal(50); // we work at constant power spectral density (50 GHz channel width @-20dBm=37.5GHz) // 87.5 GHz channel width @-20dBm=75GHz - if (input.getWidth() != null) { - BigDecimal gridSize = input.getWidth().getValue(); - LOG.debug("Input Gridsize is {}",gridSize); - if (gridSize.equals(GridConstant.WIDTH_80)) { - powerValue = powerValue.add(BigDecimal.valueOf(3)); - } - // TODO no default or warning for unsupported grid sizes ? + if (input.getMcWidth() != null) { + // Units of MC-width are in GHz, meaning it should be 40/50/87.5GHz + // TODO: Should we validate this units before proceeding? + LOG.debug("Input Grid size is {}", input.getMcWidth().getValue()); + + // We round-off the mc-width to the nearest grid-value based on the granularity of 12.5 GHz + double nbrMcSlots = Math.ceil(input.getMcWidth().getValue().doubleValue() / MC_WIDTH_GRAN); + LOG.debug("Nearest (ceil) number of slots {}", nbrMcSlots); + mcWidth = new BigDecimal(MC_WIDTH_GRAN * nbrMcSlots); + LOG.debug("Given mc-width={}, Rounded mc-width={}", input.getMcWidth().getValue(), mcWidth); + + BigDecimal logVal = mcWidth.divide(new BigDecimal(50)); + double pdsVal = 10 * Math.log10(logVal.doubleValue()); + // Addition of PSD value will give Pin[87.5 GHz] + powerValue = powerValue.add(new BigDecimal(pdsVal, new MathContext(3, RoundingMode.HALF_EVEN))); } - // FIXME compliancy with OpenROADM MSA and approximations used + // FIXME compliancy with OpenROADM MSA and approximations used -- should be addressed with powermask update // cf JIRA ticket https://jira.opendaylight.org/browse/TRNSPRTPCE-494 - LOG.info("Power Value is {}", powerValue); + powerValue = powerValue.setScale(2, RoundingMode.CEILING); + // target-output-power yang precision is 2, so we limit here to 2 + LOG.info("The power value is P1[{}GHz]={} dB for spanloss {}", mcWidth, powerValue, spanLossTx); return powerValue; }