it actually looks good AND works!
This commit is contained in:
parent
2dcf3f1fe4
commit
3a5d570add
5 changed files with 826 additions and 145 deletions
|
|
@ -20,9 +20,6 @@ class BMDCamera {
|
||||||
// Current Transport Mode (string)
|
// Current Transport Mode (string)
|
||||||
transportMode;
|
transportMode;
|
||||||
|
|
||||||
// Whether the transport is playing or not (boolean)
|
|
||||||
isPlaying;
|
|
||||||
|
|
||||||
// Playback state (JSON object)
|
// Playback state (JSON object)
|
||||||
playbackState;
|
playbackState;
|
||||||
|
|
||||||
|
|
@ -80,6 +77,9 @@ class BMDCamera {
|
||||||
CCcolor;
|
CCcolor;
|
||||||
CClumacontribution;
|
CClumacontribution;
|
||||||
|
|
||||||
|
// Keep track of unimplemented functions on the camera (array of strings)
|
||||||
|
UnimplementedFunctionality = [];
|
||||||
|
|
||||||
// ============= CONSTRUCTOR ================
|
// ============= CONSTRUCTOR ================
|
||||||
constructor(hostname, index) {
|
constructor(hostname, index) {
|
||||||
this.hostname = hostname;
|
this.hostname = hostname;
|
||||||
|
|
@ -117,7 +117,6 @@ class BMDCamera {
|
||||||
this.updateUISupportedCodecFormats();
|
this.updateUISupportedCodecFormats();
|
||||||
this.updateUISupportedVideoFormats();
|
this.updateUISupportedVideoFormats();
|
||||||
this.updateUITransportMode();
|
this.updateUITransportMode();
|
||||||
this.updateUIisPlaying();
|
|
||||||
this.updateUIPlaybackState();
|
this.updateUIPlaybackState();
|
||||||
this.updateUIRecordState();
|
this.updateUIRecordState();
|
||||||
this.updateUITimecode();
|
this.updateUITimecode();
|
||||||
|
|
@ -133,14 +132,15 @@ class BMDCamera {
|
||||||
this.updateUIshutter();
|
this.updateUIshutter();
|
||||||
this.updateUIAutoExposureMode();
|
this.updateUIAutoExposureMode();
|
||||||
this.updateUIColorCorrection();
|
this.updateUIColorCorrection();
|
||||||
|
this.updateUILinks();
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIname() {
|
updateUIname() {
|
||||||
document.getElementsByClassName("cameraName")[this.index].innerHTML = this.name;
|
document.getElementById("cameraName").innerHTML = this.name;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIhostname() {
|
updateUIhostname() {
|
||||||
//TBD
|
document.getElementById("hostnameInput").value = this.hostname;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUICodecFormat() {
|
updateUICodecFormat() {
|
||||||
|
|
@ -163,26 +163,25 @@ class BMDCamera {
|
||||||
//TBD
|
//TBD
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIisPlaying() {
|
|
||||||
//TBD
|
|
||||||
}
|
|
||||||
|
|
||||||
updateUIPlaybackState() {
|
updateUIPlaybackState() {
|
||||||
//TBD
|
//TBD
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIRecordState() {
|
updateUIRecordState() {
|
||||||
if (this.recordState.recording) {
|
if (this.recordState.recording) {
|
||||||
document.getElementsByClassName("cameraControlsContainer")[this.index].classList.add("liveCam");
|
document.getElementById("cameraControlHeadContainer").classList.add("liveCam");
|
||||||
|
document.getElementById("cameraControlExpandedHeadContainer").classList.add("liveCam");
|
||||||
} else {
|
} else {
|
||||||
document.getElementsByClassName("cameraControlsContainer")[this.index].classList.remove("liveCam");
|
document.getElementById("cameraControlHeadContainer").classList.remove("liveCam");
|
||||||
|
document.getElementById("cameraControlExpandedHeadContainer").classList.remove("liveCam");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUITimecode() {
|
updateUITimecode() {
|
||||||
|
// Redo this to work with no leading 0
|
||||||
var tcString = parseInt(this.timecode.timecode.toString(16),10).toString().match(/.{1,2}/g).join(':');
|
var tcString = parseInt(this.timecode.timecode.toString(16),10).toString().match(/.{1,2}/g).join(':');
|
||||||
|
|
||||||
document.getElementsByClassName("timecodeLabel")[this.index].innerHTML = tcString;
|
document.getElementById("timecodeLabel").innerHTML = tcString;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIPresets() {
|
updateUIPresets() {
|
||||||
|
|
@ -194,21 +193,21 @@ class BMDCamera {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIAperture() {
|
updateUIAperture() {
|
||||||
document.getElementsByClassName("irisRange")[this.index].value = this.apertureNormalised;
|
document.getElementById("irisRange").value = this.apertureNormalised;
|
||||||
document.getElementsByClassName("apertureStopsLabel")[this.index].innerHTML = this.apertureStop.toFixed(1);
|
document.getElementById("apertureStopsLabel").innerHTML = this.apertureStop.toFixed(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIZoom() {
|
updateUIZoom() {
|
||||||
document.getElementsByClassName("zoomRange")[this.index].value = this.zoomNormalised;
|
document.getElementById("zoomRange").value = this.zoomNormalised;
|
||||||
document.getElementsByClassName("zoomMMLabel")[this.index].innerHTML = this.zoomMM;
|
document.getElementById("zoomMMLabel").innerHTML = this.zoomMM;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIFocus() {
|
updateUIFocus() {
|
||||||
document.getElementsByClassName("focusRange")[this.index].value = this.focusNormalised;
|
document.getElementById("focusRange").value = this.focusNormalised;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIISO() {
|
updateUIISO() {
|
||||||
// TBD
|
document.getElementById("ISOInput").value = this.ISO;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIgain() {
|
updateUIgain() {
|
||||||
|
|
@ -220,15 +219,15 @@ class BMDCamera {
|
||||||
gainString = this.gain+"db"
|
gainString = this.gain+"db"
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementsByClassName("gainSpan")[this.index].innerHTML = gainString;
|
document.getElementById("gainSpan").innerHTML = gainString;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIWhiteBalance() {
|
updateUIWhiteBalance() {
|
||||||
document.getElementsByClassName("whiteBalanceSpan")[this.index].innerHTML = this.WhiteBalance+"K";
|
document.getElementById("whiteBalanceSpan").innerHTML = this.WhiteBalance+"K";
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUINDStop() {
|
updateUINDStop() {
|
||||||
document.getElementsByClassName("ndFilterSpan")[this.index].innerHTML = this.NDStop;
|
document.getElementById("ndFilterSpan").innerHTML = this.NDStop;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIshutter() {
|
updateUIshutter() {
|
||||||
|
|
@ -237,11 +236,15 @@ class BMDCamera {
|
||||||
if ('shutterSpeed' in this.shutter) {
|
if ('shutterSpeed' in this.shutter) {
|
||||||
shutterString = "1/"+this.shutter.shutterSpeed
|
shutterString = "1/"+this.shutter.shutterSpeed
|
||||||
} else {
|
} else {
|
||||||
var shangleString = this.shutter.shutterAngle.toString();
|
var shangleString = (this.shutter.shutterAngle / 100).toFixed(1).toString()
|
||||||
shutterString = shangleString.slice(0,3)+(shangleString.slice(3,4) == '0' ? '' : "."+shangleString.slice(3,4))+"°"
|
if (shangleString.indexOf(".0") > 0) {
|
||||||
|
shutterString = parseFloat(shangleString).toFixed(0)+"°";
|
||||||
|
} else {
|
||||||
|
shutterString = shangleString+"°";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
document.getElementsByClassName("shutterSpan")[this.index].innerHTML = shutterString;
|
document.getElementById("shutterSpan").innerHTML = shutterString;
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIAutoExposureMode() {
|
updateUIAutoExposureMode() {
|
||||||
|
|
@ -249,7 +252,34 @@ class BMDCamera {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateUIColorCorrection() {
|
updateUIColorCorrection() {
|
||||||
//TBD
|
// Lift
|
||||||
|
document.getElementsByClassName("CClumaLabel")[0].innerHTML = this.CClift.luma.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCredLabel")[0].innerHTML = this.CClift.red.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCgreenLabel")[0].innerHTML = this.CClift.green.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCblueLabel")[0].innerHTML = this.CClift.blue.toFixed(2);
|
||||||
|
|
||||||
|
// Gamma
|
||||||
|
document.getElementsByClassName("CClumaLabel")[1].innerHTML = this.CCgamma.luma.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCredLabel")[1].innerHTML = this.CCgamma.red.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCgreenLabel")[1].innerHTML = this.CCgamma.green.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCblueLabel")[1].innerHTML = this.CCgamma.blue.toFixed(2);
|
||||||
|
|
||||||
|
// Gain
|
||||||
|
document.getElementsByClassName("CClumaLabel")[2].innerHTML = this.CCgain.luma.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCredLabel")[2].innerHTML = this.CCgain.red.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCgreenLabel")[2].innerHTML = this.CCgain.green.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCblueLabel")[2].innerHTML = this.CCgain.blue.toFixed(2);
|
||||||
|
|
||||||
|
// Offset
|
||||||
|
document.getElementsByClassName("CClumaLabel")[3].innerHTML = this.CCoffset.luma.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCredLabel")[3].innerHTML = this.CCoffset.red.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCgreenLabel")[3].innerHTML = this.CCoffset.green.toFixed(2);
|
||||||
|
document.getElementsByClassName("CCblueLabel")[3].innerHTML = this.CCoffset.blue.toFixed(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
updateUILinks() {
|
||||||
|
document.getElementById("documentationLink").href = "http://"+this.hostname+"/control/documentation.html";
|
||||||
|
document.getElementById("mediaManagerLink").href = "http://"+this.hostname;
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============== GETTERS ==================
|
// =============== GETTERS ==================
|
||||||
|
|
@ -257,86 +287,82 @@ class BMDCamera {
|
||||||
// name, hostname, APIaddress, index handled by constructor
|
// name, hostname, APIaddress, index handled by constructor
|
||||||
|
|
||||||
getCodecFormat() {
|
getCodecFormat() {
|
||||||
this.pullData("/system/codecFormat").then((value) => {this.codecFormat = value});
|
this.pullData("/system/codecFormat").then((value) => {this.codecFormat = value; this.updateUICodecFormat()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getVideoFormat() {
|
getVideoFormat() {
|
||||||
this.pullData("/system/videoFormat").then((value) => {this.videoFormat = value});
|
this.pullData("/system/videoFormat").then((value) => {this.videoFormat = value; this.updateUIVideoFormat()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getSupportedCodecFormats() {
|
getSupportedCodecFormats() {
|
||||||
this.pullData("/system/supportedCodecFormats").then((value) => {this.supportedCodecFormats = value});
|
this.pullData("/system/supportedCodecFormats").then((value) => {this.supportedCodecFormats = value; this.updateUISupportedCodecFormats()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getSupportedVideoFormats() {
|
getSupportedVideoFormats() {
|
||||||
this.pullData("/system/supportedVideoFormats").then((value) => {this.supportedVideoFormats = value});
|
this.pullData("/system/supportedVideoFormats").then((value) => {this.supportedVideoFormats = value; this.updateUISupportedVideoFormats()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getTransportMode() {
|
getTransportMode() {
|
||||||
this.pullData("/transports/0").then((value) => {this.transportMode = value});
|
this.pullData("/transports/0").then((value) => {this.transportMode = value; this.updateUITransportMode()});
|
||||||
}
|
|
||||||
|
|
||||||
getIsPlaying() {
|
|
||||||
this.pullData("/transports/0/play").then((value) => {this.isPlaying = value});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
getPlaybackState() {
|
getPlaybackState() {
|
||||||
this.pullData("/transports/0/playback").then((value) => {this.playbackState = value});
|
this.pullData("/transports/0/playback").then((value) => {this.playbackState = value; this.updateUIPlaybackState()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getRecordState() {
|
getRecordState() {
|
||||||
this.pullData("/transports/0/record").then((value) => {this.recordState = value});
|
this.pullData("/transports/0/record").then((value) => {this.recordState = value; this.updateUIRecordState()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getTimecode() {
|
getTimecode() {
|
||||||
this.pullData("/transports/0/timecode").then((value) => {this.timecode = value});
|
this.pullData("/transports/0/timecode").then((value) => {this.timecode = value; this.updateUITimecode()});
|
||||||
this.pullData("/transports/0/timecode/source").then((value) => {this.timecode.source = value.source});
|
this.pullData("/transports/0/timecode/source").then((value) => {this.timecode.source = value.source});
|
||||||
}
|
}
|
||||||
|
|
||||||
getPresets() {
|
getPresets() {
|
||||||
this.pullData("/presets").then((value) => {this.presets = value.presets});
|
this.pullData("/presets").then((value) => {this.presets = value.presets; this.updateUIPresets()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getActivePreset() {
|
getActivePreset() {
|
||||||
this.pullData("/presets/active").then((value) => {this.activePreset = value});
|
this.pullData("/presets/active").then((value) => {this.activePreset = value; this.updateUIActivePreset()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getAperture() {
|
getAperture() {
|
||||||
this.pullData("/lens/iris").then((value) => {this.apertureStop = value.apertureStop; this.apertureNormalised = value.normalised});
|
this.pullData("/lens/iris").then((value) => {this.apertureStop = value.apertureStop; this.apertureNormalised = value.normalised; this.updateUIAperture()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getZoom() {
|
getZoom() {
|
||||||
this.pullData("/lens/zoom").then((value) => {this.zoomMM = value.focalLength; this.zoomNormalised = value.normalised});
|
this.pullData("/lens/zoom").then((value) => {this.zoomMM = value.focalLength; this.zoomNormalised = value.normalised; this.updateUIZoom()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getFocus() {
|
getFocus() {
|
||||||
this.pullData("/lens/focus").then((value) => {this.focusNormalised = value.normalised});
|
this.pullData("/lens/focus").then((value) => {this.focusNormalised = value.normalised; this.updateUIFocus()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getISO() {
|
getISO() {
|
||||||
this.pullData("/video/iso").then((value) => {this.ISO = value.iso});
|
this.pullData("/video/iso").then((value) => {this.ISO = value.iso; this.updateUIISO()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getGain() {
|
getGain() {
|
||||||
this.pullData("/video/gain").then((value) => {this.gain = value.gain});
|
this.pullData("/video/gain").then((value) => {this.gain = value.gain; this.updateUIgain()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getWhiteBalance() {
|
getWhiteBalance() {
|
||||||
this.pullData("/video/whiteBalance").then((value) => {this.WhiteBalance = value.whiteBalance});
|
this.pullData("/video/whiteBalance").then((value) => {this.WhiteBalance = value.whiteBalance});
|
||||||
this.pullData("/video/whiteBalanceTint").then((value) => {this.WhiteBalanceTint = value.whiteBalanceTint});
|
this.pullData("/video/whiteBalanceTint").then((value) => {this.WhiteBalanceTint = value.whiteBalanceTint; this.updateUIWhiteBalance()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getND() {
|
getND() {
|
||||||
this.pullData("/video/ndFilter").then((value) => {this.NDStop = value.stop});
|
this.pullData("/video/ndFilter").then((value) => {this.NDStop = value.stop; this.updateUINDStop()});
|
||||||
this.pullData("/video/ndFilter/displayMode").then((value) => {this.NDMode = value.displayMode});
|
this.pullData("/video/ndFilter/displayMode").then((value) => {this.NDMode = value.displayMode});
|
||||||
}
|
}
|
||||||
|
|
||||||
getShutter() {
|
getShutter() {
|
||||||
this.pullData("/video/shutter").then((value) => {this.shutter = value});
|
this.pullData("/video/shutter").then((value) => {this.shutter = value; this.updateUIshutter()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getAutoExposureMode() {
|
getAutoExposureMode() {
|
||||||
this.pullData("/video/autoExposure").then((value) => {this.AutoExposureMode = value});
|
this.pullData("/video/autoExposure").then((value) => {this.AutoExposureMode = value; this.updateUIAutoExposureMode()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getColorCorrection() {
|
getColorCorrection() {
|
||||||
|
|
@ -346,7 +372,7 @@ class BMDCamera {
|
||||||
this.pullData("/colorCorrection/offset").then((value) => {this.CCoffset = value});
|
this.pullData("/colorCorrection/offset").then((value) => {this.CCoffset = value});
|
||||||
this.pullData("/colorCorrection/contrast").then((value) => {this.CCcontrast = value});
|
this.pullData("/colorCorrection/contrast").then((value) => {this.CCcontrast = value});
|
||||||
this.pullData("/colorCorrection/color").then((value) => {this.CCcolor = value});
|
this.pullData("/colorCorrection/color").then((value) => {this.CCcolor = value});
|
||||||
this.pullData("/colorCorrection/lumaContribution").then((value) => {this.CClumacontribution = value});
|
this.pullData("/colorCorrection/lumaContribution").then((value) => {this.CClumacontribution = value; this.updateUIColorCorrection()});
|
||||||
}
|
}
|
||||||
|
|
||||||
getAllInfo() {
|
getAllInfo() {
|
||||||
|
|
@ -355,7 +381,6 @@ class BMDCamera {
|
||||||
this.getSupportedCodecFormats();
|
this.getSupportedCodecFormats();
|
||||||
this.getSupportedVideoFormats();
|
this.getSupportedVideoFormats();
|
||||||
this.getTransportMode();
|
this.getTransportMode();
|
||||||
this.getIsPlaying();
|
|
||||||
this.getPlaybackState();
|
this.getPlaybackState();
|
||||||
this.getRecordState();
|
this.getRecordState();
|
||||||
this.getTimecode();
|
this.getTimecode();
|
||||||
|
|
@ -373,14 +398,130 @@ class BMDCamera {
|
||||||
this.getColorCorrection();
|
this.getColorCorrection();
|
||||||
}
|
}
|
||||||
|
|
||||||
// =============== Other Commands =======================
|
// =============== SETTERS ==================
|
||||||
doAutoFocus() {
|
|
||||||
this.pushData("/lens/focus/doAutoFocus")
|
// name, hostname, APIaddress, index should never have to be set
|
||||||
|
|
||||||
|
setCodecFormat(newCodecFormatObject) {
|
||||||
|
this.pushData("/system/codecFormat",newCodecFormatObject).then(() => sleep(1000).then(() => this.getCodecFormat()));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Timer Stuff */
|
setVideoFormat(newVideoFormatObject) {
|
||||||
everySecond() {
|
this.pushData("/system/videoFormat",newVideoFormatObject).then(() => sleep(1000).then(() => this.getCodecFormat()));
|
||||||
this.refresh();
|
}
|
||||||
|
|
||||||
|
setTransportMode(newTransportModeString) {
|
||||||
|
this.pushData("/transports/0",{"mode": newTransportModeString}).then(() => sleep(1000).then(() => this.getTransportMode()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setPlaybackState(playbackStateObject) {
|
||||||
|
this.pushData("/transports/0/playback",playbackStateObject).then(() => sleep(1000).then(() => this.getPlaybackState()));
|
||||||
|
}
|
||||||
|
|
||||||
|
sendPresetFile(file) {
|
||||||
|
sendRequest("POST",this.APIAddress+"/presets",file)
|
||||||
|
}
|
||||||
|
|
||||||
|
setActivePreset(presetString) {
|
||||||
|
this.pushData("/presets/active",{"preset": presetString}).then(() => sleep(1000).then(() => this.getActivePreset()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setAperture(apertureNormalisedFloat) {
|
||||||
|
this.pushData("/lens/iris",{"normalised": apertureNormalisedFloat}).then(() => sleep(1000).then(() => this.getAperture()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setZoom(zoomNormalisedFloat) {
|
||||||
|
this.pushData("/lens/zoom",{"normalised": zoomNormalisedFloat}).then(() => sleep(1000).then(() => this.getZoom()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setFocus(focusNormalisedFloat) {
|
||||||
|
this.pushData("/lens/focus",{"normalised": focusNormalisedFloat}).then(() => sleep(1000).then(() => this.getFocus()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setISO(ISOint) {
|
||||||
|
this.pushData("/video/iso",{"iso":ISOint}).then(() => sleep(1000).then(() => this.getISO()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setGain(gainInt) {
|
||||||
|
this.pushData("/video/gain",{"gain":gainInt}).then(() => sleep(1000).then(() => this.getGain()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setWhiteBalance(whiteBalanceInt, whiteBalanceTintInt) {
|
||||||
|
this.pushData("/video/whiteBalance",{"whiteBalance": whiteBalanceInt});
|
||||||
|
this.pushData("/video/whiteBalanceTint",{"whiteBalanceTint": whiteBalanceTintInt}).then(() => sleep(1000).then(() => this.getWhiteBalance()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setND(NDstopInt) {
|
||||||
|
this.pushData("/video/ndFilter",{"stop": NDstopInt}).then(() => sleep(1000).then(() => this.getND()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setNDDisplayMode(displayModeString) {
|
||||||
|
this.pushData("/video/ndFilter/displayMode",{"displayMode": displayModeString}).then(() => sleep(1000).then(() => this.getND()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Accepts JSON obejcts with either shutterSpeed or shutterAngle properties
|
||||||
|
// Note that shutterAngle is 100x the displayed value
|
||||||
|
setShutter(shutterObject) {
|
||||||
|
this.pushData("/video/shutter",shutterObject).then(() => sleep(1000).then(() => this.getShutter()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setAutoExposureMode(AEmodeObject) {
|
||||||
|
this.pushData("/video/autoExposure",AEmodeObject).then(() => sleep(1000).then(() => this.getAutoExposureMode()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCLift(CCliftObject) {
|
||||||
|
this.pushData("/colorCorrection/lift",CCliftObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCGamma(CCgammaObject) {
|
||||||
|
this.pushData("/colorCorrection/gamma",CCgammaObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCGain(CCgainObject) {
|
||||||
|
this.pushData("/colorCorrection/gain",CCgainObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCOffset(CCoffsetObject) {
|
||||||
|
this.pushData("/colorCorrection/offset",CCoffsetObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCContrast(CCcontrastObject) {
|
||||||
|
this.pushData("/colorCorrection/contrast",CCcontrastObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCColor(CCcolorObject) {
|
||||||
|
this.pushData("/colorCorrection/color",CCcolorObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
setCCLumaContribuion(CClumacontributionObject) {
|
||||||
|
this.pushData("/colorCorrection/lumaContribution",CClumacontributionObject).then(() => sleep(1000).then(() => this.getColorCorrection()));
|
||||||
|
}
|
||||||
|
|
||||||
|
// =============== Other Commands =======================
|
||||||
|
doAutoFocus() {
|
||||||
|
this.pushData("/lens/focus/doAutoFocus").then(() => sleep(1500).then(() => this.getFocus()));
|
||||||
|
}
|
||||||
|
|
||||||
|
play() {
|
||||||
|
this.pushData("/transports/0/play").then(() => sleep(1000).then(() => this.getPlaybackState()));
|
||||||
|
}
|
||||||
|
|
||||||
|
record() {
|
||||||
|
this.pushData("/transports/0/record",{"recording": true}).then(() => {
|
||||||
|
sleep(2000).then(() => this.getRecordState());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
stopTransport() {
|
||||||
|
this.pushData("/transports/0/stop").then(() => {
|
||||||
|
sleep(2000).then(() => this.getPlaybackState());
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
stopRecord() {
|
||||||
|
this.pushData("/transports/0/record",{"recording": false}).then(() => {
|
||||||
|
sleep(2000).then(() => this.getRecordState());
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -398,8 +539,27 @@ async function sendRequest(method, url, data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
xhttp.open(method, url, false);
|
// Don't keep making API calls for unimplemented features
|
||||||
xhttp.send(JSON.stringify(data));
|
if (cameras[ci]) {
|
||||||
|
// First check if the camera exists.
|
||||||
|
if (cameras[ci].UnimplementedFunctionality.indexOf(url) < 0) {
|
||||||
|
// If everything is honky dory
|
||||||
|
|
||||||
|
xhttp.open(method, url, false);
|
||||||
|
xhttp.send(JSON.stringify(data));
|
||||||
|
} else {
|
||||||
|
// If everything is not honky dory
|
||||||
|
// do nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!responseObject) || (Object.hasOwn(responseObject,'error') && responseObject.error == "Not implemented for this device")) {
|
||||||
|
cameras[ci].UnimplementedFunctionality.push(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
xhttp.open(method, url, false);
|
||||||
|
xhttp.send(JSON.stringify(data));
|
||||||
|
}
|
||||||
|
|
||||||
return responseObject;
|
return responseObject;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
BIN
web-ui/Screenshot 2024-06-12 171720.png
Normal file
BIN
web-ui/Screenshot 2024-06-12 171720.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 121 KiB |
|
|
@ -24,71 +24,268 @@
|
||||||
|
|
||||||
<!-- Camera Select Bar -->
|
<!-- Camera Select Bar -->
|
||||||
<div class="flexContainerH" id="cameraSelectContainer">
|
<div class="flexContainerH" id="cameraSelectContainer">
|
||||||
|
<span class="cameraSwitchLabel selectedCam"><a href="#" onclick="switchCamera(0)">CAM1</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(1)">CAM2</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(2)">CAM3</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(3)">CAM4</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(4)">CAM5</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(5)">CAM6</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(6)">CAM7</a></span>
|
||||||
|
<span class="camSelectSeparator">|</span>
|
||||||
|
<span class="cameraSwitchLabel"><a href="#" onclick="switchCamera(7)">CAM8</a></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Camera Controls Box -->
|
<!-- Camera Controls Box -->
|
||||||
<div class="flexContainerH" id="allCamerasContainer">
|
<div class="flexContainerH" id="allCamerasContainer">
|
||||||
<div class="flexContainerV cameraControlsContainer">
|
<div class="flexContainerV" id="cameraControlsContainer">
|
||||||
<div class="flexContainerH cameraControlHeadContainer">
|
<div class="flexContainerH" id="cameraControlHeadContainer">
|
||||||
<h2 class="cameraName">CAM1</h2>
|
<h2 id="cameraNumberLabel">CAM1</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexContainerH cameraControlColorCorrectionContainer">
|
<div class="flexContainerH" id="cameraControlColorCorrectionContainer">
|
||||||
|
<!-- <div class="flexContainerH" id="cameraControlLGGTabs">
|
||||||
|
<a href="#" class="ccTabLabel selectedTab" onclick="setCCMode(0)">Lift</a>
|
||||||
|
<a href="#" class="ccTabLabel" onclick="setCCMode(1)">Gamma</a>
|
||||||
|
<a href="#" class="ccTabLabel" onclick="setCCMode(2)">Gain</a>
|
||||||
|
</div> -->
|
||||||
|
<span style="margin-top: 0.5em;">Lift</span>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionBottomContainer">
|
||||||
|
<button id="CCResetButton" class="circleButton" onclick="resetCC(0)" title="Reset Lift">⟳</button>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionNumbersContainer">
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #dbdbdb;" class="CClumaLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #e64b3d;" class="CCredLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #00a841;" class="CCgreenLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #2a78c8;" class="CCblueLabel">0.00</span>
|
||||||
|
</div>
|
||||||
|
<button id="CCHamburgerButton" class="circleButton" onclick="setCCFromUI(0)" title="Set Lift">➚</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span>Gamma</span>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionBottomContainer">
|
||||||
|
<button id="CCResetButton" class="circleButton" onclick="resetCC(1)" title="Reset Gamma">⟳</button>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionNumbersContainer">
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #dbdbdb;" class="CClumaLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #e64b3d;" class="CCredLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #00a841;" class="CCgreenLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #2a78c8;" class="CCblueLabel">0.00</span>
|
||||||
|
</div>
|
||||||
|
<button id="CCHamburgerButton" class="circleButton" onclick="setCCFromUI(1)" title="Set Gamma">➚</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<span>Gain</span>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionBottomContainer">
|
||||||
|
<button id="CCResetButton" class="circleButton" onclick="resetCC(2)" title="Reset Gain">⟳</button>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionNumbersContainer">
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #dbdbdb;" class="CClumaLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #e64b3d;" class="CCredLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #00a841;" class="CCgreenLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #2a78c8;" class="CCblueLabel">0.00</span>
|
||||||
|
</div>
|
||||||
|
<button id="CCHamburgerButton" class="circleButton" onclick="setCCFromUI(2)" title="Set Gain">➚</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<span>Offset</span>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionBottomContainer">
|
||||||
|
<button id="CCResetButton" class="circleButton" onclick="resetCC(3)" title="Reset Offset">⟳</button>
|
||||||
|
<div class="flexContainerH" id="cameraControlColorCorrectionNumbersContainer">
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #dbdbdb;" class="CClumaLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #e64b3d;" class="CCredLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #00a841;" class="CCgreenLabel">0.00</span>
|
||||||
|
<span contenteditable="plaintext-only" style="text-decoration-color: #2a78c8;" class="CCblueLabel">0.00</span>
|
||||||
|
</div>
|
||||||
|
<button id="CCHamburgerButton" class="circleButton" onclick="setCCFromUI(3)" title="Set Offset">➚</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexContainerH cameraControlExposureContainer">
|
<div class="flexContainerH" id="cameraControlExposureContainer">
|
||||||
<div class="ccExposureSettingContainer">
|
<div class="ccExposureSettingContainer">
|
||||||
<span class="exposureControlLabel">FILTER</span>
|
<span class="exposureControlLabel">FILTER</span>
|
||||||
<!-- Add control arrows -->
|
<div class="ccExposureSettingValueContainer">
|
||||||
<span class="ndFilterSpan">0</span>
|
<a class="expAdjArr" href="#" onclick="decreaseND()" id="NDL">◀</a>
|
||||||
|
<span id="ndFilterSpan">0</span>
|
||||||
|
<a class="expAdjArr" href="#" onclick="increaseND()" id="NDR">▶</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ccExposureSettingContainer">
|
<div class="ccExposureSettingContainer">
|
||||||
<span class="exposureControlLabel">GAIN</span>
|
<span class="exposureControlLabel">GAIN</span>
|
||||||
<!-- Add control arrows -->
|
<div class="ccExposureSettingValueContainer">
|
||||||
<span class="gainSpan">+0db</span>
|
<a class="expAdjArr" href="#" onclick="decreaseGain()" id="GAL">◀</a>
|
||||||
|
<span id="gainSpan">+0db</span>
|
||||||
|
<a class="expAdjArr" href="#" onclick="increaseGain()" id="GAR">▶</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ccExposureSettingContainer">
|
<div class="ccExposureSettingContainer">
|
||||||
<span class="exposureControlLabel">SHUTTER</span>
|
<span class="exposureControlLabel">SHUTTER</span>
|
||||||
<!-- Add control arrows -->
|
<div class="ccExposureSettingValueContainer">
|
||||||
<span class="shutterSpan">1/50</span>
|
<a class="expAdjArr" href="#" onclick="decreaseShutter()" id="SHL">◀</a>
|
||||||
|
<span id="shutterSpan">1/50</span>
|
||||||
|
<a class="expAdjArr" href="#" onclick="increaseShutter()" id="SHR">▶</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="ccExposureSettingContainer">
|
<div class="ccExposureSettingContainer">
|
||||||
<span class="exposureControlLabel">BALANCE</span>
|
<span class="exposureControlLabel">BALANCE</span>
|
||||||
<!-- Add control arrows -->
|
<div class="ccExposureSettingValueContainer">
|
||||||
<span class="whiteBalanceSpan">5600K</span>
|
<a class="expAdjArr" href="#" onclick="decreaseWhiteBalance()" id="WBL">◀</a>
|
||||||
|
<span id="whiteBalanceSpan">5600K</span>
|
||||||
|
<a class="expAdjArr" href="#" onclick="increaseWhiteBalance()" id="WBR">▶</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexContainerH cameraControlLensContainer">
|
<div class="flexContainerH" id="cameraControlLensContainer">
|
||||||
<div class="lensSliderContainer">
|
<div class="lensSliderContainer">
|
||||||
<span>FOCUS</span>
|
<span>FOCUS</span>
|
||||||
<input type="range" orient="vertical" max="1" min="0" step="0.001" class="focusRange">
|
<input type="range" orient="vertical" max="1" min="0" step="0.001" id="focusRange" onmouseup="cameras[ci].setFocus(parseFloat(this.value))">
|
||||||
<button onclick="cameras[ci].doAutoFocus()">AF</button>
|
<button id="AFButton" class="circleButton" onclick="cameras[ci].doAutoFocus()">AF</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="lensSliderContainer">
|
<div class="lensSliderContainer">
|
||||||
<span>IRIS</span>
|
<span>IRIS</span>
|
||||||
<input type="range" orient="vertical" max="1" min="0" step="0.001" class="irisRange">
|
<input type="range" orient="vertical" max="1" min="0" step="0.001" id="irisRange" onmouseup="cameras[ci].setAperture(parseFloat(this.value))">
|
||||||
<span class="apertureStopsLabel">X.X</span>
|
<span id="apertureStopsLabel">X.X</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="lensSliderContainer">
|
<div class="lensSliderContainer">
|
||||||
<span>ZOOM</span>
|
<span>ZOOM</span>
|
||||||
<input type="range" orient="vertical" max="1" min="0" step="0.001" class="zoomRange">
|
<input type="range" orient="vertical" max="1" min="0" step="0.001" id="zoomRange" onmouseup="cameras[ci].setZoom(parseFloat(this.value))">
|
||||||
<span class="zoomMMLabel">XXmm</span>
|
<span id="zoomMMLabel">XXmm</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flexContainerV cameraControlsContainerExpanded">
|
<div class="flexContainerV" id="cameraControlsContainerExpanded">
|
||||||
<div class="flexContainerH cameraControlExpandedHeadContainer">
|
<div class="flexContainerH" id="cameraControlExpandedHeadContainer">
|
||||||
<h2 class="timecodeLabel">TIMECODE</h2>
|
<h2 id="cameraName">CAMERA NAME</h2>
|
||||||
|
<div id="transportControls">
|
||||||
|
<!-- These will be sticky buttons for loop, single clip, record -->
|
||||||
|
<button class="circleButton" onclick="" title="Loop">↻</button>
|
||||||
|
<button class="circleButton" onclick="" title="Single Clip">S</button>
|
||||||
|
<button class="circleButton" onclick="" title="Back">⏴</button>
|
||||||
|
<button class="circleButton" onclick="" title="Forward">⏵</button>
|
||||||
|
<button class="circleButton" onclick="cameras[ci].record()" title="Record">⏺</button>
|
||||||
|
<button class="circleButton" onclick="cameras[ci].play()" title="Play">▶</button>
|
||||||
|
<button class="circleButton" onclick="cameras[ci].stopTransport(); cameras[ci].stopRecord();" title="Stop">⏹</button>
|
||||||
|
</div>
|
||||||
|
<h2 id="timecodeLabel">TIMECODE</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="connectionContainer">
|
|
||||||
<span>Hostname: </span>
|
<div class="flexContainerV" id="cameraControlExpandedBodyContainer">
|
||||||
<input type="text" value="Studio-Camera-6K-Pro.local" class="hostnameInput" onkeydown="textInputTrigger(this)">
|
<div class="tableControl">
|
||||||
<button onclick='cameras[ci] = new BMDCamera(document.getElementsByClassName("hostnameInput")[ci].value,ci);'>Connect</button>
|
<h3>Connection</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Hostname</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" value="Studio-Camera-6K-Pro.local" id="hostnameInput" onkeydown="textInputTrigger(this)">
|
||||||
|
<button onclick='cameras[ci] = new BMDCamera(document.getElementById("hostnameInput").value,ci);'>Connect</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Send API Call</td>
|
||||||
|
<td>
|
||||||
|
<input type="radio" id="requestTypeGET" value="GET" name="manualRequestType" checked>
|
||||||
|
<label for="requestTypeGET">GET</label>
|
||||||
|
<input type="radio" id="requestTypePUT" value="PUT" name="manualRequestType">
|
||||||
|
<label for="requestTypePUT">PUT</label>
|
||||||
|
|
||||||
|
<input type="text" id="manualRequestEndpointLabel" placeholder="request endpoint">
|
||||||
|
<input type="text" id="manualRequestBodyLabel" placeholder="request body">
|
||||||
|
|
||||||
|
<button onclick="manualAPICall()">Send API Request</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tableControl">
|
||||||
|
<h3>Presets</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Preset Select</td>
|
||||||
|
<td>
|
||||||
|
<select id="presetsDropDown" onchange="console.log('Preset selected: '+this.value)">
|
||||||
|
<option value="default">Default</option>
|
||||||
|
<option value="other">other</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="color: #727272;">Upload a preset file</td>
|
||||||
|
<td><input type="file" id="presetFileInput"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tableControl">
|
||||||
|
<h3>Exposure</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>ISO</td>
|
||||||
|
<td><input type="number" id="ISOInput" step="100" oninput="cameras[ci].setISO(parseInt(this.value))"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>AE Mode</td>
|
||||||
|
<td>
|
||||||
|
<select id="AEmodeDropDown">
|
||||||
|
<option value="Off">Off</option>
|
||||||
|
<option value="Continuous">Continuous</option>
|
||||||
|
<option value="OneShot">One-Shot</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>AE Type</td>
|
||||||
|
<td>
|
||||||
|
<select id="AEtypeDropDown">
|
||||||
|
<option value="">None</option>
|
||||||
|
<option value="Iris">Iris Only</option>
|
||||||
|
<option value="Shutter">Shutter Only</option>
|
||||||
|
<option value="Shutter,Iris">Shutter + Iris</option>
|
||||||
|
<option value="Iris,Shutter">Iris + Shutter</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<button style="margin: 2vh 0 0 3.5vw;" onclick="AEmodeInputHandler()">Set AE Mode</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tableControl">
|
||||||
|
<h3>Contrast</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Pivot</td>
|
||||||
|
<td><input type="range" max="1" min="0" step="0.001" id="CCcontrastPivotRange"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Adjust</td>
|
||||||
|
<td><input type="range" max="1" min="0" step="0.001" id="CCcontrastAdjustRange"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="tableControl">
|
||||||
|
<h3>Color</h3>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>Hue</td>
|
||||||
|
<td><input type="range" max="1" min="0" step="0.001" id="CChueRange"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Saturation</td>
|
||||||
|
<td><input type="range" max="1" min="0" step="0.001" id="CCsaturationRange"></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Luma Contribution</td>
|
||||||
|
<td><input type="range" max="1" min="0" step="0.001" id="CClumaContributionRange"></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -97,6 +294,11 @@
|
||||||
<!-- Footer Div -->
|
<!-- Footer Div -->
|
||||||
<div class="flexContainerH" id="footerContainer">
|
<div class="flexContainerH" id="footerContainer">
|
||||||
<button onclick="cameras.forEach((element) => {element.refresh()});">Refresh</button>
|
<button onclick="cameras.forEach((element) => {element.refresh()});">Refresh</button>
|
||||||
|
<div id="footerLinks">
|
||||||
|
<span><a id="documentationLink" href="#" target="_blank">YAML Documentation</a></span>
|
||||||
|
<span><a id="mediaManagerLink" href="#" target="_blank">Web Media Manager</a></span>
|
||||||
|
<span><a id="githubLink" href="#" target="https://github.com/DylanSpeiser/BM-Camera-Control-WebUI">GitHub</a></span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
288
web-ui/style.css
288
web-ui/style.css
|
|
@ -1,3 +1,5 @@
|
||||||
|
/* ============= WHOLE PAGE STYLES ================== */
|
||||||
|
|
||||||
/* Load NotoSansDisplay Font from resources */
|
/* Load NotoSansDisplay Font from resources */
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'NotoSansDisplay';
|
font-family: 'NotoSansDisplay';
|
||||||
|
|
@ -7,6 +9,7 @@
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: 'NotoSansDisplay', sans-serif;
|
font-family: 'NotoSansDisplay', sans-serif;
|
||||||
|
font-weight: 100;
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
background: #181818;
|
background: #181818;
|
||||||
|
|
@ -22,6 +25,91 @@ body {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Inputs */
|
||||||
|
|
||||||
|
input[type=text] {
|
||||||
|
border-radius: 0.5vh;
|
||||||
|
background: rgb(30, 30, 30);
|
||||||
|
color: white;
|
||||||
|
height: 2em;
|
||||||
|
width: 10vw;
|
||||||
|
border: 1px solid rgb(20, 20, 20);
|
||||||
|
text-align: center;
|
||||||
|
font-family: 'NotoSansDisplay', sans-serif;
|
||||||
|
outline: none;
|
||||||
|
margin: 0px 0.5vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=text]:focus {
|
||||||
|
border: 1px solid rgb(150, 58, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=number] {
|
||||||
|
border-radius: 0.5vh;
|
||||||
|
background: rgb(30, 30, 30);
|
||||||
|
color: white;
|
||||||
|
height: 2em;
|
||||||
|
width: 4.666vw;
|
||||||
|
border: 1px solid rgb(20, 20, 20);
|
||||||
|
text-align: center;
|
||||||
|
font-family: 'NotoSansDisplay', sans-serif;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=number]:focus {
|
||||||
|
border: 1px solid rgb(150, 58, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=range][orient=vertical] {
|
||||||
|
writing-mode: vertical-lr; direction: rtl;
|
||||||
|
width: 2vw;
|
||||||
|
height: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
border-radius: 0.5vh;
|
||||||
|
background: rgb(30, 30, 30);
|
||||||
|
color: white;
|
||||||
|
height: 2em;
|
||||||
|
width: 5vw;
|
||||||
|
border: 1px solid rgb(20, 20, 20);
|
||||||
|
text-align: center;
|
||||||
|
font-family: 'NotoSansDisplay', sans-serif;
|
||||||
|
outline: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
select:focus {
|
||||||
|
border: 1px solid rgb(150, 58, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
font-family: 'NotoSansDisplay', sans-serif;
|
||||||
|
background: #181818;
|
||||||
|
background: linear-gradient(0deg, #232323 0%, #404040 100%);
|
||||||
|
border: 0.3vh solid black;
|
||||||
|
outline: 0.3vh solid #404040;
|
||||||
|
color: white;
|
||||||
|
height: fit-content;
|
||||||
|
width: fit-content;
|
||||||
|
border-radius: 0.4em;
|
||||||
|
padding: 0.5vh 1vw;
|
||||||
|
margin: 1vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:hover {
|
||||||
|
background: #313131;
|
||||||
|
background: linear-gradient(0deg, #313131 0%, #4d4d4d 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active {
|
||||||
|
background: #181818;
|
||||||
|
box-shadow: inset 0 0 1em #090909;
|
||||||
|
}
|
||||||
|
|
||||||
|
input[type=file]:focus {
|
||||||
|
border: 1px solid rgb(150, 58, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Horizontal Container Styles */
|
/* Horizontal Container Styles */
|
||||||
#headerContainer {
|
#headerContainer {
|
||||||
background: #181818;
|
background: #181818;
|
||||||
|
|
@ -34,9 +122,9 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
#headerContainer h1 {
|
#headerContainer h1 {
|
||||||
font-weight: 100;
|
|
||||||
color: white;
|
color: white;
|
||||||
margin-left: 1.3vw;
|
margin-left: 1.3vw;
|
||||||
|
font-weight: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
#cameraSelectContainer {
|
#cameraSelectContainer {
|
||||||
|
|
@ -44,6 +132,27 @@ body {
|
||||||
border: 1px solid black;
|
border: 1px solid black;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 3.53vh;
|
height: 3.53vh;
|
||||||
|
color: #474747;
|
||||||
|
font-size: 1em;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraSelectContainer span {
|
||||||
|
height: fit-content;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraSelectContainer .camSelectSeparator {
|
||||||
|
margin: 0px 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cameraSwitchLabel a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #474747;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cameraSwitchLabel.selectedCam a {
|
||||||
|
color: #e66c01;
|
||||||
}
|
}
|
||||||
|
|
||||||
#allCamerasContainer {
|
#allCamerasContainer {
|
||||||
|
|
@ -64,10 +173,26 @@ body {
|
||||||
height: 5vh;
|
height: 5vh;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footerContainer button {
|
||||||
|
padding: 0.4em 0.8em;
|
||||||
|
font-size: x-small;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footerLinks span {
|
||||||
|
margin-right: 1.25vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
#footerLinks a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #e66c01;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Camera Controls Container */
|
/* Camera Controls Container */
|
||||||
.cameraControlsContainer {
|
#cameraControlsContainer {
|
||||||
width: 15vw;
|
width: 15vw;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: #282828;
|
background: #282828;
|
||||||
|
|
@ -76,39 +201,98 @@ body {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cameraControlsContainer.selectedCam {
|
.liveCam {
|
||||||
background: #323232;
|
|
||||||
}
|
|
||||||
|
|
||||||
.liveCam .cameraControlHeadContainer {
|
|
||||||
background: rgb(184,3,16);
|
background: rgb(184,3,16);
|
||||||
background: linear-gradient(90deg, rgba(184,3,16,1) 0%, rgba(255,0,19,1) 15%, rgba(255,0,19,1) 85%, rgba(184,3,16,1) 100%);
|
background: linear-gradient(90deg, rgba(184,3,16,1) 0%, rgba(255,0,19,1) 15%, rgba(255,0,19,1) 85%, rgba(184,3,16,1) 100%);
|
||||||
}
|
}
|
||||||
|
|
||||||
.cameraControlHeadContainer {
|
#cameraControlHeadContainer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 5vh;
|
height: 5vh;
|
||||||
border-bottom: 2px solid black;
|
border-bottom: 2px solid black;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cameraName {
|
h2 {
|
||||||
font-weight: 100;
|
|
||||||
color: white;
|
|
||||||
margin-inline-start: 0.6em;
|
margin-inline-start: 0.6em;
|
||||||
margin-inline-end: 0.6em;
|
margin-inline-end: 0.6em;
|
||||||
|
font-weight: 100;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraName {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Color Correction Section */
|
/* Color Correction Section */
|
||||||
.cameraControlColorCorrectionContainer {
|
#cameraControlColorCorrectionContainer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 33vh;
|
height: 33vh;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraControlLGGTabs {
|
||||||
|
margin-top: 2vh;
|
||||||
|
border: 1px solid #101010;
|
||||||
|
border-radius: 2.5vh;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#cameraControlLGGTabs a {
|
||||||
|
background: #181818;
|
||||||
|
background: linear-gradient(0deg, #181818 0%, #303030 100%);
|
||||||
|
|
||||||
|
padding: 0.1vh 1.25vw 0.25vh 1.25vw;
|
||||||
|
|
||||||
|
border-left: 1px solid #101010;
|
||||||
|
|
||||||
|
text-decoration: none;
|
||||||
|
color: #474747;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraControlLGGTabs a.selectedTab {
|
||||||
|
color: #e66c01;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ccExposureSettingValueContainer .expAdjArr {
|
||||||
|
text-decoration: none;
|
||||||
|
color: #60606000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ccExposureSettingValueContainer:hover .expAdjArr {
|
||||||
|
color: #606060ff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ccExposureSettingValueContainer:hover .expAdjArr:hover {
|
||||||
|
color: #474747;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ccExposureSettingValueContainer:hover .expAdjArr:active {
|
||||||
|
color: #e66c01;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraControlColorCorrectionBottomContainer {
|
||||||
|
margin-bottom: 1em;
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraControlColorCorrectionBottomContainer button {
|
||||||
|
margin: 0px 0.5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#cameraControlColorCorrectionNumbersContainer span {
|
||||||
|
margin: 0px 0.5em;
|
||||||
|
text-decoration: underline 3px;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Exposure Section */
|
/* Exposure Section */
|
||||||
.cameraControlExposureContainer {
|
#cameraControlExposureContainer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 4.4vh;
|
height: 4.7vh;
|
||||||
background-color: #171717;
|
background-color: #171717;
|
||||||
border-top: 1px solid #2d2d2d;
|
border-top: 1px solid #2d2d2d;
|
||||||
border-bottom: 1px solid #2d2d2d;
|
border-bottom: 1px solid #2d2d2d;
|
||||||
|
|
@ -117,11 +301,6 @@ body {
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selectedCam .cameraControlExposureContainer {
|
|
||||||
border-top: 1px solid #3a3a3a;
|
|
||||||
border-bottom: 1px solid #3a3a3a;
|
|
||||||
}
|
|
||||||
|
|
||||||
.ccExposureSettingContainer {
|
.ccExposureSettingContainer {
|
||||||
display: flex;
|
display: flex;
|
||||||
color: white;
|
color: white;
|
||||||
|
|
@ -141,7 +320,7 @@ body {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Lens Stuff */
|
/* Lens Stuff */
|
||||||
.cameraControlLensContainer {
|
#cameraControlLensContainer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 41.9vh;
|
height: 41.9vh;
|
||||||
border-bottom: 1px solid black;
|
border-bottom: 1px solid black;
|
||||||
|
|
@ -159,19 +338,20 @@ body {
|
||||||
margin-bottom: 1em;
|
margin-bottom: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.lensSliderContainer button {
|
.circleButton {
|
||||||
margin-top: 1em;
|
width: 2em;
|
||||||
margin-bottom: 1em;
|
height: 2em;
|
||||||
|
border-radius: 1em;
|
||||||
|
padding: 0;
|
||||||
|
margin: 1em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=range][orient=vertical] {
|
#transportControls .circleButton {
|
||||||
-webkit-appearance: slider-vertical;
|
margin: 0 0.5em;
|
||||||
width: 2vw;
|
|
||||||
height: 80%;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Right side (expanded) */
|
/* Right side (expanded) */
|
||||||
.cameraControlsContainerExpanded {
|
#cameraControlsContainerExpanded {
|
||||||
width: 84.75vw;
|
width: 84.75vw;
|
||||||
height: 100%;
|
height: 100%;
|
||||||
background: #282828;
|
background: #282828;
|
||||||
|
|
@ -180,39 +360,43 @@ input[type=range][orient=vertical] {
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.cameraControlExpandedHeadContainer {
|
#cameraControlExpandedHeadContainer {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 5vh;
|
height: 5vh;
|
||||||
border-bottom: 2px solid black;
|
border-bottom: 2px solid black;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: center;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.timecodeLabel {
|
#cameraControlExpandedBodyContainer {
|
||||||
|
flex-direction: column;
|
||||||
|
display: inline-flex;
|
||||||
|
height: inherit;
|
||||||
|
justify-content: space-around;
|
||||||
|
}
|
||||||
|
|
||||||
|
#timecodeLabel {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Table Controls */
|
||||||
|
|
||||||
|
.tableControl {
|
||||||
|
margin-left: 1.5vw;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tableControl h3 {
|
||||||
font-weight: 100;
|
font-weight: 100;
|
||||||
color: white;
|
margin: 0.5vh 0vw;
|
||||||
margin-inline-start: 0.6em;
|
|
||||||
margin-inline-end: 0.6em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Connection Settings */
|
table, td {
|
||||||
.connectionContainer {
|
margin-left: 0.5vw;
|
||||||
margin: 1.5vw;
|
/* border: 1px solid white; */
|
||||||
|
border-collapse: collapse;
|
||||||
|
padding: 0.1vw 1vw;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text] {
|
td, tr {
|
||||||
border-radius: 0.5vh;
|
align-items: center;
|
||||||
background: rgb(30, 30, 30);
|
|
||||||
color: white;
|
|
||||||
height: 2em;
|
|
||||||
width: 10vw;
|
|
||||||
border: 1px solid rgb(20, 20, 20);
|
|
||||||
margin-left: 1vw;
|
|
||||||
text-align: center;
|
|
||||||
font-family: 'NotoSansDisplay', sans-serif;
|
|
||||||
outline: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
input[type=text]:focus {
|
|
||||||
border: 1px solid rgb(150, 58, 0);
|
|
||||||
}
|
}
|
||||||
147
web-ui/web-ui.js
147
web-ui/web-ui.js
|
|
@ -1,20 +1,38 @@
|
||||||
/* Global variables */
|
/* Global variables */
|
||||||
var cameras = [];
|
var cameras = [];
|
||||||
var ci = 0;
|
var ci = 0;
|
||||||
|
var ccMode = 0;
|
||||||
|
|
||||||
function bodyOnLoad() {
|
function bodyOnLoad() {
|
||||||
//let intervalID = setInterval(timerCallFunction, 1000);
|
let intervalIDOne = setInterval(timerCallFunction1, 1000); // Tem second timer for refreshing everything
|
||||||
|
let intervalIDTen = setInterval(timerCallFunction10, 10000); // Tem second timer for refreshing everything
|
||||||
|
|
||||||
let newCamHostname = document.getElementsByClassName("hostnameInput")[ci].value;
|
let newCamHostname = document.getElementById("hostnameInput").value;
|
||||||
|
|
||||||
if (newCamHostname) {
|
if (newCamHostname) {
|
||||||
cameras[ci] = new BMDCamera(newCamHostname,ci);
|
cameras[ci] = new BMDCamera(newCamHostname,ci);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// function timerCallFunction() {
|
// One Second Timer Call
|
||||||
// cameras.forEach((camera) => camera.everySecond());
|
function timerCallFunction1() {
|
||||||
// }
|
if (cameras[ci]) {
|
||||||
|
cameras[ci].getRecordState();
|
||||||
|
cameras[ci].getPlaybackState();
|
||||||
|
cameras[ci].getTimecode();
|
||||||
|
|
||||||
|
cameras[ci].updateUIRecordState();
|
||||||
|
cameras[ci].updateUIPlaybackState();
|
||||||
|
cameras[ci].updateUITimecode();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ten Second Timer Call
|
||||||
|
function timerCallFunction10() {
|
||||||
|
if (cameras[ci]) {
|
||||||
|
cameras[ci].refresh();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function textInputTrigger(element) {
|
function textInputTrigger(element) {
|
||||||
if (event.key === 'Enter') {
|
if (event.key === 'Enter') {
|
||||||
|
|
@ -22,6 +40,124 @@ function textInputTrigger(element) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function switchCamera(index) {
|
||||||
|
ci = index;
|
||||||
|
|
||||||
|
if (cameras[ci]) {
|
||||||
|
cameras[ci].refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 8; i++) {
|
||||||
|
if (i == ci) {
|
||||||
|
document.getElementsByClassName("cameraSwitchLabel")[i].classList.add("selectedCam");
|
||||||
|
} else {
|
||||||
|
document.getElementsByClassName("cameraSwitchLabel")[i].classList.remove("selectedCam");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementById("cameraNumberLabel").innerHTML = "CAM"+(ci+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
function setCCMode(mode) {
|
||||||
|
if (mode == 0) {
|
||||||
|
// Lift
|
||||||
|
|
||||||
|
} else if (mode == 1) {
|
||||||
|
// Gamma
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Gain
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
for (var i = 0; i < 3; i++) {
|
||||||
|
if (i == mode) {
|
||||||
|
document.getElementsByClassName("ccTabLabel")[i].classList.add("selectedTab");
|
||||||
|
} else {
|
||||||
|
document.getElementsByClassName("ccTabLabel")[i].classList.remove("selectedTab");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Control Calling Functions */
|
||||||
|
|
||||||
|
function decreaseND() {
|
||||||
|
cameras[ci].setND(cameras[ci].NDStop-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function increaseND() {
|
||||||
|
cameras[ci].setND(cameras[ci].NDStop+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function decreaseGain() {
|
||||||
|
cameras[ci].setGain(cameras[ci].gain-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function increaseGain() {
|
||||||
|
cameras[ci].setGain(cameras[ci].gain+2);
|
||||||
|
}
|
||||||
|
|
||||||
|
function decreaseShutter() {
|
||||||
|
let cam = cameras[ci];
|
||||||
|
|
||||||
|
if ('shutterSpeed' in cam.shutter) {
|
||||||
|
cam.setShutter({"shutterSpeed":cam.shutter.shutterSpeed+10});
|
||||||
|
} else {
|
||||||
|
cam.setShutter({"shutterAngle": cam.shutter.shutterAngle-1000});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function increaseShutter() {
|
||||||
|
let cam = cameras[ci];
|
||||||
|
|
||||||
|
if ('shutterSpeed' in cam.shutter) {
|
||||||
|
cam.setShutter({"shutterSpeed":cam.shutter.shutterSpeed-10});
|
||||||
|
} else {
|
||||||
|
cam.setShutter({"shutterAngle": cam.shutter.shutterAngle+1000});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function decreaseWhiteBalance() {
|
||||||
|
cameras[ci].setWhiteBalance(cameras[ci].WhiteBalance-50,cameras[ci].WhiteBalanceTint);
|
||||||
|
}
|
||||||
|
|
||||||
|
function increaseWhiteBalance() {
|
||||||
|
cameras[ci].setWhiteBalance(cameras[ci].WhiteBalance+50,cameras[ci].WhiteBalanceTint);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0: lift, 1: gamma, 2: gain, 3: offset
|
||||||
|
function setCCFromUI(which) {
|
||||||
|
let lumaFloat = parseFloat(document.getElementsByClassName("CClumaLabel")[which].innerHTML);
|
||||||
|
let redFloat = parseFloat(document.getElementsByClassName("CCredLabel")[which].innerHTML);
|
||||||
|
let greenFloat = parseFloat(document.getElementsByClassName("CCgreenLabel")[which].innerHTML);
|
||||||
|
let blueFloat = parseFloat(document.getElementsByClassName("CCblueLabel")[which].innerHTML);
|
||||||
|
|
||||||
|
let ccobject = {"red": redFloat, "green": greenFloat, "blue": blueFloat, "luma": lumaFloat};
|
||||||
|
|
||||||
|
if (which == 0) {
|
||||||
|
cameras[ci].setCCLift(ccobject);
|
||||||
|
} else if (which == 1) {
|
||||||
|
cameras[ci].setCCGamma(ccobject);
|
||||||
|
} else if (which == 2) {
|
||||||
|
cameras[ci].setCCGain(ccobject);
|
||||||
|
} else {
|
||||||
|
cameras[ci].setCCOffset(ccobject);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 0: lift, 1: gamma, 2: gain, 3: offset
|
||||||
|
function resetCC(which) {
|
||||||
|
if (which == 0) {
|
||||||
|
cameras[ci].setCCLift({"red": 0.0, "green": 0.0, "blue": 0.0, "luma": 0.0});
|
||||||
|
} else if (which == 1) {
|
||||||
|
cameras[ci].setCCGamma({"red": 0.0, "green": 0.0, "blue": 0.0, "luma": 0.0});
|
||||||
|
} else if (which == 2) {
|
||||||
|
cameras[ci].setCCGain({"red": 1.0, "green": 1.0, "blue": 1.0, "luma": 1.0});
|
||||||
|
} else {
|
||||||
|
cameras[ci].setCCOffset({"red": 0.0, "green": 0.0, "blue": 0.0, "luma": 0.0});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function makeFakeCamera() {
|
function makeFakeCamera() {
|
||||||
cam = new BMDCamera("Studio-Camera-6K-Pro.local",0)
|
cam = new BMDCamera("Studio-Camera-6K-Pro.local",0)
|
||||||
return Object.assign(cam,{
|
return Object.assign(cam,{
|
||||||
|
|
@ -32,7 +168,6 @@ function makeFakeCamera() {
|
||||||
"transportMode": {
|
"transportMode": {
|
||||||
"mode": "InputPreview"
|
"mode": "InputPreview"
|
||||||
},
|
},
|
||||||
"isPlaying": false,
|
|
||||||
"playbackState": {
|
"playbackState": {
|
||||||
"loop": false,
|
"loop": false,
|
||||||
"position": 0,
|
"position": 0,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue