Skip to content

Commit f094887

Browse files
committed
add action to set the antenna
1 parent 57ea758 commit f094887

4 files changed

Lines changed: 203 additions & 0 deletions

File tree

manifest.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,18 @@
175175
"PropertyInspectorPath": "pi/xit.html",
176176
"Controllers": ["Encoder", "Keypad"],
177177
"States": [{ "Title": "XIT" }]
178+
},
179+
{
180+
"Name": "Set Antenna",
181+
"UUID": "com.thecodingflow.hamlibplugin.setantenna",
182+
"Tooltip": "Select an antenna for a certain VFO",
183+
"Icon": "icons/radio_light",
184+
"DisableAutomaticStates": false,
185+
"VisibleInActionsList": true,
186+
"SupportedInMultiActions": true,
187+
"PropertyInspectorPath": "pi/antenna.html",
188+
"Controllers": ["Keypad"],
189+
"States": [{ "Title": "Ant" }]
178190
}
179191
],
180192
"OS": [{ "Platform": "linux" }],

pi/antenna.html

Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<script>
5+
let update = () => {};
6+
let vfoSetting = "";
7+
let antennaSetting = "";
8+
let optionSetting = "";
9+
10+
function connectOpenActionSocket(
11+
inPort,
12+
inPropertyInspectorUUID,
13+
inRegisterEvent,
14+
inInfo,
15+
inActionInfo,
16+
) {
17+
const websocket = new WebSocket("ws://localhost:" + inPort);
18+
inActionInfo = JSON.parse(inActionInfo);
19+
websocket.onopen = () => {
20+
websocket.send(
21+
JSON.stringify({
22+
event: inRegisterEvent,
23+
uuid: inPropertyInspectorUUID,
24+
}),
25+
);
26+
};
27+
28+
vfoSetting = inActionInfo.payload.settings.vfo ?? "";
29+
antennaSetting = inActionInfo.payload.settings.antenna ?? "";
30+
optionSetting = inActionInfo.payload.settings.option ?? "";
31+
32+
websocket.onmessage = (event) => {
33+
const data = JSON.parse(event.data);
34+
if (data.event == "didReceiveSettings") {
35+
vfoSetting = data.payload.settings.vfo ?? "";
36+
antennaSetting = data.payload.settings.antenna ?? "";
37+
optionSetting = data.payload.settings.option ?? "";
38+
}
39+
if (data.event == "sendToPropertyInspector") {
40+
// TODO: receive available vfos from the plugin
41+
}
42+
};
43+
44+
const vfoElement = document.getElementById("vfo");
45+
vfoElement.value = inActionInfo.payload.settings.vfo ?? "";
46+
47+
const antennaElement = document.getElementById("antenna");
48+
antennaElement.value = inActionInfo.payload.settings.antenna ?? "";
49+
50+
const optionElement = document.getElementById("option");
51+
optionElement.value = inActionInfo.payload.settings.option ?? "";
52+
53+
update = () => {
54+
websocket.send(
55+
JSON.stringify({
56+
event: "setSettings",
57+
context: inActionInfo.context,
58+
payload: {
59+
vfo: vfoElement.value || "",
60+
antenna: antennaElement.value || "",
61+
option: optionElement.value || "",
62+
},
63+
}),
64+
);
65+
};
66+
}
67+
68+
const connectElgatoStreamDeckSocket = connectOpenActionSocket;
69+
</script>
70+
71+
<style>
72+
* {
73+
font-family: system-ui, sans-serif;
74+
font-size: 16px;
75+
color: oklch(92.2% 0 0);
76+
}
77+
body {
78+
margin: 16px;
79+
background-color: oklch(26.9% 0 0);
80+
}
81+
label {
82+
margin-right: 4px;
83+
}
84+
input {
85+
margin: 4px;
86+
padding: 4px;
87+
background-color: oklch(37.1% 0 0);
88+
border: 1px solid oklch(43.9% 0 0);
89+
border-radius: 8px;
90+
}
91+
</style>
92+
</head>
93+
94+
<body>
95+
<div>
96+
<label for="vfo">VFO:</label>
97+
<!-- should be a combo box with all VFOs -->
98+
<input id="vfo" oninput="update()" type="text" />
99+
<br />
100+
<label for="antenna">Antenna:</label>
101+
<input id="antenna" oninput="update()" type="text" />
102+
<br />
103+
<label for="option">Option:</label>
104+
<input id="option" oninput="update()" type="text" />
105+
</div>
106+
</body>
107+
</html>

pkg/action/action.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ type RigClient interface {
4949
SetXIT(hl.VFO, hl.Frequency) error
5050
GetPowerStatus() (hl.PowerStatus, error)
5151
SetPowerStatus(hl.PowerStatus) error
52+
SetAntenna(hl.VFO, int, int) error
5253
}
5354

5455
type Deck interface {

pkg/action/antenna.go

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package action
2+
3+
import (
4+
"log"
5+
"strconv"
6+
7+
sdk "github.com/SkYNewZ/streamdeck-sdk"
8+
"github.com/ftl/hl-go"
9+
)
10+
11+
const (
12+
SetAntennaUUID = "com.thecodingflow.hamlibplugin.setantenna"
13+
)
14+
15+
func init() {
16+
Factories[SetAntennaUUID] = NewSetAntenna
17+
}
18+
19+
type SetAntenna struct {
20+
basicAction
21+
}
22+
23+
func NewSetAntenna(context string, client RigClient, deck Deck) Action {
24+
return &SetAntenna{
25+
basicAction: basicAction{
26+
context: context,
27+
client: client,
28+
deck: deck,
29+
},
30+
}
31+
}
32+
33+
func (a *SetAntenna) parseSettings(settings map[string]any) (hl.VFO, int, int) {
34+
vfo, ok := settings["vfo"].(string)
35+
if !ok {
36+
vfo = ""
37+
}
38+
antennaString, ok := settings["antenna"].(string)
39+
if !ok {
40+
antennaString = "0"
41+
}
42+
antenna, err := strconv.Atoi(antennaString)
43+
if err != nil {
44+
antenna = 0
45+
}
46+
optionString, ok := settings["option"].(string)
47+
if !ok {
48+
optionString = "0"
49+
}
50+
option, err := strconv.Atoi(optionString)
51+
if err != nil {
52+
option = 0
53+
}
54+
return hl.VFO(vfo), antenna, option
55+
}
56+
57+
func (a *SetAntenna) DidReceiveSettings(payload *sdk.ReceivedEventPayload) error {
58+
a.UpdateVisual(payload)
59+
return nil
60+
}
61+
62+
func (a *SetAntenna) UpdateVisual(payload *sdk.ReceivedEventPayload) error {
63+
_, antenna, _ := a.parseSettings(payload.Settings)
64+
title := "Ant"
65+
if antenna > 0 {
66+
title = "Ant " + strconv.Itoa(antenna)
67+
}
68+
a.deck.SetTitle(a.context, title, sdk.HardwareAndSoftware)
69+
return nil
70+
}
71+
72+
func (a *SetAntenna) KeyDown(payload *sdk.ReceivedEventPayload) error {
73+
vfo, antenna, option := a.parseSettings(payload.Settings)
74+
if vfo == "" || antenna == 0 {
75+
return nil
76+
}
77+
78+
err := a.client.SetAntenna(vfo, antenna, option)
79+
if err != nil {
80+
log.Printf("[ERROR] set antenna %d: %v", antenna, err)
81+
}
82+
return nil
83+
}

0 commit comments

Comments
 (0)