-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathwinlink.uc
More file actions
executable file
·112 lines (99 loc) · 3.27 KB
/
winlink.uc
File metadata and controls
executable file
·112 lines (99 loc) · 3.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import * as node from "node";
const WINLINK_FORMS_DIR = "winlink/forms";
const menuitems = [];
const forms = {};
let seqnum = 1;
export function formpost(id)
{
let data = platform.loadbinary(`${WINLINK_FORMS_DIR}/${forms[id]?.post}`);
if (!data) {
return null;
}
const me = node.getInfo();
const loc = node.getLocation(true);
data = replace(data, /<head>/, `<head><base href="about:srcdoc">`);
data = replace(data, /\{(var )?MsgSender\}/ig, `${me.callsign ?? ""}`);
data = replace(data, /\{(var )?SeqNum\}/ig, `${seqnum++}`);
data = replace(data, /\{(var )?Latitude\}/ig, `${loc.lat}`);
data = replace(data, /\{(var )?Longitude\}/ig, `${loc.lon}`);
data = replace(data, /\{(var )?GridSquare\}/ig, `${me.gridsquare ?? ""}`);
if (loc.source === 2) {
data = replace(data, /\{(var )?Location_Source\}/ig, "GPS");
data = replace(data, /\{(var )?GPS_SIGNED_DECIMAL\}/ig, `${loc.lat} ${loc.lon}`);
}
else {
data = replace(data, /\{(var )?Location_Source\}/ig, "SPECIFIED");
data = replace(data, /\{(var )?GPS_SIGNED_DECIMAL\}/ig, "(Not available)");
}
return data;
};
export function formshow(id, formdata)
{
let data = platform.loadbinary(`${WINLINK_FORMS_DIR}/${forms[id]?.view}`);
if (!data) {
return null;
}
data = replace(data, /<head>/, `<head><base href='about:srcdoc'>`);
for (let key in formdata)
{
data = replace(data, regexp(`\\{var ${key}\\}`, "ig"), formdata[key]);
}
data = replace(data, /\{var [^}]+\}/ig, "");
return data;
};
export function post(id, formdata)
{
const keys = forms[id]?.keys;
if (!keys) {
return;
}
const lformdata = {};
for (let key in formdata) {
lformdata[lc(key)] = formdata[key];
}
const nformdata = {};
for (let i = 0; i < length(keys); i++) {
const key = keys[i];
if (lformdata[key] !== null && lformdata[key] !== "") {
nformdata[key] = lformdata[key];
}
}
return { id: id, data: nformdata };
};
export function menu()
{
return menuitems;
};
export function setup(config)
{
const dirs = platform.dirtree(WINLINK_FORMS_DIR);
for (let dir in dirs) {
const contents = dirs[dir];
if (contents) {
const items = [];
for (let file in contents) {
if (substr(file, -4) === ".txt") {
const txt = platform.loadbinary(`${WINLINK_FORMS_DIR}/${dir}/${file}`);
if (txt) {
const formdata = match(split(txt, "\n", 2)[0], /^Form:([^,]+),(.+)$/);
if (formdata) {
const keys = map(match(txt, /<var ([^>]+)>/g), k => lc(k[1]));
const root = substr(file, 0, -4);
forms[`${dir}/${root}`] = { post: `${dir}/${trim(formdata[1])}`, view: `${dir}/${trim(formdata[2])}`, keys: keys };
push(items, root);
}
}
}
}
sort(items);
push(menuitems, [ dir, items ]);
}
}
sort(menuitems, (a, b) => a[0] > b[0] ? -1 : a[0] < b[0] ? 1 : 0);
};
export function tick()
{
};
export function process(msg)
{
};