var tsCtrlrs = angular.module('tsCtrlrs', ['ngJustGage', 'n3-line-chart', "ngQuickDate"]); function isValidDate(d) { if ( Object.prototype.toString.call(d) !== "[object Date]" ) return false; return !isNaN(d.getTime()); } tsCtrlrs.config(function(ngQuickDateDefaultsProvider) { // Configure with icons from font-awesome return ngQuickDateDefaultsProvider.set({ closeButtonHtml: "", buttonIconHtml: "", nextLinkHtml: "", prevLinkHtml: "", // Take advantage of Sugar.js date parsing parseDateFunction: function(str) { d = Date.create(str); return d.isValid() ? d : null; } }); }); var dString_to_sqlite = function(dString){ /** * Takes a date string in the form YYYYMMDD_HHmmSS and returns it in SQLite format (YYYY-MM-DD HH:mm:SS) * @param {String} dString * @return {String} sqliteString */ var re = /(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})/; var fd = re.exec(dString); if (fd){ var sqliteString = ""; return sqliteString.concat(fd[1], "-", fd[2], "-", fd[3], " ", fd[4], ":", fd[5], ":", fd[6]); } else { return null; } }; var sqlite_to_dString = function(sqliteDate){ /** * Takes a sqlite date string in the form YYYY-MM-DD HH:mm:SS and returns it in format YYYYMMDD_HHmmSS * @param {String} sqliteDate * @return {String} dString */ var re = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/; var fd = re.exec(sqliteDate); if (fd){ var dString = ""; return dString.concat(fd[1], fd[2], fd[3], "_", fd[4], fd[5], fd[6]); } else { return null; } }; var date_to_dString = function(inpDate){ var year = inpDate.getUTCFullYear().pad(4); var month = (inpDate.getUTCMonth() + 1).pad(2); var day = inpDate.getUTCDate().pad(2); var hour = inpDate.getUTCHours().pad(2); var min = inpDate.getUTCMinutes().pad(2); var sec = inpDate.getUTCSeconds().pad(2); return "".concat(year, month, day, "_", hour, min, sec); }; tsCtrlrs.factory('Page', function($log) { var title = 'default'; var page = 'default'; return { title: function() { return title; }, setTitle: function(newTitle) { title = newTitle; }, page: function() { return page; }, setPage: function(newPage) { page = newPage; } }; }); tsCtrlrs.factory('Alerts', function($log) { var alerts = []; return { add: function(alt) { alerts.push(alt); }, remove: function(indx) { alerts.splice(indx, 1); }, clear: function() { alerts = []; }, get: function() { return alerts; } }; }); tsCtrlrs.factory('tags',function($q, $http, $log){ var getTag = function(id) { var deferred = $q.defer(); $http.get('/json/tag/' + id).success(function(data) { if(data.status == "OK"){ deferred.resolve({ tag:data.tags[0], status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; var getTagList = function() { var deferred = $q.defer(); $http.get('/json/tag/').success(function(data) { if(data.status == "OK"){ deferred.resolve({ tags:data.tags, status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; var getTagHistory = function(id){ var deferred = $q.defer(); $http.get('/json/series/'+ id + "/24").success(function(data) { if(data.status == "OK"){ deferred.resolve({ vals:data.vals, status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; var getTagHistoryBetween = function(id, start, end){ var deferred = $q.defer(); var url = '/json/valBetween/'+ id + "/" + date_to_dString(start) + "/" + date_to_dString(end); $log.info("getting value for: " + url); $http.get(url).success(function(data) { if(data.status == "OK"){ deferred.resolve({ vals:data.vals, status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; var getCurrentValues = function(){ var deferred = $q.defer(); $http.get('/json/all').success(function(data) { if(data.status == "OK"){ deferred.resolve({ vals:data.vals, status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; var createTag = function(tag){ $http.post('/json/tag/add', { tagName: tag.tagName, vanityName: tag.vanityName, units: tag.units, minExpected: tag.minExpected, maxExpected: tag.maxExpected, description: tag.description }).success(function(data){ return data; }); }; var updateTag = function(tag){ $log.info("updateTag called with "+ JSON.stringify(tag)); $http.post('/json/tag/update', { id: tag.id, tagName: tag.tagName, vanityName: tag.vanityName, units: tag.units, minExpected: tag.minExpected, maxExpected: tag.maxExpected, description: tag.description }).success(function(data){ return data; }).error(function(err){ $log.warn("updateTag Error: " + err); }); }; var deleteTag = function(id){ var deferred = $q.defer(); var url = '/json/tag/delete/' + id; $http.get(url).success(function(data) { deferred.resolve({ status: data.status }); }); return deferred.promise; }; return { getTag: getTag, getTagList: getTagList, getTagHistory: getTagHistory, getTagHistoryBetween: getTagHistoryBetween, getCurrentValues: getCurrentValues, createTag: createTag, updateTag: updateTag, deleteTag: deleteTag, }; }); tsCtrlrs.factory('config',function($q, $http, $log){ var getConfig = function(){ var deferred = $q.defer(); $http.get('/json/config/').success(function(data) { if(data.status == "OK"){ deferred.resolve({ config:data.config, status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; var submitParameter = function(entry){ $http.post('/json/config', { parameter: entry.parameter, val: entry.val }).success(function(data){ return data; }); }; var getLoggerStatus = function(){ var deferred = $q.defer(); $http.get('/json/logger/status').success(function(data) { if(data.status == "OK"){ deferred.resolve({ running:data.running, status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message, }); } }); return deferred.promise; }; var restartLogger = function(){ var deferred = $q.defer(); $http.get('/json/logger/restart').success(function(data) { if(data.status == "OK"){ deferred.resolve({ status: data.status }); } else { deferred.resolve({ status:data.status, message: data.message }); } }); return deferred.promise; }; return { getConfig:getConfig, submitParameter: submitParameter, getLoggerStatus: getLoggerStatus, restartLogger: restartLogger }; }); tsCtrlrs.controller('mainCtrl', function($scope, Page, Alerts) { $scope.Page = Page; $scope.Alerts = Alerts; }); tsCtrlrs.controller('dashboardCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) { Page.setTitle('Dashboard'); Page.setPage('dashboard'); $scope.loadDashboard = function(){ $scope.loading = true; var getCurrentValues = tags.getCurrentValues(); getCurrentValues.then(function(data) { $scope.loading = false; if (data.status == "OK"){ $scope.vals = data.vals; $scope.error = false; } else { $scope.error = data.message; } }); }; $scope.loadDashboard(); }); tsCtrlrs.controller('tagsCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) { Page.setTitle('Tags'); Page.setPage('tags'); $scope.loadTagList = function(){ $scope.loading = true; var getTagList = tags.getTagList(); getTagList.then(function(data) { $scope.loading = false; if (data.status == "OK"){ $scope.tags = data.tags; $scope.error = false; } else { $scope.error = data.message; } }); }; $scope.loadTagList(); $scope.submitAddTag = function(){ var createStatus = tags.createTag($scope.newTag); $scope.createStatus = createStatus.status; $scope.loadTagList(); }; $scope.openDeleteTag = function(id){ var getTag = tags.getTag(id); getTag.then(function(data){ if (data.status == "OK"){ $scope.error = false; $scope.dTag = data.tag; $log.info("Thinking about deleting tag with parameters: "+ JSON.stringify($scope.dTag)); } else { $scope.error = data.message; } }); }; $scope.deleteTag = function(id){ var deleteTag = tags.deleteTag(id); deleteTag.then(function(data){ $log.info("deleting tag "+ id + " status: " + data.status); if (data.status == "OK"){ $scope.error = false; $scope.loadTagList(); } else { $scope.error = data.message; } }); }; $scope.openEditTag = function(id){ var getTag = tags.getTag(id); getTag.then(function(data){ if (data.status == "OK"){ $scope.error = false; $scope.editTag = data.tag; $log.info("Started editing tag with parameters: "+ JSON.stringify($scope.editTag)); } else { $scope.error = data.message; } }); }; $scope.submitEditTag = function(){ var editStatus = tags.updateTag($scope.editTag); $log.info(editStatus); $scope.editStatus = editStatus.status; $scope.loadTagList(); }; }); tsCtrlrs.controller('tagValsCtrl', function($scope, $route, $http, $routeParams, Page, Alerts, $log, tags) { Page.setTitle('Tag Series'); Page.setPage('tags'); if ($routeParams.endDatetime){ $scope.endDatetime = Date.parse(dString_to_sqlite($routeParams.endDatetime)); } else { $scope.endDatetime = new Date(); } if ($routeParams.startDatetime){ $scope.startDatetime = Date.parse(dString_to_sqlite($routeParams.startDatetime)); } else { $scope.startDatetime = new Date(); $scope.startDatetime.setHours($scope.endDatetime.getHours() - 2); } $scope.loadTagVals = function(sDTime, eDTime){ $scope.loading = true; var getTag = tags.getTag($routeParams.tagID); getTag.then(function(tagData){ if (tagData.status == "OK"){ $scope.tag = tagData.tag; Page.setTitle('Tag Series: '+ tagData.tag.tagName); var getTagHistoryBetween = tags.getTagHistoryBetween($routeParams.tagID, sDTime, eDTime); getTagHistoryBetween.then(function(data) { $scope.loading = false; if (data.status == "OK"){ $scope.data = data; $scope.data.vals = $scope.data.vals.map(function(x){ return {id: x.id, tagID: x.tagID, val: x.val, dateAdded: new Date(x.dateAdded)}; }); $scope.error = false; $scope.options = { series: [ { axis: "y", dataset: "vals", key: "val", label: "Tag Value", color: "#1f77b4", type: ['line'], id: 'tagChart' } ], axes: { x: { key: "dateAdded", type: "date" } } }; } else { $scope.error = data.message; } }); } else { $scope.loading = false; $scope.error = data.message; } }); }; $scope.loadTagVals($scope.startDatetime, $scope.endDatetime); }); tsCtrlrs.controller('configCtrl', function($scope, Page, Alerts, $log, config) { Page.setTitle('Configuration'); Page.setPage('configuration'); $scope.loadConfig = function(){ $scope.loading = true; var getConfig = config.getConfig(); getConfig.then(function(data) { $scope.loading = false; if (data.status == "OK"){ $scope.config = data.config; $scope.error = false; } else { $scope.error = data.message; } }); }; $scope.loadConfig(); $scope.paramError = null; var selString = "Select a parameter..."; $scope.newParam = { pSelected: selString, parameter: null, val: null }; $scope.addParameter = function(){ if ($scope.newParam.pSelected == selString){ $scope.paramError = "No parameter selected"; } else { if ($scope.newParam.pSelected == "other") { $scope.newParam.parameter = $scope.newParam.pEntry; } else { $scope.newParam.parameter = $scope.newParam.pSelected; } config.submitParameter($scope.newParam); $scope.loadConfig(); } }; $scope.checkLogger = function(){ $scope.loggerLoading = true; var checkLoggerStatus = config.getLoggerStatus(); checkLoggerStatus.then(function(data){ $scope.loggerLoading = false; if (data.status == "OK"){ $scope.loggerRunning = data.running; $scope.error = false; } else { $scope.error = data.message; } }); }; $scope.checkLogger(); $scope.restartLogger = function(){ var restartLogger = config.restartLogger(); restartLogger.then(function(data){ if (data.status == "OK"){ $scope.error = false; $scope.checkLogger(); } else { $scope.error = data.message; } }); }; }); //*---- FILTERS -----*// tsCtrlrs.filter('dString', function myDateFormat($filter){ return function(text){ var tempdate= new Date(text); return $filter('date')(tempdate, "yyyyMMdd'_'HHmmss"); }; }); tsCtrlrs.filter('sqlite_to_local', function sqliteformat($filter){ return function(text){ var utcdate= new Date(text + " UTC"); return $filter('date')(utcdate, "yyyy-MM-dd hh:mm:ss a"); }; });