@leonardojc/capacitor-ioboard 1.2.7 → 2.0.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/README.md +257 -209
- package/android/build.gradle +0 -1
- package/android/src/main/java/com/leonardojc/capacitor/ioboard/CapacitorIoboardPlugin.java +926 -381
- package/android/src/main/java/com/leonardojc/capacitor/ioboard/CapacitorIoboardPlugin.java.backup +777 -0
- package/android/src/main/java/com/leonardojc/capacitor/ioboard/SerialConnectionManager.java +446 -0
- package/dist/esm/definitions-v2.d.ts +228 -0
- package/dist/esm/definitions-v2.js +11 -0
- package/dist/esm/definitions.d.ts +28 -0
- package/dist/esm/index-v2.d.ts +266 -0
- package/dist/esm/index-v2.js +295 -0
- package/dist/esm/web.d.ts +13 -16
- package/dist/esm/web.js +51 -135
- package/dist/plugin.cjs.js +50 -134
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/plugin.js +50 -134
- package/dist/plugin.js.map +1 -1
- package/package.json +3 -4
package/dist/esm/web.js
CHANGED
|
@@ -1,167 +1,83 @@
|
|
|
1
|
-
import { WebPlugin } from
|
|
1
|
+
import { WebPlugin } from "@capacitor/core";
|
|
2
2
|
export class CapacitorIoboardWeb extends WebPlugin {
|
|
3
3
|
constructor() {
|
|
4
|
-
super(
|
|
5
|
-
|
|
4
|
+
super();
|
|
5
|
+
console.log("IOBoard Web Plugin v2.0 initialized");
|
|
6
6
|
}
|
|
7
7
|
async connect(options) {
|
|
8
|
-
console.log(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
this.isConnectedState = true;
|
|
12
|
-
return {
|
|
13
|
-
success: true,
|
|
14
|
-
message: `Connected to ${options.portPath || '/dev/ttyS2'} (web mock)`
|
|
15
|
-
};
|
|
8
|
+
console.log("Web: Connecting to IOBoard...", options);
|
|
9
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
10
|
+
return { success: true, message: `Connected to IOBoard at ${options.portPath}` };
|
|
16
11
|
}
|
|
17
12
|
async disconnect() {
|
|
18
|
-
console.log(
|
|
19
|
-
|
|
20
|
-
return {
|
|
21
|
-
success: true,
|
|
22
|
-
message: 'Disconnected successfully (web mock)'
|
|
23
|
-
};
|
|
13
|
+
console.log("Web: Disconnecting from IOBoard...");
|
|
14
|
+
return { success: true, message: "Disconnected from IOBoard" };
|
|
24
15
|
}
|
|
25
16
|
async isConnected() {
|
|
26
|
-
return { connected:
|
|
17
|
+
return { connected: false, portPath: null };
|
|
18
|
+
}
|
|
19
|
+
async listPorts() {
|
|
20
|
+
console.log("Web: Listing available ports...");
|
|
21
|
+
const ports = ["/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyUSB0", "COM1", "COM2", "COM3"];
|
|
22
|
+
return { success: true, ports };
|
|
27
23
|
}
|
|
28
24
|
async getStatus(options) {
|
|
29
|
-
console.log(
|
|
30
|
-
|
|
31
|
-
return {
|
|
32
|
-
success: false,
|
|
33
|
-
message: 'No serial connection established'
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
// Mock response
|
|
25
|
+
console.log("Web: Getting device status...", options);
|
|
26
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
37
27
|
return {
|
|
38
28
|
success: true,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
29
|
+
status: {
|
|
30
|
+
address: options.address,
|
|
31
|
+
connected: true,
|
|
32
|
+
firmwareVersion: "2.1.0",
|
|
33
|
+
palletStates: Array(8).fill(false),
|
|
34
|
+
temperature: 25.5,
|
|
35
|
+
voltage: 12.0,
|
|
36
|
+
uptime: 86400
|
|
47
37
|
}
|
|
48
38
|
};
|
|
49
39
|
}
|
|
50
40
|
async unlockPallet(options) {
|
|
51
|
-
console.log(
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
success: false,
|
|
55
|
-
message: 'No serial connection established'
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
// Validate pallet number
|
|
59
|
-
if (options.palletNumber < 0 || options.palletNumber > 7) {
|
|
60
|
-
return {
|
|
61
|
-
success: false,
|
|
62
|
-
message: 'Invalid pallet number. Must be 0-7'
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
// Mock response
|
|
41
|
+
console.log("Web: Unlocking pallet...", options);
|
|
42
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
66
43
|
return {
|
|
67
44
|
success: true,
|
|
68
|
-
message: `Pallet ${options.palletNumber} unlocked
|
|
69
|
-
data: {
|
|
70
|
-
address: options.address,
|
|
71
|
-
palletNumber: options.palletNumber,
|
|
72
|
-
ledColor: options.ledColor || 'green'
|
|
73
|
-
}
|
|
45
|
+
message: `Pallet ${options.palletNumber} unlocked with RGB(${options.red}, ${options.green}, ${options.blue})`
|
|
74
46
|
};
|
|
75
47
|
}
|
|
76
48
|
async controlMultiplePallets(options) {
|
|
77
|
-
console.log(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
success: false,
|
|
81
|
-
message: 'No serial connection established'
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
// Mock response
|
|
49
|
+
console.log("Web: Controlling multiple pallets...", options);
|
|
50
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
51
|
+
const { address, color, intensity, blinkTimes, blinkSpeed, pallets } = options;
|
|
85
52
|
return {
|
|
86
53
|
success: true,
|
|
87
|
-
message:
|
|
88
|
-
|
|
89
|
-
address
|
|
90
|
-
|
|
91
|
-
|
|
54
|
+
message: `Controlled ${pallets.length} pallets with ${color} color at ${intensity}% intensity`,
|
|
55
|
+
details: {
|
|
56
|
+
address,
|
|
57
|
+
color,
|
|
58
|
+
intensity,
|
|
59
|
+
blinkTimes,
|
|
60
|
+
blinkSpeed,
|
|
61
|
+
palletsControlled: pallets
|
|
92
62
|
}
|
|
93
63
|
};
|
|
94
64
|
}
|
|
95
|
-
async
|
|
96
|
-
console.log(
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
success: false,
|
|
100
|
-
message: 'No serial connection established'
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
// Mock scan results
|
|
104
|
-
const devices = [];
|
|
105
|
-
const start = options.startAddress || 1;
|
|
106
|
-
const end = Math.min(options.endAddress || 63, start + 5); // Mock max 5 devices
|
|
107
|
-
for (let addr = start; addr <= end; addr++) {
|
|
108
|
-
devices.push({
|
|
109
|
-
address: addr,
|
|
110
|
-
responding: Math.random() > 0.7,
|
|
111
|
-
status: Math.random() > 0.7 ? { doorLockStatus: Math.floor(Math.random() * 256) } : undefined
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
success: true,
|
|
116
|
-
message: `Scanned addresses ${start}-${end} (web mock)`,
|
|
117
|
-
devices
|
|
118
|
-
};
|
|
65
|
+
async controlMultiple(options) {
|
|
66
|
+
console.log("Web: Controlling multiple LEDs...", options);
|
|
67
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
68
|
+
return { success: true, message: `Controlled ${options.leds.length} LEDs successfully` };
|
|
119
69
|
}
|
|
120
|
-
async
|
|
121
|
-
console.log(
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
success: false,
|
|
125
|
-
message: 'No serial connection established'
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
// Mock response
|
|
129
|
-
return {
|
|
130
|
-
success: true,
|
|
131
|
-
message: 'OTA notification sent successfully (web mock)',
|
|
132
|
-
data: {
|
|
133
|
-
address: options.address,
|
|
134
|
-
version: `${options.majorVersion}.${options.minorVersion}.${options.patchVersion}`,
|
|
135
|
-
firmwareSize: options.firmwareSize
|
|
136
|
-
}
|
|
137
|
-
};
|
|
70
|
+
async startOTAUpdate(options) {
|
|
71
|
+
console.log("Web: Starting OTA update...", options);
|
|
72
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
73
|
+
return { success: true, message: `OTA update started for ${options.fileName} (${options.fileSize} bytes)` };
|
|
138
74
|
}
|
|
139
75
|
async sendOTAData(options) {
|
|
140
|
-
console.log(
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
message: 'No serial connection established'
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
// Mock response
|
|
148
|
-
return {
|
|
149
|
-
success: true,
|
|
150
|
-
message: `OTA data packet ${options.packetNumber} sent successfully (web mock)`,
|
|
151
|
-
data: {
|
|
152
|
-
address: options.address,
|
|
153
|
-
packetNumber: options.packetNumber,
|
|
154
|
-
dataLength: options.data.length
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
getMaskBits(mask) {
|
|
159
|
-
const bits = [];
|
|
160
|
-
for (let i = 0; i < 8; i++) {
|
|
161
|
-
if (mask & (1 << i)) {
|
|
162
|
-
bits.push(i);
|
|
163
|
-
}
|
|
76
|
+
console.log("Web: Sending OTA data packet...", options.packetNumber);
|
|
77
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
78
|
+
if (Math.random() < 0.05) {
|
|
79
|
+
return { success: false, error: `Packet ${options.packetNumber} transmission failed` };
|
|
164
80
|
}
|
|
165
|
-
return
|
|
81
|
+
return { success: true, message: `OTA packet ${options.packetNumber} sent successfully` };
|
|
166
82
|
}
|
|
167
83
|
}
|
package/dist/plugin.cjs.js
CHANGED
|
@@ -246,168 +246,84 @@ const CapacitorIoboard = core.registerPlugin('CapacitorIoboard', {
|
|
|
246
246
|
|
|
247
247
|
class CapacitorIoboardWeb extends core.WebPlugin {
|
|
248
248
|
constructor() {
|
|
249
|
-
super(
|
|
250
|
-
|
|
249
|
+
super();
|
|
250
|
+
console.log("IOBoard Web Plugin v2.0 initialized");
|
|
251
251
|
}
|
|
252
252
|
async connect(options) {
|
|
253
|
-
console.log(
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
this.isConnectedState = true;
|
|
257
|
-
return {
|
|
258
|
-
success: true,
|
|
259
|
-
message: `Connected to ${options.portPath || '/dev/ttyS2'} (web mock)`
|
|
260
|
-
};
|
|
253
|
+
console.log("Web: Connecting to IOBoard...", options);
|
|
254
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
255
|
+
return { success: true, message: `Connected to IOBoard at ${options.portPath}` };
|
|
261
256
|
}
|
|
262
257
|
async disconnect() {
|
|
263
|
-
console.log(
|
|
264
|
-
|
|
265
|
-
return {
|
|
266
|
-
success: true,
|
|
267
|
-
message: 'Disconnected successfully (web mock)'
|
|
268
|
-
};
|
|
258
|
+
console.log("Web: Disconnecting from IOBoard...");
|
|
259
|
+
return { success: true, message: "Disconnected from IOBoard" };
|
|
269
260
|
}
|
|
270
261
|
async isConnected() {
|
|
271
|
-
return { connected:
|
|
262
|
+
return { connected: false, portPath: null };
|
|
263
|
+
}
|
|
264
|
+
async listPorts() {
|
|
265
|
+
console.log("Web: Listing available ports...");
|
|
266
|
+
const ports = ["/dev/ttyS0", "/dev/ttyS1", "/dev/ttyS2", "/dev/ttyUSB0", "COM1", "COM2", "COM3"];
|
|
267
|
+
return { success: true, ports };
|
|
272
268
|
}
|
|
273
269
|
async getStatus(options) {
|
|
274
|
-
console.log(
|
|
275
|
-
|
|
276
|
-
return {
|
|
277
|
-
success: false,
|
|
278
|
-
message: 'No serial connection established'
|
|
279
|
-
};
|
|
280
|
-
}
|
|
281
|
-
// Mock response
|
|
270
|
+
console.log("Web: Getting device status...", options);
|
|
271
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
282
272
|
return {
|
|
283
273
|
success: true,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
274
|
+
status: {
|
|
275
|
+
address: options.address,
|
|
276
|
+
connected: true,
|
|
277
|
+
firmwareVersion: "2.1.0",
|
|
278
|
+
palletStates: Array(8).fill(false),
|
|
279
|
+
temperature: 25.5,
|
|
280
|
+
voltage: 12.0,
|
|
281
|
+
uptime: 86400
|
|
292
282
|
}
|
|
293
283
|
};
|
|
294
284
|
}
|
|
295
285
|
async unlockPallet(options) {
|
|
296
|
-
console.log(
|
|
297
|
-
|
|
298
|
-
return {
|
|
299
|
-
success: false,
|
|
300
|
-
message: 'No serial connection established'
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
// Validate pallet number
|
|
304
|
-
if (options.palletNumber < 0 || options.palletNumber > 7) {
|
|
305
|
-
return {
|
|
306
|
-
success: false,
|
|
307
|
-
message: 'Invalid pallet number. Must be 0-7'
|
|
308
|
-
};
|
|
309
|
-
}
|
|
310
|
-
// Mock response
|
|
286
|
+
console.log("Web: Unlocking pallet...", options);
|
|
287
|
+
await new Promise(resolve => setTimeout(resolve, 200));
|
|
311
288
|
return {
|
|
312
289
|
success: true,
|
|
313
|
-
message: `Pallet ${options.palletNumber} unlocked
|
|
314
|
-
data: {
|
|
315
|
-
address: options.address,
|
|
316
|
-
palletNumber: options.palletNumber,
|
|
317
|
-
ledColor: options.ledColor || 'green'
|
|
318
|
-
}
|
|
290
|
+
message: `Pallet ${options.palletNumber} unlocked with RGB(${options.red}, ${options.green}, ${options.blue})`
|
|
319
291
|
};
|
|
320
292
|
}
|
|
321
293
|
async controlMultiplePallets(options) {
|
|
322
|
-
console.log(
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
success: false,
|
|
326
|
-
message: 'No serial connection established'
|
|
327
|
-
};
|
|
328
|
-
}
|
|
329
|
-
// Mock response
|
|
294
|
+
console.log("Web: Controlling multiple pallets...", options);
|
|
295
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
296
|
+
const { address, color, intensity, blinkTimes, blinkSpeed, pallets } = options;
|
|
330
297
|
return {
|
|
331
298
|
success: true,
|
|
332
|
-
message:
|
|
333
|
-
|
|
334
|
-
address
|
|
335
|
-
|
|
336
|
-
|
|
299
|
+
message: `Controlled ${pallets.length} pallets with ${color} color at ${intensity}% intensity`,
|
|
300
|
+
details: {
|
|
301
|
+
address,
|
|
302
|
+
color,
|
|
303
|
+
intensity,
|
|
304
|
+
blinkTimes,
|
|
305
|
+
blinkSpeed,
|
|
306
|
+
palletsControlled: pallets
|
|
337
307
|
}
|
|
338
308
|
};
|
|
339
309
|
}
|
|
340
|
-
async
|
|
341
|
-
console.log(
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
success: false,
|
|
345
|
-
message: 'No serial connection established'
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
// Mock scan results
|
|
349
|
-
const devices = [];
|
|
350
|
-
const start = options.startAddress || 1;
|
|
351
|
-
const end = Math.min(options.endAddress || 63, start + 5); // Mock max 5 devices
|
|
352
|
-
for (let addr = start; addr <= end; addr++) {
|
|
353
|
-
devices.push({
|
|
354
|
-
address: addr,
|
|
355
|
-
responding: Math.random() > 0.7,
|
|
356
|
-
status: Math.random() > 0.7 ? { doorLockStatus: Math.floor(Math.random() * 256) } : undefined
|
|
357
|
-
});
|
|
358
|
-
}
|
|
359
|
-
return {
|
|
360
|
-
success: true,
|
|
361
|
-
message: `Scanned addresses ${start}-${end} (web mock)`,
|
|
362
|
-
devices
|
|
363
|
-
};
|
|
310
|
+
async controlMultiple(options) {
|
|
311
|
+
console.log("Web: Controlling multiple LEDs...", options);
|
|
312
|
+
await new Promise(resolve => setTimeout(resolve, 300));
|
|
313
|
+
return { success: true, message: `Controlled ${options.leds.length} LEDs successfully` };
|
|
364
314
|
}
|
|
365
|
-
async
|
|
366
|
-
console.log(
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
success: false,
|
|
370
|
-
message: 'No serial connection established'
|
|
371
|
-
};
|
|
372
|
-
}
|
|
373
|
-
// Mock response
|
|
374
|
-
return {
|
|
375
|
-
success: true,
|
|
376
|
-
message: 'OTA notification sent successfully (web mock)',
|
|
377
|
-
data: {
|
|
378
|
-
address: options.address,
|
|
379
|
-
version: `${options.majorVersion}.${options.minorVersion}.${options.patchVersion}`,
|
|
380
|
-
firmwareSize: options.firmwareSize
|
|
381
|
-
}
|
|
382
|
-
};
|
|
315
|
+
async startOTAUpdate(options) {
|
|
316
|
+
console.log("Web: Starting OTA update...", options);
|
|
317
|
+
await new Promise(resolve => setTimeout(resolve, 500));
|
|
318
|
+
return { success: true, message: `OTA update started for ${options.fileName} (${options.fileSize} bytes)` };
|
|
383
319
|
}
|
|
384
320
|
async sendOTAData(options) {
|
|
385
|
-
console.log(
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
message: 'No serial connection established'
|
|
390
|
-
};
|
|
391
|
-
}
|
|
392
|
-
// Mock response
|
|
393
|
-
return {
|
|
394
|
-
success: true,
|
|
395
|
-
message: `OTA data packet ${options.packetNumber} sent successfully (web mock)`,
|
|
396
|
-
data: {
|
|
397
|
-
address: options.address,
|
|
398
|
-
packetNumber: options.packetNumber,
|
|
399
|
-
dataLength: options.data.length
|
|
400
|
-
}
|
|
401
|
-
};
|
|
402
|
-
}
|
|
403
|
-
getMaskBits(mask) {
|
|
404
|
-
const bits = [];
|
|
405
|
-
for (let i = 0; i < 8; i++) {
|
|
406
|
-
if (mask & (1 << i)) {
|
|
407
|
-
bits.push(i);
|
|
408
|
-
}
|
|
321
|
+
console.log("Web: Sending OTA data packet...", options.packetNumber);
|
|
322
|
+
await new Promise(resolve => setTimeout(resolve, 50));
|
|
323
|
+
if (Math.random() < 0.05) {
|
|
324
|
+
return { success: false, error: `Packet ${options.packetNumber} transmission failed` };
|
|
409
325
|
}
|
|
410
|
-
return
|
|
326
|
+
return { success: true, message: `OTA packet ${options.packetNumber} sent successfully` };
|
|
411
327
|
}
|
|
412
328
|
}
|
|
413
329
|
|
package/dist/plugin.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.cjs.js","sources":["esm/definitions.js","esm/protocol.js","esm/index.js","esm/web.js"],"sourcesContent":["// Protocol Constants\nexport const IOBOARD_PROTOCOL = {\n SOI: 0x0D,\n EOI: 0x0A,\n FRAME_TYPES: {\n STATUS_QUERY: 0x00,\n SINGLE_PALLET: 0x01,\n FULL_PALLET: 0x02,\n OTA_REQUEST: 0xF1,\n OTA_DATA: 0xF2,\n OTA_RESPONSE: 0xF3\n },\n DEFAULT_BAUD_RATE: 115200,\n DEFAULT_DATA_BITS: 8,\n DEFAULT_STOP_BITS: 1,\n DEFAULT_PARITY: 'none',\n DEFAULT_TIMEOUT: 5000,\n // Address range\n MIN_ADDRESS: 1,\n MAX_ADDRESS: 63,\n // Pallet range\n MIN_PALLET: 0,\n MAX_PALLET: 7,\n // OTA Constants\n OTA_PACKET_SIZE: 128,\n // Response codes\n OTA_RESPONSES: {\n AREA_REQUEST: 0x26,\n REQUEST_A_ZONE: 0x41,\n REQUEST_B_ZONE: 0x42,\n DATA_REQUEST: 0x23,\n COMPLETION: 0x4F,\n ERROR: 0x45, // 'E'\n },\n // Error codes\n OTA_ERROR_CODES: {\n ILLEGAL_VERSION: 9,\n NON_OTA_STATUS: 8,\n WRITE_FAILED: 7,\n VERIFICATION_FAILED: 6,\n TRANSFER_FAILED: 5\n }\n};\n","/**\n * IOBOARD Protocol utilities for frame construction and parsing\n */\nexport class IOBoardProtocol {\n /**\n * Calculate CRC-16 CCITT checksum\n */\n static calculateCRC16(data) {\n let crc = 0xFFFF;\n for (const byte of data) {\n crc ^= (byte << 8);\n for (let bit = 0; bit < 8; bit++) {\n if (crc & 0x8000) {\n crc = (crc << 1) ^ 0x1021;\n }\n else {\n crc = crc << 1;\n }\n crc &= 0xFFFF;\n }\n }\n return crc;\n }\n /**\n * Build a command frame for IOBOARD\n */\n static buildFrame(address, frameType, data) {\n const frame = [];\n // SOI\n frame.push(0x0D);\n // Address\n frame.push(address);\n // Frame Type\n frame.push(frameType);\n // Data\n frame.push(...data);\n // Calculate CRC for address + frameType + data\n const crcData = [address, frameType, ...data];\n const crc = this.calculateCRC16(crcData);\n // CRC (high byte first)\n frame.push((crc >> 8) & 0xFF);\n frame.push(crc & 0xFF);\n // EOI\n frame.push(0x0A);\n return frame;\n }\n /**\n * Parse a response frame from IOBOARD\n */\n static parseFrame(frame) {\n if (frame.length < 6) {\n return { success: false, error: 'Frame too short' };\n }\n // Check SOI and EOI\n if (frame[0] !== 0x0D || frame[frame.length - 1] !== 0x0A) {\n return { success: false, error: 'Invalid frame markers' };\n }\n const address = frame[1];\n const frameType = frame[2];\n const dataLength = frame.length - 6; // SOI + Address + FrameType + CRC(2) + EOI\n const data = frame.slice(3, 3 + dataLength);\n // Extract CRC from frame\n const receivedCRC = (frame[frame.length - 3] << 8) | frame[frame.length - 2];\n // Calculate expected CRC\n const crcData = [address, frameType, ...data];\n const expectedCRC = this.calculateCRC16(crcData);\n if (receivedCRC !== expectedCRC) {\n return {\n success: false,\n error: `CRC mismatch: expected ${expectedCRC.toString(16)}, got ${receivedCRC.toString(16)}`\n };\n }\n return {\n success: true,\n address,\n frameType,\n data\n };\n }\n /**\n * Build status query frame\n */\n static buildStatusQuery(address) {\n return this.buildFrame(address, 0x00, []);\n }\n /**\n * Build single pallet control frame\n */\n static buildSinglePalletControl(address, palletNumber, doorLock, ledControl) {\n const data = [];\n // Pallet number\n data.push(palletNumber);\n // Door lock control (1 = unlock, 0 = no action)\n data.push(doorLock ? 1 : 0);\n // LED control (6 bytes)\n data.push(ledControl.red);\n data.push(ledControl.green);\n data.push(ledControl.blue);\n data.push(ledControl.intensity);\n data.push(ledControl.blinkTimes);\n data.push(ledControl.blinkSpeed);\n return this.buildFrame(address, 0x01, data);\n }\n /**\n * Build full pallet control frame\n */\n static buildFullPalletControl(address, doorLockControl, extendedControl, ledControls) {\n const data = [];\n // Door lock control (8-bit mask)\n data.push(doorLockControl);\n // Extended control\n data.push(extendedControl);\n // LED controls for 8 pallets (48 bytes total)\n for (let i = 0; i < 8; i++) {\n const led = ledControls[i] || {\n red: 0, green: 0, blue: 0,\n intensity: 0, blinkTimes: 0, blinkSpeed: 0\n };\n data.push(led.red);\n data.push(led.green);\n data.push(led.blue);\n data.push(led.intensity);\n data.push(led.blinkTimes);\n data.push(led.blinkSpeed);\n }\n return this.buildFrame(address, 0x02, data);\n }\n /**\n * Build OTA notification frame\n */\n static buildOTANotification(address, majorVersion, minorVersion, patchVersion, firmwareSize) {\n const data = [];\n // Version (3 bytes)\n data.push(majorVersion);\n data.push(minorVersion);\n data.push(patchVersion);\n // Firmware size (4 bytes, little-endian)\n data.push(firmwareSize & 0xFF);\n data.push((firmwareSize >> 8) & 0xFF);\n data.push((firmwareSize >> 16) & 0xFF);\n data.push((firmwareSize >> 24) & 0xFF);\n return this.buildFrame(address, 0xF1, data);\n }\n /**\n * Build OTA data frame\n */\n static buildOTAData(address, packetNumber, data) {\n const frameData = [];\n // Packet number (4 bytes, little-endian)\n frameData.push(packetNumber & 0xFF);\n frameData.push((packetNumber >> 8) & 0xFF);\n frameData.push((packetNumber >> 16) & 0xFF);\n frameData.push((packetNumber >> 24) & 0xFF);\n // Data bytes (up to 128 bytes)\n for (let i = 0; i < data.length; i++) {\n frameData.push(data[i]);\n }\n return this.buildFrame(address, 0xF2, frameData);\n }\n /**\n * Parse status response\n */\n static parseStatusResponse(data) {\n if (data.length < 4) {\n return null;\n }\n return {\n doorLockStatus: data[0],\n softwareVersion: {\n major: data[1],\n minor: data[2],\n patch: data[3]\n }\n };\n }\n /**\n * Convert frame to hex string for debugging\n */\n static frameToHex(frame) {\n return frame.map(b => b.toString(16).padStart(2, '0')).join(' ').toUpperCase();\n }\n /**\n * Convert hex string to frame\n */\n static hexToFrame(hex) {\n return hex.split(' ')\n .map(h => h.trim())\n .filter(h => h.length > 0)\n .map(h => parseInt(h, 16));\n }\n}\n","import { registerPlugin } from '@capacitor/core';\nconst CapacitorIoboard = registerPlugin('CapacitorIoboard', {\n web: () => import('./web').then(m => new m.CapacitorIoboardWeb()),\n});\nexport * from './definitions';\nexport * from './protocol';\nexport { CapacitorIoboard };\n","import { WebPlugin } from '@capacitor/core';\nexport class CapacitorIoboardWeb extends WebPlugin {\n constructor() {\n super(...arguments);\n this.isConnectedState = false;\n }\n async connect(options) {\n console.log('IOBOARD Web: Connect', options);\n // Simulate connection delay\n await new Promise(resolve => setTimeout(resolve, 500));\n this.isConnectedState = true;\n return {\n success: true,\n message: `Connected to ${options.portPath || '/dev/ttyS2'} (web mock)`\n };\n }\n async disconnect() {\n console.log('IOBOARD Web: Disconnect');\n this.isConnectedState = false;\n return {\n success: true,\n message: 'Disconnected successfully (web mock)'\n };\n }\n async isConnected() {\n return { connected: this.isConnectedState };\n }\n async getStatus(options) {\n console.log('IOBOARD Web: Get Status', options);\n if (!this.isConnectedState) {\n return {\n success: false,\n message: 'No serial connection established'\n };\n }\n // Mock response\n return {\n success: true,\n message: 'Status retrieved successfully (web mock)',\n data: {\n doorLockStatus: 0b11010001,\n softwareVersion: {\n major: 1,\n minor: 2,\n patch: 3\n }\n }\n };\n }\n async unlockPallet(options) {\n console.log('IOBOARD Web: Unlock Pallet', options);\n if (!this.isConnectedState) {\n return {\n success: false,\n message: 'No serial connection established'\n };\n }\n // Validate pallet number\n if (options.palletNumber < 0 || options.palletNumber > 7) {\n return {\n success: false,\n message: 'Invalid pallet number. Must be 0-7'\n };\n }\n // Mock response\n return {\n success: true,\n message: `Pallet ${options.palletNumber} unlocked successfully (web mock)`,\n data: {\n address: options.address,\n palletNumber: options.palletNumber,\n ledColor: options.ledColor || 'green'\n }\n };\n }\n async controlMultiplePallets(options) {\n console.log('IOBOARD Web: Control Multiple Pallets', options);\n if (!this.isConnectedState) {\n return {\n success: false,\n message: 'No serial connection established'\n };\n }\n // Mock response\n return {\n success: true,\n message: 'Multiple pallets controlled successfully (web mock)',\n data: {\n address: options.address,\n doorLockMask: options.doorLockMask,\n affectedPallets: this.getMaskBits(options.doorLockMask)\n }\n };\n }\n async scanDevices(options) {\n console.log('IOBOARD Web: Scan Devices', options);\n if (!this.isConnectedState) {\n return {\n success: false,\n message: 'No serial connection established'\n };\n }\n // Mock scan results\n const devices = [];\n const start = options.startAddress || 1;\n const end = Math.min(options.endAddress || 63, start + 5); // Mock max 5 devices\n for (let addr = start; addr <= end; addr++) {\n devices.push({\n address: addr,\n responding: Math.random() > 0.7,\n status: Math.random() > 0.7 ? { doorLockStatus: Math.floor(Math.random() * 256) } : undefined\n });\n }\n return {\n success: true,\n message: `Scanned addresses ${start}-${end} (web mock)`,\n devices\n };\n }\n async sendOTANotification(options) {\n console.log('IOBOARD Web: Send OTA Notification', options);\n if (!this.isConnectedState) {\n return {\n success: false,\n message: 'No serial connection established'\n };\n }\n // Mock response\n return {\n success: true,\n message: 'OTA notification sent successfully (web mock)',\n data: {\n address: options.address,\n version: `${options.majorVersion}.${options.minorVersion}.${options.patchVersion}`,\n firmwareSize: options.firmwareSize\n }\n };\n }\n async sendOTAData(options) {\n console.log('IOBOARD Web: Send OTA Data', options);\n if (!this.isConnectedState) {\n return {\n success: false,\n message: 'No serial connection established'\n };\n }\n // Mock response\n return {\n success: true,\n message: `OTA data packet ${options.packetNumber} sent successfully (web mock)`,\n data: {\n address: options.address,\n packetNumber: options.packetNumber,\n dataLength: options.data.length\n }\n };\n }\n getMaskBits(mask) {\n const bits = [];\n for (let i = 0; i < 8; i++) {\n if (mask & (1 << i)) {\n bits.push(i);\n }\n }\n return bits;\n }\n}\n"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"plugin.cjs.js","sources":["esm/definitions.js","esm/protocol.js","esm/index.js","esm/web.js"],"sourcesContent":["// Protocol Constants\nexport const IOBOARD_PROTOCOL = {\n SOI: 0x0D,\n EOI: 0x0A,\n FRAME_TYPES: {\n STATUS_QUERY: 0x00,\n SINGLE_PALLET: 0x01,\n FULL_PALLET: 0x02,\n OTA_REQUEST: 0xF1,\n OTA_DATA: 0xF2,\n OTA_RESPONSE: 0xF3\n },\n DEFAULT_BAUD_RATE: 115200,\n DEFAULT_DATA_BITS: 8,\n DEFAULT_STOP_BITS: 1,\n DEFAULT_PARITY: 'none',\n DEFAULT_TIMEOUT: 5000,\n // Address range\n MIN_ADDRESS: 1,\n MAX_ADDRESS: 63,\n // Pallet range\n MIN_PALLET: 0,\n MAX_PALLET: 7,\n // OTA Constants\n OTA_PACKET_SIZE: 128,\n // Response codes\n OTA_RESPONSES: {\n AREA_REQUEST: 0x26,\n REQUEST_A_ZONE: 0x41,\n REQUEST_B_ZONE: 0x42,\n DATA_REQUEST: 0x23,\n COMPLETION: 0x4F,\n ERROR: 0x45, // 'E'\n },\n // Error codes\n OTA_ERROR_CODES: {\n ILLEGAL_VERSION: 9,\n NON_OTA_STATUS: 8,\n WRITE_FAILED: 7,\n VERIFICATION_FAILED: 6,\n TRANSFER_FAILED: 5\n }\n};\n","/**\n * IOBOARD Protocol utilities for frame construction and parsing\n */\nexport class IOBoardProtocol {\n /**\n * Calculate CRC-16 CCITT checksum\n */\n static calculateCRC16(data) {\n let crc = 0xFFFF;\n for (const byte of data) {\n crc ^= (byte << 8);\n for (let bit = 0; bit < 8; bit++) {\n if (crc & 0x8000) {\n crc = (crc << 1) ^ 0x1021;\n }\n else {\n crc = crc << 1;\n }\n crc &= 0xFFFF;\n }\n }\n return crc;\n }\n /**\n * Build a command frame for IOBOARD\n */\n static buildFrame(address, frameType, data) {\n const frame = [];\n // SOI\n frame.push(0x0D);\n // Address\n frame.push(address);\n // Frame Type\n frame.push(frameType);\n // Data\n frame.push(...data);\n // Calculate CRC for address + frameType + data\n const crcData = [address, frameType, ...data];\n const crc = this.calculateCRC16(crcData);\n // CRC (high byte first)\n frame.push((crc >> 8) & 0xFF);\n frame.push(crc & 0xFF);\n // EOI\n frame.push(0x0A);\n return frame;\n }\n /**\n * Parse a response frame from IOBOARD\n */\n static parseFrame(frame) {\n if (frame.length < 6) {\n return { success: false, error: 'Frame too short' };\n }\n // Check SOI and EOI\n if (frame[0] !== 0x0D || frame[frame.length - 1] !== 0x0A) {\n return { success: false, error: 'Invalid frame markers' };\n }\n const address = frame[1];\n const frameType = frame[2];\n const dataLength = frame.length - 6; // SOI + Address + FrameType + CRC(2) + EOI\n const data = frame.slice(3, 3 + dataLength);\n // Extract CRC from frame\n const receivedCRC = (frame[frame.length - 3] << 8) | frame[frame.length - 2];\n // Calculate expected CRC\n const crcData = [address, frameType, ...data];\n const expectedCRC = this.calculateCRC16(crcData);\n if (receivedCRC !== expectedCRC) {\n return {\n success: false,\n error: `CRC mismatch: expected ${expectedCRC.toString(16)}, got ${receivedCRC.toString(16)}`\n };\n }\n return {\n success: true,\n address,\n frameType,\n data\n };\n }\n /**\n * Build status query frame\n */\n static buildStatusQuery(address) {\n return this.buildFrame(address, 0x00, []);\n }\n /**\n * Build single pallet control frame\n */\n static buildSinglePalletControl(address, palletNumber, doorLock, ledControl) {\n const data = [];\n // Pallet number\n data.push(palletNumber);\n // Door lock control (1 = unlock, 0 = no action)\n data.push(doorLock ? 1 : 0);\n // LED control (6 bytes)\n data.push(ledControl.red);\n data.push(ledControl.green);\n data.push(ledControl.blue);\n data.push(ledControl.intensity);\n data.push(ledControl.blinkTimes);\n data.push(ledControl.blinkSpeed);\n return this.buildFrame(address, 0x01, data);\n }\n /**\n * Build full pallet control frame\n */\n static buildFullPalletControl(address, doorLockControl, extendedControl, ledControls) {\n const data = [];\n // Door lock control (8-bit mask)\n data.push(doorLockControl);\n // Extended control\n data.push(extendedControl);\n // LED controls for 8 pallets (48 bytes total)\n for (let i = 0; i < 8; i++) {\n const led = ledControls[i] || {\n red: 0, green: 0, blue: 0,\n intensity: 0, blinkTimes: 0, blinkSpeed: 0\n };\n data.push(led.red);\n data.push(led.green);\n data.push(led.blue);\n data.push(led.intensity);\n data.push(led.blinkTimes);\n data.push(led.blinkSpeed);\n }\n return this.buildFrame(address, 0x02, data);\n }\n /**\n * Build OTA notification frame\n */\n static buildOTANotification(address, majorVersion, minorVersion, patchVersion, firmwareSize) {\n const data = [];\n // Version (3 bytes)\n data.push(majorVersion);\n data.push(minorVersion);\n data.push(patchVersion);\n // Firmware size (4 bytes, little-endian)\n data.push(firmwareSize & 0xFF);\n data.push((firmwareSize >> 8) & 0xFF);\n data.push((firmwareSize >> 16) & 0xFF);\n data.push((firmwareSize >> 24) & 0xFF);\n return this.buildFrame(address, 0xF1, data);\n }\n /**\n * Build OTA data frame\n */\n static buildOTAData(address, packetNumber, data) {\n const frameData = [];\n // Packet number (4 bytes, little-endian)\n frameData.push(packetNumber & 0xFF);\n frameData.push((packetNumber >> 8) & 0xFF);\n frameData.push((packetNumber >> 16) & 0xFF);\n frameData.push((packetNumber >> 24) & 0xFF);\n // Data bytes (up to 128 bytes)\n for (let i = 0; i < data.length; i++) {\n frameData.push(data[i]);\n }\n return this.buildFrame(address, 0xF2, frameData);\n }\n /**\n * Parse status response\n */\n static parseStatusResponse(data) {\n if (data.length < 4) {\n return null;\n }\n return {\n doorLockStatus: data[0],\n softwareVersion: {\n major: data[1],\n minor: data[2],\n patch: data[3]\n }\n };\n }\n /**\n * Convert frame to hex string for debugging\n */\n static frameToHex(frame) {\n return frame.map(b => b.toString(16).padStart(2, '0')).join(' ').toUpperCase();\n }\n /**\n * Convert hex string to frame\n */\n static hexToFrame(hex) {\n return hex.split(' ')\n .map(h => h.trim())\n .filter(h => h.length > 0)\n .map(h => parseInt(h, 16));\n }\n}\n","import { registerPlugin } from '@capacitor/core';\nconst CapacitorIoboard = registerPlugin('CapacitorIoboard', {\n web: () => import('./web').then(m => new m.CapacitorIoboardWeb()),\n});\nexport * from './definitions';\nexport * from './protocol';\nexport { CapacitorIoboard };\n","import { WebPlugin } from \"@capacitor/core\";\nexport class CapacitorIoboardWeb extends WebPlugin {\n constructor() {\n super();\n console.log(\"IOBoard Web Plugin v2.0 initialized\");\n }\n async connect(options) {\n console.log(\"Web: Connecting to IOBoard...\", options);\n await new Promise(resolve => setTimeout(resolve, 1000));\n return { success: true, message: `Connected to IOBoard at ${options.portPath}` };\n }\n async disconnect() {\n console.log(\"Web: Disconnecting from IOBoard...\");\n return { success: true, message: \"Disconnected from IOBoard\" };\n }\n async isConnected() {\n return { connected: false, portPath: null };\n }\n async listPorts() {\n console.log(\"Web: Listing available ports...\");\n const ports = [\"/dev/ttyS0\", \"/dev/ttyS1\", \"/dev/ttyS2\", \"/dev/ttyUSB0\", \"COM1\", \"COM2\", \"COM3\"];\n return { success: true, ports };\n }\n async getStatus(options) {\n console.log(\"Web: Getting device status...\", options);\n await new Promise(resolve => setTimeout(resolve, 100));\n return {\n success: true,\n status: {\n address: options.address,\n connected: true,\n firmwareVersion: \"2.1.0\",\n palletStates: Array(8).fill(false),\n temperature: 25.5,\n voltage: 12.0,\n uptime: 86400\n }\n };\n }\n async unlockPallet(options) {\n console.log(\"Web: Unlocking pallet...\", options);\n await new Promise(resolve => setTimeout(resolve, 200));\n return {\n success: true,\n message: `Pallet ${options.palletNumber} unlocked with RGB(${options.red}, ${options.green}, ${options.blue})`\n };\n }\n async controlMultiplePallets(options) {\n console.log(\"Web: Controlling multiple pallets...\", options);\n await new Promise(resolve => setTimeout(resolve, 300));\n const { address, color, intensity, blinkTimes, blinkSpeed, pallets } = options;\n return {\n success: true,\n message: `Controlled ${pallets.length} pallets with ${color} color at ${intensity}% intensity`,\n details: {\n address,\n color,\n intensity,\n blinkTimes,\n blinkSpeed,\n palletsControlled: pallets\n }\n };\n }\n async controlMultiple(options) {\n console.log(\"Web: Controlling multiple LEDs...\", options);\n await new Promise(resolve => setTimeout(resolve, 300));\n return { success: true, message: `Controlled ${options.leds.length} LEDs successfully` };\n }\n async startOTAUpdate(options) {\n console.log(\"Web: Starting OTA update...\", options);\n await new Promise(resolve => setTimeout(resolve, 500));\n return { success: true, message: `OTA update started for ${options.fileName} (${options.fileSize} bytes)` };\n }\n async sendOTAData(options) {\n console.log(\"Web: Sending OTA data packet...\", options.packetNumber);\n await new Promise(resolve => setTimeout(resolve, 50));\n if (Math.random() < 0.05) {\n return { success: false, error: `Packet ${options.packetNumber} transmission failed` };\n }\n return { success: true, message: `OTA packet ${options.packetNumber} sent successfully` };\n }\n}\n"],"names":["registerPlugin","WebPlugin"],"mappings":"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"}
|