@robotical/raftjs 2.0.11 → 2.1.2

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.
Files changed (163) hide show
  1. package/devdocs/devbin-backwards-compatibility.md +105 -0
  2. package/devdocs/pseudocode-to-js-transpiler.md +563 -0
  3. package/dist/react-native/PseudocodeTranspiler.d.ts +6 -0
  4. package/dist/react-native/PseudocodeTranspiler.js +115 -0
  5. package/dist/react-native/PseudocodeTranspiler.js.map +1 -0
  6. package/dist/react-native/RaftAttributeHandler.d.ts +1 -1
  7. package/dist/react-native/RaftAttributeHandler.js +108 -32
  8. package/dist/react-native/RaftAttributeHandler.js.map +1 -1
  9. package/dist/react-native/RaftChannelBLE.web.d.ts +4 -0
  10. package/dist/react-native/RaftChannelBLE.web.js +59 -21
  11. package/dist/react-native/RaftChannelBLE.web.js.map +1 -1
  12. package/dist/react-native/RaftChannelSimulated.d.ts +1 -0
  13. package/dist/react-native/RaftChannelSimulated.js +10 -6
  14. package/dist/react-native/RaftChannelSimulated.js.map +1 -1
  15. package/dist/react-native/RaftChannelWebSerial.js +1 -1
  16. package/dist/react-native/RaftChannelWebSerial.js.map +1 -1
  17. package/dist/react-native/RaftChannelWebSocket.js +16 -1
  18. package/dist/react-native/RaftChannelWebSocket.js.map +1 -1
  19. package/dist/react-native/RaftConnector.d.ts +11 -1
  20. package/dist/react-native/RaftConnector.js +75 -9
  21. package/dist/react-native/RaftConnector.js.map +1 -1
  22. package/dist/react-native/RaftCustomAttrHandler.d.ts +2 -2
  23. package/dist/react-native/RaftCustomAttrHandler.js +32 -44
  24. package/dist/react-native/RaftCustomAttrHandler.js.map +1 -1
  25. package/dist/react-native/RaftDeviceInfo.d.ts +18 -0
  26. package/dist/react-native/RaftDeviceInfo.js +8 -0
  27. package/dist/react-native/RaftDeviceInfo.js.map +1 -1
  28. package/dist/react-native/RaftDeviceManager.d.ts +47 -2
  29. package/dist/react-native/RaftDeviceManager.js +696 -104
  30. package/dist/react-native/RaftDeviceManager.js.map +1 -1
  31. package/dist/react-native/RaftDeviceMgrIF.d.ts +11 -2
  32. package/dist/react-native/RaftDeviceStates.d.ts +27 -3
  33. package/dist/react-native/RaftDeviceStates.js +31 -6
  34. package/dist/react-native/RaftDeviceStates.js.map +1 -1
  35. package/dist/react-native/RaftFileHandler.d.ts +0 -1
  36. package/dist/react-native/RaftFileHandler.js +61 -23
  37. package/dist/react-native/RaftFileHandler.js.map +1 -1
  38. package/dist/react-native/RaftPublish.d.ts +2 -0
  39. package/dist/react-native/RaftPublish.js +81 -0
  40. package/dist/react-native/RaftPublish.js.map +1 -0
  41. package/dist/react-native/RaftStreamHandler.d.ts +11 -0
  42. package/dist/react-native/RaftStreamHandler.js +66 -0
  43. package/dist/react-native/RaftStreamHandler.js.map +1 -1
  44. package/dist/react-native/RaftStruct.d.ts +2 -2
  45. package/dist/react-native/RaftStruct.js +97 -26
  46. package/dist/react-native/RaftStruct.js.map +1 -1
  47. package/dist/react-native/RaftSystemType.d.ts +1 -0
  48. package/dist/react-native/RaftSystemUtils.d.ts +17 -1
  49. package/dist/react-native/RaftSystemUtils.js +51 -0
  50. package/dist/react-native/RaftSystemUtils.js.map +1 -1
  51. package/dist/react-native/RaftTimezone.d.ts +16 -0
  52. package/dist/react-native/RaftTimezone.js +153 -0
  53. package/dist/react-native/RaftTimezone.js.map +1 -0
  54. package/dist/react-native/RaftTypes.d.ts +27 -1
  55. package/dist/react-native/RaftTypes.js.map +1 -1
  56. package/dist/react-native/RaftUpdateManager.js +1 -1
  57. package/dist/react-native/RaftUpdateManager.js.map +1 -1
  58. package/dist/react-native/main.d.ts +3 -0
  59. package/dist/react-native/main.js +6 -1
  60. package/dist/react-native/main.js.map +1 -1
  61. package/dist/web/PseudocodeTranspiler.d.ts +6 -0
  62. package/dist/web/PseudocodeTranspiler.js +115 -0
  63. package/dist/web/PseudocodeTranspiler.js.map +1 -0
  64. package/dist/web/RaftAttributeHandler.d.ts +1 -1
  65. package/dist/web/RaftAttributeHandler.js +108 -32
  66. package/dist/web/RaftAttributeHandler.js.map +1 -1
  67. package/dist/web/RaftChannelBLE.web.d.ts +4 -0
  68. package/dist/web/RaftChannelBLE.web.js +59 -21
  69. package/dist/web/RaftChannelBLE.web.js.map +1 -1
  70. package/dist/web/RaftChannelSimulated.d.ts +1 -0
  71. package/dist/web/RaftChannelSimulated.js +10 -6
  72. package/dist/web/RaftChannelSimulated.js.map +1 -1
  73. package/dist/web/RaftChannelWebSerial.js +1 -1
  74. package/dist/web/RaftChannelWebSerial.js.map +1 -1
  75. package/dist/web/RaftChannelWebSocket.js +16 -1
  76. package/dist/web/RaftChannelWebSocket.js.map +1 -1
  77. package/dist/web/RaftConnector.d.ts +11 -1
  78. package/dist/web/RaftConnector.js +75 -9
  79. package/dist/web/RaftConnector.js.map +1 -1
  80. package/dist/web/RaftCustomAttrHandler.d.ts +2 -2
  81. package/dist/web/RaftCustomAttrHandler.js +32 -44
  82. package/dist/web/RaftCustomAttrHandler.js.map +1 -1
  83. package/dist/web/RaftDeviceInfo.d.ts +18 -0
  84. package/dist/web/RaftDeviceInfo.js +8 -0
  85. package/dist/web/RaftDeviceInfo.js.map +1 -1
  86. package/dist/web/RaftDeviceManager.d.ts +47 -2
  87. package/dist/web/RaftDeviceManager.js +696 -104
  88. package/dist/web/RaftDeviceManager.js.map +1 -1
  89. package/dist/web/RaftDeviceMgrIF.d.ts +11 -2
  90. package/dist/web/RaftDeviceStates.d.ts +27 -3
  91. package/dist/web/RaftDeviceStates.js +31 -6
  92. package/dist/web/RaftDeviceStates.js.map +1 -1
  93. package/dist/web/RaftFileHandler.d.ts +0 -1
  94. package/dist/web/RaftFileHandler.js +61 -23
  95. package/dist/web/RaftFileHandler.js.map +1 -1
  96. package/dist/web/RaftPublish.d.ts +2 -0
  97. package/dist/web/RaftPublish.js +81 -0
  98. package/dist/web/RaftPublish.js.map +1 -0
  99. package/dist/web/RaftStreamHandler.d.ts +11 -0
  100. package/dist/web/RaftStreamHandler.js +66 -0
  101. package/dist/web/RaftStreamHandler.js.map +1 -1
  102. package/dist/web/RaftStruct.d.ts +2 -2
  103. package/dist/web/RaftStruct.js +97 -26
  104. package/dist/web/RaftStruct.js.map +1 -1
  105. package/dist/web/RaftSystemType.d.ts +1 -0
  106. package/dist/web/RaftSystemUtils.d.ts +17 -1
  107. package/dist/web/RaftSystemUtils.js +51 -0
  108. package/dist/web/RaftSystemUtils.js.map +1 -1
  109. package/dist/web/RaftTimezone.d.ts +16 -0
  110. package/dist/web/RaftTimezone.js +153 -0
  111. package/dist/web/RaftTimezone.js.map +1 -0
  112. package/dist/web/RaftTypes.d.ts +27 -1
  113. package/dist/web/RaftTypes.js.map +1 -1
  114. package/dist/web/RaftUpdateManager.js +1 -1
  115. package/dist/web/RaftUpdateManager.js.map +1 -1
  116. package/dist/web/main.d.ts +3 -0
  117. package/dist/web/main.js +6 -1
  118. package/dist/web/main.js.map +1 -1
  119. package/examples/dashboard/package.json +2 -2
  120. package/examples/dashboard/src/DeviceActionsForm.tsx +158 -8
  121. package/examples/dashboard/src/DeviceLineChart.tsx +16 -3
  122. package/examples/dashboard/src/DevicePanel.tsx +92 -11
  123. package/examples/dashboard/src/DeviceSelectDialog.tsx +224 -0
  124. package/examples/dashboard/src/DeviceStatsPanel.tsx +76 -0
  125. package/examples/dashboard/src/DevicesPanel.tsx +11 -0
  126. package/examples/dashboard/src/LogConfigPanel.tsx +357 -0
  127. package/examples/dashboard/src/LogFilesPanel.tsx +200 -0
  128. package/examples/dashboard/src/LoggingPanel.tsx +264 -0
  129. package/examples/dashboard/src/Main.tsx +12 -2
  130. package/examples/dashboard/src/SettingsScreen.tsx +9 -4
  131. package/examples/dashboard/src/SystemTypeCog/CogStateInfo.ts +10 -3
  132. package/examples/dashboard/src/SystemTypeCog/SystemTypeCog.ts +37 -3
  133. package/examples/dashboard/src/SystemTypeGeneric/StateInfoGeneric.ts +10 -2
  134. package/examples/dashboard/src/SystemTypeGeneric/SystemTypeGeneric.ts +41 -7
  135. package/examples/dashboard/src/SystemTypeMarty/RICStateInfo.ts +34 -3
  136. package/examples/dashboard/src/styles.css +766 -1
  137. package/notes/web-ble-reconnect-retry.md +69 -0
  138. package/package.json +10 -7
  139. package/src/PseudocodeTranspiler.test.ts +372 -0
  140. package/src/PseudocodeTranspiler.ts +127 -0
  141. package/src/RaftAttributeHandler.ts +152 -76
  142. package/src/RaftChannelBLE.web.ts +62 -20
  143. package/src/RaftChannelSimulated.ts +11 -6
  144. package/src/RaftChannelWebSerial.ts +1 -1
  145. package/src/RaftChannelWebSocket.ts +16 -2
  146. package/src/RaftConnector.ts +93 -15
  147. package/src/RaftCustomAttrHandler.ts +35 -45
  148. package/src/RaftDeviceInfo.ts +27 -0
  149. package/src/RaftDeviceManager.test.ts +164 -0
  150. package/src/RaftDeviceManager.ts +823 -121
  151. package/src/RaftDeviceMgrIF.ts +13 -2
  152. package/src/RaftDeviceStates.ts +49 -8
  153. package/src/RaftFileHandler.ts +69 -28
  154. package/src/RaftPublish.ts +92 -0
  155. package/src/RaftStreamHandler.ts +84 -1
  156. package/src/RaftStruct.test.ts +229 -0
  157. package/src/RaftStruct.ts +101 -37
  158. package/src/RaftSystemType.ts +1 -0
  159. package/src/RaftSystemUtils.ts +59 -0
  160. package/src/RaftTimezone.ts +151 -0
  161. package/src/RaftTypes.ts +34 -1
  162. package/src/RaftUpdateManager.ts +1 -1
  163. package/src/main.ts +3 -0
@@ -0,0 +1,151 @@
1
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
2
+ //
3
+ // RaftTimezone
4
+ // Part of RaftJS — IANA timezone to POSIX TZ string conversion for ESP-IDF
5
+ //
6
+ // Rob Dobson 2026
7
+ // (C) 2026 All rights reserved
8
+ //
9
+ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
10
+
11
+ // Mapping of common IANA timezone names to POSIX TZ strings (with DST rules where applicable)
12
+ const IANA_TO_POSIX: Record<string, string> = {
13
+ // UTC / GMT
14
+ 'UTC': 'UTC0',
15
+ 'Etc/UTC': 'UTC0',
16
+ 'Etc/GMT': 'GMT0',
17
+
18
+ // Europe
19
+ 'Europe/London': 'GMT0BST,M3.5.0/1,M10.5.0',
20
+ 'Europe/Dublin': 'IST-1GMT0,M10.5.0,M3.5.0/1',
21
+ 'Europe/Paris': 'CET-1CEST,M3.5.0,M10.5.0/3',
22
+ 'Europe/Berlin': 'CET-1CEST,M3.5.0,M10.5.0/3',
23
+ 'Europe/Brussels': 'CET-1CEST,M3.5.0,M10.5.0/3',
24
+ 'Europe/Amsterdam': 'CET-1CEST,M3.5.0,M10.5.0/3',
25
+ 'Europe/Rome': 'CET-1CEST,M3.5.0,M10.5.0/3',
26
+ 'Europe/Madrid': 'CET-1CEST,M3.5.0,M10.5.0/3',
27
+ 'Europe/Zurich': 'CET-1CEST,M3.5.0,M10.5.0/3',
28
+ 'Europe/Vienna': 'CET-1CEST,M3.5.0,M10.5.0/3',
29
+ 'Europe/Stockholm': 'CET-1CEST,M3.5.0,M10.5.0/3',
30
+ 'Europe/Oslo': 'CET-1CEST,M3.5.0,M10.5.0/3',
31
+ 'Europe/Copenhagen': 'CET-1CEST,M3.5.0,M10.5.0/3',
32
+ 'Europe/Helsinki': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
33
+ 'Europe/Athens': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
34
+ 'Europe/Bucharest': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
35
+ 'Europe/Warsaw': 'CET-1CEST,M3.5.0,M10.5.0/3',
36
+ 'Europe/Prague': 'CET-1CEST,M3.5.0,M10.5.0/3',
37
+ 'Europe/Lisbon': 'WET0WEST,M3.5.0/1,M10.5.0',
38
+ 'Europe/Moscow': 'MSK-3',
39
+ 'Europe/Istanbul': '<+03>-3',
40
+ 'Europe/Kiev': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
41
+ 'Europe/Kyiv': 'EET-2EEST,M3.5.0/3,M10.5.0/4',
42
+
43
+ // Americas
44
+ 'America/New_York': 'EST5EDT,M3.2.0,M11.1.0',
45
+ 'America/Chicago': 'CST6CDT,M3.2.0,M11.1.0',
46
+ 'America/Denver': 'MST7MDT,M3.2.0,M11.1.0',
47
+ 'America/Los_Angeles': 'PST8PDT,M3.2.0,M11.1.0',
48
+ 'America/Phoenix': 'MST7',
49
+ 'America/Anchorage': 'AKST9AKDT,M3.2.0,M11.1.0',
50
+ 'Pacific/Honolulu': 'HST10',
51
+ 'America/Toronto': 'EST5EDT,M3.2.0,M11.1.0',
52
+ 'America/Vancouver': 'PST8PDT,M3.2.0,M11.1.0',
53
+ 'America/Edmonton': 'MST7MDT,M3.2.0,M11.1.0',
54
+ 'America/Winnipeg': 'CST6CDT,M3.2.0,M11.1.0',
55
+ 'America/Halifax': 'AST4ADT,M3.2.0,M11.1.0',
56
+ 'America/St_Johns': 'NST3:30NDT,M3.2.0,M11.1.0',
57
+ 'America/Mexico_City': 'CST6',
58
+ 'America/Sao_Paulo': '<-03>3',
59
+ 'America/Argentina/Buenos_Aires': '<-03>3',
60
+ 'America/Santiago': '<-04>4<-03>,M9.1.6/24,M4.1.6/24',
61
+ 'America/Bogota': '<-05>5',
62
+ 'America/Lima': '<-05>5',
63
+
64
+ // Asia
65
+ 'Asia/Tokyo': 'JST-9',
66
+ 'Asia/Shanghai': 'CST-8',
67
+ 'Asia/Hong_Kong': 'HKT-8',
68
+ 'Asia/Taipei': 'CST-8',
69
+ 'Asia/Singapore': '<+08>-8',
70
+ 'Asia/Seoul': 'KST-9',
71
+ 'Asia/Kolkata': 'IST-5:30',
72
+ 'Asia/Calcutta': 'IST-5:30',
73
+ 'Asia/Dubai': '<+04>-4',
74
+ 'Asia/Riyadh': '<+03>-3',
75
+ 'Asia/Tehran': '<+0330>-3:30',
76
+ 'Asia/Karachi': 'PKT-5',
77
+ 'Asia/Dhaka': '<+06>-6',
78
+ 'Asia/Bangkok': '<+07>-7',
79
+ 'Asia/Jakarta': 'WIB-7',
80
+ 'Asia/Ho_Chi_Minh': '<+07>-7',
81
+ 'Asia/Kuala_Lumpur': '<+08>-8',
82
+ 'Asia/Manila': 'PST-8',
83
+ 'Asia/Vladivostok': '<+10>-10',
84
+ 'Asia/Novosibirsk': '<+07>-7',
85
+ 'Asia/Yekaterinburg': '<+05>-5',
86
+
87
+ // Oceania
88
+ 'Australia/Sydney': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
89
+ 'Australia/Melbourne': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
90
+ 'Australia/Brisbane': 'AEST-10',
91
+ 'Australia/Perth': 'AWST-8',
92
+ 'Australia/Adelaide': 'ACST-9:30ACDT,M10.1.0,M4.1.0/3',
93
+ 'Australia/Darwin': 'ACST-9:30',
94
+ 'Australia/Hobart': 'AEST-10AEDT,M10.1.0,M4.1.0/3',
95
+ 'Pacific/Auckland': 'NZST-12NZDT,M9.5.0,M4.1.0/3',
96
+ 'Pacific/Fiji': '<+12>-12',
97
+
98
+ // Africa
99
+ 'Africa/Cairo': 'EET-2',
100
+ 'Africa/Johannesburg': 'SAST-2',
101
+ 'Africa/Lagos': 'WAT-1',
102
+ 'Africa/Nairobi': 'EAT-3',
103
+ 'Africa/Casablanca': '<+01>-1',
104
+ };
105
+
106
+ /**
107
+ * Get the host machine's IANA timezone name.
108
+ * Returns undefined if not available.
109
+ */
110
+ export function getHostTimezone(): string | undefined {
111
+ try {
112
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
113
+ } catch {
114
+ return undefined;
115
+ }
116
+ }
117
+
118
+ /**
119
+ * Convert an IANA timezone name to a POSIX TZ string suitable for ESP-IDF.
120
+ * Falls back to a simple UTC offset string if the IANA name is not in the lookup table.
121
+ * Returns undefined if timezone cannot be determined.
122
+ */
123
+ export function ianaToPosixTZ(iana: string): string | undefined {
124
+ // Direct lookup
125
+ const posix = IANA_TO_POSIX[iana];
126
+ if (posix) return posix;
127
+
128
+ // Fallback: compute simple UTC offset from current Date (no DST transitions)
129
+ try {
130
+ const offsetMin = new Date().getTimezoneOffset(); // minutes west of UTC (e.g. -60 for UTC+1)
131
+ if (offsetMin === 0) return 'UTC0';
132
+ // POSIX TZ convention: positive = west of UTC (opposite of ISO 8601)
133
+ const hours = Math.trunc(offsetMin / 60);
134
+ const mins = Math.abs(offsetMin % 60);
135
+ let tz = `UTC${hours >= 0 ? '+' : '-'}${Math.abs(hours)}`;
136
+ if (mins > 0) tz += `:${mins.toString().padStart(2, '0')}`;
137
+ return tz;
138
+ } catch {
139
+ return undefined;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Get the host machine's timezone as a POSIX TZ string.
145
+ * Attempts IANA lookup first, then falls back to UTC offset.
146
+ */
147
+ export function getHostPosixTZ(): string | undefined {
148
+ const iana = getHostTimezone();
149
+ if (!iana) return undefined;
150
+ return ianaToPosixTZ(iana);
151
+ }
package/src/RaftTypes.ts CHANGED
@@ -72,6 +72,31 @@ export class RaftOKFail {
72
72
  rslt = 'failComms';
73
73
  }
74
74
 
75
+ export type RaftPubTopicRec = {
76
+ name: string;
77
+ idx: number;
78
+ };
79
+
80
+ export type RaftSubscriptionUpdateResponse = RaftOKFail & {
81
+ topics?: Array<RaftPubTopicRec>;
82
+ };
83
+
84
+ export type RaftPubTopicsResponse = RaftOKFail & {
85
+ topics?: Array<RaftPubTopicRec>;
86
+ };
87
+
88
+ export type RaftPublishFrameType = 'json' | 'binary' | 'unknown';
89
+
90
+ export type RaftPublishFrameMeta = {
91
+ frameType: RaftPublishFrameType;
92
+ topicIndex?: number;
93
+ topicName?: string;
94
+ version?: number;
95
+ binaryHasEnvelope?: boolean;
96
+ binaryPayloadOffset?: number;
97
+ jsonString?: string;
98
+ };
99
+
75
100
  export type RaftReportMsg = {
76
101
  msgType?: string;
77
102
  rslt?: string;
@@ -181,6 +206,8 @@ export class RaftSysModInfoBLEMan {
181
206
 
182
207
  export type RaftProgressCBType = (received: number, total: number) => void;
183
208
 
209
+ export type RaftStreamDataProgressCBType = (sent: number, total: number, progress: number) => void;
210
+
184
211
  export class RaftFileDownloadResult {
185
212
  fileData: Uint8Array | null = null;
186
213
  downloadedOk = false;
@@ -210,7 +237,13 @@ export type RaftFileDownloadStartResp = {
210
237
  batchAckSize: number;
211
238
  streamID: number;
212
239
  fileLen: number;
213
- crc16: string;
240
+ crc16?: string;
241
+ }
242
+
243
+ export type RaftFileDownloadEndResp = {
244
+ req: string;
245
+ rslt: string;
246
+ crc16?: string;
214
247
  }
215
248
 
216
249
  export interface Dictionary<T> {
@@ -414,7 +414,7 @@ export default class RICUpdateManager {
414
414
  15000
415
415
  );
416
416
  // trigger and wait for reboot
417
- RaftLog.debug(`Restarting RIC`);
417
+ RaftLog.debug(`Restarting device`);
418
418
  try {
419
419
  await this._msgHandler.sendRICRESTURL<RaftOKFail>("reset");
420
420
  } catch (error) {
package/src/main.ts CHANGED
@@ -27,7 +27,9 @@ export { default as RaftUtils } from './RaftUtils';
27
27
  export { default as RaftSysTypeManager } from './RaftSysTypeManager';
28
28
  export { default as RaftDeviceMgrIF } from './RaftDeviceMgrIF';
29
29
  export { DeviceManager as RaftDeviceManager } from './RaftDeviceManager';
30
+ export type { DeviceDecodedData } from './RaftDeviceManager';
30
31
 
32
+ export * from './RaftPublish';
31
33
  export * from './RaftTypes';
32
34
  export * from './RaftSystemType';
33
35
  export * from './RaftWifiTypes';
@@ -36,3 +38,4 @@ export * from './RaftUpdateEvents';
36
38
  export * from "./RaftProtocolDefs";
37
39
  export * from "./RaftDeviceStates";
38
40
  export * from "./RaftDeviceInfo";
41
+ export { getHostTimezone, getHostPosixTZ, ianaToPosixTZ } from './RaftTimezone';