Repository navigation
Expand file tree
/
Copy pathhardware-types.js
More file actions
97 lines (88 loc) · 3.02 KB
/
Copy pathhardware-types.js
File metadata and controls
97 lines (88 loc) · 3.02 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
const HW_TYPES = {
byId: {
0: { label: 'default', fileName: 'default' },
1: { label: 'rhinoedge', fileName: 'rhinoedge_nrf52840' },
2: { label: 'elephantedge', fileName: 'elephantedge_nrf52840' },
3: { label: 'wisentedge', fileName: 'wisentedge_nrf52840' },
4: { label: 'cattracker', fileName: 'cattracker_nrf52840' },
5: { label: 'rangeredge', fileName: 'rangeredge_nrf52840' },
6: { label: 'rhinopuck', fileName: 'rhinopuck_nrf52840' },
7: { label: 'rhinopuck35', fileName: 'rhinopuck35_nrf52840' },
8: { label: 'collaredge', fileName: 'collaredge_nrf52840' },
9: { label: 'freeedge', fileName: 'freeedge_nrf52840' },
},
};
const HW_DFU_MANIFEST_URL = 'assets/dfu/manifest.json';
let cachedManifest = null;
let cachedHwVersionsByType = null;
function normalizeHwTypeName(name) {
if (name === 'rangeredge_airq_nrf52840') {
return 'rangeredge_nrf52840';
}
return name;
}
function getHwTypeLabel(hwType) {
if (Number.isFinite(hwType) && HW_TYPES.byId[hwType]) {
return HW_TYPES.byId[hwType].label;
}
return 'unknown';
}
function getHwTypeFileName(hwType) {
if (Number.isFinite(hwType) && HW_TYPES.byId[hwType]) {
return HW_TYPES.byId[hwType].fileName;
}
return undefined;
}
async function loadDfuManifest() {
if (cachedManifest) {
return cachedManifest;
}
const response = await fetch(HW_DFU_MANIFEST_URL);
if (!response.ok) {
throw new Error(`Manifest fetch failed: ${response.status}`);
}
cachedManifest = await response.json();
return cachedManifest;
}
function buildHwVersionsByType(manifest) {
const map = new Map();
const releases = Array.isArray(manifest?.releases) ? manifest.releases : [];
releases.forEach((release) => {
const files = Array.isArray(release?.files) ? release.files : [];
files.forEach((file) => {
if (!file?.hwType || !file?.hwVersion) {
return;
}
const normalizedHwType = normalizeHwTypeName(file.hwType);
if (!map.has(normalizedHwType)) {
map.set(normalizedHwType, new Set());
}
map.get(normalizedHwType).add(file.hwVersion);
});
});
return map;
}
async function getValidHwVersionsByType() {
if (cachedHwVersionsByType) {
return cachedHwVersionsByType;
}
const manifest = await loadDfuManifest();
cachedHwVersionsByType = buildHwVersionsByType(manifest);
return cachedHwVersionsByType;
}
async function getValidHwVersionsForHwType(hwTypeOrName) {
const hwTypeName = Number.isFinite(hwTypeOrName) ? getHwTypeFileName(hwTypeOrName) : hwTypeOrName;
if (!hwTypeName) {
return [];
}
const map = await getValidHwVersionsByType();
const versions = Array.from(map.get(hwTypeName) || []);
versions.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }));
return versions;
}
window.HW_TYPES = HW_TYPES;
window.getHwTypeLabel = getHwTypeLabel;
window.getHwTypeFileName = getHwTypeFileName;
window.loadDfuManifest = loadDfuManifest;
window.getValidHwVersionsByType = getValidHwVersionsByType;
window.getValidHwVersionsForHwType = getValidHwVersionsForHwType;