GUI2 Added intents to Traffic2 Monitor

Change-Id: I92744f214b96b6abcb09fac3afa9c497780065e5
diff --git a/web/gui2-topo-lib/projects/gui2-topo-lib/src/lib/topology/topology.component.ts b/web/gui2-topo-lib/projects/gui2-topo-lib/src/lib/topology/topology.component.ts
index 8ce1a6e..97b8764 100644
--- a/web/gui2-topo-lib/projects/gui2-topo-lib/src/lib/topology/topology.component.ts
+++ b/web/gui2-topo-lib/projects/gui2-topo-lib/src/lib/topology/topology.component.ts
@@ -65,7 +65,7 @@
     RESETZOOM_BTN,
     SUMMARY_TOGGLE
 } from '../panel/toolbar/toolbar.component';
-import {TrafficService} from '../traffic.service';
+import {TrafficService, TrafficType} from '../traffic.service';
 import {ZoomableDirective} from '../layer/zoomable.directive';
 import {MapObject} from '../layer/maputils';
 import {LayoutService, LayoutType} from '../layout.service';
@@ -86,6 +86,7 @@
 const PREF_SUMMARY = 'summary';
 const PREF_TOOLBAR = 'toolbar';
 const PREF_PINNED = 'pinned';
+const PREF_TRAFFIC = 'traffic';
 
 const BACKGROUND_ELEMENTS = [
     'svg topo2',
@@ -111,6 +112,7 @@
     toolbar: number;
     grid: number;
     pinned: number;
+    traffic: number;
 }
 
 /**
@@ -166,7 +168,9 @@
         spr: 0,
         summary: 1,
         toolbar: 0,
-        grid: 0
+        grid: 0,
+        pinned: 0,
+        traffic: 2 // default to PORTSTATSPKTSEC, as it will iterate over to 0 on init
     };
 
     mapIdState: MapObject = <MapObject>{
@@ -260,6 +264,14 @@
         }
     }
 
+    private static trafficTypeFlashMessage(index: number): string {
+        switch (index) {
+            case 0: return 'tr_fl_fstats_bytes';
+            case 1: return 'tr_fl_pstats_bits';
+            case 2: return 'tr_fl_pstats_pkts';
+        }
+    }
+
     /**
      * Pass the list of Key Commands to the KeyService, and initialize the Topology
      * Service - which communicates with through the WebSocket to the ONOS server
@@ -276,6 +288,7 @@
         this.ps.addListener((data) => this.prefsUpdateHandler(data));
         this.prefsState = this.ps.getPrefs(TOPO2_PREFS, this.prefsState);
         this.mapIdState = this.ps.getPrefs(TOPO_MAPID_PREFS, this.mapIdState);
+        this.trs.init(this.force);
 
         this.log.debug('Topology component initialized');
     }
@@ -311,6 +324,7 @@
     ngOnDestroy() {
         this.ts.destroy();
         this.ps.removeListener((data) => this.prefsUpdateHandler(data));
+        this.trs.destroy();
         this.log.debug('Topology component destroyed');
     }
 
@@ -373,7 +387,7 @@
                 this.cancelTraffic();
                 break;
             case ALL_TRAFFIC:
-                this.monitorAllTraffic();
+                this.cycleTrafficTypeDisplay();
                 break;
             case QUICKHELP_BTN:
                 this.ks.quickHelpShown = true;
@@ -397,7 +411,7 @@
      */
     actionMap() {
         return {
-            A: [() => {this.monitorAllTraffic(); }, 'Monitor all traffic'],
+            A: [() => {this.cycleTrafficTypeDisplay(); }, 'Monitor all traffic'],
             B: [(token) => {this.toggleBackground(token); }, 'Toggle background'],
             D: [(token) => {this.toggleDetails(token); }, 'Toggle details panel'],
             E: [() => {this.equalizeMasters(); }, 'Equalize mastership roles'],
@@ -527,6 +541,15 @@
         this.log.debug('Cycling grid display', old, next);
     }
 
+    protected cycleTrafficTypeDisplay() {
+        const old: TrafficType.Enum = this.prefsState.traffic; // by number
+        const next = TrafficType.next(old);
+        this.flashMsg = this.lionFn(TopologyComponent.trafficTypeFlashMessage(next));
+        this.updatePrefsState(PREF_TRAFFIC, next);
+        this.trs.requestTraffic(next);
+        this.log.debug('Cycling traffic display', old, next);
+    }
+
     /**
      * When the button is clicked on the toolbar or the B key is pressed
      * 1) Find the inverse of the current state (held as 1 or 0)
@@ -674,15 +697,7 @@
     nodeSelected(nodesOrLink: UiElement[]) {
         this.details.ngOnChanges({'selectedNodes':
             new SimpleChange(undefined, nodesOrLink, true)});
-    }
-
-    /**
-     * Enable traffic monitoring
-     */
-    monitorAllTraffic() {
-        // TODO: Implement support for toggling between bits, packets and octets
-        this.flashMsg = this.lionFn('tr_fl_pstats_bits');
-        this.trs.init(this.force);
+        this.trs.cancelTraffic();
     }
 
     /**
@@ -690,7 +705,7 @@
      */
     cancelTraffic() {
         this.flashMsg = this.lionFn('fl_monitoring_canceled');
-        this.trs.destroy();
+        this.trs.cancelTraffic();
     }
 
     changeMap(map: MapObject) {