Adding wavelenght to port view and MHz to command

Change-Id: Iecdf46c82cd2df4fe1b46f759d32a1c49a7dd9d6
(cherry picked from commit 02e2eb4ee23b7032e4d3f56b5087d169edac2e46)
diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java
index 9f50458..568df72 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/cli/PortWaveLengthCommand.java
@@ -32,6 +32,7 @@
 import org.onosproject.net.Device;
 import org.onosproject.net.GridType;
 import org.onosproject.net.OchSignal;
+import org.onosproject.net.Port;
 import org.onosproject.net.device.DeviceService;
 import org.onosproject.net.flow.DefaultFlowRule;
 import org.onosproject.net.flow.DefaultTrafficSelector;
@@ -41,8 +42,11 @@
 import org.onosproject.net.flow.TrafficSelector;
 import org.onosproject.net.flow.TrafficTreatment;
 import org.onosproject.net.flow.instructions.Instructions;
+import org.onosproject.net.optical.OchPort;
+import org.onosproject.net.optical.device.OchPortHelper;
 
 import java.util.Map;
+import java.util.Optional;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
@@ -63,6 +67,7 @@
     private static final String CH_25 = "25";
     private static final String CH_50 = "50";
     private static final String CH_100 = "100";
+    public static final long BASE_FREQUENCY = 193100000;   //Working in Mhz
 
     private static final Map<String, ChannelSpacing> CHANNEL_SPACING_MAP = ImmutableMap
             .<String, ChannelSpacing>builder()
@@ -83,18 +88,18 @@
     @Completion(OpticalConnectPointCompleter.class)
     String connectPointString = "";
 
+    @Argument(index = 2, name = "value",
+            description = "Optical Signal or wavelength. Provide wavelenght in MHz, while Och Format = "
+                    + SIGNAL_FORMAT, required = false, multiValued = false)
+    String parameter = "";
 
-    @Argument(index = 2, name = "signal",
-            description = "Optical Signal. Format = " + SIGNAL_FORMAT,
-            required = true, multiValued = false)
-    String signal = "";
 
     private OchSignal createOchSignal() throws IllegalArgumentException {
-        if (signal == null) {
+        if (parameter == null) {
             return null;
         }
         try {
-            String[] splitted = signal.split("/");
+            String[] splitted = parameter.split("/");
             checkArgument(splitted.length == 4,
                     "signal requires 4 parameters: " + SIGNAL_FORMAT);
             int slotGranularity = Integer.parseInt(splitted[0]);
@@ -111,12 +116,54 @@
              * are subclasses of RuntimeException.
              */
             String msg = String.format("Invalid signal format: %s, expected format is %s.",
-                    signal, SIGNAL_FORMAT);
+                    parameter, SIGNAL_FORMAT);
             print(msg);
             throw new IllegalArgumentException(msg, e);
         }
     }
 
+    private OchSignal createOchSignalFromWavelength(DeviceService deviceService, ConnectPoint cp) {
+        long wavelength = Long.parseLong(parameter);
+        if (wavelength == 0L) {
+            return null;
+        }
+        Port port = deviceService.getPort(cp);
+        Optional<OchPort> ochPortOpt = OchPortHelper.asOchPort(port);
+
+        if (ochPortOpt.isPresent()) {
+            OchPort ochPort = ochPortOpt.get();
+            GridType gridType = ochPort.lambda().gridType();
+            ChannelSpacing channelSpacing = ochPort.lambda().channelSpacing();
+            int slotGranularity = ochPort.lambda().slotGranularity();
+            int multiplier = getMultplier(wavelength, gridType, channelSpacing, slotGranularity);
+            return new OchSignal(gridType, channelSpacing, multiplier, slotGranularity);
+        } else {
+            print("Connect point %s is not OChPort", cp);
+            return null;
+        }
+
+    }
+
+    private int getMultplier(long wavelength, GridType gridType, ChannelSpacing channelSpacing, int slotGranularity) {
+        long baseFreq;
+        switch (gridType) {
+            case DWDM:
+                baseFreq = BASE_FREQUENCY;
+                break;
+            case CWDM:
+            case FLEX:
+            case UNKNOWN:
+            default:
+                baseFreq = 0L;
+                break;
+        }
+        if (wavelength > baseFreq) {
+            return (int) ((wavelength - baseFreq) / (channelSpacing.frequency().asMHz()));
+        } else {
+            return (int) ((baseFreq - wavelength) / (channelSpacing.frequency().asMHz()));
+        }
+    }
+
 
     @Override
     protected void doExecute() throws Exception {
@@ -133,8 +180,19 @@
 
             // an empty traffic selector
             TrafficSelector trafficSelector = trafficSelectorBuilder.matchInPort(cp.port()).build();
-            OchSignal ochSignal = createOchSignal();
-
+            OchSignal ochSignal;
+            if (parameter.contains("/")) {
+                ochSignal = createOchSignal();
+            } else if (parameter.matches("-?\\d+(\\.\\d+)?")) {
+                ochSignal = createOchSignalFromWavelength(deviceService, cp);
+            } else {
+                print("Signal or wavelength %s are in uncorrect format");
+                return;
+            }
+            if (ochSignal == null) {
+                print("Error in creating OchSignal");
+                return;
+            }
             TrafficTreatment trafficTreatment = trafficTreatmentBuilder
                     .add(Instructions.modL0Lambda(ochSignal))
                     .add(Instructions.createOutput(deviceService.getPort(cp).number()))