Skip to content

Commit 921f55f

Browse files
Finish tally-dump feature (#37)
* Open the tally-dump feature added by a85d9d4 for testing * Fix the way we read tally dumps * Add support for tally variables per layer, fix issues with name responses, remove "self" usage, added extra caching of variables so we don't update more variables than needed. Don't push variable definitions unless they have changed. Handle "supported commands" data from device better. Cleaned up the way functions are added to the main class. * Use interval for keepalive timer, and fix the invalid dummy packet we were sending. * Make sure names are cached, fix bug in definition caching, and move source/dest count to same throttling * Make sure the number of levels in dropdowns in actions/feedbacks represent the current config settings
1 parent a8c82bf commit 921f55f

File tree

13 files changed

+618
-341
lines changed

13 files changed

+618
-341
lines changed

src/actions.js

Lines changed: 84 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,206 +1,220 @@
11
import { actionOptions } from './consts.js'
22

3-
export async function UpdateActions(self) {
3+
export async function updateActions() {
44
const actionDefinitions = []
55

66
actionDefinitions.select_level = {
77
name: 'Select Levels',
8-
options: [{ ...actionOptions.levels, choices: self.levels }],
8+
options: [{ ...actionOptions.levels, choices: this.levels }],
99
callback: ({ options }) => {
10-
self.processLevelsSelection(options.level, true)
10+
this.processLevelsSelection(options.level, true)
1111
},
1212
}
13+
1314
actionDefinitions.deselect_level = {
1415
name: 'De-Select Levels',
15-
options: [{ ...actionOptions.levels, choices: self.levels }],
16+
options: [{ ...actionOptions.levels, choices: this.levels }],
1617
callback: ({ options }) => {
17-
self.processLevelsSelection(options.level, false)
18+
this.processLevelsSelection(options.level, false)
1819
},
1920
}
21+
2022
actionDefinitions.toggle_level = {
2123
name: 'Toggle Levels',
22-
options: [{ ...actionOptions.levels, choices: self.levels }],
24+
options: [{ ...actionOptions.levels, choices: this.levels }],
2325
callback: ({ options }) => {
24-
self.processLevelsSelection(options.level, 'toggle')
26+
this.processLevelsSelection(options.level, 'toggle')
2527
},
2628
}
29+
2730
actionDefinitions.select_dest = {
2831
name: 'Select Destination',
2932
options: [actionOptions.destination],
3033
callback: ({ options }) => {
31-
self.selected_dest = Number.parseInt(options.dest)
32-
console.log(`set destination ${self.selected_dest}`)
33-
self.setVariableValues({ Destination: self.selected_dest })
34-
self.checkFeedbacks('selected_dest', 'selected_level_dest', 'source_dest_route')
35-
if (!self.config.tally_dump_and_update) {
36-
self.getCrosspoints(options.dest)
34+
this.selected_dest = Number.parseInt(options.dest)
35+
console.log(`set destination ${this.selected_dest}`)
36+
this.setVariableValuesCached({ Destination: this.selected_dest })
37+
this.checkFeedbacks('selected_dest', 'selected_level_dest', 'source_dest_route')
38+
if (!this.config.tally_dump_and_update) {
39+
this.getCrosspoints(options.dest)
3740
}
3841
},
3942
subscribe: ({ options }) => {
40-
if (!self.config.tally_dump_and_update) {
41-
self.getCrosspoints(options.dest)
43+
if (!this.config.tally_dump_and_update) {
44+
this.getCrosspoints(options.dest)
4245
}
4346
},
4447
}
48+
4549
actionDefinitions.select_dest_name = {
4650
name: 'Select Destination name',
47-
options: [{ ...actionOptions.destinationName, choices: self.dest_names }],
51+
options: [{ ...actionOptions.destinationName, choices: this.dest_names }],
4852
callback: async ({ options }, context) => {
4953
const dest = Number.parseInt(await context.parseVariablesInString(options.dest))
5054
if (Number.isNaN(dest) || dest < 1 || dest > 65536) {
51-
self.log('warn', `select_dest_name has been passed an out of range variable ${dest}`)
55+
this.log('warn', `select_dest_name has been passed an out of range variable ${dest}`)
5256
return undefined
5357
}
54-
self.selected_dest = dest
55-
console.log(`set destination ${self.selected_dest}`)
56-
self.setVariableValues({ Destination: self.selected_dest })
57-
self.checkFeedbacks('selected_dest', 'selected_level_dest', 'source_dest_route')
58-
if (!self.config.tally_dump_and_update) {
59-
self.getCrosspoints(dest)
58+
this.selected_dest = dest
59+
console.log(`set destination ${this.selected_dest}`)
60+
this.setVariableValuesCached({ Destination: this.selected_dest })
61+
this.checkFeedbacks('selected_dest', 'selected_level_dest', 'source_dest_route')
62+
if (!this.config.tally_dump_and_update) {
63+
this.getCrosspoints(dest)
6064
}
6165
},
6266
subscribe: async (action, context) => {
63-
if (!self.config.tally_dump_and_update) {
67+
if (!this.config.tally_dump_and_update) {
6468
const dest = Number.parseInt(await context.parseVariablesInString(action.options.dest))
6569
if (Number.isNaN(dest) || dest < 1 || dest > 65536) {
66-
self.log('warn', `select_dest_name:Subscribe has been passed an out of range variable - dst ${dest}`)
70+
this.log('warn', `select_dest_name:Subscribe has been passed an out of range variable - dst ${dest}`)
6771
return undefined
6872
}
69-
self.getCrosspoints(dest)
73+
this.getCrosspoints(dest)
7074
}
7175
},
7276
}
77+
7378
actionDefinitions.select_source = {
7479
name: 'Select Source',
7580
options: [actionOptions.source],
7681
callback: ({ options }) => {
77-
self.selected_source = Number.parseInt(options.source)
78-
console.log(`set source ${self.selected_source}`)
79-
self.setVariableValues({ Source: self.selected_source })
80-
self.checkFeedbacks('selected_source')
82+
this.selected_source = Number.parseInt(options.source)
83+
console.log(`set source ${this.selected_source}`)
84+
this.setVariableValuesCached({ Source: this.selected_source })
85+
this.checkFeedbacks('selected_source')
8186
},
8287
}
88+
8389
actionDefinitions.select_source_name = {
8490
name: 'Select Source name',
85-
options: [{ ...actionOptions.sourceName, choices: Array.from(self.source_names.values()) }],
91+
options: [{ ...actionOptions.sourceName, choices: Array.from(this.source_names.values()) }],
8692
callback: async ({ options }, context) => {
8793
const source = Number.parseInt(await context.parseVariablesInString(options.source))
8894
if (Number.isNaN(source) || source < 1 || source > 65536) {
89-
self.log('warn', `select_source_name has been passed an out of range variable ${source}`)
95+
this.log('warn', `select_source_name has been passed an out of range variable ${source}`)
9096
return undefined
9197
}
92-
self.selected_source = source
93-
console.log(`set source ${self.selected_source}`)
94-
self.setVariableValues({ Source: self.selected_source })
95-
self.checkFeedbacks('selected_source')
98+
this.selected_source = source
99+
console.log(`set source ${this.selected_source}`)
100+
this.setVariableValuesCached({ Source: this.selected_source })
101+
this.checkFeedbacks('selected_source')
96102
},
97103
}
104+
98105
actionDefinitions.route_source = {
99106
name: 'Route Source to selected Levels and Destination',
100107
options: [actionOptions.source],
101108
callback: ({ options }) => {
102-
console.log(self.selected_level)
103-
const l = self.selected_level.length
109+
console.log(this.selected_level)
110+
const l = this.selected_level.length
104111
for (let i = 0; i < l; i++) {
105-
if (self.selected_level[i].enabled === true) {
106-
self.SetCrosspoint(options.source, self.selected_dest, self.selected_level[i].id)
112+
if (this.selected_level[i].enabled === true) {
113+
this.SetCrosspoint(options.source, this.selected_dest, this.selected_level[i].id)
107114
}
108115
}
109116
},
110117
}
118+
111119
actionDefinitions.route_source_name = {
112120
name: 'Route Source name to selected Levels and Destination',
113-
options: [{ ...actionOptions.sourceName, choices: Array.from(self.source_names.values()) }],
121+
options: [{ ...actionOptions.sourceName, choices: Array.from(this.source_names.values()) }],
114122
callback: async ({ options }, context) => {
115123
const source = Number.parseInt(await context.parseVariablesInString(options.source))
116124
if (Number.isNaN(source) || source < 1 || source > 65536) {
117-
self.log('warn', `route_source_name has been passed an out of range variable ${source}`)
125+
this.log('warn', `route_source_name has been passed an out of range variable ${source}`)
118126
return undefined
119127
}
120-
console.log(self.selected_level)
121-
const l = self.selected_level.length
128+
console.log(this.selected_level)
129+
const l = this.selected_level.length
122130
for (let i = 0; i < l; i++) {
123-
if (self.selected_level[i].enabled === true) {
124-
self.SetCrosspoint(source, self.selected_dest, self.selected_level[i].id)
131+
if (this.selected_level[i].enabled === true) {
132+
this.SetCrosspoint(source, this.selected_dest, this.selected_level[i].id)
125133
}
126134
}
127135
},
128136
}
137+
129138
actionDefinitions.take = {
130139
name: 'Take',
131140
options: [],
132141
callback: () => {
133-
console.log(self.selected_level)
134-
const l = self.selected_level.length
142+
console.log(this.selected_level)
143+
const l = this.selected_level.length
135144
for (let i = 0; i < l; i++) {
136-
if (self.selected_level[i].enabled === true) {
137-
self.SetCrosspoint(self.selected_source, self.selected_dest, self.selected_level[i].id)
145+
if (this.selected_level[i].enabled === true) {
146+
this.SetCrosspoint(this.selected_source, this.selected_dest, this.selected_level[i].id)
138147
}
139148
}
140149
},
141150
}
151+
142152
actionDefinitions.clear = {
143153
name: 'Clear',
144154
options: [actionOptions.clear, actionOptions.clearEnableLevels],
145155
callback: ({ options }) => {
146156
if (options.clear === 'all' || options.clear === 'level') {
147-
self.selected_level = []
148-
for (let i = 1; i <= self.config.max_levels; i++) {
149-
self.selected_level.push({ id: i, enabled: options.clear_enable_levels })
157+
this.selected_level = []
158+
for (let i = 1; i <= this.config.max_levels; i++) {
159+
this.selected_level.push({ id: i, enabled: options.clear_enable_levels })
150160
}
151-
self.checkFeedbacks('selected_level', 'selected_level_dest', 'source_dest_route')
161+
this.checkFeedbacks('selected_level', 'selected_level_dest', 'source_dest_route')
152162
console.log('clear levels')
153-
console.log(self.selected_level)
163+
console.log(this.selected_level)
154164
}
155165

156166
if (options.clear === 'all' || options.clear === 'dest') {
157-
self.selected_dest = 0
158-
self.setVariableValues({ Destination: self.selected_dest })
159-
self.checkFeedbacks('selected_dest', 'selected_level_dest', 'source_dest_route')
167+
this.selected_dest = 0
168+
this.setVariableValuesCached({ Destination: this.selected_dest })
169+
this.checkFeedbacks('selected_dest', 'selected_level_dest', 'source_dest_route')
160170
console.log('clear dest')
161171
}
162172

163173
if (options.clear === 'all' || options.clear === 'source') {
164-
self.selected_source = 0
165-
self.setVariableValues({ Source: self.selected_source })
166-
self.checkFeedbacks('selected_source', 'clear source')
174+
this.selected_source = 0
175+
this.setVariableValuesCached({ Source: this.selected_source })
176+
this.checkFeedbacks('selected_source', 'clear source')
167177
}
168178
},
169179
}
180+
170181
actionDefinitions.set_crosspoint = {
171182
name: 'Set crosspoint',
172-
options: [{ ...actionOptions.levels, choices: self.levels }, actionOptions.source, actionOptions.destination],
183+
options: [{ ...actionOptions.levels, choices: this.levels }, actionOptions.source, actionOptions.destination],
173184
callback: ({ options }) => {
174185
for (const level_val of options.level) {
175-
self.SetCrosspoint(options.source, options.dest, level_val)
186+
this.SetCrosspoint(options.source, options.dest, level_val)
176187
}
177188
},
178189
}
190+
179191
actionDefinitions.set_crosspoint_name = {
180192
name: 'Set crosspoint by name',
181193
options: [
182-
{ ...actionOptions.levels, choices: self.levels },
183-
{ ...actionOptions.sourceName, choices: Array.from(self.source_names.values()) },
184-
{ ...actionOptions.destinationName, choices: Array.from(self.dest_names.values()) },
194+
{ ...actionOptions.levels, choices: this.levels },
195+
{ ...actionOptions.sourceName, choices: Array.from(this.source_names.values()) },
196+
{ ...actionOptions.destinationName, choices: Array.from(this.dest_names.values()) },
185197
],
186198
callback: async ({ options }, context) => {
187199
const source = Number.parseInt(await context.parseVariablesInString(options.source))
188200
const dest = Number.parseInt(await context.parseVariablesInString(options.dest))
189201
if (Number.isNaN(source) || source < 1 || source > 65536 || Number.isNaN(dest) || dest < 1 || dest > 65536) {
190-
self.log('warn', `set_crosspoint_name has been passed an out of range variable - src ${source} : dst ${dest}`)
202+
this.log('warn', `set_crosspoint_name has been passed an out of range variable - src ${source} : dst ${dest}`)
191203
return undefined
192204
}
193205
for (const level_val of options.level) {
194-
self.SetCrosspoint(source, dest, level_val)
206+
this.SetCrosspoint(source, dest, level_val)
195207
}
196208
},
197209
}
210+
198211
actionDefinitions.get_names = {
199212
name: 'Refresh Source and Destination names',
200213
options: [],
201214
callback: () => {
202-
self.readNames()
215+
this.readNames()
203216
},
204217
}
205-
self.setActionDefinitions(actionDefinitions)
218+
219+
this.setActionDefinitions(actionDefinitions)
206220
}

src/config.js

Lines changed: 54 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ export function getConfigFields() {
2525
regex: Regex.PORT,
2626
},
2727
{
28+
isVisible: (config) => !config.extended_support,
2829
type: 'number',
29-
label: 'Matrix Number (Default 1)',
30+
label: 'Matrix Number (Default 1) (normal mode)',
3031
id: 'matrix',
3132
width: 6,
3233
default: 1,
@@ -36,30 +37,71 @@ export function getConfigFields() {
3637
step: 1,
3738
},
3839
{
40+
isVisible: (config) => config.extended_support,
3941
type: 'number',
40-
label: 'Number of levels defined in router',
42+
label: 'Matrix Number (Default 1) (extended mode)',
43+
id: 'matrix_ext',
44+
width: 6,
45+
default: 1,
46+
min: 1,
47+
max: 256,
48+
range: true,
49+
step: 1,
50+
},
51+
{
52+
isVisible: (config) => !config.extended_support,
53+
type: 'number',
54+
label: 'Number of levels defined in route (normal mode)',
4155
id: 'max_levels',
4256
width: 6,
4357
default: 3,
4458
min: 1,
59+
max: 16,
60+
range: true,
61+
step: 1,
62+
},
63+
{
64+
isVisible: (config) => config.extended_support,
65+
type: 'number',
66+
label: 'Number of levels defined in router (extended mode)',
67+
id: 'max_levels_ext',
68+
width: 6,
69+
default: 3,
70+
min: 1,
4571
max: 256,
4672
range: true,
4773
step: 1,
4874
},
49-
/*{
75+
{
5076
type: 'checkbox',
5177
label: 'Enable',
5278
id: 'tally_dump_and_update',
5379
width: 1,
5480
default: false,
55-
},*/
56-
// {
57-
// type: 'static-text',
58-
// label: 'My router controller supports tally dump, and sends tally updates',
59-
// id: 'tally_dump_and_update_txt',
60-
// value: 'If enabled, the module will request a tally dump on connection and will not (need to) interrogate the router for tally updates.',
61-
// width: 11,
62-
// },
81+
},
82+
{
83+
type: 'static-text',
84+
label: 'My router supports tally dump, and sends tally updates',
85+
id: 'tally_dump_and_update_txt',
86+
value:
87+
'If enabled, the module will request a tally dump on connection and will not (need to) interrogate the router for tally updates.',
88+
width: 11,
89+
},
90+
{
91+
type: 'checkbox',
92+
label: 'Enable',
93+
id: 'tally_dump_variables',
94+
width: 1,
95+
default: false,
96+
},
97+
{
98+
type: 'static-text',
99+
label: 'Advanced tally/routing variables',
100+
id: 'tally_dump_variables_txt',
101+
value:
102+
'If enabled, there will be generated variables for each destination on each level. Should only be enabled if you need them specifically.',
103+
width: 11,
104+
},
63105
{
64106
type: 'checkbox',
65107
label: 'Enable',
@@ -97,7 +139,7 @@ export function getConfigFields() {
97139
},
98140
{
99141
type: 'static-text',
100-
label: 'Router has more than 1024 source or destination names',
142+
label: 'Router has more than 1024 source or destinations or has more than 16 levels',
101143
id: 'extended_support_txt',
102144
value: 'Use extended command set. Not supported by all router controllers',
103145
width: 11,

0 commit comments

Comments
 (0)