summaryrefslogtreecommitdiff
path: root/www/js/TimelineCtrl.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/js/TimelineCtrl.js')
-rw-r--r--www/js/TimelineCtrl.js238
1 files changed, 141 insertions, 97 deletions
diff --git a/www/js/TimelineCtrl.js b/www/js/TimelineCtrl.js
index 027734a4..6d91b6d5 100644
--- a/www/js/TimelineCtrl.js
+++ b/www/js/TimelineCtrl.js
@@ -244,7 +244,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
//-------------------------------------------------------------------------
function onPause() {
NVRDataModel.debug("TimelineCtrl:onpause called");
- $interval.cancel(updateInterval);
+ $interval.cancel(updateInterval);
// console.log("*** Moving to Background ***"); // Handle the pause event
if ($scope.popover) $scope.popover.remove();
@@ -520,7 +520,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
function shortenTime(str) {
if (NVRDataModel.getLogin().useLocalTimeZone)
return moment.tz(str, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format(NVRDataModel.getTimeFormat());
- else
+ else
return moment(str).format(NVRDataModel.getTimeFormat());
}
@@ -590,80 +590,109 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
/**
- * [processNewEvents description]
+ * [processNewEvents is called every X seconds when dynamic update is on. X = 10 for now]
* @return {[type]}
*/
function processNewEvents() {
-
+ //safeguard in the event http calls are still going on
if (!$scope.follow.time || isProcessNewEventsWaiting) return;
+
var ld = NVRDataModel.getLogin();
- console.log("NEED TO PROCESS NEW EVENTS");
+
// check for last 2 minutes to account for late DB updates and what not. 5 mins was likely enough
var from = moment(lastTimeForEvent).subtract(2, 'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
var to = moment().locale('en').format("YYYY-MM-DD HH:mm:ss");
lastTimeForEvent = moment();
- var apiurl = ld.apiurl + '/events/index/StartTime >=:' + from /*+ "/EndTime <=:" + to*/ ;
- //apiurl = apiurl + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0);
- // we can't do alarm frames and end time as otherwise currently recording won't show up
- // FIXME: Check the same in Events page
-
- apiurl = apiurl + ".json";
+ // FIXME: totally ignoring event pages - hoping it wont be more than 100 or 150 whatever
+ // the events per page limit is. Why? laziness.
+ //
+ var completedEvents = ld.apiurl + '/events/index/StartTime >=:' + from;
+ // we can add alarmCount as this is really for completed events
+ completedEvents = completedEvents + "/AlarmFrames >=:" + (ld.enableAlarmCount ? ld.minAlarmCount : 0);
+
+ completedEvents = completedEvents + ".json";
- NVRDataModel.debug("Getting incremental events using: " + apiurl);
+ // now get currently ongoing events
+ // as it turns out various events get stored withn null and never recover
+ // so, lets limiy to 15 m
+ //
+
+ var st = moment().subtract (10,'minutes').locale('en').format("YYYY-MM-DD HH:mm:ss");
+ var ongoingEvents = ld.apiurl + '/events/index/StartTime >=:'+st+'/EndTime =:.json';
+ //NVRDataModel.debug("Getting incremental events using: " + completedEvents);
isProcessNewEventsWaiting = true;
- $http.get(apiurl)
- .then(function(data)
- {
-
- $scope.newEvents = '';
- var localNewEvents = '';
+
+ var $httpApi = $http.get(completedEvents);
+ var $httpOngoing = $http.get(ongoingEvents);
+
+ $q.all([$httpApi, $httpOngoing])
+ .then(function(dataarray) {
+
+ var myevents = dataarray[0].data.events;
+
+ if (dataarray.length > 1) {
+ myevents = myevents.concat(dataarray[1].data.events);
+
+ }
+
+ $scope.newEvents = '';
+ var localNewEvents = '';
//console.log ("GOT "+JSON.stringify(data));
- var myevents = data.data.events;
- for (var j = 0; j < myevents.length; j++)
- {
- console.log("GOT Event Id:" + myevents[j].Event.Id);
+
+ for (var j = 0; j < myevents.length; j++) {
+
+ // get rid of the moment js deprecation notice
+ myevents[j].Event.StartTime = moment.tz(myevents[j].Event.StartTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+
+ myevents[j].Event.EndTime = moment.tz(myevents[j].Event.EndTime, NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+
var itm = graphData.get(myevents[j].Event.Id);
- if (itm)
- {
+ if (itm) {
console.log(myevents[j].Event.Id + " already exists, updating params");
- var content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || 'new') + ") " + myevents[j].Event.Notes + "</span>";
+ var content = "<span class='my-vis-font'>" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
var style;
+ var recordingInProgress = false;
if (moment(myevents[j].Event.EndTime).isValid()) // recording over
{
- // remove flash
- content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || 'new') + ") " + myevents[j].Event.Notes + "</span>";
-
- style="background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] +
- ";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length];
- }
+
+ content = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + myevents[j].Event.AlarmFrames + ") " + myevents[j].Event.Notes + "</span>";
- else // still recording
+ style = "background-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length] +
+ ";border-color:" + colors[parseInt(myevents[j].Event.MonitorId) % colors.length];
+ } else // still recording
{
-
- NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, likely recording, so fixing");
-
- myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
- style="background-color:orange" ;
+ myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+ style = "background-color:orange";
+ recordingInProgress = true;
}
- if (moment(options.max).isBefore(moment()))
- {
- console.log ("Adjusting Range to fit in new event");
- options.max = moment().add ('1','hours').locale('en').format("YYYY-MM-DD HH:mm:ss");
- timeline.setOptions(options);
- }
- // data.update({id: 2, group: 1});
+ if (moment(options.max).isBefore(moment())) {
+ // console.log("Adjusting Range to fit in new event");
+ options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss");
+ timeline.setOptions(options);
+ }
+ // data.update({id: 2, group: 1});
// update end time - is it needed to be updated?
- graphData.update({
- id: myevents[j].Event.Id,
+ //
+
+ // right at this point we need to decide if we keep or remove this event
+ //
+
+ if (ld.enableAlarmCount && ld.minAlarmCount > myevents[j].Event.AlarmFrames && !recordingInProgress) {
+ // remove
+ NVRDataModel.debug("Removing Event:" + myevents[j].Event.Id + "as it doesn't have" + myevents[j].Event.AlarmFrames + " alarm frames");
+ graphData.remove(myevents[j].Event.Id);
+ } else {
+ graphData.update({
+ id: myevents[j].Event.Id,
content: content,
start: myevents[j].Event.StartTime,
end: myevents[j].Event.EndTime,
@@ -677,13 +706,19 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
myvideo: myevents[j].Event.DefaultVideo,
myevent: myevents[j]
- });
+ });
+
+ timeline.focus(myevents[j].Event.Id);
+ localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
+
+
+ }
- timeline.focus( myevents[j].Event.Id);
- localNewEvents= localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId)+'@'+shortenTime(myevents[j].Event.StartTime)+' ('+myevents[j].Event.Id+'),';
} else { // event is new
+
+ var isBeingRecorded = false;
var idfound = false;
for (var ii = 0; ii < $scope.monitors.length; ii++) {
if ($scope.monitors[ii].Monitor.Id == myevents[j].Event.MonitorId && NVRDataModel.isNotHidden(myevents[j].Event.MonitorId)) {
@@ -693,9 +728,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
if (idfound) {
- NVRDataModel.debug(myevents[j].Event.Id + " New event updating graph");
- localNewEvents= localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId)+'@'+shortenTime(myevents[j].Event.StartTime)+' ('+myevents[j].Event.Id+'),';
+
myevents[j].Event.MonitorName = NVRDataModel.getMonitorName(myevents[j].Event.MonitorId);
@@ -720,69 +754,80 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
}
// now lets make sure we don't infinitely increase
-
+
if (graphIndex >= curCount)
//if (1)
{
var mv = graphData.min('id');
//console.log("MIN="+JSON.stringify(mv));
- if (mv)
- {
+ if (mv) {
graphData.remove(mv.id);
graphIndex--;
- NVRDataModel.debug ("Removed Event "+mv.id+" to make space");
+ NVRDataModel.debug("Removed Event " + mv.id + " to make space");
}
}
// since this is a new add its possible dates are not defined
- if (!moment(myevents[j].Event.StartTime).isValid())
- {
- NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-Invalid Start time - this should really not happen ");
+ if (!moment(myevents[j].Event.StartTime).isValid()) {
+ NVRDataModel.debug("Event:" + myevents[j].Event.Id + "-Invalid Start time - this should really not happen ");
}
- if (!moment(myevents[j].Event.EndTime).isValid())
- {
- NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, likely recording, so fixing" );
+ if (!moment(myevents[j].Event.EndTime).isValid()) {
+ // NVRDataModel.debug ("Event:" + myevents[j].Event.Id +"-End time is invalid, likely recording, so fixing" );
myevents[j].Event.EndTime = moment.tz(moment(), NVRDataModel.getTimeZoneNow()).tz(moment.tz.guess()).format('YYYY-MM-DD HH:mm:ss');
+ isBeingRecorded = true;
}
-
+
// if range doesn't allow for current time, we need to fix that
- if (moment(options.max).isBefore(moment()))
- {
- console.log ("Adjusting Range to fit in new event");
- options.max = moment().add ('1','hours').locale('en').format("YYYY-MM-DD HH:mm:ss");
+ if (moment(options.max).isBefore(moment())) {
+ // console.log("Adjusting Range to fit in new event");
+ options.max = moment().add('1', 'hours').locale('en').format("YYYY-MM-DD HH:mm:ss");
timeline.setOptions(options);
- }
+ }
- graphData.add({
-
- id: myevents[j].Event.Id,
- content: "<span class='my-vis-font'>" + "New Event:( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>",
- start: myevents[j].Event.StartTime,
- end: myevents[j].Event.EndTime,
- group: myevents[j].Event.MonitorId,
- style:"background-color:orange" ,
- //type: "range",
-
- myframes: myevents[j].Event.Frames,
- mydur: myevents[j].Event.Length,
- myeid: myevents[j].Event.Id,
- myename: myevents[j].Event.Name,
- myvideo: myevents[j].Event.DefaultVideo,
- myevent: myevents[j]
+ var eventText = "<span class='my-vis-font'>" + "( <i class='ion-android-notifications'></i>" + (myevents[j].Event.AlarmFrames || ' unknown ') + ") " + myevents[j].Event.Notes + "</span>";
- });
- graphIndex++;
+ if (isBeingRecorded) {
+ eventText = "<span class='my-vis-font'>" + myevents[j].Event.Notes + " " + $translate.instant('kRecordingProgress') + "</span>";
+ }
+
+ // since we concated, its possible events may be repeated
+ if (!graphData.get(myevents[j].Event.Id)) {
+ NVRDataModel.debug(">>> "+myevents[j].Event.Id + " at " + myevents[j].Event.StartTime + " New event updating graph");
+
+ localNewEvents = localNewEvents + NVRDataModel.getMonitorName(myevents[j].Event.MonitorId) + '@' + shortenTime(myevents[j].Event.StartTime) + ' (' + myevents[j].Event.Id + '),';
+
+
+ console.log ("SHIZ");
+ graphData.add({
+
+ id: myevents[j].Event.Id,
+ content: eventText,
+ start: myevents[j].Event.StartTime,
+ end: myevents[j].Event.EndTime,
+ group: myevents[j].Event.MonitorId,
+ style: "background-color:orange",
+ //type: "range",
+
+ myframes: myevents[j].Event.Frames,
+ mydur: myevents[j].Event.Length,
+ myeid: myevents[j].Event.Id,
+ myename: myevents[j].Event.Name,
+ myvideo: myevents[j].Event.DefaultVideo,
+ myevent: myevents[j]
+
+ });
+ graphIndex++;
+ }
-
//options.max = moment(fromDate).locale('en').format("YYYY-MM-DD HH:mm:ss");
- timeline.focus( myevents[j].Event.Id);
+ timeline.focus(myevents[j].Event.Id);
} //idfound
@@ -792,9 +837,8 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
} // for j
// At this stage, see if we need to display new events
- if (localNewEvents.length > 0)
- {
- localNewEvents = $translate.instant('kLatestEvents')+':'+localNewEvents;
+ if (localNewEvents.length > 0) {
+ localNewEvents = $translate.instant('kLatestEvents') + ':' + localNewEvents;
localNewEvents = localNewEvents.slice(0, -1);
$scope.newEvents = localNewEvents;
}
@@ -823,7 +867,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
function drawGraph(fromDate, toDate, count) {
- $scope.newEvents="";
+ $scope.newEvents = "";
// we only need this for day mode
$interval.cancel(updateInterval);
@@ -864,7 +908,7 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
- options = {
+ options = {
showCurrentTime: true,
editable: false,
@@ -1060,14 +1104,14 @@ angular.module('zmApp.controllers').controller('zmApp.TimelineCtrl', ['$ionicPla
// this is called for each tick the bar moves
// speed moves depending on zoom factor
//
- /* timeline.on('currentTimeTick', function() {
+ /* timeline.on('currentTimeTick', function() {
- if ($scope.follow.time) {
-
- }
+ if ($scope.follow.time) {
+
+ }
- });*/
+ });*/
timeline.on('click', function(prop) {