@signalk/server-api 2.10.0 → 2.10.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/features.d.ts +1 -1
- package/dist/features.d.ts.map +1 -1
- package/dist/history.d.ts +2 -2
- package/dist/history.d.ts.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/radarapi.d.ts +709 -0
- package/dist/radarapi.d.ts.map +1 -0
- package/dist/radarapi.js +32 -0
- package/dist/resourcesapi.d.ts +4 -0
- package/dist/resourcesapi.d.ts.map +1 -1
- package/dist/serverapi.d.ts +3 -2
- package/dist/serverapi.d.ts.map +1 -1
- package/dist/subscriptionmanager.d.ts +7 -0
- package/dist/subscriptionmanager.d.ts.map +1 -1
- package/package.json +5 -3
- package/tsconfig.tsbuildinfo +1 -1
- package/wit/signalk.wit +98 -0
|
@@ -0,0 +1,709 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Radar API Types
|
|
3
|
+
*
|
|
4
|
+
* Types and interfaces for the Signal K Radar API at
|
|
5
|
+
* /signalk/v2/api/vessels/self/radars
|
|
6
|
+
*/
|
|
7
|
+
/** @category Radar API */
|
|
8
|
+
export type RadarStatus = 'off' | 'standby' | 'transmit' | 'warming';
|
|
9
|
+
/** @category Radar API */
|
|
10
|
+
export interface RadarControlValue {
|
|
11
|
+
auto: boolean;
|
|
12
|
+
value: number;
|
|
13
|
+
}
|
|
14
|
+
/** @category Radar API */
|
|
15
|
+
export interface RadarControls {
|
|
16
|
+
gain: RadarControlValue;
|
|
17
|
+
sea?: RadarControlValue;
|
|
18
|
+
rain?: {
|
|
19
|
+
value: number;
|
|
20
|
+
};
|
|
21
|
+
interferenceRejection?: {
|
|
22
|
+
value: number;
|
|
23
|
+
};
|
|
24
|
+
targetExpansion?: {
|
|
25
|
+
value: number;
|
|
26
|
+
};
|
|
27
|
+
targetBoost?: {
|
|
28
|
+
value: number;
|
|
29
|
+
};
|
|
30
|
+
[key: string]: RadarControlValue | {
|
|
31
|
+
value: number;
|
|
32
|
+
} | undefined;
|
|
33
|
+
}
|
|
34
|
+
/** @category Radar API */
|
|
35
|
+
export interface LegendEntry {
|
|
36
|
+
color: string;
|
|
37
|
+
label: string;
|
|
38
|
+
minValue?: number;
|
|
39
|
+
maxValue?: number;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Optional features a radar provider may support.
|
|
43
|
+
*
|
|
44
|
+
* These indicate what API features are implemented by the provider,
|
|
45
|
+
* NOT hardware capabilities (those are in characteristics).
|
|
46
|
+
*
|
|
47
|
+
* @category Radar API
|
|
48
|
+
*/
|
|
49
|
+
export type SupportedFeature = 'arpa' | 'guardZones' | 'trails' | 'dualRange';
|
|
50
|
+
/**
|
|
51
|
+
* Hardware characteristics of a radar.
|
|
52
|
+
*
|
|
53
|
+
* @category Radar API
|
|
54
|
+
*/
|
|
55
|
+
export interface RadarCharacteristics {
|
|
56
|
+
/** Maximum detection range in meters */
|
|
57
|
+
maxRange: number;
|
|
58
|
+
/** Minimum detection range in meters */
|
|
59
|
+
minRange: number;
|
|
60
|
+
/** Supported discrete range values in meters */
|
|
61
|
+
supportedRanges: number[];
|
|
62
|
+
/** Number of spokes per full rotation */
|
|
63
|
+
spokesPerRevolution: number;
|
|
64
|
+
/** Maximum spoke length in samples */
|
|
65
|
+
maxSpokeLength: number;
|
|
66
|
+
/** Whether the radar supports Doppler/motion detection */
|
|
67
|
+
hasDoppler: boolean;
|
|
68
|
+
/** Whether the radar supports dual-range mode */
|
|
69
|
+
hasDualRange: boolean;
|
|
70
|
+
/** Maximum range for dual-range mode (if supported) */
|
|
71
|
+
maxDualRange?: number;
|
|
72
|
+
/** Number of no-transmit zones supported */
|
|
73
|
+
noTransmitZoneCount: number;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Control definition describing a radar control.
|
|
77
|
+
*
|
|
78
|
+
* @category Radar API
|
|
79
|
+
*/
|
|
80
|
+
export interface ControlDefinitionV5 {
|
|
81
|
+
/** Semantic control ID (e.g., "gain", "beamSharpening") */
|
|
82
|
+
id: string;
|
|
83
|
+
/** Human-readable name */
|
|
84
|
+
name: string;
|
|
85
|
+
/** Description for tooltips */
|
|
86
|
+
description: string;
|
|
87
|
+
/** Category: base controls all radars have, extended are model-specific */
|
|
88
|
+
category: 'base' | 'extended';
|
|
89
|
+
/** Control value type */
|
|
90
|
+
type: 'boolean' | 'number' | 'enum' | 'compound';
|
|
91
|
+
/** For type: "number" - value range constraints */
|
|
92
|
+
range?: {
|
|
93
|
+
min: number;
|
|
94
|
+
max: number;
|
|
95
|
+
step?: number;
|
|
96
|
+
unit?: string;
|
|
97
|
+
};
|
|
98
|
+
/** For type: "enum" - allowed values */
|
|
99
|
+
values?: Array<{
|
|
100
|
+
value: string | number;
|
|
101
|
+
label: string;
|
|
102
|
+
description?: string;
|
|
103
|
+
}>;
|
|
104
|
+
/** For type: "compound" - property definitions */
|
|
105
|
+
properties?: Record<string, any>;
|
|
106
|
+
/** Supported modes (auto/manual) */
|
|
107
|
+
modes?: ('auto' | 'manual')[];
|
|
108
|
+
/** Default mode */
|
|
109
|
+
defaultMode?: 'auto' | 'manual';
|
|
110
|
+
/** Whether this control is read-only */
|
|
111
|
+
readOnly?: boolean;
|
|
112
|
+
/** Default value */
|
|
113
|
+
default?: any;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Control constraint describing dependencies between controls.
|
|
117
|
+
*
|
|
118
|
+
* @category Radar API
|
|
119
|
+
*/
|
|
120
|
+
export interface ControlConstraint {
|
|
121
|
+
/** Control ID this constraint applies to */
|
|
122
|
+
controlId: string;
|
|
123
|
+
/** Condition that triggers the constraint */
|
|
124
|
+
condition: {
|
|
125
|
+
type: 'disabled_when' | 'read_only_when' | 'restricted_when';
|
|
126
|
+
dependsOn: string;
|
|
127
|
+
operator: '==' | '!=' | '>' | '<' | '>=' | '<=';
|
|
128
|
+
value: string | number | boolean;
|
|
129
|
+
};
|
|
130
|
+
/** Effect when condition is true */
|
|
131
|
+
effect: {
|
|
132
|
+
disabled?: boolean;
|
|
133
|
+
readOnly?: boolean;
|
|
134
|
+
allowedValues?: any[];
|
|
135
|
+
reason?: string;
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Capability manifest describing what a radar can do.
|
|
140
|
+
* This is cacheable - capabilities rarely change at runtime.
|
|
141
|
+
*
|
|
142
|
+
* @category Radar API
|
|
143
|
+
*
|
|
144
|
+
* @example
|
|
145
|
+
* ```json
|
|
146
|
+
* {
|
|
147
|
+
* "id": "1",
|
|
148
|
+
* "make": "Furuno",
|
|
149
|
+
* "model": "DRS4D-NXT",
|
|
150
|
+
* "characteristics": {
|
|
151
|
+
* "maxRange": 88896,
|
|
152
|
+
* "minRange": 116,
|
|
153
|
+
* "supportedRanges": [116, 231, 463, ...],
|
|
154
|
+
* "hasDoppler": true
|
|
155
|
+
* },
|
|
156
|
+
* "controls": [
|
|
157
|
+
* {"id": "power", "type": "enum", ...},
|
|
158
|
+
* {"id": "gain", "type": "compound", ...}
|
|
159
|
+
* ]
|
|
160
|
+
* }
|
|
161
|
+
* ```
|
|
162
|
+
*/
|
|
163
|
+
export interface CapabilityManifest {
|
|
164
|
+
/** Radar ID */
|
|
165
|
+
id: string;
|
|
166
|
+
/** Manufacturer name */
|
|
167
|
+
make: string;
|
|
168
|
+
/** Model name */
|
|
169
|
+
model: string;
|
|
170
|
+
/** Model family (optional) */
|
|
171
|
+
modelFamily?: string;
|
|
172
|
+
/** Serial number (optional) */
|
|
173
|
+
serialNumber?: string;
|
|
174
|
+
/** Firmware version (optional) */
|
|
175
|
+
firmwareVersion?: string;
|
|
176
|
+
/** Hardware characteristics */
|
|
177
|
+
characteristics: RadarCharacteristics;
|
|
178
|
+
/** Available controls with their schemas */
|
|
179
|
+
controls: ControlDefinitionV5[];
|
|
180
|
+
/** Control dependencies/constraints */
|
|
181
|
+
constraints?: ControlConstraint[];
|
|
182
|
+
/**
|
|
183
|
+
* Optional features this provider implements.
|
|
184
|
+
*
|
|
185
|
+
* Indicates which optional API features are available:
|
|
186
|
+
* - 'arpa': ARPA target tracking (GET /targets, POST /targets, etc.)
|
|
187
|
+
* - 'guardZones': Guard zone alerting (GET /guardZones, etc.)
|
|
188
|
+
* - 'trails': Target trails/history (GET /trails)
|
|
189
|
+
* - 'dualRange': Dual-range simultaneous display
|
|
190
|
+
*
|
|
191
|
+
* Note: This declares API capabilities, not hardware. A radar may have
|
|
192
|
+
* hardware Doppler support (characteristics.hasDoppler) but the provider
|
|
193
|
+
* might not implement the trails API endpoint.
|
|
194
|
+
*/
|
|
195
|
+
supportedFeatures?: SupportedFeature[];
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Current radar state.
|
|
199
|
+
* Contains status and all current control values.
|
|
200
|
+
*
|
|
201
|
+
* @category Radar API
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```json
|
|
205
|
+
* {
|
|
206
|
+
* "id": "1",
|
|
207
|
+
* "timestamp": "2025-01-15T10:30:00Z",
|
|
208
|
+
* "status": "transmit",
|
|
209
|
+
* "controls": {
|
|
210
|
+
* "power": "transmit",
|
|
211
|
+
* "range": 5556,
|
|
212
|
+
* "gain": {"mode": "auto", "value": 65}
|
|
213
|
+
* }
|
|
214
|
+
* }
|
|
215
|
+
* ```
|
|
216
|
+
*/
|
|
217
|
+
export interface RadarState {
|
|
218
|
+
/** Radar ID */
|
|
219
|
+
id: string;
|
|
220
|
+
/** ISO 8601 timestamp of when state was captured */
|
|
221
|
+
timestamp: string;
|
|
222
|
+
/** Current operational status */
|
|
223
|
+
status: RadarStatus;
|
|
224
|
+
/** Current control values keyed by control ID */
|
|
225
|
+
controls: Record<string, any>;
|
|
226
|
+
/** Controls that are currently disabled and why */
|
|
227
|
+
disabledControls?: Array<{
|
|
228
|
+
controlId: string;
|
|
229
|
+
reason: string;
|
|
230
|
+
}>;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* ARPA target status.
|
|
234
|
+
*
|
|
235
|
+
* @category Radar API
|
|
236
|
+
*/
|
|
237
|
+
export type ArpaTargetStatus = 'tracking' | 'lost' | 'acquiring';
|
|
238
|
+
/**
|
|
239
|
+
* ARPA target acquisition method.
|
|
240
|
+
*
|
|
241
|
+
* @category Radar API
|
|
242
|
+
*/
|
|
243
|
+
export type ArpaAcquisitionMethod = 'manual' | 'auto';
|
|
244
|
+
/**
|
|
245
|
+
* ARPA target position data.
|
|
246
|
+
*
|
|
247
|
+
* @category Radar API
|
|
248
|
+
*/
|
|
249
|
+
export interface ArpaTargetPosition {
|
|
250
|
+
/** Bearing from own ship in degrees (0-360, true north) */
|
|
251
|
+
bearing: number;
|
|
252
|
+
/** Distance from own ship in meters */
|
|
253
|
+
distance: number;
|
|
254
|
+
/** Latitude (if GPS available) */
|
|
255
|
+
latitude?: number;
|
|
256
|
+
/** Longitude (if GPS available) */
|
|
257
|
+
longitude?: number;
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* ARPA target motion data.
|
|
261
|
+
*
|
|
262
|
+
* @category Radar API
|
|
263
|
+
*/
|
|
264
|
+
export interface ArpaTargetMotion {
|
|
265
|
+
/** Course over ground in degrees (0-360, true north) */
|
|
266
|
+
course: number;
|
|
267
|
+
/** Speed over ground in meters per second */
|
|
268
|
+
speed: number;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* ARPA target danger assessment.
|
|
272
|
+
*
|
|
273
|
+
* @category Radar API
|
|
274
|
+
*/
|
|
275
|
+
export interface ArpaTargetDanger {
|
|
276
|
+
/** Closest Point of Approach in meters */
|
|
277
|
+
cpa: number;
|
|
278
|
+
/** Time to CPA in seconds (negative if target is receding) */
|
|
279
|
+
tcpa: number;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* ARPA tracked target.
|
|
283
|
+
*
|
|
284
|
+
* @category Radar API
|
|
285
|
+
*
|
|
286
|
+
* @example
|
|
287
|
+
* ```json
|
|
288
|
+
* {
|
|
289
|
+
* "id": 1,
|
|
290
|
+
* "status": "tracking",
|
|
291
|
+
* "position": {
|
|
292
|
+
* "bearing": 45.2,
|
|
293
|
+
* "distance": 1852,
|
|
294
|
+
* "latitude": 52.1234,
|
|
295
|
+
* "longitude": 4.5678
|
|
296
|
+
* },
|
|
297
|
+
* "motion": {
|
|
298
|
+
* "course": 180.5,
|
|
299
|
+
* "speed": 5.14
|
|
300
|
+
* },
|
|
301
|
+
* "danger": {
|
|
302
|
+
* "cpa": 150,
|
|
303
|
+
* "tcpa": 300
|
|
304
|
+
* },
|
|
305
|
+
* "acquisition": "manual",
|
|
306
|
+
* "firstSeen": "2025-01-15T10:28:00Z",
|
|
307
|
+
* "lastSeen": "2025-01-15T10:30:00Z"
|
|
308
|
+
* }
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
export interface ArpaTarget {
|
|
312
|
+
/** Unique target identifier (1-99 typically) */
|
|
313
|
+
id: number;
|
|
314
|
+
/** Current tracking status */
|
|
315
|
+
status: ArpaTargetStatus;
|
|
316
|
+
/** Target position relative to own ship */
|
|
317
|
+
position: ArpaTargetPosition;
|
|
318
|
+
/** Target motion (course and speed) */
|
|
319
|
+
motion: ArpaTargetMotion;
|
|
320
|
+
/** Danger assessment (CPA/TCPA) */
|
|
321
|
+
danger: ArpaTargetDanger;
|
|
322
|
+
/** How this target was acquired */
|
|
323
|
+
acquisition: ArpaAcquisitionMethod;
|
|
324
|
+
/** ISO 8601 timestamp when target was first acquired */
|
|
325
|
+
firstSeen: string;
|
|
326
|
+
/** ISO 8601 timestamp of most recent radar return */
|
|
327
|
+
lastSeen: string;
|
|
328
|
+
}
|
|
329
|
+
/**
|
|
330
|
+
* Response from GET /radars/{id}/targets.
|
|
331
|
+
*
|
|
332
|
+
* @category Radar API
|
|
333
|
+
*
|
|
334
|
+
* @example
|
|
335
|
+
* ```json
|
|
336
|
+
* {
|
|
337
|
+
* "radarId": "radar-0",
|
|
338
|
+
* "timestamp": "2025-01-15T10:30:00Z",
|
|
339
|
+
* "targets": [
|
|
340
|
+
* { "id": 1, "status": "tracking", ... },
|
|
341
|
+
* { "id": 2, "status": "lost", ... }
|
|
342
|
+
* ]
|
|
343
|
+
* }
|
|
344
|
+
* ```
|
|
345
|
+
*/
|
|
346
|
+
export interface TargetListResponse {
|
|
347
|
+
/** Radar ID */
|
|
348
|
+
radarId: string;
|
|
349
|
+
/** ISO 8601 timestamp */
|
|
350
|
+
timestamp: string;
|
|
351
|
+
/** List of tracked targets */
|
|
352
|
+
targets: ArpaTarget[];
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* WebSocket message for target streaming.
|
|
356
|
+
*
|
|
357
|
+
* @category Radar API
|
|
358
|
+
*/
|
|
359
|
+
export interface TargetStreamMessage {
|
|
360
|
+
/** Message type */
|
|
361
|
+
type: 'target_update' | 'target_lost' | 'target_acquired';
|
|
362
|
+
/** ISO 8601 timestamp */
|
|
363
|
+
timestamp: string;
|
|
364
|
+
/** Updated/lost/acquired target */
|
|
365
|
+
target: ArpaTarget;
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* ARPA settings for a radar.
|
|
369
|
+
*
|
|
370
|
+
* @category Radar API
|
|
371
|
+
*/
|
|
372
|
+
export interface ArpaSettings {
|
|
373
|
+
/** Whether ARPA is enabled */
|
|
374
|
+
enabled: boolean;
|
|
375
|
+
/** Maximum number of targets to track (typically 10-100) */
|
|
376
|
+
maxTargets: number;
|
|
377
|
+
/** CPA threshold for danger alert in meters */
|
|
378
|
+
cpaThreshold: number;
|
|
379
|
+
/** TCPA threshold for danger alert in seconds */
|
|
380
|
+
tcpaThreshold: number;
|
|
381
|
+
/** Seconds before marking a target as lost */
|
|
382
|
+
lostTargetTimeout: number;
|
|
383
|
+
/** Auto-acquisition sensitivity (0=off, 1-3=low/med/high) */
|
|
384
|
+
autoAcquisition: number;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Radar information returned by GET /radars/{id}
|
|
388
|
+
*
|
|
389
|
+
* @category Radar API
|
|
390
|
+
*
|
|
391
|
+
* @example
|
|
392
|
+
* ```json
|
|
393
|
+
* {
|
|
394
|
+
* "id": "radar-0",
|
|
395
|
+
* "name": "Furuno DRS4D-NXT",
|
|
396
|
+
* "brand": "Furuno",
|
|
397
|
+
* "status": "transmit",
|
|
398
|
+
* "spokesPerRevolution": 2048,
|
|
399
|
+
* "maxSpokeLen": 1024,
|
|
400
|
+
* "range": 2000,
|
|
401
|
+
* "controls": {
|
|
402
|
+
* "gain": { "auto": false, "value": 50 },
|
|
403
|
+
* "sea": { "auto": true, "value": 30 }
|
|
404
|
+
* },
|
|
405
|
+
* "streamUrl": "ws://192.168.1.100:3001/v1/api/stream/radar-0"
|
|
406
|
+
* }
|
|
407
|
+
* ```
|
|
408
|
+
*/
|
|
409
|
+
export interface RadarInfo {
|
|
410
|
+
/** Unique identifier for this radar */
|
|
411
|
+
id: string;
|
|
412
|
+
/** Display name */
|
|
413
|
+
name: string;
|
|
414
|
+
/** Radar brand/manufacturer */
|
|
415
|
+
brand?: string;
|
|
416
|
+
/** Current operational status */
|
|
417
|
+
status: RadarStatus;
|
|
418
|
+
/** Number of spokes per full rotation */
|
|
419
|
+
spokesPerRevolution: number;
|
|
420
|
+
/** Maximum spoke length in samples */
|
|
421
|
+
maxSpokeLen: number;
|
|
422
|
+
/** Current range in meters */
|
|
423
|
+
range: number;
|
|
424
|
+
/** Current control settings */
|
|
425
|
+
controls: RadarControls;
|
|
426
|
+
/** Color legend for radar display */
|
|
427
|
+
legend?: LegendEntry[];
|
|
428
|
+
/**
|
|
429
|
+
* WebSocket URL for radar spoke streaming.
|
|
430
|
+
*
|
|
431
|
+
* - If **absent**: Clients use the built-in stream endpoint:
|
|
432
|
+
* `ws://server/signalk/v2/api/vessels/self/radars/{id}/stream`
|
|
433
|
+
* or `ws://server/signalk/v2/api/streams/radars/{id}`
|
|
434
|
+
* (WASM plugins emit spokes via `sk_radar_emit_spokes()` FFI binding)
|
|
435
|
+
*
|
|
436
|
+
* - If **present**: Clients connect directly to external URL (backward compat)
|
|
437
|
+
* @example "ws://192.168.1.100:3001/stream" (external mayara-server)
|
|
438
|
+
*/
|
|
439
|
+
streamUrl?: string;
|
|
440
|
+
}
|
|
441
|
+
/**
|
|
442
|
+
* Provider interface for plugins that provide radar data.
|
|
443
|
+
*
|
|
444
|
+
* @category Radar API
|
|
445
|
+
*
|
|
446
|
+
* @example
|
|
447
|
+
* ```javascript
|
|
448
|
+
* app.registerRadarProvider({
|
|
449
|
+
* name: 'Furuno Radar Plugin',
|
|
450
|
+
* methods: {
|
|
451
|
+
* getRadars: async () => ['radar-0'],
|
|
452
|
+
* getRadarInfo: async (id) => ({
|
|
453
|
+
* id: 'radar-0',
|
|
454
|
+
* name: 'Furuno DRS4D-NXT',
|
|
455
|
+
* status: 'transmit',
|
|
456
|
+
* spokesPerRevolution: 2048,
|
|
457
|
+
* maxSpokeLen: 1024,
|
|
458
|
+
* range: 2000,
|
|
459
|
+
* controls: { gain: { auto: false, value: 50 } },
|
|
460
|
+
* streamUrl: 'ws://192.168.1.100:3001/stream'
|
|
461
|
+
* }),
|
|
462
|
+
* setPower: async (id, state) => { ... },
|
|
463
|
+
* setRange: async (id, range) => { ... },
|
|
464
|
+
* setGain: async (id, gain) => { ... }
|
|
465
|
+
* }
|
|
466
|
+
* })
|
|
467
|
+
* ```
|
|
468
|
+
*/
|
|
469
|
+
export interface RadarProvider {
|
|
470
|
+
/** Display name for this radar provider */
|
|
471
|
+
name: string;
|
|
472
|
+
/** Provider methods */
|
|
473
|
+
methods: RadarProviderMethods;
|
|
474
|
+
}
|
|
475
|
+
/** @category Radar API */
|
|
476
|
+
export interface RadarProviderMethods {
|
|
477
|
+
/** Plugin ID (set automatically on registration) */
|
|
478
|
+
pluginId?: string;
|
|
479
|
+
/**
|
|
480
|
+
* Get list of radar IDs this provider manages.
|
|
481
|
+
* @returns Array of radar IDs
|
|
482
|
+
*/
|
|
483
|
+
getRadars: () => Promise<string[]>;
|
|
484
|
+
/**
|
|
485
|
+
* Get detailed info for a specific radar.
|
|
486
|
+
* @param radarId The radar ID
|
|
487
|
+
* @returns Radar info or null if not found
|
|
488
|
+
*/
|
|
489
|
+
getRadarInfo: (radarId: string) => Promise<RadarInfo | null>;
|
|
490
|
+
/**
|
|
491
|
+
* Set radar power state.
|
|
492
|
+
* @param radarId The radar ID
|
|
493
|
+
* @param state Target power state
|
|
494
|
+
* @returns true on success
|
|
495
|
+
*/
|
|
496
|
+
setPower?: (radarId: string, state: RadarStatus) => Promise<boolean>;
|
|
497
|
+
/**
|
|
498
|
+
* Set radar range in meters.
|
|
499
|
+
* @param radarId The radar ID
|
|
500
|
+
* @param range Range in meters
|
|
501
|
+
* @returns true on success
|
|
502
|
+
*/
|
|
503
|
+
setRange?: (radarId: string, range: number) => Promise<boolean>;
|
|
504
|
+
/**
|
|
505
|
+
* Set radar gain.
|
|
506
|
+
* @param radarId The radar ID
|
|
507
|
+
* @param gain Gain settings
|
|
508
|
+
* @returns true on success
|
|
509
|
+
*/
|
|
510
|
+
setGain?: (radarId: string, gain: {
|
|
511
|
+
auto: boolean;
|
|
512
|
+
value?: number;
|
|
513
|
+
}) => Promise<boolean>;
|
|
514
|
+
/**
|
|
515
|
+
* Set radar sea clutter.
|
|
516
|
+
* @param radarId The radar ID
|
|
517
|
+
* @param sea Sea clutter settings
|
|
518
|
+
* @returns true on success
|
|
519
|
+
*/
|
|
520
|
+
setSea?: (radarId: string, sea: {
|
|
521
|
+
auto: boolean;
|
|
522
|
+
value?: number;
|
|
523
|
+
}) => Promise<boolean>;
|
|
524
|
+
/**
|
|
525
|
+
* Set radar rain clutter.
|
|
526
|
+
* @param radarId The radar ID
|
|
527
|
+
* @param rain Rain clutter settings
|
|
528
|
+
* @returns true on success
|
|
529
|
+
*/
|
|
530
|
+
setRain?: (radarId: string, rain: {
|
|
531
|
+
auto: boolean;
|
|
532
|
+
value?: number;
|
|
533
|
+
}) => Promise<boolean>;
|
|
534
|
+
/**
|
|
535
|
+
* Set multiple radar controls at once.
|
|
536
|
+
* @param radarId The radar ID
|
|
537
|
+
* @param controls Partial controls to update
|
|
538
|
+
* @returns true on success
|
|
539
|
+
*/
|
|
540
|
+
setControls?: (radarId: string, controls: Partial<RadarControls>) => Promise<boolean>;
|
|
541
|
+
/**
|
|
542
|
+
* Handle WebSocket stream connection (optional).
|
|
543
|
+
* Only needed if provider doesn't expose external streamUrl.
|
|
544
|
+
* @param radarId The radar ID
|
|
545
|
+
* @param ws WebSocket connection to send spoke data to
|
|
546
|
+
*/
|
|
547
|
+
handleStreamConnection?: (radarId: string, ws: WebSocket) => void;
|
|
548
|
+
/**
|
|
549
|
+
* Get capability manifest for a radar.
|
|
550
|
+
* Returns detailed capabilities including supported controls, ranges, features.
|
|
551
|
+
* @param radarId The radar ID
|
|
552
|
+
* @returns CapabilityManifest or null if not found
|
|
553
|
+
*/
|
|
554
|
+
getCapabilities?: (radarId: string) => Promise<CapabilityManifest | null>;
|
|
555
|
+
/**
|
|
556
|
+
* Get current radar state.
|
|
557
|
+
* Returns status and all current control values.
|
|
558
|
+
* @param radarId The radar ID
|
|
559
|
+
* @returns RadarState or null if not found
|
|
560
|
+
*/
|
|
561
|
+
getState?: (radarId: string) => Promise<RadarState | null>;
|
|
562
|
+
/**
|
|
563
|
+
* Get a single control value.
|
|
564
|
+
* @param radarId The radar ID
|
|
565
|
+
* @param controlId The semantic control ID (e.g., "gain", "beamSharpening")
|
|
566
|
+
* @returns Control value or null if not found
|
|
567
|
+
*/
|
|
568
|
+
getControl?: (radarId: string, controlId: string) => Promise<any | null>;
|
|
569
|
+
/**
|
|
570
|
+
* Set a single control value.
|
|
571
|
+
* @param radarId The radar ID
|
|
572
|
+
* @param controlId The semantic control ID (e.g., "gain", "beamSharpening")
|
|
573
|
+
* @param value The value to set
|
|
574
|
+
* @returns Result with success flag and optional error
|
|
575
|
+
*/
|
|
576
|
+
setControl?: (radarId: string, controlId: string, value: any) => Promise<{
|
|
577
|
+
success: boolean;
|
|
578
|
+
error?: string;
|
|
579
|
+
}>;
|
|
580
|
+
/**
|
|
581
|
+
* Get all tracked ARPA targets.
|
|
582
|
+
* @param radarId The radar ID
|
|
583
|
+
* @returns Target list response or null if not supported
|
|
584
|
+
*/
|
|
585
|
+
getTargets?: (radarId: string) => Promise<TargetListResponse | null>;
|
|
586
|
+
/**
|
|
587
|
+
* Manually acquire a target at the specified position.
|
|
588
|
+
* @param radarId The radar ID
|
|
589
|
+
* @param bearing Bearing in degrees (0-360, true north)
|
|
590
|
+
* @param distance Distance in meters
|
|
591
|
+
* @returns Result with success flag and optional target ID
|
|
592
|
+
*/
|
|
593
|
+
acquireTarget?: (radarId: string, bearing: number, distance: number) => Promise<{
|
|
594
|
+
success: boolean;
|
|
595
|
+
targetId?: number;
|
|
596
|
+
error?: string;
|
|
597
|
+
}>;
|
|
598
|
+
/**
|
|
599
|
+
* Cancel tracking of a target.
|
|
600
|
+
* @param radarId The radar ID
|
|
601
|
+
* @param targetId The target ID to cancel
|
|
602
|
+
* @returns true on success
|
|
603
|
+
*/
|
|
604
|
+
cancelTarget?: (radarId: string, targetId: number) => Promise<boolean>;
|
|
605
|
+
/**
|
|
606
|
+
* Handle WebSocket target stream connection.
|
|
607
|
+
* Streams target updates in real-time.
|
|
608
|
+
* @param radarId The radar ID
|
|
609
|
+
* @param ws WebSocket connection to send target updates to
|
|
610
|
+
*/
|
|
611
|
+
handleTargetStreamConnection?: (radarId: string, ws: WebSocket) => void;
|
|
612
|
+
/**
|
|
613
|
+
* Get ARPA settings.
|
|
614
|
+
* @param radarId The radar ID
|
|
615
|
+
* @returns ARPA settings or null if not supported
|
|
616
|
+
*/
|
|
617
|
+
getArpaSettings?: (radarId: string) => Promise<ArpaSettings | null>;
|
|
618
|
+
/**
|
|
619
|
+
* Update ARPA settings.
|
|
620
|
+
* @param radarId The radar ID
|
|
621
|
+
* @param settings Partial settings to update
|
|
622
|
+
* @returns Result with success flag and optional error
|
|
623
|
+
*/
|
|
624
|
+
setArpaSettings?: (radarId: string, settings: Partial<ArpaSettings>) => Promise<{
|
|
625
|
+
success: boolean;
|
|
626
|
+
error?: string;
|
|
627
|
+
}>;
|
|
628
|
+
}
|
|
629
|
+
/**
|
|
630
|
+
* Radar API methods available on the server.
|
|
631
|
+
*
|
|
632
|
+
* @category Radar API
|
|
633
|
+
*/
|
|
634
|
+
export interface RadarApi {
|
|
635
|
+
/** Register a radar provider plugin */
|
|
636
|
+
register: (pluginId: string, provider: RadarProvider) => void;
|
|
637
|
+
/** Unregister a radar provider plugin */
|
|
638
|
+
unRegister: (pluginId: string) => void;
|
|
639
|
+
/** Get list of all radars from all providers */
|
|
640
|
+
getRadars: () => Promise<RadarInfo[]>;
|
|
641
|
+
/** Get info for a specific radar */
|
|
642
|
+
getRadarInfo: (radarId: string) => Promise<RadarInfo | null>;
|
|
643
|
+
}
|
|
644
|
+
/**
|
|
645
|
+
* Registry interface exposed to plugins via ServerAPI.
|
|
646
|
+
*
|
|
647
|
+
* @category Radar API
|
|
648
|
+
*/
|
|
649
|
+
export interface RadarProviderRegistry {
|
|
650
|
+
/**
|
|
651
|
+
* Register a radar provider plugin.
|
|
652
|
+
* See Radar Provider Plugins documentation for details.
|
|
653
|
+
*
|
|
654
|
+
* @category Radar API
|
|
655
|
+
*/
|
|
656
|
+
registerRadarProvider: (provider: RadarProvider) => void;
|
|
657
|
+
/**
|
|
658
|
+
* Access the Radar API to get radar info and manage radars.
|
|
659
|
+
*
|
|
660
|
+
* @category Radar API
|
|
661
|
+
*/
|
|
662
|
+
radarApi: RadarApi;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Interface for accessing the Radar API from plugins.
|
|
666
|
+
*
|
|
667
|
+
* This provides typed, in-process programmatic access to the Radar API,
|
|
668
|
+
* similar to {@link history!WithHistoryApi | WithHistoryApi} for the History API.
|
|
669
|
+
*
|
|
670
|
+
* @category Radar API
|
|
671
|
+
*
|
|
672
|
+
* @example
|
|
673
|
+
* ```javascript
|
|
674
|
+
* // Check if Radar API is available
|
|
675
|
+
* if (app.getRadarApi) {
|
|
676
|
+
* const radarApi = await app.getRadarApi();
|
|
677
|
+
* const radars = await radarApi.getRadars();
|
|
678
|
+
* app.debug(`Found ${radars.length} radars`);
|
|
679
|
+
* }
|
|
680
|
+
* ```
|
|
681
|
+
*/
|
|
682
|
+
export type WithRadarApi = {
|
|
683
|
+
/**
|
|
684
|
+
* Returns a promise for the active Radar API implementation, or rejects if unavailable.
|
|
685
|
+
* The property is optional to support older servers that do not have radar API support.
|
|
686
|
+
*
|
|
687
|
+
* @returns Promise that resolves to a {@link RadarApi} instance if available, or rejects with an error if not.
|
|
688
|
+
*/
|
|
689
|
+
getRadarApi?: () => Promise<RadarApi>;
|
|
690
|
+
};
|
|
691
|
+
/**
|
|
692
|
+
* List of registered radar providers (for /_providers endpoint)
|
|
693
|
+
*
|
|
694
|
+
* @hidden visible through API
|
|
695
|
+
* @category Radar API
|
|
696
|
+
*/
|
|
697
|
+
export interface RadarProviders {
|
|
698
|
+
[id: string]: {
|
|
699
|
+
name: string;
|
|
700
|
+
isDefault: boolean;
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
/**
|
|
704
|
+
* Type guard to validate a RadarProvider object.
|
|
705
|
+
*
|
|
706
|
+
* @category Radar API
|
|
707
|
+
*/
|
|
708
|
+
export declare const isRadarProvider: (obj: any) => obj is RadarProvider;
|
|
709
|
+
//# sourceMappingURL=radarapi.d.ts.map
|