mirror of http://git.sublab.org/mjpegplexer/
297 lines
7.7 KiB
JavaScript
297 lines
7.7 KiB
JavaScript
// CCTV Control
|
|
//
|
|
// Author: Florian Raemisch
|
|
// Email: olf@subsignal.org
|
|
//
|
|
// cctv-control is a webinterface to control and view
|
|
// mjpeg encoded videos by cctv cameras which are
|
|
// proxied by mjpegplexer. camera control is possible
|
|
// with arrow-keys, if mjpegplexer is configured
|
|
// properly.
|
|
//
|
|
// This Software is licensed under the GPL Version 3, 29 June 2007
|
|
|
|
var cam = 0;
|
|
var camHost = "192.168.1.66:8080";
|
|
var controlHost = "192.168.1.66:8080";
|
|
var submitHost = "192.168.1.66:8080";
|
|
var formActive = 0; //crazy errors if boolean is used here...
|
|
|
|
//create event which is triggered when DOM is ready
|
|
window.onDomReady = initReady;
|
|
|
|
//change from testbild to default cam when DOM is ready
|
|
window.onDomReady(initViewer);
|
|
|
|
|
|
function initReady(fn) {
|
|
if(document.addEventListener) {
|
|
document.addEventListener("DOMContentLoaded", fn, false);
|
|
}
|
|
}
|
|
|
|
function reloadSrc() {
|
|
var camImage = document.getElementById('camImage');
|
|
camImage.setAttribute('src', camImage.getAttribute('src'));
|
|
window.setTimeout(reloadSrc, 5000);
|
|
}
|
|
|
|
//hide the form, and switch on camera
|
|
function initViewer() {
|
|
var display = document.getElementById('screen');
|
|
var camImage = document.getElementById('camImage');
|
|
var tempCam = parseInt(localStorage.getItem('cam'));
|
|
|
|
formActive = localStorage.getItem("formActive");
|
|
if (tempCam <= 7 && tempCam >= 0) {
|
|
cam = tempCam;
|
|
}
|
|
|
|
//if form was displayed, when page was reloaded, display form
|
|
if (formActive == 1) {
|
|
displayCamNumber();
|
|
camImage.setAttribute('src',
|
|
'http://' + camHost + '/cam/' + cam + '/stream.mjpeg');
|
|
showForm();
|
|
}
|
|
else {
|
|
formActive == 0;
|
|
document.getElementById('form').style.visibility = "hidden";
|
|
changeCam();
|
|
}
|
|
|
|
reloadSrc();
|
|
}
|
|
|
|
function displayCamNumber() {
|
|
var camNumber = cam + 1;
|
|
var camDisplay = document.getElementsByClassName('camNumber')[0];
|
|
|
|
camDisplay.innerText = camNumber;
|
|
}
|
|
|
|
//change currently displayed camera to the one in cam variable
|
|
function changeCam() {
|
|
|
|
var display = document.getElementById('screen');
|
|
var camImage = document.getElementById('camImage');
|
|
if (cam <= 7 && cam >= 0) {
|
|
displayCamNumber();
|
|
camImage.setAttribute('src',
|
|
'http://' + camHost + '/cam/' + cam + '/stream.mjpeg');
|
|
localStorage.setItem("cam", cam);
|
|
}
|
|
else {
|
|
camImage.setAttribute('src', 'img/testbild.gif');
|
|
}
|
|
}
|
|
|
|
//send control command to currently selected camera
|
|
function controlCam(direction) {
|
|
if (direction == "left" || direction == "right" || direction == "up" || direction == "down") {
|
|
var request = new XMLHttpRequest();
|
|
request.open("get", "http://" + controlHost + "/cam/" + cam + "/control/" + direction, false);
|
|
request.send();
|
|
return false;
|
|
}
|
|
}
|
|
|
|
//save current screenshot in local storage
|
|
function saveImage() {
|
|
|
|
var storageFiles = {}, //local storage object
|
|
xhr = new XMLHttpRequest(),
|
|
blob,
|
|
fileReader = new FileReader(),
|
|
snapShot = new Image(), //dummy-object to display snapshot
|
|
imgCanvas = document.createElement("canvas"),
|
|
imgContext = imgCanvas.getContext("2d");
|
|
|
|
|
|
//xhr.open("GET", 'img/testbild-' + camDisplay + '.png', true);
|
|
xhr.open("GET", 'http://' + camHost + '/cam/' + cam + '/snapshot.jpg', true);
|
|
xhr.responseType = "arraybuffer";
|
|
|
|
xhr.addEventListener("load", function () {
|
|
if (xhr.status === 200) {
|
|
|
|
blob = new Blob([xhr.response], {type: "image/jpg"});
|
|
|
|
|
|
fileReader.onload = function (evt) {
|
|
var result = evt.target.result;
|
|
|
|
snapShot.src = result;
|
|
|
|
try {
|
|
localStorage.setItem("snapShot", result);
|
|
localStorage.setItem("timeStamp",
|
|
strftime('%Y-%m-%d_%H-%M-%S'));
|
|
}
|
|
catch (e) {
|
|
console.log("Storage failed: " + e);
|
|
}
|
|
};
|
|
|
|
fileReader.readAsDataURL(blob);
|
|
|
|
fileReader.onloadend = function() {
|
|
showForm();
|
|
}
|
|
}
|
|
}, false);
|
|
|
|
xhr.send();
|
|
}
|
|
|
|
function showForm() {
|
|
|
|
//load snapshot from localstorage
|
|
var display1 = document.getElementById("camImage"),
|
|
stor = localStorage.getItem("snapShot");
|
|
timestamp = localStorage.getItem("timeStamp");
|
|
|
|
//display loaded image
|
|
if (stor) {
|
|
display1.setAttribute("src", stor);
|
|
}
|
|
|
|
//insert date in date-field
|
|
document.getElementById("formDate").value = timestamp;
|
|
|
|
//make form visible
|
|
document.getElementById("form").style.visibility = 'visible';
|
|
document.getElementById("printButton").onclick = completeForm;
|
|
formActive = 1;
|
|
localStorage.setItem("formActive", formActive);
|
|
}
|
|
|
|
var errorTimeout = null;
|
|
function setError(message) {
|
|
var error_box = document.getElementById('errorBox');
|
|
error_box.innerText = message;
|
|
if (errorTimeout !== null)
|
|
window.clearTimeout(errorTimeout);
|
|
errorTimeout = window.setTimeout(function() {
|
|
error_box.innerHTML = ' ';
|
|
errorTimeout = null;
|
|
}, 5000);
|
|
return false;
|
|
}
|
|
|
|
|
|
function completeForm() {
|
|
var formName = document.getElementById('formName');
|
|
var formDate = document.getElementById('formDate');
|
|
var formAnalysis1 = document.getElementById('formAnalysis1');
|
|
var formAnalysis2 = document.getElementById('formAnalysis2');
|
|
var formAnalysis3 = document.getElementById('formAnalysis3');
|
|
|
|
if (formName.value.length < 3)
|
|
return setError("Personalkennzeichung unzureichend!");
|
|
if (formAnalysis1.value.length < 3)
|
|
return setError("Analyse der Aufnahme unzureichend!");
|
|
if (formAnalysis2.value.length < 3)
|
|
return setError("Bemerkungen zum Untersuchungsverlauf unzureichend!");
|
|
if (formAnalysis3.value.length < 3)
|
|
return setError("Persönliche Bemerkungen fehlen!");
|
|
|
|
// unfocus and disable button
|
|
//otherwise next enter press will trigger print-function
|
|
document.getElementById('printButton').blur();
|
|
document.getElementById('printButton').onclick = function() {
|
|
return false;
|
|
};
|
|
|
|
var request = new XMLHttpRequest();
|
|
request.open("post", "http://" + submitHost + "/submit", false);
|
|
|
|
var post_object = {
|
|
'cam': localStorage.getItem("cam"),
|
|
'formName': formName.value,
|
|
'formDate': formDate.value,
|
|
'formAnalysis1': formAnalysis1.value,
|
|
'formAnalysis2': formAnalysis2.value,
|
|
'formAnalysis3': formAnalysis3.value,
|
|
'formImage': localStorage.getItem("snapShot")
|
|
};
|
|
|
|
var post_data = JSON.stringify(post_object);
|
|
request.setRequestHeader('Content-Type', 'application/json');
|
|
request.send(post_data);
|
|
|
|
// clear the input fields so they are not
|
|
// visible during next usage of the form.
|
|
// XXX: Leave the name in?
|
|
document.getElementById('formName').value = '';
|
|
document.getElementById('formAnalysis1').value = '';
|
|
document.getElementById('formAnalysis2').value = '';
|
|
document.getElementById('formAnalysis3').value = '';
|
|
|
|
//hide form and unfocus button
|
|
//otherwise next enter press will trigger print-function
|
|
document.getElementById("form").style.visibility = 'hidden';
|
|
formActive = 0;
|
|
localStorage.setItem("formActive", formActive);
|
|
changeCam();
|
|
return false;
|
|
}
|
|
|
|
|
|
function keyDown(event) {
|
|
|
|
// chaning the camera is only possible if the form is not displayed
|
|
if (formActive != 1) {
|
|
//numpad has different keycodes!
|
|
switch(event.keyCode) {
|
|
case 49: // 1
|
|
cam = 0;
|
|
changeCam();
|
|
break;
|
|
case 50: // 2
|
|
cam = 1;
|
|
changeCam();
|
|
break;
|
|
case 51: // 3
|
|
cam = 2;
|
|
changeCam();
|
|
break;
|
|
case 52: // 4
|
|
cam = 3;
|
|
changeCam();
|
|
break;
|
|
case 53: // 5
|
|
cam = 4;
|
|
changeCam();
|
|
break;
|
|
case 54: // 6
|
|
cam = 5;
|
|
changeCam();
|
|
break;
|
|
case 55: // 7
|
|
cam = 6;
|
|
changeCam();
|
|
break;
|
|
case 56: // 8
|
|
cam = 7;
|
|
changeCam();
|
|
break;
|
|
case 37: // arrow left
|
|
controlCam("left");
|
|
break;
|
|
case 38: // arrow up
|
|
controlCam("up");
|
|
break;
|
|
case 39: // arrow right
|
|
controlCam("right");
|
|
break;
|
|
case 40: // arrow down
|
|
controlCam("down");
|
|
break;
|
|
case 13: //enter
|
|
saveImage();
|
|
break;
|
|
}
|
|
}
|
|
}
|