openc3 5.20.0 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/openc3cli +12 -120
- data/data/config/command_modifiers.yaml +13 -1
- data/data/config/interface_modifiers.yaml +21 -4
- data/data/config/item_modifiers.yaml +1 -1
- data/data/config/microservice.yaml +15 -2
- data/data/config/param_item_modifiers.yaml +1 -1
- data/data/config/parameter_modifiers.yaml +1 -1
- data/data/config/table_manager.yaml +2 -2
- data/data/config/target.yaml +11 -0
- data/data/config/telemetry_modifiers.yaml +17 -1
- data/data/config/tool.yaml +12 -0
- data/data/config/widgets.yaml +13 -17
- data/lib/openc3/accessors/form_accessor.rb +4 -3
- data/lib/openc3/accessors/html_accessor.rb +3 -3
- data/lib/openc3/accessors/http_accessor.rb +13 -13
- data/lib/openc3/accessors/xml_accessor.rb +16 -4
- data/lib/openc3/api/target_api.rb +0 -30
- data/lib/openc3/config/config_parser.rb +6 -3
- data/lib/openc3/core_ext/array.rb +0 -16
- data/lib/openc3/core_ext.rb +0 -1
- data/lib/openc3/interfaces/file_interface.rb +198 -0
- data/lib/openc3/interfaces/http_client_interface.rb +71 -39
- data/lib/openc3/interfaces/http_server_interface.rb +0 -7
- data/lib/openc3/interfaces/interface.rb +2 -0
- data/lib/openc3/interfaces/mqtt_interface.rb +32 -15
- data/lib/openc3/interfaces/mqtt_stream_interface.rb +19 -4
- data/lib/openc3/interfaces/protocols/crc_protocol.rb +7 -0
- data/lib/openc3/interfaces/serial_interface.rb +1 -0
- data/lib/openc3/interfaces.rb +2 -4
- data/lib/openc3/microservices/multi_microservice.rb +3 -3
- data/lib/openc3/migrations/20241208080000_no_critical_cmd.rb +31 -0
- data/lib/openc3/migrations/20241208080001_no_trigger_group.rb +46 -0
- data/lib/openc3/models/interface_model.rb +9 -3
- data/lib/openc3/models/microservice_model.rb +8 -1
- data/lib/openc3/models/plugin_model.rb +6 -1
- data/lib/openc3/models/python_package_model.rb +6 -1
- data/lib/openc3/models/reaction_model.rb +14 -10
- data/lib/openc3/models/scope_model.rb +60 -42
- data/lib/openc3/models/target_model.rb +17 -1
- data/lib/openc3/models/timeline_model.rb +17 -5
- data/lib/openc3/models/tool_model.rb +15 -3
- data/lib/openc3/models/trigger_group_model.rb +6 -3
- data/lib/openc3/operators/microservice_operator.rb +8 -0
- data/lib/openc3/packets/commands.rb +17 -6
- data/lib/openc3/packets/limits.rb +0 -12
- data/lib/openc3/packets/packet.rb +1 -1
- data/lib/openc3/packets/packet_item.rb +30 -36
- data/lib/openc3/packets/structure_item.rb +2 -2
- data/lib/openc3/script/script.rb +0 -10
- data/lib/openc3/script/web_socket_api.rb +2 -2
- data/lib/openc3/streams/mqtt_stream.rb +41 -33
- data/lib/openc3/streams/serial_stream.rb +27 -27
- data/lib/openc3/streams/stream.rb +17 -17
- data/lib/openc3/streams/tcpip_client_stream.rb +1 -1
- data/lib/openc3/streams/tcpip_socket_stream.rb +19 -19
- data/lib/openc3/system/system.rb +1 -1
- data/lib/openc3/system.rb +2 -3
- data/lib/openc3/tools/table_manager/table.rb +2 -2
- data/lib/openc3/tools/table_manager/table_parser.rb +1 -1
- data/lib/openc3/top_level.rb +0 -5
- data/lib/openc3/topics/command_decom_topic.rb +0 -7
- data/lib/openc3/utilities/bucket_utilities.rb +1 -1
- data/lib/openc3/utilities/cli_generator.rb +0 -1
- data/lib/openc3/version.rb +6 -6
- data/templates/plugin/README.md +1 -1
- data/templates/target/targets/TARGET/lib/target.rb +1 -1
- data/templates/tool_angular/package.json +8 -8
- data/templates/tool_angular/src/app/app.component.html +4 -13
- data/templates/tool_angular/src/app/app.component.scss +5 -13
- data/templates/tool_angular/src/app/app.component.ts +5 -4
- data/templates/tool_angular/src/app/custom-overlay-container.ts +2 -2
- data/templates/tool_angular/src/app/openc3-api.d.ts +1 -1
- data/templates/tool_angular/src/main.single-spa.ts +1 -1
- data/templates/tool_react/package.json +1 -0
- data/templates/tool_react/src/root.component.js +1 -1
- data/templates/tool_svelte/package.json +11 -9
- data/templates/tool_svelte/rollup.config.js +2 -0
- data/templates/tool_svelte/src/App.svelte +2 -2
- data/templates/tool_vue/eslint.config.mjs +68 -0
- data/templates/tool_vue/jsconfig.json +1 -1
- data/templates/tool_vue/package.json +26 -43
- data/templates/tool_vue/src/App.vue +3 -5
- data/templates/tool_vue/src/main.js +12 -23
- data/templates/tool_vue/src/router.js +19 -18
- data/templates/tool_vue/src/tools/tool_name/tool_name.vue +2 -2
- data/templates/tool_vue/vite.config.js +52 -0
- data/templates/widget/package.json +19 -26
- data/templates/widget/src/Widget.vue +13 -15
- data/templates/widget/vite.config.js +26 -0
- metadata +10 -41
- data/lib/openc3/core_ext/hash.rb +0 -40
- data/lib/openc3/core_ext/httpclient.rb +0 -11
- data/lib/openc3/interfaces/linc_interface.rb +0 -480
- data/lib/openc3/interfaces/protocols/override_protocol.rb +0 -4
- data/lib/openc3/microservices/critical_cmd_microservice.rb +0 -74
- data/lib/openc3/microservices/reaction_microservice.rb +0 -607
- data/lib/openc3/microservices/timeline_microservice.rb +0 -398
- data/lib/openc3/microservices/trigger_group_microservice.rb +0 -698
- data/lib/openc3/migrations/20230615000000_autonomic.rb +0 -86
- data/lib/openc3/migrations/20240915000000_activity_uuid.rb +0 -28
- data/lib/openc3/migrations/20241016000000_scope_critical_cmd.rb +0 -24
- data/lib/openc3/system/system_config.rb +0 -413
- data/templates/tool_svelte/src/services/api.js +0 -92
- data/templates/tool_svelte/src/services/axios.js +0 -85
- data/templates/tool_svelte/src/services/cable.js +0 -65
- data/templates/tool_svelte/src/services/config-parser.js +0 -198
- data/templates/tool_svelte/src/services/openc3-api.js +0 -606
- data/templates/tool_vue/.eslintrc.js +0 -43
- data/templates/tool_vue/babel.config.json +0 -11
- data/templates/tool_vue/vue.config.js +0 -38
- data/templates/widget/.eslintrc.js +0 -43
- data/templates/widget/babel.config.json +0 -11
- data/templates/widget/vue.config.js +0 -28
- /data/templates/tool_vue/{.prettierrc.js → .prettierrc.cjs} +0 -0
- /data/templates/widget/{.prettierrc.js → .prettierrc.cjs} +0 -0
@@ -1,85 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
3
|
-
# All Rights Reserved.
|
4
|
-
#
|
5
|
-
# This program is free software; you can modify and/or redistribute it
|
6
|
-
# under the terms of the GNU Affero General Public License
|
7
|
-
# as published by the Free Software Foundation; version 3 with
|
8
|
-
# attribution addendums as found in the LICENSE.txt
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU Affero General Public License for more details.
|
14
|
-
|
15
|
-
# Modified by OpenC3, Inc.
|
16
|
-
# All changes Copyright 2022, OpenC3, Inc.
|
17
|
-
# All Rights Reserved
|
18
|
-
#
|
19
|
-
# This file may also be used under the terms of a commercial license
|
20
|
-
# if purchased from OpenC3, Inc.
|
21
|
-
*/
|
22
|
-
|
23
|
-
import axios from 'axios'
|
24
|
-
|
25
|
-
const axiosInstance = axios.create({
|
26
|
-
baseURL: location.origin,
|
27
|
-
timeout: 60000,
|
28
|
-
params: {},
|
29
|
-
})
|
30
|
-
|
31
|
-
axiosInstance.interceptors.response.use(
|
32
|
-
(response) => response,
|
33
|
-
(error) => {
|
34
|
-
if (error.response) {
|
35
|
-
if (error.response.status === 401) {
|
36
|
-
OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity, true).then(
|
37
|
-
function (refreshed) {
|
38
|
-
if (refreshed) {
|
39
|
-
OpenC3Auth.setTokens()
|
40
|
-
}
|
41
|
-
}
|
42
|
-
)
|
43
|
-
}
|
44
|
-
// Individual tools can set 'Ignore-Errors' to an error code
|
45
|
-
// they potentially expect, e.g. '500', in which case we ignore it
|
46
|
-
// For example in CommandSender.vue:
|
47
|
-
// obs = this.api.cmd(targetName, commandName, paramList, {
|
48
|
-
// 'Ignore-Errors': '500',
|
49
|
-
// })
|
50
|
-
if (
|
51
|
-
error.response.headers['ignore-errors'] &&
|
52
|
-
error.response.headers['ignore-errors'].includes(
|
53
|
-
error.response.status.toString()
|
54
|
-
)
|
55
|
-
) {
|
56
|
-
return Promise.reject(error)
|
57
|
-
}
|
58
|
-
let body = `HTTP ${error.response.status} - `
|
59
|
-
if (error.response?.statusText) {
|
60
|
-
body += `${error.response.statusText} `
|
61
|
-
}
|
62
|
-
if (error.response?.config?.data) {
|
63
|
-
body += `${error.response.config.data} `
|
64
|
-
}
|
65
|
-
if (error.response?.data?.message) {
|
66
|
-
body += `${error.response.data.message}`
|
67
|
-
} else if (error.response?.data?.exception) {
|
68
|
-
body += `${error.response.data.exception}`
|
69
|
-
} else if (error.response?.data?.error?.message) {
|
70
|
-
if (error.response.data.error.class) {
|
71
|
-
body += `${error.response.data.error.class} `
|
72
|
-
}
|
73
|
-
body += `${error.response.data.error.message}`
|
74
|
-
} else {
|
75
|
-
body += `${error.response?.data}`
|
76
|
-
}
|
77
|
-
alert(`Network error: ${body}`)
|
78
|
-
throw error
|
79
|
-
} else {
|
80
|
-
throw error
|
81
|
-
}
|
82
|
-
}
|
83
|
-
)
|
84
|
-
|
85
|
-
export default axiosInstance
|
@@ -1,65 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
3
|
-
# All Rights Reserved.
|
4
|
-
#
|
5
|
-
# This program is free software; you can modify and/or redistribute it
|
6
|
-
# under the terms of the GNU Affero General Public License
|
7
|
-
# as published by the Free Software Foundation; version 3 with
|
8
|
-
# attribution addendums as found in the LICENSE.txt
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU Affero General Public License for more details.
|
14
|
-
|
15
|
-
# Modified by OpenC3, Inc.
|
16
|
-
# All changes Copyright 2022, OpenC3, Inc.
|
17
|
-
# All Rights Reserved
|
18
|
-
#
|
19
|
-
# This file may also be used under the terms of a commercial license
|
20
|
-
# if purchased from OpenC3, Inc.
|
21
|
-
*/
|
22
|
-
|
23
|
-
import * as ActionCable from '@rails/actioncable'
|
24
|
-
//ActionCable.logger.enabled = true
|
25
|
-
ActionCable.ConnectionMonitor.staleThreshold = 10
|
26
|
-
|
27
|
-
export default class Cable {
|
28
|
-
constructor(url = '/openc3-api/cable') {
|
29
|
-
this._cable = null
|
30
|
-
this._url = url
|
31
|
-
}
|
32
|
-
disconnect() {
|
33
|
-
if (this._cable) {
|
34
|
-
this._cable.disconnect()
|
35
|
-
}
|
36
|
-
}
|
37
|
-
createSubscription(channel, scope, callbacks = {}, additionalOptions = {}) {
|
38
|
-
return OpenC3Auth.updateToken(OpenC3Auth.defaultMinValidity).then(
|
39
|
-
(refreshed) => {
|
40
|
-
if (refreshed) {
|
41
|
-
OpenC3Auth.setTokens()
|
42
|
-
}
|
43
|
-
if (this._cable == null) {
|
44
|
-
let final_url =
|
45
|
-
this._url +
|
46
|
-
'?scope=' +
|
47
|
-
window.openc3Scope +
|
48
|
-
'&authorization=' +
|
49
|
-
localStorage.openc3Token
|
50
|
-
this._cable = ActionCable.createConsumer(encodeURI(final_url))
|
51
|
-
}
|
52
|
-
return this._cable.subscriptions.create(
|
53
|
-
{
|
54
|
-
channel,
|
55
|
-
...additionalOptions,
|
56
|
-
},
|
57
|
-
callbacks
|
58
|
-
)
|
59
|
-
}
|
60
|
-
)
|
61
|
-
}
|
62
|
-
recordPing() {
|
63
|
-
this._cable.connection.monitor.recordPing()
|
64
|
-
}
|
65
|
-
}
|
@@ -1,198 +0,0 @@
|
|
1
|
-
/*
|
2
|
-
# Copyright 2022 Ball Aerospace & Technologies Corp.
|
3
|
-
# All Rights Reserved.
|
4
|
-
#
|
5
|
-
# This program is free software; you can modify and/or redistribute it
|
6
|
-
# under the terms of the GNU Affero General Public License
|
7
|
-
# as published by the Free Software Foundation; version 3 with
|
8
|
-
# attribution addendums as found in the LICENSE.txt
|
9
|
-
#
|
10
|
-
# This program is distributed in the hope that it will be useful,
|
11
|
-
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
12
|
-
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
13
|
-
# GNU Affero General Public License for more details.
|
14
|
-
|
15
|
-
# Modified by OpenC3, Inc.
|
16
|
-
# All changes Copyright 2024, OpenC3, Inc.
|
17
|
-
# All Rights Reserved
|
18
|
-
#
|
19
|
-
# This file may also be used under the terms of a commercial license
|
20
|
-
# if purchased from OpenC3, Inc.
|
21
|
-
*/
|
22
|
-
|
23
|
-
export class ConfigParserError {
|
24
|
-
constructor(config_parser, message, usage = '', url = '') {
|
25
|
-
this.keyword = config_parser.keyword
|
26
|
-
this.parameters = config_parser.parameters
|
27
|
-
this.filename = config_parser.filename
|
28
|
-
this.line = config_parser.line
|
29
|
-
this.lineNumber = config_parser.lineNumber
|
30
|
-
this.message = message
|
31
|
-
this.usage = usage
|
32
|
-
this.url = url
|
33
|
-
}
|
34
|
-
}
|
35
|
-
|
36
|
-
export class ConfigParserService {
|
37
|
-
keyword = null
|
38
|
-
parameters = []
|
39
|
-
filename = ''
|
40
|
-
line = ''
|
41
|
-
lineNumber = 0
|
42
|
-
url = 'https://docs.openc3.com/docs'
|
43
|
-
constructor() {}
|
44
|
-
|
45
|
-
verify_num_parameters(min_num_params, max_num_params, usage = '') {
|
46
|
-
// This syntax works with 0 because each doesn't return any values
|
47
|
-
// for a backwards range
|
48
|
-
for (let index = 1; index <= min_num_params; index++) {
|
49
|
-
// If the parameter is nil (0 based) then we have a problem
|
50
|
-
if (this.parameters[index - 1] === undefined) {
|
51
|
-
throw new ConfigParserError(
|
52
|
-
this,
|
53
|
-
`Not enough parameters for ${this.keyword}.`,
|
54
|
-
usage,
|
55
|
-
this.url,
|
56
|
-
)
|
57
|
-
}
|
58
|
-
}
|
59
|
-
// If they pass null for max_params we don't check for a maximum number
|
60
|
-
if (max_num_params && this.parameters[max_num_params] !== undefined) {
|
61
|
-
throw new ConfigParserError(
|
62
|
-
this,
|
63
|
-
`Too many parameters for ${this.keyword}.`,
|
64
|
-
usage,
|
65
|
-
this.url,
|
66
|
-
)
|
67
|
-
}
|
68
|
-
}
|
69
|
-
|
70
|
-
remove_quotes(string) {
|
71
|
-
if (string.length < 2) {
|
72
|
-
return string
|
73
|
-
}
|
74
|
-
let first_char = string.charAt(0)
|
75
|
-
if (first_char !== '"' && first_char !== "'") {
|
76
|
-
return string
|
77
|
-
}
|
78
|
-
let last_char = string.charAt(string.length - 1)
|
79
|
-
if (first_char !== last_char) {
|
80
|
-
return string
|
81
|
-
}
|
82
|
-
return string.substring(1, string.length - 1)
|
83
|
-
}
|
84
|
-
|
85
|
-
scan_string(string, rx) {
|
86
|
-
if (!rx.global) throw "rx must have 'global' flag set"
|
87
|
-
let r = []
|
88
|
-
string.replace(rx, function (match) {
|
89
|
-
r.push(match)
|
90
|
-
return match
|
91
|
-
})
|
92
|
-
return r
|
93
|
-
}
|
94
|
-
|
95
|
-
parse_string(
|
96
|
-
input_string,
|
97
|
-
original_filename,
|
98
|
-
yield_non_keyword_lines,
|
99
|
-
remove_quotes,
|
100
|
-
handler,
|
101
|
-
) {
|
102
|
-
let string_concat = false
|
103
|
-
this.line = ''
|
104
|
-
this.keyword = null
|
105
|
-
this.parameters = []
|
106
|
-
this.filename = original_filename
|
107
|
-
|
108
|
-
// Break string into lines
|
109
|
-
let lines = input_string.split('\n')
|
110
|
-
let numLines = lines.length
|
111
|
-
|
112
|
-
for (let i = 0; i < numLines; i++) {
|
113
|
-
this.lineNumber = i + 1
|
114
|
-
let line = lines[i].trim()
|
115
|
-
// Ensure the line length is not 0
|
116
|
-
if (line.length === 0) {
|
117
|
-
continue
|
118
|
-
}
|
119
|
-
|
120
|
-
if (string_concat === true) {
|
121
|
-
// Skip comment lines after a string concatenation
|
122
|
-
if (line[0] === '#') {
|
123
|
-
continue
|
124
|
-
}
|
125
|
-
// Remove the opening quote if we're continuing the line
|
126
|
-
line = line.substring(1, line.length)
|
127
|
-
}
|
128
|
-
|
129
|
-
// Check for string continuation
|
130
|
-
let last_char = line.charAt(line.length - 1)
|
131
|
-
let newline = false
|
132
|
-
switch (last_char) {
|
133
|
-
case '+': // String concatenation with newlines
|
134
|
-
newline = true
|
135
|
-
// Deliberate fall through
|
136
|
-
case '\\': // String concatenation
|
137
|
-
// Trim off the concat character plus any spaces, e.g. "line" \
|
138
|
-
let trim = line.substring(0, line.length - 1).trim()
|
139
|
-
// Now trim off the last quote so it will flow into the next line
|
140
|
-
this.line += trim.substring(0, trim.length - 1)
|
141
|
-
if (newline) {
|
142
|
-
this.line += '\n'
|
143
|
-
}
|
144
|
-
string_concat = true
|
145
|
-
continue
|
146
|
-
case '&': // Line continuation
|
147
|
-
this.line += line.substring(0, line.length - 1)
|
148
|
-
continue
|
149
|
-
default:
|
150
|
-
this.line += line
|
151
|
-
}
|
152
|
-
string_concat = false
|
153
|
-
|
154
|
-
let rx = /("([^\\"]|\\.)*")|('([^\\']|\\.)*')|\S+/g
|
155
|
-
let data = this.scan_string(this.line, rx)
|
156
|
-
let first_item = ''
|
157
|
-
if (data.length > 0) {
|
158
|
-
first_item = first_item + data[0]
|
159
|
-
}
|
160
|
-
|
161
|
-
if (first_item.length === 0 || first_item.charAt(0) === '#') {
|
162
|
-
this.keyword = null
|
163
|
-
} else {
|
164
|
-
this.keyword = first_item.toUpperCase()
|
165
|
-
}
|
166
|
-
this.parameters = []
|
167
|
-
|
168
|
-
// Ignore lines without keywords: comments and blank lines
|
169
|
-
if (this.keyword === null) {
|
170
|
-
if (yield_non_keyword_lines) {
|
171
|
-
handler(this.keyword, this.parameters, this.line, this.lineNumber)
|
172
|
-
}
|
173
|
-
this.line = ''
|
174
|
-
continue
|
175
|
-
}
|
176
|
-
|
177
|
-
let length = data.length
|
178
|
-
if (length > 1) {
|
179
|
-
for (let index = 1; index < length; index++) {
|
180
|
-
let string = data[index]
|
181
|
-
|
182
|
-
// Don't process trailing comments such as:
|
183
|
-
// KEYWORD PARAM #This is a comment
|
184
|
-
if (string.length > 0 && string.charAt(0) === '#') {
|
185
|
-
break
|
186
|
-
}
|
187
|
-
if (remove_quotes) {
|
188
|
-
this.parameters.push(this.remove_quotes(string))
|
189
|
-
} else {
|
190
|
-
this.parameters.push(string)
|
191
|
-
}
|
192
|
-
}
|
193
|
-
}
|
194
|
-
handler(this.keyword, this.parameters, this.line, this.lineNumber)
|
195
|
-
this.line = ''
|
196
|
-
} // for all the lines
|
197
|
-
} // parse_string
|
198
|
-
} // class ConfigParserService
|