create-mikrojs 0.8.0 → 0.9.0
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/scaffold.d.ts.map +1 -1
- package/dist/scaffold.js +38 -0
- package/dist/scaffold.js.map +1 -1
- package/dist/scaffold.test.js +2 -2
- package/dist/scaffold.test.js.map +1 -1
- package/dist/templates/_common/tsconfig.d.ts.map +1 -1
- package/dist/templates/_common/tsconfig.js +2 -23
- package/dist/templates/_common/tsconfig.js.map +1 -1
- package/dist/templates/udp-discovery/mikro.config.d.ts +7 -0
- package/dist/templates/udp-discovery/mikro.config.d.ts.map +1 -0
- package/dist/templates/udp-discovery/mikro.config.js +7 -0
- package/dist/templates/udp-discovery/mikro.config.js.map +1 -0
- package/package.json +2 -2
- package/src/templates/_common/tsconfig.ts +2 -23
- package/src/templates/ble-beacon/app/main.ts +56 -0
- package/src/templates/ble-gatt/app/main.ts +101 -0
- package/src/templates/schema/app/main.ts +54 -0
- package/src/templates/uart/app/main.ts +34 -0
- package/src/templates/udp-discovery/app/main.ts +54 -0
- package/src/templates/udp-discovery/env.d.ts +4 -0
- package/src/templates/udp-discovery/mikro.config.ts +7 -0
package/dist/scaffold.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAgB9D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,YAAY,
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAGA,OAAO,EAAe,KAAK,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAgB9D,UAAU,YAAY;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,2EAA2E;IAC3E,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC5B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,YAAY,EA4HnC,CAAA;AAEV,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,MAAM,CAAA;IACnB,cAAc,EAAE,MAAM,CAAA;IACtB,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,eAAe,QA6DhD"}
|
package/dist/scaffold.js
CHANGED
|
@@ -87,6 +87,44 @@ For long strips (>8 LEDs), power the strip from an external 5V supply, not the b
|
|
|
87
87
|
description: 'Count wake-ups from deep sleep using RTC memory. The counter survives deep sleep but resets on power loss.',
|
|
88
88
|
hardware: 'Any ESP32 board.',
|
|
89
89
|
},
|
|
90
|
+
{
|
|
91
|
+
name: 'schema',
|
|
92
|
+
description: 'Define and validate runtime data shapes with `mikrojs/schema`, including tagged unions.',
|
|
93
|
+
hardware: 'Any ESP32 board.',
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
name: 'uart',
|
|
97
|
+
description: 'Send and receive bytes over UART using a loopback wire.',
|
|
98
|
+
hardware: 'Any ESP32 board with at least two free GPIO pins.\n\nChange `TX_PIN` and `RX_PIN` in `app/main.ts` to match your board.',
|
|
99
|
+
wiring: `\`\`\`
|
|
100
|
+
ESP32C6
|
|
101
|
+
┌──────┐
|
|
102
|
+
│ GPIO ├──┐
|
|
103
|
+
│ 16 │ │ jumper wire
|
|
104
|
+
│ GPIO ├──┘
|
|
105
|
+
│ 17 │
|
|
106
|
+
└──────┘
|
|
107
|
+
\`\`\`
|
|
108
|
+
|
|
109
|
+
Connect GPIO 16 (RX) to GPIO 17 (TX) with a jumper wire so the example can read back its own writes.`,
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: 'udp-discovery',
|
|
113
|
+
description: 'Devices on the same LAN find each other via UDP multicast announcements every couple of seconds.',
|
|
114
|
+
hardware: 'Any ESP32 board with WiFi + a WiFi network.',
|
|
115
|
+
wifiSetup: true,
|
|
116
|
+
envVars: ['WIFI_SSID', 'WIFI_PASSPHRASE'],
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'ble-beacon',
|
|
120
|
+
description: 'Broadcast a sensor reading in BLE advertising packets. No connections; just transmit.',
|
|
121
|
+
hardware: 'Any ESP32 family board with BLE (ESP32-C3, ESP32-C6, ESP32-S3, original ESP32). ESP32-S2 has no BLE radio.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
name: 'ble-gatt',
|
|
125
|
+
description: 'Connectable GATT peripheral with live notifications and a writable command characteristic.',
|
|
126
|
+
hardware: 'Any ESP32 family board with BLE (ESP32-C3, ESP32-C6, ESP32-S3, original ESP32). ESP32-S2 has no BLE radio.',
|
|
127
|
+
},
|
|
90
128
|
];
|
|
91
129
|
export function scaffold(options) {
|
|
92
130
|
const { targetDir, template, projectName, mikrojsVersion, templatesDir, pkgManager } = options;
|
package/dist/scaffold.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
|
package/dist/scaffold.test.js
CHANGED
|
@@ -81,9 +81,9 @@ describe.each(TEMPLATES)('template: $name', ({ name }) => {
|
|
|
81
81
|
expect(pkg.scripts.flash).toBeUndefined();
|
|
82
82
|
expect(pkg.engines).toBeUndefined();
|
|
83
83
|
});
|
|
84
|
-
it('creates tsconfig.json
|
|
84
|
+
it('creates tsconfig.json extending the mikrojs base config', () => {
|
|
85
85
|
const tsconfig = JSON.parse(readFileSync(path.join(targetDir, 'tsconfig.json'), 'utf-8'));
|
|
86
|
-
expect(tsconfig.
|
|
86
|
+
expect(tsconfig.extends).toBe('mikrojs/tsconfig');
|
|
87
87
|
expect(tsconfig.include).toContain('app/**/*');
|
|
88
88
|
expect(tsconfig.include).toContain('mikro.config.ts');
|
|
89
89
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../src/scaffold.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"scaffold.test.js","sourceRoot":"","sources":["../src/scaffold.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../../../src/templates/_common/tsconfig.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,aAAa,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"tsconfig.d.ts","sourceRoot":"","sources":["../../../src/templates/_common/tsconfig.ts"],"names":[],"mappings":"AAAA,wBAAgB,YAAY,CAAC,aAAa,GAAE,SAAS,MAAM,EAAO,GAAG,MAAM,CAO1E"}
|
|
@@ -1,29 +1,8 @@
|
|
|
1
1
|
export function tsconfigJson(extraIncludes = []) {
|
|
2
2
|
const includes = [...extraIncludes, 'mikro.config.ts', 'app/**/*'];
|
|
3
3
|
return `{
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"module": "nodenext",
|
|
7
|
-
"target": "es2024",
|
|
8
|
-
"lib": ${inlineStringArray(['es2024'])},
|
|
9
|
-
"noEmit": true,
|
|
10
|
-
"types": ${inlineStringArray(['mikrojs/runtime'])},
|
|
11
|
-
"sourceMap": true,
|
|
12
|
-
"noUncheckedIndexedAccess": true,
|
|
13
|
-
"allowUnreachableCode": false,
|
|
14
|
-
"erasableSyntaxOnly": true,
|
|
15
|
-
"strict": true,
|
|
16
|
-
"verbatimModuleSyntax": true,
|
|
17
|
-
"isolatedModules": true,
|
|
18
|
-
"noUncheckedSideEffectImports": true,
|
|
19
|
-
"moduleDetection": "force",
|
|
20
|
-
"jsx": "preserve",
|
|
21
|
-
"skipLibCheck": true,
|
|
22
|
-
"noFallthroughCasesInSwitch": true,
|
|
23
|
-
"noUnusedLocals": true,
|
|
24
|
-
"forceConsistentCasingInFileNames": true,
|
|
25
|
-
"resolveJsonModule": true
|
|
26
|
-
}
|
|
4
|
+
"extends": "mikrojs/tsconfig",
|
|
5
|
+
"include": ${inlineStringArray(includes)}
|
|
27
6
|
}
|
|
28
7
|
`;
|
|
29
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig.js","sourceRoot":"","sources":["../../../src/templates/_common/tsconfig.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,gBAAmC,EAAE;IAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAA;IAClE,OAAO
|
|
1
|
+
{"version":3,"file":"tsconfig.js","sourceRoot":"","sources":["../../../src/templates/_common/tsconfig.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,gBAAmC,EAAE;IAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,aAAa,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAA;IAClE,OAAO;;eAEM,iBAAiB,CAAC,QAAQ,CAAC;;CAEzC,CAAA;AACD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAwB;IACjD,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAA;AAC9D,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mikro.config.d.ts","sourceRoot":"","sources":["../../../src/templates/udp-discovery/mikro.config.ts"],"names":[],"mappings":";;;;;AAGA,wBAGG"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { defineConfig } from "mikrojs";
|
|
2
|
+
// Project configuration. See https://mikrojs.dev/config for all options.
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
// Set to your country code so WiFi uses the correct regulatory domain.
|
|
5
|
+
wifi: { country: "NO" },
|
|
6
|
+
});
|
|
7
|
+
//# sourceMappingURL=mikro.config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mikro.config.js","sourceRoot":"","sources":["../../../src/templates/udp-discovery/mikro.config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,yEAAyE;AACzE,eAAe,YAAY,CAAC;IAC1B,uEAAuE;IACvE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;CACxB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-mikrojs",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Create a new Mikro.js project",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"esp32",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"prettier": "^3.4.0",
|
|
46
46
|
"typescript": "^6.0.3",
|
|
47
47
|
"typescript-eslint": "^8.59.0",
|
|
48
|
-
"@mikrojs/eslint-plugin": "0.
|
|
48
|
+
"@mikrojs/eslint-plugin": "0.9.0"
|
|
49
49
|
},
|
|
50
50
|
"engines": {
|
|
51
51
|
"node": ">=24.0.0"
|
|
@@ -1,29 +1,8 @@
|
|
|
1
1
|
export function tsconfigJson(extraIncludes: readonly string[] = []): string {
|
|
2
2
|
const includes = [...extraIncludes, 'mikro.config.ts', 'app/**/*']
|
|
3
3
|
return `{
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"module": "nodenext",
|
|
7
|
-
"target": "es2024",
|
|
8
|
-
"lib": ${inlineStringArray(['es2024'])},
|
|
9
|
-
"noEmit": true,
|
|
10
|
-
"types": ${inlineStringArray(['mikrojs/runtime'])},
|
|
11
|
-
"sourceMap": true,
|
|
12
|
-
"noUncheckedIndexedAccess": true,
|
|
13
|
-
"allowUnreachableCode": false,
|
|
14
|
-
"erasableSyntaxOnly": true,
|
|
15
|
-
"strict": true,
|
|
16
|
-
"verbatimModuleSyntax": true,
|
|
17
|
-
"isolatedModules": true,
|
|
18
|
-
"noUncheckedSideEffectImports": true,
|
|
19
|
-
"moduleDetection": "force",
|
|
20
|
-
"jsx": "preserve",
|
|
21
|
-
"skipLibCheck": true,
|
|
22
|
-
"noFallthroughCasesInSwitch": true,
|
|
23
|
-
"noUnusedLocals": true,
|
|
24
|
-
"forceConsistentCasingInFileNames": true,
|
|
25
|
-
"resolveJsonModule": true
|
|
26
|
-
}
|
|
4
|
+
"extends": "mikrojs/tsconfig",
|
|
5
|
+
"include": ${inlineStringArray(includes)}
|
|
27
6
|
}
|
|
28
7
|
`
|
|
29
8
|
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { ble, peripheral } from "mikrojs/ble";
|
|
2
|
+
import { sleep } from "mikrojs/sleep";
|
|
3
|
+
|
|
4
|
+
// Set a friendly name. If omitted, the runtime uses "mikrojs-<MAC suffix>".
|
|
5
|
+
ble.name = "mikrojs-beacon";
|
|
6
|
+
|
|
7
|
+
// Encode a fake temperature reading as manufacturer-specific data.
|
|
8
|
+
// First two bytes are the company ID (0xFFFF = "no company", reserved for testing).
|
|
9
|
+
// Remaining bytes are a little-endian int16 in units of 0.01°C.
|
|
10
|
+
function encodeTemperature(tempCelsius: number): Uint8Array {
|
|
11
|
+
const centi = Math.round(tempCelsius * 100);
|
|
12
|
+
return new Uint8Array([
|
|
13
|
+
0xff,
|
|
14
|
+
0xff, // company ID (little-endian): 0xFFFF
|
|
15
|
+
centi & 0xff, // low byte
|
|
16
|
+
(centi >> 8) & 0xff, // high byte
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async function startAdvertising(tempCelsius: number) {
|
|
21
|
+
return peripheral.advertise({
|
|
22
|
+
name: "mikrojs-beacon",
|
|
23
|
+
connectable: false,
|
|
24
|
+
interval: { min: 1000, max: 1500 },
|
|
25
|
+
includeTxPower: true,
|
|
26
|
+
manufacturerData: encodeTemperature(tempCelsius),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let temp = 21.5;
|
|
31
|
+
let result = await startAdvertising(temp);
|
|
32
|
+
|
|
33
|
+
if (!result.ok) {
|
|
34
|
+
console.error("ble.advertise failed: %s", result.error.name);
|
|
35
|
+
} else {
|
|
36
|
+
console.log("BLE beacon advertising as %s at %s", ble.name, ble.address);
|
|
37
|
+
|
|
38
|
+
while (true) {
|
|
39
|
+
await sleep(5000);
|
|
40
|
+
// Drift the reading slightly so a watcher can see it change.
|
|
41
|
+
temp += (Math.random() - 0.5) * 0.2;
|
|
42
|
+
|
|
43
|
+
// Broadcaster mode does not support updating the manufacturer-data
|
|
44
|
+
// payload in place, so stop and restart the advertisement to publish
|
|
45
|
+
// the new value.
|
|
46
|
+
const stopResult = result.value.stop();
|
|
47
|
+
if (!stopResult.ok) {
|
|
48
|
+
console.warn("ble.stop (refresh) failed: %s", stopResult.error.name);
|
|
49
|
+
}
|
|
50
|
+
result = await startAdvertising(temp);
|
|
51
|
+
if (!result.ok) {
|
|
52
|
+
console.error("ble.advertise (refresh) failed: %s", result.error.name);
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { ble, peripheral } from "mikrojs/ble";
|
|
2
|
+
import { sleep } from "mikrojs/sleep";
|
|
3
|
+
|
|
4
|
+
// Set a friendly name. If omitted, the runtime uses "mikrojs-<MAC suffix>".
|
|
5
|
+
ble.name = "mikrojs-hello";
|
|
6
|
+
|
|
7
|
+
// Peripheral lifecycle listeners. These fire on the JS loop thread as
|
|
8
|
+
// centrals connect, renegotiate MTU, or disconnect. Register before
|
|
9
|
+
// advertise so no event is missed.
|
|
10
|
+
peripheral.onConnect.subscribe((info) => {
|
|
11
|
+
console.log("connected: %s mtu: %d", info.address, info.mtu);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
peripheral.onDisconnect.subscribe(async (info) => {
|
|
15
|
+
console.log("disconnected: %s mtu: %d", info.address, info.mtu);
|
|
16
|
+
// NimBLE stops advertising on connect. Re-advertise so the device stays
|
|
17
|
+
// discoverable once the peer goes away.
|
|
18
|
+
const r = await peripheral.advertise({
|
|
19
|
+
name: "mikrojs-hello",
|
|
20
|
+
connectable: true,
|
|
21
|
+
interval: { min: 100, max: 150 },
|
|
22
|
+
includeTxPower: true,
|
|
23
|
+
services: currentServices,
|
|
24
|
+
});
|
|
25
|
+
if (!r.ok) console.error("re-advertise failed: %s", r.error.name);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
peripheral.onMtu.subscribe((info) => {
|
|
29
|
+
console.log("mtu renegotiated on %d new mtu: %d", info.id, info.mtu);
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
// Characteristic declarations. The command characteristic has an onWrite
|
|
33
|
+
// handler that runs asynchronously after a central writes to it. The
|
|
34
|
+
// write is already acknowledged at the GATT layer by the time this runs.
|
|
35
|
+
const currentServices = [
|
|
36
|
+
{
|
|
37
|
+
uuid: "180f", // Battery Service
|
|
38
|
+
characteristics: [
|
|
39
|
+
{
|
|
40
|
+
uuid: "2a19", // Battery Level
|
|
41
|
+
properties: ["read", "notify"] as const,
|
|
42
|
+
value: new Uint8Array([87]),
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
// Custom vendor service. Replace the UUID for real projects.
|
|
48
|
+
uuid: "7f3a1b00-4a2f-4e5b-9a3c-1e2d3f4a5b6c",
|
|
49
|
+
characteristics: [
|
|
50
|
+
{
|
|
51
|
+
// Read-only info string.
|
|
52
|
+
uuid: "7f3a1b01-4a2f-4e5b-9a3c-1e2d3f4a5b6c",
|
|
53
|
+
properties: ["read"] as const,
|
|
54
|
+
value: new TextEncoder().encode("mikrojs v0: hello from BLE"),
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
// Writable command characteristic. The onWrite handler logs the
|
|
58
|
+
// received bytes whenever a central writes to it.
|
|
59
|
+
uuid: "7f3a1b02-4a2f-4e5b-9a3c-1e2d3f4a5b6c",
|
|
60
|
+
properties: ["read", "write", "writeWithoutResponse"] as const,
|
|
61
|
+
value: new Uint8Array([0]),
|
|
62
|
+
onWrite: (bytes: Uint8Array) => {
|
|
63
|
+
const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join(" ");
|
|
64
|
+
console.log("command write: %d bytes: %s", bytes.length, hex);
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
const result = await peripheral.advertise({
|
|
72
|
+
name: "mikrojs-hello",
|
|
73
|
+
connectable: true,
|
|
74
|
+
interval: { min: 100, max: 150 },
|
|
75
|
+
includeTxPower: true,
|
|
76
|
+
services: currentServices,
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
if (!result.ok) {
|
|
80
|
+
console.error("ble.advertise failed: %s", result.error.name);
|
|
81
|
+
} else {
|
|
82
|
+
console.log("BLE GATT peripheral advertising as %s", ble.name);
|
|
83
|
+
console.log("address: %s", ble.address);
|
|
84
|
+
console.log("open nRF Connect (or LightBlue) and connect to discover the services.");
|
|
85
|
+
|
|
86
|
+
// Fake a battery draining from 87% down to 0% and wrapping back to 100%.
|
|
87
|
+
// handle.notify both updates the cached value AND pushes the new bytes
|
|
88
|
+
// to every subscriber that enabled notifications via the CCCD. If no
|
|
89
|
+
// one is subscribed, it is a silent no-op. The value still updates, so
|
|
90
|
+
// connecting later and reading Battery Level returns the current level.
|
|
91
|
+
let level = 87;
|
|
92
|
+
while (true) {
|
|
93
|
+
await sleep(2000);
|
|
94
|
+
level = level > 0 ? level - 1 : 100;
|
|
95
|
+
const update = result.value.notify("180f", "2a19", new Uint8Array([level]));
|
|
96
|
+
if (!update.ok) {
|
|
97
|
+
console.error("notify failed: %s", update.error.name);
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as s from "mikrojs/schema";
|
|
2
|
+
|
|
3
|
+
// Define a schema for sensor readings
|
|
4
|
+
const SensorReading = s.object({
|
|
5
|
+
temperature: s.number(),
|
|
6
|
+
humidity: s.number(),
|
|
7
|
+
label: s.optional(s.string()),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
// Define a schema for device commands using tagged unions
|
|
11
|
+
const Command = s.taggedUnion("type", {
|
|
12
|
+
setInterval: s.object({ ms: s.number() }),
|
|
13
|
+
calibrate: s.object({ offset: s.number() }),
|
|
14
|
+
reset: s.object({}),
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
// ── Validate a sensor reading ───────────────────────────────────────
|
|
18
|
+
|
|
19
|
+
const goodReading: unknown = { temperature: 22.5, humidity: 45.2, label: "living-room" };
|
|
20
|
+
const badReading: unknown = { temperature: "warm", humidity: 45.2 };
|
|
21
|
+
|
|
22
|
+
const result1 = s.parse(SensorReading, goodReading);
|
|
23
|
+
if (result1.ok) {
|
|
24
|
+
console.log(`Temperature: ${result1.value.temperature}`);
|
|
25
|
+
console.log(`Humidity: ${result1.value.humidity}`);
|
|
26
|
+
console.log(`Label: ${result1.value.label ?? "(none)"}`);
|
|
27
|
+
} else {
|
|
28
|
+
console.error(`Invalid reading: ${result1.error.message} at ${result1.error.path}`);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const result2 = s.parse(SensorReading, badReading);
|
|
32
|
+
if (result2.ok) {
|
|
33
|
+
console.log("This should not happen");
|
|
34
|
+
} else {
|
|
35
|
+
console.error(`Caught bad reading: ${result2.error.message} at path "${result2.error.path}"`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// ── Validate a tagged union ─────────────────────────────────────────
|
|
39
|
+
|
|
40
|
+
const commands: unknown[] = [
|
|
41
|
+
{ type: "setInterval", ms: 5000 },
|
|
42
|
+
{ type: "calibrate", offset: -1.2 },
|
|
43
|
+
{ type: "reset" },
|
|
44
|
+
{ type: "explode" },
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
for (const cmd of commands) {
|
|
48
|
+
const result = s.parse(Command, cmd);
|
|
49
|
+
if (result.ok) {
|
|
50
|
+
console.log(`Valid command: ${result.value.type}`);
|
|
51
|
+
} else {
|
|
52
|
+
console.error(`Invalid command: ${result.error.message} at path "${result.error.path}"`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { sleep } from "mikrojs/sleep";
|
|
2
|
+
import { Uart } from "mikrojs/uart";
|
|
3
|
+
|
|
4
|
+
// UART loopback example for ESP32C6: connect TX (GPIO 17) to RX (GPIO 16) with a jumper wire.
|
|
5
|
+
// Change TX_PIN / RX_PIN to match your board.
|
|
6
|
+
const TX_PIN = 16;
|
|
7
|
+
const RX_PIN = 17;
|
|
8
|
+
|
|
9
|
+
await sleep(2000);
|
|
10
|
+
const uart = new Uart(1, { tx: TX_PIN, rx: RX_PIN, baudRate: 115200 });
|
|
11
|
+
|
|
12
|
+
uart.begin().orPanic("Failed to start UART");
|
|
13
|
+
|
|
14
|
+
const message = new TextEncoder().encode("Hello from UART!\n");
|
|
15
|
+
uart.write(message).orPanic("Failed to write");
|
|
16
|
+
|
|
17
|
+
const reader = uart.read();
|
|
18
|
+
|
|
19
|
+
if (!reader.ok) {
|
|
20
|
+
console.error("Failed to start reading: %s", reader.error.name);
|
|
21
|
+
} else {
|
|
22
|
+
// Give data a moment to loop back
|
|
23
|
+
await sleep(1000);
|
|
24
|
+
for await (const chunk of reader.value) {
|
|
25
|
+
if (!chunk.ok) {
|
|
26
|
+
console.error("UART read error: %s", chunk.error.name);
|
|
27
|
+
break;
|
|
28
|
+
}
|
|
29
|
+
console.log("Received: %s", new TextDecoder().decode(chunk.value));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
uart.end().orPanic("Failed to stop UART");
|
|
34
|
+
console.log("Done!");
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { env } from "mikrojs/env";
|
|
2
|
+
import { sleep } from "mikrojs/sleep";
|
|
3
|
+
import { deviceId } from "mikrojs/sys";
|
|
4
|
+
import { bind } from "mikrojs/udp";
|
|
5
|
+
import { wifi } from "mikrojs/wifi";
|
|
6
|
+
|
|
7
|
+
// IPv4 site-local discovery group. 224.0.0.251 is the mDNS group, which
|
|
8
|
+
// home routers almost always forward (Bonjour/AirPlay/Chromecast use it).
|
|
9
|
+
// Note: real mDNS is on port 5353; we use a different port to avoid
|
|
10
|
+
// colliding with system mDNS responders.
|
|
11
|
+
const GROUP = "224.0.0.251";
|
|
12
|
+
const PORT = 7654;
|
|
13
|
+
const ANNOUNCE_MS = 2000;
|
|
14
|
+
|
|
15
|
+
const ssid = env.require("WIFI_SSID");
|
|
16
|
+
const passphrase = env.require("WIFI_PASSPHRASE");
|
|
17
|
+
|
|
18
|
+
console.log("Connecting to %s...", ssid);
|
|
19
|
+
const connected = await wifi.connect(ssid, passphrase);
|
|
20
|
+
if (!connected.ok) {
|
|
21
|
+
console.error("WiFi connect failed: %s", connected.error.name);
|
|
22
|
+
} else {
|
|
23
|
+
console.log("Connected. IP: %s", connected.value.ip);
|
|
24
|
+
|
|
25
|
+
const bound = await bind({ port: PORT, family: "ipv4" });
|
|
26
|
+
if (!bound.ok) {
|
|
27
|
+
console.error("bind failed: %s", bound.error.name);
|
|
28
|
+
} else {
|
|
29
|
+
const sock = bound.value;
|
|
30
|
+
|
|
31
|
+
const joined = sock.joinMulticastGroup({ address: GROUP });
|
|
32
|
+
if (!joined.ok) {
|
|
33
|
+
console.error("join failed: %s", joined.error.name);
|
|
34
|
+
sock.close();
|
|
35
|
+
} else {
|
|
36
|
+
const me = deviceId;
|
|
37
|
+
|
|
38
|
+
sock.onMessage.subscribe(({ msg, from }) => {
|
|
39
|
+
const text = new TextDecoder().decode(msg);
|
|
40
|
+
// Multicast loops back to ourselves on the same host; skip.
|
|
41
|
+
if (text === me) return;
|
|
42
|
+
console.log("discovered %s at %s", text, from.address);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
console.log("announcing as %s on %s:%d", me, GROUP, PORT);
|
|
46
|
+
|
|
47
|
+
while (true) {
|
|
48
|
+
const sent = await sock.send(me, { address: GROUP, port: PORT, family: "ipv4" });
|
|
49
|
+
if (!sent.ok) console.error("send failed: %s", sent.error.name);
|
|
50
|
+
await sleep(ANNOUNCE_MS);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|