From 41a5a49d86ac134b13b14e2a6d70dea064257a79 Mon Sep 17 00:00:00 2001
From: Henry <akhenry@gmail.com>
Date: Thu, 7 Apr 2016 10:13:21 -0700
Subject: [PATCH] [Examples] Converted sinewave generator to object prototype
 form

---
 .../src/SinewaveTelemetryProvider.js          | 164 ++++++++++--------
 1 file changed, 96 insertions(+), 68 deletions(-)

diff --git a/example/generator/src/SinewaveTelemetryProvider.js b/example/generator/src/SinewaveTelemetryProvider.js
index a50cf4b2cf..1c6afe78b8 100644
--- a/example/generator/src/SinewaveTelemetryProvider.js
+++ b/example/generator/src/SinewaveTelemetryProvider.js
@@ -22,7 +22,10 @@
 /*global define,Promise*/
 
 /**
- * Module defining SinewaveTelemetryProvider. Created by vwoeltje on 11/12/14.
+ * Module defining SinewaveTelemetryProvider.
+ * Created by vwoeltje on 11/12/14.
+ *
+ * @memberof example/generator
  */
 define(
     ["./SinewaveTelemetrySeries"],
@@ -30,89 +33,114 @@ define(
         "use strict";
 
         /**
-         *
+         * A telemetry provider that generates sine wave data for testing
+         * and telemetry purposes.
          * @constructor
          */
         function SinewaveTelemetryProvider($q, $timeout) {
-            var subscriptions = [],
-                generating = false;
+            this.$q = $q;
+            this.$timeout = $timeout;
+            this.subscriptions = [];
+            this.generating = false;
+        }
 
-            //
-            function matchesSource(request) {
-                return request.source === "generator";
-            }
+        function doPackage(results) {
+            var packaged = {};
+            results.forEach(function (result) {
+                packaged[result.key] = result.telemetry;
+            });
+            // Format as expected (sources -> keys -> telemetry)
+            return { generator: packaged };
+        }
 
-            // Used internally; this will be repacked by doPackage
-            function generateData(request) {
-                return {
-                    key: request.key,
-                    telemetry: new SinewaveTelemetrySeries(request)
-                };
-            }
+        /**
+         * Produce some data to be passed to registered subscription callbacks
+         * @param request
+         * @returns {{key: string, telemetry: SinewaveTelemetrySeries}}
+         */
+        SinewaveTelemetryProvider.prototype.generateData = function (request) {
+            return {
+                key: request.key,
+                telemetry: new SinewaveTelemetrySeries(request)
+            };
+        }
 
-            //
-            function doPackage(results) {
-                var packaged = {};
-                results.forEach(function (result) {
-                    packaged[result.key] = result.telemetry;
-                });
-                // Format as expected (sources -> keys -> telemetry)
-                return { generator: packaged };
-            }
+        SinewaveTelemetryProvider.prototype.matchesSource = function (request) {
+            return request.source === "generator";
+        }
 
-            function requestTelemetry(requests) {
-                return $timeout(function () {
-                    return doPackage(requests.filter(matchesSource).map(generateData));
-                }, 0);
-            }
+        /**
+         * Invoke callbacks on all registered subscriptions when data is
+         * available.
+         */
+        SinewaveTelemetryProvider.prototype.handleSubscriptions = function () {
+            var self = this;
+            self.subscriptions.forEach(function (subscription) {
+                var requests = subscription.requests;
+                subscription.callback(doPackage(
+                    requests.filter(self.matchesSource).map(self.generateData)
+                ));
+            });
+        }
 
-            function handleSubscriptions() {
-                subscriptions.forEach(function (subscription) {
-                    var requests = subscription.requests;
-                    subscription.callback(doPackage(
-                        requests.filter(matchesSource).map(generateData)
-                    ));
-                });
-            }
+        /**
+         * Will start producing telemetry every second
+         */
+        SinewaveTelemetryProvider.prototype.startGenerating = function () {
+            var self = this;
+            self.generating = true;
+            self.$timeout(function () {
+                self.handleSubscriptions();
+                if (self.generating && self.subscriptions.length > 0) {
+                    self.startGenerating();
+                } else {
+                    self.generating = false;
+                }
+            }, 1000);
+        };
 
-            function startGenerating() {
-                generating = true;
-                $timeout(function () {
-                    handleSubscriptions();
-                    if (generating && subscriptions.length > 0) {
-                        startGenerating();
-                    } else {
-                        generating = false;
-                    }
-                }, 1000);
-            }
+        /**
+         * Request historical telemetry from this source.
+         * @param requests
+         * @returns {object} an object with the request key as the key, and
+         * a SinewaveTelemetrySeries as its value
+         */
+        SinewaveTelemetryProvider.prototype.requestTelemetry = function (requests) {
+            var self = this;
+            return this.$timeout(function () {
+                return doPackage(requests.filter(self.matchesSource).map(self.generateData));
+            }, 0);
+        };
 
-            function subscribe(callback, requests) {
-                var subscription = {
+        /**
+         * Subscribe to realtime telemetry
+         * @param callback a function to call when data is available
+         * @param requests all current telemetry requests (will be tested to
+         * see if they match this source)
+         * @returns {function} a function to call to unsubscribe from this
+         * telemetry source
+         */
+        SinewaveTelemetryProvider.prototype.subscribe = function (callback, requests) {
+            var self = this,
+                subscription = {
                     callback: callback,
                     requests: requests
                 };
 
-                function unsubscribe() {
-                    subscriptions = subscriptions.filter(function (s) {
-                        return s !== subscription;
-                    });
-                }
-
-                subscriptions.push(subscription);
-
-                if (!generating) {
-                    startGenerating();
-                }
-
-                return unsubscribe;
+            function unsubscribe() {
+                self.subscriptions = subscriptions.filter(function (s) {
+                    return s !== subscription;
+                });
             }
 
-            return {
-                requestTelemetry: requestTelemetry,
-                subscribe: subscribe
-            };
-        }
+            self.subscriptions.push(subscription);
+
+            if (!this.generating) {
+                this.startGenerating();
+            }
+
+            return unsubscribe;
+        };
 
         return SinewaveTelemetryProvider;
     }