@leonardojc/capacitor-ioboard 1.1.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/plugin.js ADDED
@@ -0,0 +1,425 @@
1
+ var capacitorIoboard = (function (exports, core) {
2
+ 'use strict';
3
+
4
+ // Protocol Constants
5
+ const IOBOARD_PROTOCOL = {
6
+ SOI: 0x0D,
7
+ EOI: 0x0A,
8
+ FRAME_TYPES: {
9
+ STATUS_QUERY: 0x00,
10
+ SINGLE_PALLET: 0x01,
11
+ FULL_PALLET: 0x02,
12
+ OTA_REQUEST: 0xF1,
13
+ OTA_DATA: 0xF2,
14
+ OTA_RESPONSE: 0xF3
15
+ },
16
+ DEFAULT_BAUD_RATE: 115200,
17
+ DEFAULT_DATA_BITS: 8,
18
+ DEFAULT_STOP_BITS: 1,
19
+ DEFAULT_PARITY: 'none',
20
+ DEFAULT_TIMEOUT: 5000,
21
+ // Address range
22
+ MIN_ADDRESS: 1,
23
+ MAX_ADDRESS: 63,
24
+ // Pallet range
25
+ MIN_PALLET: 0,
26
+ MAX_PALLET: 7,
27
+ // OTA Constants
28
+ OTA_PACKET_SIZE: 128,
29
+ // Response codes
30
+ OTA_RESPONSES: {
31
+ AREA_REQUEST: 0x26,
32
+ REQUEST_A_ZONE: 0x41,
33
+ REQUEST_B_ZONE: 0x42,
34
+ DATA_REQUEST: 0x23,
35
+ COMPLETION: 0x4F,
36
+ ERROR: 0x45, // 'E'
37
+ },
38
+ // Error codes
39
+ OTA_ERROR_CODES: {
40
+ ILLEGAL_VERSION: 9,
41
+ NON_OTA_STATUS: 8,
42
+ WRITE_FAILED: 7,
43
+ VERIFICATION_FAILED: 6,
44
+ TRANSFER_FAILED: 5
45
+ }
46
+ };
47
+
48
+ /**
49
+ * IOBOARD Protocol utilities for frame construction and parsing
50
+ */
51
+ class IOBoardProtocol {
52
+ /**
53
+ * Calculate CRC-16 CCITT checksum
54
+ */
55
+ static calculateCRC16(data) {
56
+ let crc = 0xFFFF;
57
+ for (const byte of data) {
58
+ crc ^= (byte << 8);
59
+ for (let bit = 0; bit < 8; bit++) {
60
+ if (crc & 0x8000) {
61
+ crc = (crc << 1) ^ 0x1021;
62
+ }
63
+ else {
64
+ crc = crc << 1;
65
+ }
66
+ crc &= 0xFFFF;
67
+ }
68
+ }
69
+ return crc;
70
+ }
71
+ /**
72
+ * Build a command frame for IOBOARD
73
+ */
74
+ static buildFrame(address, frameType, data) {
75
+ const frame = [];
76
+ // SOI
77
+ frame.push(0x0D);
78
+ // Address
79
+ frame.push(address);
80
+ // Frame Type
81
+ frame.push(frameType);
82
+ // Data
83
+ frame.push(...data);
84
+ // Calculate CRC for address + frameType + data
85
+ const crcData = [address, frameType, ...data];
86
+ const crc = this.calculateCRC16(crcData);
87
+ // CRC (high byte first)
88
+ frame.push((crc >> 8) & 0xFF);
89
+ frame.push(crc & 0xFF);
90
+ // EOI
91
+ frame.push(0x0A);
92
+ return frame;
93
+ }
94
+ /**
95
+ * Parse a response frame from IOBOARD
96
+ */
97
+ static parseFrame(frame) {
98
+ if (frame.length < 6) {
99
+ return { success: false, error: 'Frame too short' };
100
+ }
101
+ // Check SOI and EOI
102
+ if (frame[0] !== 0x0D || frame[frame.length - 1] !== 0x0A) {
103
+ return { success: false, error: 'Invalid frame markers' };
104
+ }
105
+ const address = frame[1];
106
+ const frameType = frame[2];
107
+ const dataLength = frame.length - 6; // SOI + Address + FrameType + CRC(2) + EOI
108
+ const data = frame.slice(3, 3 + dataLength);
109
+ // Extract CRC from frame
110
+ const receivedCRC = (frame[frame.length - 3] << 8) | frame[frame.length - 2];
111
+ // Calculate expected CRC
112
+ const crcData = [address, frameType, ...data];
113
+ const expectedCRC = this.calculateCRC16(crcData);
114
+ if (receivedCRC !== expectedCRC) {
115
+ return {
116
+ success: false,
117
+ error: `CRC mismatch: expected ${expectedCRC.toString(16)}, got ${receivedCRC.toString(16)}`
118
+ };
119
+ }
120
+ return {
121
+ success: true,
122
+ address,
123
+ frameType,
124
+ data
125
+ };
126
+ }
127
+ /**
128
+ * Build status query frame
129
+ */
130
+ static buildStatusQuery(address) {
131
+ return this.buildFrame(address, 0x00, []);
132
+ }
133
+ /**
134
+ * Build single pallet control frame
135
+ */
136
+ static buildSinglePalletControl(address, palletNumber, doorLock, ledControl) {
137
+ const data = [];
138
+ // Pallet number
139
+ data.push(palletNumber);
140
+ // Door lock control (1 = unlock, 0 = no action)
141
+ data.push(doorLock ? 1 : 0);
142
+ // LED control (6 bytes)
143
+ data.push(ledControl.red);
144
+ data.push(ledControl.green);
145
+ data.push(ledControl.blue);
146
+ data.push(ledControl.intensity);
147
+ data.push(ledControl.blinkTimes);
148
+ data.push(ledControl.blinkSpeed);
149
+ return this.buildFrame(address, 0x01, data);
150
+ }
151
+ /**
152
+ * Build full pallet control frame
153
+ */
154
+ static buildFullPalletControl(address, doorLockControl, extendedControl, ledControls) {
155
+ const data = [];
156
+ // Door lock control (8-bit mask)
157
+ data.push(doorLockControl);
158
+ // Extended control
159
+ data.push(extendedControl);
160
+ // LED controls for 8 pallets (48 bytes total)
161
+ for (let i = 0; i < 8; i++) {
162
+ const led = ledControls[i] || {
163
+ red: 0, green: 0, blue: 0,
164
+ intensity: 0, blinkTimes: 0, blinkSpeed: 0
165
+ };
166
+ data.push(led.red);
167
+ data.push(led.green);
168
+ data.push(led.blue);
169
+ data.push(led.intensity);
170
+ data.push(led.blinkTimes);
171
+ data.push(led.blinkSpeed);
172
+ }
173
+ return this.buildFrame(address, 0x02, data);
174
+ }
175
+ /**
176
+ * Build OTA notification frame
177
+ */
178
+ static buildOTANotification(address, majorVersion, minorVersion, patchVersion, firmwareSize) {
179
+ const data = [];
180
+ // Version (3 bytes)
181
+ data.push(majorVersion);
182
+ data.push(minorVersion);
183
+ data.push(patchVersion);
184
+ // Firmware size (4 bytes, little-endian)
185
+ data.push(firmwareSize & 0xFF);
186
+ data.push((firmwareSize >> 8) & 0xFF);
187
+ data.push((firmwareSize >> 16) & 0xFF);
188
+ data.push((firmwareSize >> 24) & 0xFF);
189
+ return this.buildFrame(address, 0xF1, data);
190
+ }
191
+ /**
192
+ * Build OTA data frame
193
+ */
194
+ static buildOTAData(address, packetNumber, data) {
195
+ const frameData = [];
196
+ // Packet number (4 bytes, little-endian)
197
+ frameData.push(packetNumber & 0xFF);
198
+ frameData.push((packetNumber >> 8) & 0xFF);
199
+ frameData.push((packetNumber >> 16) & 0xFF);
200
+ frameData.push((packetNumber >> 24) & 0xFF);
201
+ // Data bytes (up to 128 bytes)
202
+ for (let i = 0; i < data.length; i++) {
203
+ frameData.push(data[i]);
204
+ }
205
+ return this.buildFrame(address, 0xF2, frameData);
206
+ }
207
+ /**
208
+ * Parse status response
209
+ */
210
+ static parseStatusResponse(data) {
211
+ if (data.length < 4) {
212
+ return null;
213
+ }
214
+ return {
215
+ doorLockStatus: data[0],
216
+ softwareVersion: {
217
+ major: data[1],
218
+ minor: data[2],
219
+ patch: data[3]
220
+ }
221
+ };
222
+ }
223
+ /**
224
+ * Convert frame to hex string for debugging
225
+ */
226
+ static frameToHex(frame) {
227
+ return frame.map(b => b.toString(16).padStart(2, '0')).join(' ').toUpperCase();
228
+ }
229
+ /**
230
+ * Convert hex string to frame
231
+ */
232
+ static hexToFrame(hex) {
233
+ return hex.split(' ')
234
+ .map(h => h.trim())
235
+ .filter(h => h.length > 0)
236
+ .map(h => parseInt(h, 16));
237
+ }
238
+ }
239
+
240
+ const CapacitorIoboard = core.registerPlugin('CapacitorIoboard', {
241
+ web: () => Promise.resolve().then(function () { return web; }).then(m => new m.CapacitorIoboardWeb()),
242
+ });
243
+
244
+ class CapacitorIoboardWeb extends core.WebPlugin {
245
+ constructor() {
246
+ super(...arguments);
247
+ this.isConnectedState = false;
248
+ }
249
+ async connect(options) {
250
+ console.log('IOBOARD Web: Connect', options);
251
+ // Simulate connection delay
252
+ await new Promise(resolve => setTimeout(resolve, 500));
253
+ this.isConnectedState = true;
254
+ return {
255
+ success: true,
256
+ message: `Connected to ${options.portPath || '/dev/ttyS2'} (web mock)`
257
+ };
258
+ }
259
+ async disconnect() {
260
+ console.log('IOBOARD Web: Disconnect');
261
+ this.isConnectedState = false;
262
+ return {
263
+ success: true,
264
+ message: 'Disconnected successfully (web mock)'
265
+ };
266
+ }
267
+ async isConnected() {
268
+ return { connected: this.isConnectedState };
269
+ }
270
+ async getStatus(options) {
271
+ console.log('IOBOARD Web: Get Status', options);
272
+ if (!this.isConnectedState) {
273
+ return {
274
+ success: false,
275
+ message: 'No serial connection established'
276
+ };
277
+ }
278
+ // Mock response
279
+ return {
280
+ success: true,
281
+ message: 'Status retrieved successfully (web mock)',
282
+ data: {
283
+ doorLockStatus: 0b11010001,
284
+ softwareVersion: {
285
+ major: 1,
286
+ minor: 2,
287
+ patch: 3
288
+ }
289
+ }
290
+ };
291
+ }
292
+ async unlockPallet(options) {
293
+ console.log('IOBOARD Web: Unlock Pallet', options);
294
+ if (!this.isConnectedState) {
295
+ return {
296
+ success: false,
297
+ message: 'No serial connection established'
298
+ };
299
+ }
300
+ // Validate pallet number
301
+ if (options.palletNumber < 0 || options.palletNumber > 7) {
302
+ return {
303
+ success: false,
304
+ message: 'Invalid pallet number. Must be 0-7'
305
+ };
306
+ }
307
+ // Mock response
308
+ return {
309
+ success: true,
310
+ message: `Pallet ${options.palletNumber} unlocked successfully (web mock)`,
311
+ data: {
312
+ address: options.address,
313
+ palletNumber: options.palletNumber,
314
+ ledColor: options.ledColor || 'green'
315
+ }
316
+ };
317
+ }
318
+ async controlMultiplePallets(options) {
319
+ console.log('IOBOARD Web: Control Multiple Pallets', options);
320
+ if (!this.isConnectedState) {
321
+ return {
322
+ success: false,
323
+ message: 'No serial connection established'
324
+ };
325
+ }
326
+ // Mock response
327
+ return {
328
+ success: true,
329
+ message: 'Multiple pallets controlled successfully (web mock)',
330
+ data: {
331
+ address: options.address,
332
+ doorLockMask: options.doorLockMask,
333
+ affectedPallets: this.getMaskBits(options.doorLockMask)
334
+ }
335
+ };
336
+ }
337
+ async scanDevices(options) {
338
+ console.log('IOBOARD Web: Scan Devices', options);
339
+ if (!this.isConnectedState) {
340
+ return {
341
+ success: false,
342
+ message: 'No serial connection established'
343
+ };
344
+ }
345
+ // Mock scan results
346
+ const devices = [];
347
+ const start = options.startAddress || 1;
348
+ const end = Math.min(options.endAddress || 63, start + 5); // Mock max 5 devices
349
+ for (let addr = start; addr <= end; addr++) {
350
+ devices.push({
351
+ address: addr,
352
+ responding: Math.random() > 0.7,
353
+ status: Math.random() > 0.7 ? { doorLockStatus: Math.floor(Math.random() * 256) } : undefined
354
+ });
355
+ }
356
+ return {
357
+ success: true,
358
+ message: `Scanned addresses ${start}-${end} (web mock)`,
359
+ devices
360
+ };
361
+ }
362
+ async sendOTANotification(options) {
363
+ console.log('IOBOARD Web: Send OTA Notification', options);
364
+ if (!this.isConnectedState) {
365
+ return {
366
+ success: false,
367
+ message: 'No serial connection established'
368
+ };
369
+ }
370
+ // Mock response
371
+ return {
372
+ success: true,
373
+ message: 'OTA notification sent successfully (web mock)',
374
+ data: {
375
+ address: options.address,
376
+ version: `${options.majorVersion}.${options.minorVersion}.${options.patchVersion}`,
377
+ firmwareSize: options.firmwareSize
378
+ }
379
+ };
380
+ }
381
+ async sendOTAData(options) {
382
+ console.log('IOBOARD Web: Send OTA Data', options);
383
+ if (!this.isConnectedState) {
384
+ return {
385
+ success: false,
386
+ message: 'No serial connection established'
387
+ };
388
+ }
389
+ // Mock response
390
+ return {
391
+ success: true,
392
+ message: `OTA data packet ${options.packetNumber} sent successfully (web mock)`,
393
+ data: {
394
+ address: options.address,
395
+ packetNumber: options.packetNumber,
396
+ dataLength: options.data.length
397
+ }
398
+ };
399
+ }
400
+ getMaskBits(mask) {
401
+ const bits = [];
402
+ for (let i = 0; i < 8; i++) {
403
+ if (mask & (1 << i)) {
404
+ bits.push(i);
405
+ }
406
+ }
407
+ return bits;
408
+ }
409
+ }
410
+
411
+ var web = /*#__PURE__*/Object.freeze({
412
+ __proto__: null,
413
+ CapacitorIoboardWeb: CapacitorIoboardWeb
414
+ });
415
+
416
+ exports.CapacitorIoboard = CapacitorIoboard;
417
+ exports.IOBOARD_PROTOCOL = IOBOARD_PROTOCOL;
418
+ exports.IOBoardProtocol = IOBoardProtocol;
419
+
420
+ Object.defineProperty(exports, '__esModule', { value: true });
421
+
422
+ return exports;
423
+
424
+ })({}, capacitorExports);
425
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.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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"}
@@ -0,0 +1,8 @@
1
+ import Foundation
2
+
3
+ @objc public class CapacitorIoboard: NSObject {
4
+ @objc public func echo(_ value: String) -> String {
5
+ print(value)
6
+ return value
7
+ }
8
+ }
@@ -0,0 +1,15 @@
1
+ #import <Foundation/Foundation.h>
2
+ #import <Capacitor/Capacitor.h>
3
+
4
+ // Define the plugin using the CAP_PLUGIN Macro, and
5
+ // each method the plugin supports using the CAP_PLUGIN_METHOD macro.
6
+ CAP_PLUGIN(CapacitorIoboardPlugin, "CapacitorIoboard",
7
+ CAP_PLUGIN_METHOD(queryStatus, CAPPluginReturnPromise);
8
+ CAP_PLUGIN_METHOD(controlSinglePallet, CAPPluginReturnPromise);
9
+ CAP_PLUGIN_METHOD(controlFullPallet, CAPPluginReturnPromise);
10
+ CAP_PLUGIN_METHOD(otaNotification, CAPPluginReturnPromise);
11
+ CAP_PLUGIN_METHOD(otaData, CAPPluginReturnPromise);
12
+ CAP_PLUGIN_METHOD(openConnection, CAPPluginReturnPromise);
13
+ CAP_PLUGIN_METHOD(closeConnection, CAPPluginReturnPromise);
14
+ CAP_PLUGIN_METHOD(isConnected, CAPPluginReturnPromise);
15
+ )
@@ -0,0 +1,142 @@
1
+ import Foundation
2
+ import Capacitor
3
+
4
+ /**
5
+ * Please read the Capacitor iOS Plugin Development Guide
6
+ * here: https://capacitorjs.com/docs/plugins/ios
7
+ */
8
+ @objc(CapacitorIoboardPlugin)
9
+ public class CapacitorIoboardPlugin: CAPPlugin {
10
+ private let implementation = CapacitorIoboard()
11
+
12
+ @objc func queryStatus(_ call: CAPPluginCall) {
13
+ guard let address = call.getInt("address") else {
14
+ call.reject("Address parameter is required")
15
+ return
16
+ }
17
+
18
+ if address < 1 || address > 63 {
19
+ call.reject("Invalid address. Must be between 1 and 63")
20
+ return
21
+ }
22
+
23
+ // For now, return a mock response
24
+ call.resolve([
25
+ "success": true,
26
+ "message": "Status queried successfully (iOS mock)",
27
+ "data": [
28
+ "doorLockStatus": 0,
29
+ "softwareVersion": [
30
+ "major": 1,
31
+ "minor": 0,
32
+ "patch": 0
33
+ ]
34
+ ]
35
+ ])
36
+ }
37
+
38
+ @objc func controlSinglePallet(_ call: CAPPluginCall) {
39
+ guard let address = call.getInt("address") else {
40
+ call.reject("Address parameter is required")
41
+ return
42
+ }
43
+
44
+ guard let palletNumber = call.getInt("palletNumber") else {
45
+ call.reject("Pallet number parameter is required")
46
+ return
47
+ }
48
+
49
+ if address < 1 || address > 63 {
50
+ call.reject("Invalid address. Must be between 1 and 63")
51
+ return
52
+ }
53
+
54
+ if palletNumber < 0 || palletNumber > 7 {
55
+ call.reject("Invalid pallet number. Must be between 0 and 7")
56
+ return
57
+ }
58
+
59
+ // For now, return a mock response
60
+ call.resolve([
61
+ "success": true,
62
+ "message": "Single pallet \(palletNumber) controlled successfully (iOS mock)"
63
+ ])
64
+ }
65
+
66
+ @objc func controlFullPallet(_ call: CAPPluginCall) {
67
+ guard let address = call.getInt("address") else {
68
+ call.reject("Address parameter is required")
69
+ return
70
+ }
71
+
72
+ if address < 1 || address > 63 {
73
+ call.reject("Invalid address. Must be between 1 and 63")
74
+ return
75
+ }
76
+
77
+ // For now, return a mock response
78
+ call.resolve([
79
+ "success": true,
80
+ "message": "Full pallet controlled successfully (iOS mock)"
81
+ ])
82
+ }
83
+
84
+ @objc func otaNotification(_ call: CAPPluginCall) {
85
+ guard let address = call.getInt("address") else {
86
+ call.reject("Address parameter is required")
87
+ return
88
+ }
89
+
90
+ if address < 1 || address > 63 {
91
+ call.reject("Invalid address. Must be between 1 and 63")
92
+ return
93
+ }
94
+
95
+ // For now, return a mock response
96
+ call.resolve([
97
+ "success": true,
98
+ "message": "OTA notification sent successfully (iOS mock)"
99
+ ])
100
+ }
101
+
102
+ @objc func otaData(_ call: CAPPluginCall) {
103
+ guard let address = call.getInt("address") else {
104
+ call.reject("Address parameter is required")
105
+ return
106
+ }
107
+
108
+ if address < 1 || address > 63 {
109
+ call.reject("Invalid address. Must be between 1 and 63")
110
+ return
111
+ }
112
+
113
+ // For now, return a mock response
114
+ call.resolve([
115
+ "success": true,
116
+ "message": "OTA data sent successfully (iOS mock)"
117
+ ])
118
+ }
119
+
120
+ @objc func openConnection(_ call: CAPPluginCall) {
121
+ // For now, return a mock response
122
+ call.resolve([
123
+ "success": true,
124
+ "message": "Serial connection opened successfully (iOS mock)"
125
+ ])
126
+ }
127
+
128
+ @objc func closeConnection(_ call: CAPPluginCall) {
129
+ // For now, return a mock response
130
+ call.resolve([
131
+ "success": true,
132
+ "message": "Serial connection closed successfully (iOS mock)"
133
+ ])
134
+ }
135
+
136
+ @objc func isConnected(_ call: CAPPluginCall) {
137
+ // For now, return a mock response
138
+ call.resolve([
139
+ "connected": false
140
+ ])
141
+ }
142
+ }