forked from microsoft/devicescript
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgenhwsupport.mjs
More file actions
113 lines (101 loc) · 3.08 KB
/
Copy pathgenhwsupport.mjs
File metadata and controls
113 lines (101 loc) · 3.08 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
113
#!/usr/bin/env zx
import "zx/globals"
function fail(msg) {
console.error(`Error: ${msg}`)
process.exit(1)
}
const drivers = `runtime/jacdac-c/drivers/`
const driversURL = `https://github.com/microsoft/jacdac-c/blob/main/drivers`
const servicesURL = `/api/clients`
const serversURL = `/api/drivers`
const srvNames = {
"accelerometers": "accelerometer",
"pressure": "airpressure",
"gyro": "gyroscope",
"co2": "eco2",
"captouch": "capacitivebutton"
}
function strcmp(a, b) {
if (a == b) return 0
if (a < b) return -1
else return 1
}
function collectI2C() {
const sensors = {}
const fn = `${drivers}/i2c_scan.c`
let stype = ""
for (let line of fs.readFileSync(fn, "utf-8").split(/\n/)) {
let m = /^const (\w+)_api_t \*i2c_(\w+)/.exec(line)
if (m) {
stype = m[2]
continue
}
if (line.startsWith("}")) stype = ""
if (!stype) continue
line = line.trim()
if (line == "NULL" || line == "NULL,") continue
m = /^\&(\w+)_(\w+),?\s*(\/\/ (.*))?/.exec(line)
if (!m) echo(`bad line: ${line}`)
const id = m[2]
let comm = m[4] ?? ""
let s = sensors[id]
if (!s) {
s = sensors[id] = {
id,
services: [],
}
}
if (!s.name || s.name.length > comm.length) s.name = comm
s.services.push(stype)
if (!fs.existsSync(drivers + "/" + id + ".c"))
echo(`file missing: ${id}.c`)
}
const ids = Object.keys(sensors)
ids.sort((a, b) => strcmp(sensors[a].name, sensors[b].name))
let r = `
| ID | Sensor | Services | Source |
|:---|:-------|:---------|:-------|
`
for (const id of ids) {
const s = sensors[id]
const serv = s.services.map(srv => srvNames[srv] || srv).map(srv => `[${srv}](/api/clients/${srv})`).join(", ")
r += `| **${id}** | ${s.name} | ${serv} | [${id}.c](${driversURL}/${id}.c) |\n`
}
return r
}
function collectAnalog() {
const fn = `runtime/jacdac-c/dcfg/srvcfg.d.ts`
let analog = ""
let servers = ""
let hid = ""
for (let line of fs.readFileSync(fn, "utf-8").split(/\n/)) {
let m = /interface (\w+)Config extends AnalogConfig/.exec(line)
if (m) {
const serv = m[1]
analog += `- [${serv}](${serversURL}/${serv.toLowerCase()})\n`
}
m = /interface (\w+)Config extends BaseServiceConfig/.exec(line)
if (m) {
const serv = m[1]
if (serv.startsWith("Hid")) {
hid += `- [HID ${serv.slice(3)}](/api/drivers/${serv.toLowerCase()})\n`
} else if (serv != "Analog") {
servers += `- [${serv}](${serversURL}/${serv.toLowerCase()})\n`
}
}
}
return {
HID: hid,
SERVERS: servers,
ANALOG: analog,
}
}
const sections = {
...collectAnalog(),
I2C: collectI2C(),
}
Object.keys(sections).map(id => {
const fn = `website/docs/devices/${id.toLowerCase()}.mdp`
fs
.writeFileSync(fn, sections[id]?.trim(), "utf-8")
})