391 lines
14 KiB
JavaScript
391 lines
14 KiB
JavaScript
const { InstanceBase, Regex, runEntrypoint, InstanceStatus, TCPHelper, combineRgb } = require('@companion-module/base')
|
|
const configFields = require('./configFields')
|
|
const presets = require('./presets')
|
|
const actions = require('./actions')
|
|
const pixtimerpro = require('./pixap-pixtimerpro')
|
|
const UpgradeScripts = require('./upgrades')
|
|
const UpdateFeedbacks = require('./feedbacks')
|
|
const UpdateVariableDefinitions = require('./variables')
|
|
|
|
class PixtimerProInstance extends InstanceBase {
|
|
constructor(internal) {
|
|
super(internal)
|
|
Object.assign(this, {
|
|
...configFields,
|
|
...presets,
|
|
...actions,
|
|
...pixtimerpro,
|
|
})
|
|
|
|
this.adjustArray = [1, 5, 10, 20, 30]
|
|
}
|
|
|
|
async init(config) {
|
|
this.config = config
|
|
this.pixtimerdata = {
|
|
presets: [],
|
|
messages: [],
|
|
gotoArray: [
|
|
{ id: 10, name: 'Goto 10' },
|
|
{ id: 20, name: 'Goto 20' },
|
|
{ id: 30, name: 'Goto 30' },
|
|
],
|
|
blackoutArray: [
|
|
{ id: 'toogle', name: 'Toogle' },
|
|
{ id: 'show', name: 'Show' },
|
|
{ id: 'hide', name: 'Hide' },
|
|
],
|
|
states: {},
|
|
}
|
|
|
|
this.updateStatus(InstanceStatus.Ok)
|
|
this.updateFeedbacks() // export feedbacks
|
|
this.updateVariableDefinitions() // export variable definitions
|
|
|
|
this.init_tcp()
|
|
this.refreshTcpTimer()
|
|
|
|
this.setVariableValues({ speaker_timer: '00:00:00' })
|
|
this.setVariableValues({ speaker_timer_ms: '00:00' })
|
|
this.setVariableValues({ speaker_timer_h: '00' })
|
|
this.setVariableValues({ speaker_timer_m: '00' })
|
|
this.setVariableValues({ speaker_timer_s: '00' })
|
|
|
|
this.setVariableValues({ session_timer: '00:00:00' })
|
|
this.setVariableValues({ session_timer_ms: '00:00' })
|
|
this.setVariableValues({ session_timer_h: '00' })
|
|
this.setVariableValues({ session_timer_m: '00' })
|
|
this.setVariableValues({ session_timer_s: '00' })
|
|
|
|
this.setVariableValues({ external_timer: '00:00:00' })
|
|
this.setVariableValues({ external_timer_ms: '00:00' })
|
|
this.setVariableValues({ external_timer_h: '00' })
|
|
this.setVariableValues({ external_timer_m: '00' })
|
|
this.setVariableValues({ external_timer_s: '00' })
|
|
}
|
|
|
|
refreshTcpTimer() {
|
|
if (!this.config.enableTimerPort) {
|
|
if (this.socketTimer !== undefined) {
|
|
this.socketTimer.destroy()
|
|
delete this.socketTimer
|
|
}
|
|
} else this.init_tcp_timer()
|
|
}
|
|
|
|
// When module gets deleted
|
|
async destroy() {
|
|
this.socket.destroy()
|
|
this.socketTimer.destroy()
|
|
this.log('info', 'destroy', this.id)
|
|
}
|
|
|
|
async configUpdated(config) {
|
|
let resetConnection = false
|
|
let resetConnectionTimer = false
|
|
|
|
if (this.config.host != config.host) {
|
|
resetConnection = true
|
|
}
|
|
|
|
if (this.config.enableTimerPort) {
|
|
resetConnectionTimer = true
|
|
} else {
|
|
resetConnectionTimer = true
|
|
}
|
|
|
|
this.config = config
|
|
if (resetConnection || !this.socket) {
|
|
this.init_tcp()
|
|
}
|
|
if (resetConnectionTimer || !this.socketTimer) {
|
|
this.refreshTcpTimer()
|
|
}
|
|
this.setActionDefinitions(this.getActions())
|
|
this.setPresetDefinitions(this.getPresets())
|
|
}
|
|
|
|
async sendCommand(cmd) {
|
|
if (cmd) {
|
|
this.log('debug', `sending ${cmd} to ${this.config.host}`)
|
|
await this.socket.send(cmd)
|
|
}
|
|
}
|
|
|
|
updateFeedbacks() {
|
|
UpdateFeedbacks(this)
|
|
}
|
|
|
|
updateVariableDefinitions() {
|
|
UpdateVariableDefinitions(this)
|
|
}
|
|
|
|
init_tcp() {
|
|
this.log('info', `PIXTIMER PRO | INIT TCP CONTROL >>> ${this.config.host} ${this.config.port}`)
|
|
|
|
if (this.socket !== undefined) {
|
|
this.socket.destroy()
|
|
delete this.socket
|
|
}
|
|
|
|
if (this.config.port === undefined) {
|
|
this.config.port = 9756
|
|
}
|
|
|
|
if (this.config.host) {
|
|
//!= undefined
|
|
this.log('info', `TCP CONTROL | Opening connection to ${this.config.host}:${this.config.port}`)
|
|
|
|
this.socket = new TCPHelper(this.config.host, this.config.port, { reconnect: true })
|
|
|
|
this.socket.on('status_change', (status, message) => {
|
|
this.updateStatus(status, message)
|
|
//this.log('info', `TCP CONTROL | Status update >>> ${status} | ${message}`)
|
|
})
|
|
|
|
this.socket.on('error', (err) => {
|
|
this.updateStatus(InstanceStatus.UnknownError, err.message)
|
|
this.log('error', 'TCP CONTROL | Network error: ' + err.message)
|
|
})
|
|
|
|
let receivebuffer = ''
|
|
this.socket.on('connect', () => {
|
|
this.updateStatus(InstanceStatus.Ok)
|
|
//this.log('info', 'Connected')
|
|
|
|
receivebuffer = ''
|
|
|
|
this.socket.send('NC\n').catch((e) => {
|
|
this.log('error', `TCP CONTROL | Socket error: ${e}`)
|
|
})
|
|
})
|
|
|
|
this.socket.on('data', (chunk) => {
|
|
let i = 0
|
|
let line = ''
|
|
let offset = 0
|
|
receivebuffer += chunk.toString()
|
|
while ((i = receivebuffer.indexOf('\n', offset)) !== -1) {
|
|
line = receivebuffer.slice(offset, i)
|
|
//this.log('info', 'RECEIVE DATA LINE >>> ' + line.toString())
|
|
offset = i + 1
|
|
this.socket.emit('receiveline', line)
|
|
}
|
|
receivebuffer = receivebuffer.slice(offset)
|
|
//this.log('info', 'RECEIVE DATA >>> ' + receivebuffer.toString())
|
|
})
|
|
|
|
this.socket.on('receiveline', (data) => {
|
|
//const info = data.toString().split("/")
|
|
this.log('warn', `TCP CONTROL | RECEIVE LINE >>> ${data.toString()}`)
|
|
|
|
// TIMER LIST
|
|
if (data.toString().slice(0, 5) === 'timer') {
|
|
this.pixtimerdata.presets = this.getTimerPresetList(data)
|
|
this.setActionDefinitions(this.getActions())
|
|
this.setPresetDefinitions(this.getPresets())
|
|
}
|
|
|
|
// MESSAGE LIST
|
|
if (data.toString().slice(0, 7) === 'message') {
|
|
this.pixtimerdata.messages = this.getMessagePresetList(data)
|
|
this.setActionDefinitions(this.getActions())
|
|
this.setPresetDefinitions(this.getPresets())
|
|
}
|
|
|
|
if (data.toString().slice(0, 3) === 'pts') {
|
|
// CURRENT PRESET SESSION
|
|
//this.log('info', `TCP CONTROL | RECEIVE LINE | CURRENT SESSION PRESET >>> ${data.toString().slice(4)}`)
|
|
this.pixtimerdata.states.currentSession = parseInt(data.toString().slice(4))
|
|
this.setVariableValues({ session_current: this.pixtimerdata.states.currentSession })
|
|
this.checkFeedbacks('current_session')
|
|
} else if (data.toString().slice(0, 2) === 'pt') {
|
|
// CURRENT PRESET SPEAKER
|
|
//this.log('info', `TCP CONTROL | RECEIVE LINE | CURRENT SPEAKER PRESET >>> ${data.toString().slice(3)}`)
|
|
this.pixtimerdata.states.currentSpeaker = parseInt(data.toString().slice(3))
|
|
this.setVariableValues({ speaker_current: this.pixtimerdata.states.currentSpeaker })
|
|
this.checkFeedbacks('current_speaker')
|
|
}
|
|
|
|
// MESSAGE SHOW
|
|
if (data.toString().slice(0, 3) === 'cmv') {
|
|
//this.log('info', `TCP CONTROL | RECEIVE LINE | MESSAGE SHOW >>> ${data.toString().slice(4)}`)
|
|
this.pixtimerdata.states.messageShow = parseInt(data.toString().slice(4))
|
|
this.setVariableValues({ message_show: this.pixtimerdata.states.messageShow })
|
|
this.checkFeedbacks('message_show')
|
|
}
|
|
|
|
// SWITCH TIMER CLOCK
|
|
if (data.toString().slice(0, 4) === 'SWTC') {
|
|
//this.log('error', `TCP CONTROL | RECEIVE LINE | SWITCH TIMER CLOCK >>> ${data.toString().slice(5)}`)
|
|
this.pixtimerdata.states.switchTimerClock = parseInt(data.toString().slice(5))
|
|
this.setVariableValues({ switch_timer_clock: this.pixtimerdata.states.switchTimerClock })
|
|
this.checkFeedbacks('switch_timer_clock')
|
|
}
|
|
|
|
// SPEAKER PLAY
|
|
if (data.toString().slice(0, 4) === 'play') {
|
|
//this.log('error', `TCP CONTROL | RECEIVE LINE | SPEAKER PLAY STATUS >>> ${data.toString().slice(5)}`)
|
|
this.pixtimerdata.states.speakerPlaying = parseInt(data.toString().slice(5))
|
|
this.setVariableValues({ speaker_play_status: this.pixtimerdata.states.speakerPlaying })
|
|
this.checkFeedbacks('speaker_play_status')
|
|
}
|
|
|
|
// SESSION PLAY
|
|
if (data.toString().slice(0, 5) === 'splay') {
|
|
//this.log('error', `TCP CONTROL | RECEIVE LINE | SPEAKER PLAY STATUS >>> ${data.toString().slice(6)}`)
|
|
this.pixtimerdata.states.sessionPlaying = parseInt(data.toString().slice(6))
|
|
this.setVariableValues({ session_play_status: this.pixtimerdata.states.sessionPlaying })
|
|
this.checkFeedbacks('session_play_status')
|
|
} else if (data.toString().slice(0, 5) === 'black') {
|
|
this.log('error', `TCP CONTROL | RECEIVE LINE | BLACKOUT STATUS >>> ${data.toString().slice(6)}`)
|
|
if (data.toString().slice(6) === "false") {
|
|
this.pixtimerdata.states.blackout = 0
|
|
} else if (data.toString().slice(6) === "true") {
|
|
this.pixtimerdata.states.blackout = 1
|
|
} else this.pixtimerdata.states.blackout = parseInt(data.toString().slice(6))
|
|
this.setVariableValues({ blackout: this.pixtimerdata.states.blackout })
|
|
this.checkFeedbacks('blackout')
|
|
}
|
|
|
|
// NDI
|
|
if (data.toString().slice(0, 5) === 'NDIST') {
|
|
//this.log('error', `TCP CONTROL | RECEIVE LINE | NDI STATUS >>> ${data.toString().slice(6)}`)
|
|
this.pixtimerdata.states.ndiStart = parseInt(data.toString().slice(6))
|
|
this.setVariableValues({ ndi_start: this.pixtimerdata.states.ndiStart })
|
|
this.checkFeedbacks('ndi_start')
|
|
}
|
|
|
|
// ALL PLAYING
|
|
if (this.pixtimerdata.states.speakerPlaying === 1 && this.pixtimerdata.states.sessionPlaying === 1) {
|
|
this.pixtimerdata.states.allPlaying = 1
|
|
} else if (this.pixtimerdata.states.speakerPlaying === 2 && this.pixtimerdata.states.sessionPlaying === 2) {
|
|
this.pixtimerdata.states.allPlaying = 2
|
|
} else {
|
|
this.pixtimerdata.states.allPlaying = 0
|
|
}
|
|
this.setVariableValues({ all_play_status: this.pixtimerdata.states.allPlaying })
|
|
this.checkFeedbacks('all_play_status')
|
|
|
|
if (data.toString().slice(0, 2) === 'pn') {
|
|
// PROJECT NAME
|
|
//this.log('info', `TCP CONTROL | RECEIVE LINE | PROJECT NAME >>> ${data.toString().slice(3)}`)
|
|
this.pixtimerdata.states.projectName = data.toString().slice(3)
|
|
this.setVariableValues({ project_name: this.pixtimerdata.states.projectName })
|
|
//this.checkFeedbacks('current_speaker')
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// TCP TIMER
|
|
init_tcp_timer() {
|
|
this.log('info', `PIXTIMER PRO | INIT TCP TIMER >>> ${this.config.host} ${this.config.portTimer}`)
|
|
|
|
if (this.socketTimer !== undefined) {
|
|
this.socketTimer.destroy()
|
|
delete this.socketTimer
|
|
}
|
|
|
|
if (this.config.portTimer === undefined) {
|
|
this.config.portTimer = 9758
|
|
}
|
|
|
|
if (this.config.host) {
|
|
//!= undefined
|
|
this.log('info', `TCP TIMER | Opening timer connection to ${this.config.host}:${this.config.portTimer}`)
|
|
|
|
this.socketTimer = new TCPHelper(this.config.host, this.config.portTimer, { reconnect: true })
|
|
|
|
this.socketTimer.on('status_change', (status, message) => {
|
|
this.updateStatus(status, message)
|
|
//this.log('info', `TCP CONTROL | Status update >>> ${status} | ${message}`)
|
|
})
|
|
|
|
this.socketTimer.on('error', (err) => {
|
|
this.updateStatus(InstanceStatus.UnknownError, err.message)
|
|
this.log('error', `TCP TIMER | Network error >>> ${err.message} | Please Check Dungle`)
|
|
})
|
|
|
|
let receivebuffer = ''
|
|
this.socketTimer.on('connect', () => {
|
|
this.updateStatus(InstanceStatus.Ok)
|
|
//this.log('info', 'TCP TIMER | TIMER Connected')
|
|
|
|
receivebuffer = ''
|
|
|
|
this.socketTimer.send('NC\n').catch((e) => {
|
|
this.log('error', `TCP TIMER | Socket error: ${e}`)
|
|
})
|
|
|
|
this.setVariableValues({ external_timer: 'STOP' })
|
|
this.setVariableValues({ external_timer_ms: 'STOP' })
|
|
this.setVariableValues({ external_timer_h: 'STOP' })
|
|
this.setVariableValues({ external_timer_m: 'STOP' })
|
|
this.setVariableValues({ external_timer_s: 'STOP' })
|
|
})
|
|
|
|
this.socketTimer.on('data', (chunk) => {
|
|
let i = 0
|
|
let line = ''
|
|
let offset = 0
|
|
receivebuffer += chunk.toString()
|
|
while ((i = receivebuffer.indexOf('\n', offset)) !== -1) {
|
|
line = receivebuffer.slice(offset, i)
|
|
//this.log('info', 'TCP TIMER | RECEIVE TIMER DATA LINE >>> ' + line.toString())
|
|
offset = i + 1
|
|
this.socketTimer.emit('receiveTimerline', line)
|
|
}
|
|
receivebuffer = receivebuffer.slice(offset)
|
|
//this.log('info', 'TCP TIMER | RECEIVE TIMER DATA >>> ' + receivebuffer.toString())
|
|
})
|
|
|
|
this.socketTimer.on('receiveTimerline', (data) => {
|
|
//const info = data.toString().split("/")
|
|
//this.log('warn', `TCP TIMER | RECEIVE TIMER LINE >>> ${data.toString()}`)
|
|
if (data.toString().slice(0, 1) === 'H') {
|
|
this.log('warn', `RECEIVE TIMER LINE >>> ${data.toString().slice(2)}`)
|
|
let speakerTimerArray = data.toString().slice(2).split(':')
|
|
this.setVariableValues({ speaker_timer: data.toString().slice(2) })
|
|
this.setVariableValues({ speaker_timer_ms: `${speakerTimerArray[1]}:${speakerTimerArray[2]}` })
|
|
this.setVariableValues({ speaker_timer_h: speakerTimerArray[0] })
|
|
this.setVariableValues({ speaker_timer_m: speakerTimerArray[1] })
|
|
this.setVariableValues({ speaker_timer_s: speakerTimerArray[2] })
|
|
}
|
|
|
|
if (data.toString().slice(0, 1) === 'S') {
|
|
//this.log('warn', `TCP TIMER | RECEIVE TIMER LINE >>> ${data.toString().slice(2)}`)
|
|
let sessionTimerArray = data.toString().slice(2).split(':')
|
|
this.setVariableValues({ session_timer: data.toString().slice(2) })
|
|
this.setVariableValues({ session_timer_ms: `${sessionTimerArray[1]}:${sessionTimerArray[2]}` })
|
|
this.setVariableValues({ session_timer_h: sessionTimerArray[0] })
|
|
this.setVariableValues({ session_timer_m: sessionTimerArray[1] })
|
|
this.setVariableValues({ session_timer_s: sessionTimerArray[2] })
|
|
}
|
|
|
|
if (data.toString().slice(0, 1) === 'V') {
|
|
//this.log('warn', `TCP TIMER | RECEIVE EXTERNAL TIMER LINE >>> ${data.toString()}`) // || data.toString().slice(2) === "STOP"
|
|
let externalTimerArray = data.toString().slice(2).split(':')
|
|
if (data.toString().slice(2) === 'stop') {
|
|
this.setVariableValues({ external_timer: 'STOP' })
|
|
this.setVariableValues({ external_timer_ms: 'STOP' })
|
|
this.setVariableValues({ external_timer_h: 'STOP' })
|
|
this.setVariableValues({ external_timer_m: 'STOP' })
|
|
this.setVariableValues({ external_timer_s: 'STOP' })
|
|
} else {
|
|
this.setVariableValues({
|
|
external_timer: `${externalTimerArray[0]}:${externalTimerArray[1]}:${externalTimerArray[2]}`,
|
|
})
|
|
this.setVariableValues({ external_timer_ms: `${externalTimerArray[1]}:${externalTimerArray[2]}` })
|
|
this.setVariableValues({ external_timer_h: externalTimerArray[0] })
|
|
this.setVariableValues({ external_timer_m: externalTimerArray[1] })
|
|
this.setVariableValues({ external_timer_s: externalTimerArray[2] })
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
|
|
runEntrypoint(PixtimerProInstance, UpgradeScripts)
|