irtxrx 0.0.1

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 (178) hide show
  1. package/README.md +127 -0
  2. package/dist/cjs/decode.d.ts +184 -0
  3. package/dist/cjs/decode.d.ts.map +1 -0
  4. package/dist/cjs/decode.js +431 -0
  5. package/dist/cjs/decode.js.map +1 -0
  6. package/dist/cjs/encode.d.ts +76 -0
  7. package/dist/cjs/encode.d.ts.map +1 -0
  8. package/dist/cjs/encode.js +185 -0
  9. package/dist/cjs/encode.js.map +1 -0
  10. package/dist/cjs/index.d.ts +34 -0
  11. package/dist/cjs/index.d.ts.map +1 -0
  12. package/dist/cjs/index.js +99 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/protocols/coolix.d.ts +98 -0
  15. package/dist/cjs/protocols/coolix.d.ts.map +1 -0
  16. package/dist/cjs/protocols/coolix.js +331 -0
  17. package/dist/cjs/protocols/coolix.js.map +1 -0
  18. package/dist/cjs/protocols/daikin.d.ts +47 -0
  19. package/dist/cjs/protocols/daikin.d.ts.map +1 -0
  20. package/dist/cjs/protocols/daikin.js +353 -0
  21. package/dist/cjs/protocols/daikin.js.map +1 -0
  22. package/dist/cjs/protocols/daikin128.d.ts +60 -0
  23. package/dist/cjs/protocols/daikin128.d.ts.map +1 -0
  24. package/dist/cjs/protocols/daikin128.js +267 -0
  25. package/dist/cjs/protocols/daikin128.js.map +1 -0
  26. package/dist/cjs/protocols/daikin152.d.ts +47 -0
  27. package/dist/cjs/protocols/daikin152.d.ts.map +1 -0
  28. package/dist/cjs/protocols/daikin152.js +256 -0
  29. package/dist/cjs/protocols/daikin152.js.map +1 -0
  30. package/dist/cjs/protocols/daikin160.d.ts +37 -0
  31. package/dist/cjs/protocols/daikin160.d.ts.map +1 -0
  32. package/dist/cjs/protocols/daikin160.js +176 -0
  33. package/dist/cjs/protocols/daikin160.js.map +1 -0
  34. package/dist/cjs/protocols/daikin176.d.ts +44 -0
  35. package/dist/cjs/protocols/daikin176.d.ts.map +1 -0
  36. package/dist/cjs/protocols/daikin176.js +215 -0
  37. package/dist/cjs/protocols/daikin176.js.map +1 -0
  38. package/dist/cjs/protocols/daikin2.d.ts +46 -0
  39. package/dist/cjs/protocols/daikin2.d.ts.map +1 -0
  40. package/dist/cjs/protocols/daikin2.js +337 -0
  41. package/dist/cjs/protocols/daikin2.js.map +1 -0
  42. package/dist/cjs/protocols/daikin216.d.ts +30 -0
  43. package/dist/cjs/protocols/daikin216.d.ts.map +1 -0
  44. package/dist/cjs/protocols/daikin216.js +167 -0
  45. package/dist/cjs/protocols/daikin216.js.map +1 -0
  46. package/dist/cjs/protocols/daikin312.d.ts +45 -0
  47. package/dist/cjs/protocols/daikin312.d.ts.map +1 -0
  48. package/dist/cjs/protocols/daikin312.js +345 -0
  49. package/dist/cjs/protocols/daikin312.js.map +1 -0
  50. package/dist/cjs/protocols/daikin64.d.ts +79 -0
  51. package/dist/cjs/protocols/daikin64.d.ts.map +1 -0
  52. package/dist/cjs/protocols/daikin64.js +260 -0
  53. package/dist/cjs/protocols/daikin64.js.map +1 -0
  54. package/dist/cjs/protocols/daikin_common.d.ts +28 -0
  55. package/dist/cjs/protocols/daikin_common.d.ts.map +1 -0
  56. package/dist/cjs/protocols/daikin_common.js +41 -0
  57. package/dist/cjs/protocols/daikin_common.js.map +1 -0
  58. package/dist/cjs/protocols/nec.d.ts +50 -0
  59. package/dist/cjs/protocols/nec.d.ts.map +1 -0
  60. package/dist/cjs/protocols/nec.js +180 -0
  61. package/dist/cjs/protocols/nec.js.map +1 -0
  62. package/dist/decode.d.ts +67 -0
  63. package/dist/decode.d.ts.map +1 -0
  64. package/dist/decode.js +242 -0
  65. package/dist/decode.js.map +1 -0
  66. package/dist/encode.d.ts +76 -0
  67. package/dist/encode.d.ts.map +1 -0
  68. package/dist/encode.js +174 -0
  69. package/dist/encode.js.map +1 -0
  70. package/dist/esm/decode.d.ts +184 -0
  71. package/dist/esm/decode.d.ts.map +1 -0
  72. package/dist/esm/decode.js +420 -0
  73. package/dist/esm/decode.js.map +1 -0
  74. package/dist/esm/encode.d.ts +76 -0
  75. package/dist/esm/encode.d.ts.map +1 -0
  76. package/dist/esm/encode.js +174 -0
  77. package/dist/esm/encode.js.map +1 -0
  78. package/dist/esm/index.d.ts +34 -0
  79. package/dist/esm/index.d.ts.map +1 -0
  80. package/dist/esm/index.js +20 -0
  81. package/dist/esm/index.js.map +1 -0
  82. package/dist/esm/protocols/coolix.d.ts +98 -0
  83. package/dist/esm/protocols/coolix.d.ts.map +1 -0
  84. package/dist/esm/protocols/coolix.js +322 -0
  85. package/dist/esm/protocols/coolix.js.map +1 -0
  86. package/dist/esm/protocols/daikin.d.ts +47 -0
  87. package/dist/esm/protocols/daikin.d.ts.map +1 -0
  88. package/dist/esm/protocols/daikin.js +344 -0
  89. package/dist/esm/protocols/daikin.js.map +1 -0
  90. package/dist/esm/protocols/daikin128.d.ts +60 -0
  91. package/dist/esm/protocols/daikin128.d.ts.map +1 -0
  92. package/dist/esm/protocols/daikin128.js +260 -0
  93. package/dist/esm/protocols/daikin128.js.map +1 -0
  94. package/dist/esm/protocols/daikin152.d.ts +47 -0
  95. package/dist/esm/protocols/daikin152.d.ts.map +1 -0
  96. package/dist/esm/protocols/daikin152.js +247 -0
  97. package/dist/esm/protocols/daikin152.js.map +1 -0
  98. package/dist/esm/protocols/daikin160.d.ts +37 -0
  99. package/dist/esm/protocols/daikin160.d.ts.map +1 -0
  100. package/dist/esm/protocols/daikin160.js +167 -0
  101. package/dist/esm/protocols/daikin160.js.map +1 -0
  102. package/dist/esm/protocols/daikin176.d.ts +44 -0
  103. package/dist/esm/protocols/daikin176.d.ts.map +1 -0
  104. package/dist/esm/protocols/daikin176.js +208 -0
  105. package/dist/esm/protocols/daikin176.js.map +1 -0
  106. package/dist/esm/protocols/daikin2.d.ts +46 -0
  107. package/dist/esm/protocols/daikin2.d.ts.map +1 -0
  108. package/dist/esm/protocols/daikin2.js +328 -0
  109. package/dist/esm/protocols/daikin2.js.map +1 -0
  110. package/dist/esm/protocols/daikin216.d.ts +30 -0
  111. package/dist/esm/protocols/daikin216.d.ts.map +1 -0
  112. package/dist/esm/protocols/daikin216.js +158 -0
  113. package/dist/esm/protocols/daikin216.js.map +1 -0
  114. package/dist/esm/protocols/daikin312.d.ts +45 -0
  115. package/dist/esm/protocols/daikin312.d.ts.map +1 -0
  116. package/dist/esm/protocols/daikin312.js +336 -0
  117. package/dist/esm/protocols/daikin312.js.map +1 -0
  118. package/dist/esm/protocols/daikin64.d.ts +79 -0
  119. package/dist/esm/protocols/daikin64.d.ts.map +1 -0
  120. package/dist/esm/protocols/daikin64.js +253 -0
  121. package/dist/esm/protocols/daikin64.js.map +1 -0
  122. package/dist/esm/protocols/daikin_common.d.ts +28 -0
  123. package/dist/esm/protocols/daikin_common.d.ts.map +1 -0
  124. package/dist/esm/protocols/daikin_common.js +38 -0
  125. package/dist/esm/protocols/daikin_common.js.map +1 -0
  126. package/dist/esm/protocols/nec.d.ts +50 -0
  127. package/dist/esm/protocols/nec.d.ts.map +1 -0
  128. package/dist/esm/protocols/nec.js +175 -0
  129. package/dist/esm/protocols/nec.js.map +1 -0
  130. package/dist/index.d.ts +32 -0
  131. package/dist/index.d.ts.map +1 -0
  132. package/dist/index.js +19 -0
  133. package/dist/index.js.map +1 -0
  134. package/dist/protocols/daikin.d.ts +47 -0
  135. package/dist/protocols/daikin.d.ts.map +1 -0
  136. package/dist/protocols/daikin.js +343 -0
  137. package/dist/protocols/daikin.js.map +1 -0
  138. package/dist/protocols/daikin128.d.ts +60 -0
  139. package/dist/protocols/daikin128.d.ts.map +1 -0
  140. package/dist/protocols/daikin128.js +259 -0
  141. package/dist/protocols/daikin128.js.map +1 -0
  142. package/dist/protocols/daikin152.d.ts +47 -0
  143. package/dist/protocols/daikin152.d.ts.map +1 -0
  144. package/dist/protocols/daikin152.js +246 -0
  145. package/dist/protocols/daikin152.js.map +1 -0
  146. package/dist/protocols/daikin160.d.ts +37 -0
  147. package/dist/protocols/daikin160.d.ts.map +1 -0
  148. package/dist/protocols/daikin160.js +166 -0
  149. package/dist/protocols/daikin160.js.map +1 -0
  150. package/dist/protocols/daikin176.d.ts +44 -0
  151. package/dist/protocols/daikin176.d.ts.map +1 -0
  152. package/dist/protocols/daikin176.js +207 -0
  153. package/dist/protocols/daikin176.js.map +1 -0
  154. package/dist/protocols/daikin2.d.ts +46 -0
  155. package/dist/protocols/daikin2.d.ts.map +1 -0
  156. package/dist/protocols/daikin2.js +326 -0
  157. package/dist/protocols/daikin2.js.map +1 -0
  158. package/dist/protocols/daikin216.d.ts +30 -0
  159. package/dist/protocols/daikin216.d.ts.map +1 -0
  160. package/dist/protocols/daikin216.js +157 -0
  161. package/dist/protocols/daikin216.js.map +1 -0
  162. package/dist/protocols/daikin312.d.ts +45 -0
  163. package/dist/protocols/daikin312.d.ts.map +1 -0
  164. package/dist/protocols/daikin312.js +334 -0
  165. package/dist/protocols/daikin312.js.map +1 -0
  166. package/dist/protocols/daikin64.d.ts +79 -0
  167. package/dist/protocols/daikin64.d.ts.map +1 -0
  168. package/dist/protocols/daikin64.js +251 -0
  169. package/dist/protocols/daikin64.js.map +1 -0
  170. package/dist/protocols/daikin_common.d.ts +28 -0
  171. package/dist/protocols/daikin_common.d.ts.map +1 -0
  172. package/dist/protocols/daikin_common.js +38 -0
  173. package/dist/protocols/daikin_common.js.map +1 -0
  174. package/dist/protocols/nec.d.ts +50 -0
  175. package/dist/protocols/nec.d.ts.map +1 -0
  176. package/dist/protocols/nec.js +175 -0
  177. package/dist/protocols/nec.js.map +1 -0
  178. package/package.json +37 -0
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Core IR decoding engine.
3
+ *
4
+ * Mirrors the decoding logic of IRremoteESP8266's IRrecv, but operates
5
+ * on plain timing arrays (in microseconds) instead of hardware capture buffers.
6
+ */
7
+ /** Default percentage tolerance for timing matches (±25%). */
8
+ export declare const kTolerance = 25;
9
+ /**
10
+ * Default mark excess in microseconds.
11
+ * Compensates for sensor lag: marks are captured too long, spaces too short.
12
+ * Set to 0 for ideal timings (encoder output); increase for real hardware.
13
+ */
14
+ export declare const kMarkExcess = 0;
15
+ /** Check if a measured timing is within tolerance of a desired value. */
16
+ export declare function matchTiming(measured: number, desired: number, tolerance?: number, delta?: number): boolean;
17
+ /**
18
+ * Match a mark (IR ON) timing.
19
+ * Adds excess to desired to compensate for marks being captured too long.
20
+ */
21
+ export declare function matchMark(measured: number, desired: number, tolerance?: number, excess?: number): boolean;
22
+ /**
23
+ * Match a space (IR OFF) timing.
24
+ * Subtracts excess from desired to compensate for spaces being too short.
25
+ */
26
+ export declare function matchSpace(measured: number, desired: number, tolerance?: number, excess?: number): boolean;
27
+ /**
28
+ * Match a timing that should be at least as long as desired.
29
+ * Used for trailing gaps which can be arbitrarily long.
30
+ */
31
+ export declare function matchAtLeast(measured: number, desired: number, tolerance?: number, delta?: number): boolean;
32
+ export interface MatchDataResult {
33
+ success: boolean;
34
+ data: bigint;
35
+ used: number;
36
+ }
37
+ /**
38
+ * Decode `nbits` of data from mark/space pairs in a timing array.
39
+ *
40
+ * Inverse of `encodeData`. Matches IRremoteESP8266 `IRrecv::matchData`.
41
+ */
42
+ export declare function matchData(timings: number[], offset: number, nbits: number, oneMark: number, oneSpace: number, zeroMark: number, zeroSpace: number, tolerance?: number, excess?: number, msbFirst?: boolean, expectLastSpace?: boolean): MatchDataResult;
43
+ export interface MatchGenericResult {
44
+ data: bigint;
45
+ used: number;
46
+ }
47
+ /**
48
+ * Generic IR frame decoder for protocols with ≤ 64 data bits.
49
+ *
50
+ * Inverse of `sendGeneric`. Matches IRremoteESP8266 `IRrecv::matchGeneric`.
51
+ *
52
+ * @returns Decoded data and entries consumed, or null on mismatch.
53
+ */
54
+ export declare function matchGeneric(timings: number[], offset: number, remaining: number, nbits: number, headerMark: number, headerSpace: number, oneMark: number, oneSpace: number, zeroMark: number, zeroSpace: number, footerMark: number, footerSpace: number, atLeast?: boolean, tolerance?: number, excess?: number, msbFirst?: boolean, headerOptional?: boolean): MatchGenericResult | null;
55
+ export interface MatchGenericBytesResult {
56
+ data: Uint8Array;
57
+ used: number;
58
+ }
59
+ /**
60
+ * Generic IR frame decoder for byte-array protocols (AC protocols).
61
+ *
62
+ * Inverse of `sendGenericBytes`. Decodes each byte individually (8 bits).
63
+ *
64
+ * @returns Decoded byte array and entries consumed, or null on mismatch.
65
+ */
66
+ export declare function matchGenericBytes(timings: number[], offset: number, remaining: number, nbytes: number, headerMark: number, headerSpace: number, oneMark: number, oneSpace: number, zeroMark: number, zeroSpace: number, footerMark: number, footerSpace: number, atLeast?: boolean, tolerance?: number, excess?: number, msbFirst?: boolean, headerOptional?: boolean): MatchGenericBytesResult | null;
67
+ import type { NECDecodeResult } from "./protocols/nec.js";
68
+ import type { Daikin64State } from "./protocols/daikin64.js";
69
+ import type { Daikin128State } from "./protocols/daikin128.js";
70
+ import type { Daikin152State } from "./protocols/daikin152.js";
71
+ import type { Daikin160State } from "./protocols/daikin160.js";
72
+ import type { Daikin176State } from "./protocols/daikin176.js";
73
+ import type { Daikin216State } from "./protocols/daikin216.js";
74
+ import type { DaikinESPState } from "./protocols/daikin.js";
75
+ import type { Daikin2State } from "./protocols/daikin2.js";
76
+ import type { Daikin312State } from "./protocols/daikin312.js";
77
+ import type { CoolixState } from "./protocols/coolix.js";
78
+ /** All supported protocol names. */
79
+ export type ProtocolName = "nec" | "daikin64" | "daikin128" | "daikin152" | "daikin160" | "daikin176" | "daikin216" | "daikin" | "daikin2" | "daikin312" | "coolix";
80
+ /** Brand groupings for hint-based filtering. */
81
+ export type BrandName = "nec" | "daikin" | "coolix";
82
+ /** Protocol type groupings. */
83
+ export type ProtocolType = "ac" | "simple";
84
+ /** Discriminated union of all possible decode results. */
85
+ export type DecodeResult = {
86
+ protocol: "nec";
87
+ brand: "nec";
88
+ type: "simple";
89
+ state: NECDecodeResult;
90
+ confidence: "timing_match";
91
+ } | {
92
+ protocol: "daikin64";
93
+ brand: "daikin";
94
+ type: "ac";
95
+ state: Daikin64State;
96
+ confidence: "checksum_valid";
97
+ } | {
98
+ protocol: "daikin128";
99
+ brand: "daikin";
100
+ type: "ac";
101
+ state: Daikin128State;
102
+ confidence: "checksum_valid";
103
+ } | {
104
+ protocol: "daikin152";
105
+ brand: "daikin";
106
+ type: "ac";
107
+ state: Daikin152State;
108
+ confidence: "checksum_valid";
109
+ } | {
110
+ protocol: "daikin160";
111
+ brand: "daikin";
112
+ type: "ac";
113
+ state: Daikin160State;
114
+ confidence: "checksum_valid";
115
+ } | {
116
+ protocol: "daikin176";
117
+ brand: "daikin";
118
+ type: "ac";
119
+ state: Daikin176State;
120
+ confidence: "checksum_valid";
121
+ } | {
122
+ protocol: "daikin216";
123
+ brand: "daikin";
124
+ type: "ac";
125
+ state: Daikin216State;
126
+ confidence: "checksum_valid";
127
+ } | {
128
+ protocol: "daikin";
129
+ brand: "daikin";
130
+ type: "ac";
131
+ state: DaikinESPState;
132
+ confidence: "checksum_valid";
133
+ } | {
134
+ protocol: "daikin2";
135
+ brand: "daikin";
136
+ type: "ac";
137
+ state: Daikin2State;
138
+ confidence: "checksum_valid";
139
+ } | {
140
+ protocol: "daikin312";
141
+ brand: "daikin";
142
+ type: "ac";
143
+ state: Daikin312State;
144
+ confidence: "checksum_valid";
145
+ } | {
146
+ protocol: "coolix";
147
+ brand: "coolix";
148
+ type: "ac";
149
+ state: CoolixState;
150
+ confidence: "checksum_valid";
151
+ } | {
152
+ protocol: "coolix";
153
+ brand: "coolix";
154
+ type: "ac";
155
+ state: null;
156
+ raw: number;
157
+ confidence: "checksum_valid";
158
+ };
159
+ export interface DecodeOptions {
160
+ /** Try only this specific protocol. */
161
+ protocol?: ProtocolName;
162
+ /** Try only protocols from this brand. */
163
+ brand?: BrandName;
164
+ /** Try only protocols of this type. */
165
+ type?: ProtocolType;
166
+ }
167
+ /**
168
+ * Unified IR decode dispatcher.
169
+ *
170
+ * Uses a 3-tier strategy to handle real-world hardware captures where
171
+ * headers may be missing:
172
+ *
173
+ * 1. **Header match at offset 0** — fastest path, handles intact captures.
174
+ * 2. **Find repeat frame** — scan for inter-frame gaps, try after each gap
175
+ * with header required. Handles missing first-frame headers.
176
+ * 3. **Brute force, header optional** — try at offset 0 relying solely on
177
+ * checksum/parity validation. Handles single-frame headerless captures.
178
+ *
179
+ * @param timings Raw mark/space timing array in microseconds.
180
+ * @param options Optional hints to narrow the search.
181
+ * @returns The first matching protocol's decode result, or null.
182
+ */
183
+ export declare function decode(timings: number[], options?: DecodeOptions): DecodeResult | null;
184
+ //# sourceMappingURL=decode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.d.ts","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Core IR decoding engine.
3
+ *
4
+ * Mirrors the decoding logic of IRremoteESP8266's IRrecv, but operates
5
+ * on plain timing arrays (in microseconds) instead of hardware capture buffers.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Constants
9
+ // ---------------------------------------------------------------------------
10
+ /** Default percentage tolerance for timing matches (±25%). */
11
+ export const kTolerance = 25;
12
+ /**
13
+ * Default mark excess in microseconds.
14
+ * Compensates for sensor lag: marks are captured too long, spaces too short.
15
+ * Set to 0 for ideal timings (encoder output); increase for real hardware.
16
+ */
17
+ export const kMarkExcess = 0;
18
+ // ---------------------------------------------------------------------------
19
+ // Tolerance bounds (internal)
20
+ // ---------------------------------------------------------------------------
21
+ /** Lower bound: desired × (1 − tolerance%) − delta, clamped to 0. */
22
+ function ticksLow(usecs, tolerance, delta = 0) {
23
+ return Math.max(Math.floor(usecs * (1.0 - tolerance / 100.0) - delta), 0);
24
+ }
25
+ /** Upper bound: desired × (1 + tolerance%) + 1 + delta. */
26
+ function ticksHigh(usecs, tolerance, delta = 0) {
27
+ return Math.floor(usecs * (1.0 + tolerance / 100.0)) + 1 + delta;
28
+ }
29
+ // ---------------------------------------------------------------------------
30
+ // Match functions
31
+ // ---------------------------------------------------------------------------
32
+ /** Check if a measured timing is within tolerance of a desired value. */
33
+ export function matchTiming(measured, desired, tolerance = kTolerance, delta = 0) {
34
+ return measured >= ticksLow(desired, tolerance, delta) &&
35
+ measured <= ticksHigh(desired, tolerance, delta);
36
+ }
37
+ /**
38
+ * Match a mark (IR ON) timing.
39
+ * Adds excess to desired to compensate for marks being captured too long.
40
+ */
41
+ export function matchMark(measured, desired, tolerance = kTolerance, excess = kMarkExcess) {
42
+ return matchTiming(measured, desired + excess, tolerance);
43
+ }
44
+ /**
45
+ * Match a space (IR OFF) timing.
46
+ * Subtracts excess from desired to compensate for spaces being too short.
47
+ */
48
+ export function matchSpace(measured, desired, tolerance = kTolerance, excess = kMarkExcess) {
49
+ return matchTiming(measured, desired - excess, tolerance);
50
+ }
51
+ /**
52
+ * Match a timing that should be at least as long as desired.
53
+ * Used for trailing gaps which can be arbitrarily long.
54
+ */
55
+ export function matchAtLeast(measured, desired, tolerance = kTolerance, delta = 0) {
56
+ if (measured === 0)
57
+ return true;
58
+ return measured >= ticksLow(desired, tolerance, delta);
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Bit-level reversal for bigint (internal)
62
+ // ---------------------------------------------------------------------------
63
+ function reverseBitsBigInt(input, nbits) {
64
+ if (nbits <= 1)
65
+ return input;
66
+ let output = 0n;
67
+ let inp = input;
68
+ for (let i = 0; i < nbits; i++) {
69
+ output = (output << 1n) | (inp & 1n);
70
+ inp >>= 1n;
71
+ }
72
+ return (inp << BigInt(nbits)) | output;
73
+ }
74
+ /**
75
+ * Decode `nbits` of data from mark/space pairs in a timing array.
76
+ *
77
+ * Inverse of `encodeData`. Matches IRremoteESP8266 `IRrecv::matchData`.
78
+ */
79
+ export function matchData(timings, offset, nbits, oneMark, oneSpace, zeroMark, zeroSpace, tolerance = kTolerance, excess = kMarkExcess, msbFirst = true, expectLastSpace = true) {
80
+ let data = 0n;
81
+ let pos = offset;
82
+ for (let i = 0; i < nbits; i++) {
83
+ if (pos >= timings.length) {
84
+ return { success: false, data: 0n, used: pos - offset };
85
+ }
86
+ const isLast = i === nbits - 1;
87
+ const mark = timings[pos];
88
+ if (isLast && !expectLastSpace) {
89
+ // Last bit without trailing space: match mark only.
90
+ if (matchMark(mark, oneMark, tolerance, excess)) {
91
+ data = (data << 1n) | 1n;
92
+ }
93
+ else if (matchMark(mark, zeroMark, tolerance, excess)) {
94
+ data = data << 1n;
95
+ }
96
+ else {
97
+ if (!msbFirst)
98
+ data = reverseBitsBigInt(data, i);
99
+ return { success: false, data, used: pos - offset };
100
+ }
101
+ pos++;
102
+ }
103
+ else {
104
+ // Normal bit: mark + space.
105
+ if (pos + 1 >= timings.length) {
106
+ return { success: false, data: 0n, used: pos - offset };
107
+ }
108
+ const space = timings[pos + 1];
109
+ if (matchMark(mark, oneMark, tolerance, excess) &&
110
+ matchSpace(space, oneSpace, tolerance, excess)) {
111
+ data = (data << 1n) | 1n;
112
+ }
113
+ else if (matchMark(mark, zeroMark, tolerance, excess) &&
114
+ matchSpace(space, zeroSpace, tolerance, excess)) {
115
+ data = data << 1n;
116
+ }
117
+ else {
118
+ if (!msbFirst)
119
+ data = reverseBitsBigInt(data, i);
120
+ return { success: false, data, used: pos - offset };
121
+ }
122
+ pos += 2;
123
+ }
124
+ }
125
+ if (!msbFirst)
126
+ data = reverseBitsBigInt(data, nbits);
127
+ return { success: true, data, used: pos - offset };
128
+ }
129
+ /**
130
+ * Generic IR frame decoder for protocols with ≤ 64 data bits.
131
+ *
132
+ * Inverse of `sendGeneric`. Matches IRremoteESP8266 `IRrecv::matchGeneric`.
133
+ *
134
+ * @returns Decoded data and entries consumed, or null on mismatch.
135
+ */
136
+ export function matchGeneric(timings, offset, remaining, nbits, headerMark, headerSpace, oneMark, oneSpace, zeroMark, zeroSpace, footerMark, footerSpace, atLeast = true, tolerance = kTolerance, excess = kMarkExcess, msbFirst = true, headerOptional = false) {
137
+ let pos = offset;
138
+ const end = offset + remaining;
139
+ // Header — consume if present, fail if required but missing.
140
+ if (headerMark || headerSpace) {
141
+ let tmp = pos;
142
+ let found = true;
143
+ if (headerMark) {
144
+ if (tmp < end && matchMark(timings[tmp], headerMark, tolerance, excess))
145
+ tmp++;
146
+ else
147
+ found = false;
148
+ }
149
+ if (found && headerSpace) {
150
+ if (tmp < end && matchSpace(timings[tmp], headerSpace, tolerance, excess))
151
+ tmp++;
152
+ else
153
+ found = false;
154
+ }
155
+ if (found)
156
+ pos = tmp;
157
+ else if (!headerOptional)
158
+ return null;
159
+ }
160
+ // Data bits
161
+ const expectLastSpace = !!footerMark || (oneSpace !== zeroSpace);
162
+ const dataResult = matchData(timings, pos, nbits, oneMark, oneSpace, zeroMark, zeroSpace, tolerance, excess, msbFirst, expectLastSpace);
163
+ if (!dataResult.success)
164
+ return null;
165
+ pos += dataResult.used;
166
+ // Footer mark
167
+ if (footerMark) {
168
+ if (pos >= end)
169
+ return null;
170
+ if (!matchMark(timings[pos], footerMark, tolerance, excess))
171
+ return null;
172
+ pos++;
173
+ }
174
+ // Footer space
175
+ if (footerSpace && pos < end) {
176
+ if (atLeast) {
177
+ if (!matchAtLeast(timings[pos], footerSpace, tolerance))
178
+ return null;
179
+ }
180
+ else {
181
+ if (!matchSpace(timings[pos], footerSpace, tolerance, excess))
182
+ return null;
183
+ }
184
+ pos++;
185
+ }
186
+ return { data: dataResult.data, used: pos - offset };
187
+ }
188
+ /**
189
+ * Generic IR frame decoder for byte-array protocols (AC protocols).
190
+ *
191
+ * Inverse of `sendGenericBytes`. Decodes each byte individually (8 bits).
192
+ *
193
+ * @returns Decoded byte array and entries consumed, or null on mismatch.
194
+ */
195
+ export function matchGenericBytes(timings, offset, remaining, nbytes, headerMark, headerSpace, oneMark, oneSpace, zeroMark, zeroSpace, footerMark, footerSpace, atLeast = true, tolerance = kTolerance, excess = kMarkExcess, msbFirst = true, headerOptional = false) {
196
+ let pos = offset;
197
+ const end = offset + remaining;
198
+ // Header — consume if present, fail if required but missing.
199
+ if (headerMark || headerSpace) {
200
+ let tmp = pos;
201
+ let found = true;
202
+ if (headerMark) {
203
+ if (tmp < end && matchMark(timings[tmp], headerMark, tolerance, excess))
204
+ tmp++;
205
+ else
206
+ found = false;
207
+ }
208
+ if (found && headerSpace) {
209
+ if (tmp < end && matchSpace(timings[tmp], headerSpace, tolerance, excess))
210
+ tmp++;
211
+ else
212
+ found = false;
213
+ }
214
+ if (found)
215
+ pos = tmp;
216
+ else if (!headerOptional)
217
+ return null;
218
+ }
219
+ // Data bytes — decode each byte as 8 bits.
220
+ const data = new Uint8Array(nbytes);
221
+ const expectLastSpace = !!footerMark || (oneSpace !== zeroSpace);
222
+ for (let i = 0; i < nbytes; i++) {
223
+ const isLastByte = i === nbytes - 1;
224
+ const byteResult = matchData(timings, pos, 8, oneMark, oneSpace, zeroMark, zeroSpace, tolerance, excess, msbFirst, isLastByte ? expectLastSpace : true);
225
+ if (!byteResult.success)
226
+ return null;
227
+ data[i] = Number(byteResult.data & 0xffn);
228
+ pos += byteResult.used;
229
+ }
230
+ // Footer mark
231
+ if (footerMark) {
232
+ if (pos >= end)
233
+ return null;
234
+ if (!matchMark(timings[pos], footerMark, tolerance, excess))
235
+ return null;
236
+ pos++;
237
+ }
238
+ // Footer space
239
+ if (footerSpace && pos < end) {
240
+ if (atLeast) {
241
+ if (!matchAtLeast(timings[pos], footerSpace, tolerance))
242
+ return null;
243
+ }
244
+ else {
245
+ if (!matchSpace(timings[pos], footerSpace, tolerance, excess))
246
+ return null;
247
+ }
248
+ pos++;
249
+ }
250
+ return { data, used: pos - offset };
251
+ }
252
+ // ---------------------------------------------------------------------------
253
+ // Unified decode dispatcher
254
+ // ---------------------------------------------------------------------------
255
+ // Import all protocol decoders lazily to avoid circular deps — they import
256
+ // from this file, so we re-export them through the registry pattern below.
257
+ import { decodeNEC } from "./protocols/nec.js";
258
+ import { decodeDaikin64 } from "./protocols/daikin64.js";
259
+ import { decodeDaikin128 } from "./protocols/daikin128.js";
260
+ import { decodeDaikin152 } from "./protocols/daikin152.js";
261
+ import { decodeDaikin160 } from "./protocols/daikin160.js";
262
+ import { decodeDaikin176 } from "./protocols/daikin176.js";
263
+ import { decodeDaikin216 } from "./protocols/daikin216.js";
264
+ import { decodeDaikinESP } from "./protocols/daikin.js";
265
+ import { decodeDaikin2 } from "./protocols/daikin2.js";
266
+ import { decodeDaikin312 } from "./protocols/daikin312.js";
267
+ import { decodeCoolix, decodeCoolixRaw } from "./protocols/coolix.js";
268
+ /** Threshold for detecting inter-frame gaps (µs). Data spaces are <2000µs
269
+ * for all supported protocols; gaps are >3000µs. */
270
+ const GAP_THRESHOLD = 3000;
271
+ const PROTOCOL_REGISTRY = [
272
+ // AC protocols first (more common use case)
273
+ {
274
+ protocol: "coolix", brand: "coolix", type: "ac",
275
+ tryDecode(timings, offset, headerOptional) {
276
+ const state = decodeCoolix(timings, offset, headerOptional);
277
+ if (state)
278
+ return { protocol: "coolix", brand: "coolix", type: "ac", state, confidence: "checksum_valid" };
279
+ // Also try raw decode for command codes
280
+ const raw = decodeCoolixRaw(timings, offset, headerOptional);
281
+ if (raw)
282
+ return { protocol: "coolix", brand: "coolix", type: "ac", state: null, raw: raw.data, confidence: "checksum_valid" };
283
+ return null;
284
+ },
285
+ },
286
+ {
287
+ protocol: "daikin152", brand: "daikin", type: "ac",
288
+ tryDecode(timings, offset, ho) {
289
+ const s = decodeDaikin152(timings, offset, ho);
290
+ return s ? { protocol: "daikin152", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
291
+ },
292
+ },
293
+ {
294
+ protocol: "daikin216", brand: "daikin", type: "ac",
295
+ tryDecode(timings, offset, ho) {
296
+ const s = decodeDaikin216(timings, offset, ho);
297
+ return s ? { protocol: "daikin216", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
298
+ },
299
+ },
300
+ {
301
+ protocol: "daikin160", brand: "daikin", type: "ac",
302
+ tryDecode(timings, offset, ho) {
303
+ const s = decodeDaikin160(timings, offset, ho);
304
+ return s ? { protocol: "daikin160", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
305
+ },
306
+ },
307
+ {
308
+ protocol: "daikin176", brand: "daikin", type: "ac",
309
+ tryDecode(timings, offset, ho) {
310
+ const s = decodeDaikin176(timings, offset, ho);
311
+ return s ? { protocol: "daikin176", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
312
+ },
313
+ },
314
+ {
315
+ protocol: "daikin64", brand: "daikin", type: "ac",
316
+ tryDecode(timings, offset, ho) {
317
+ const s = decodeDaikin64(timings, offset, ho);
318
+ return s ? { protocol: "daikin64", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
319
+ },
320
+ },
321
+ {
322
+ protocol: "daikin128", brand: "daikin", type: "ac",
323
+ tryDecode(timings, offset, ho) {
324
+ const s = decodeDaikin128(timings, offset, ho);
325
+ return s ? { protocol: "daikin128", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
326
+ },
327
+ },
328
+ {
329
+ protocol: "daikin", brand: "daikin", type: "ac",
330
+ tryDecode(timings, offset, ho) {
331
+ const s = decodeDaikinESP(timings, offset, ho);
332
+ return s ? { protocol: "daikin", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
333
+ },
334
+ },
335
+ {
336
+ protocol: "daikin2", brand: "daikin", type: "ac",
337
+ tryDecode(timings, offset, ho) {
338
+ const s = decodeDaikin2(timings, offset, ho);
339
+ return s ? { protocol: "daikin2", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
340
+ },
341
+ },
342
+ {
343
+ protocol: "daikin312", brand: "daikin", type: "ac",
344
+ tryDecode(timings, offset, ho) {
345
+ const s = decodeDaikin312(timings, offset, ho);
346
+ return s ? { protocol: "daikin312", brand: "daikin", type: "ac", state: s, confidence: "checksum_valid" } : null;
347
+ },
348
+ },
349
+ // Simple protocols last
350
+ {
351
+ protocol: "nec", brand: "nec", type: "simple",
352
+ tryDecode(timings, offset, ho) {
353
+ const s = decodeNEC(timings, offset, undefined, undefined, ho);
354
+ return s ? { protocol: "nec", brand: "nec", type: "simple", state: s, confidence: "timing_match" } : null;
355
+ },
356
+ },
357
+ ];
358
+ /**
359
+ * Unified IR decode dispatcher.
360
+ *
361
+ * Uses a 3-tier strategy to handle real-world hardware captures where
362
+ * headers may be missing:
363
+ *
364
+ * 1. **Header match at offset 0** — fastest path, handles intact captures.
365
+ * 2. **Find repeat frame** — scan for inter-frame gaps, try after each gap
366
+ * with header required. Handles missing first-frame headers.
367
+ * 3. **Brute force, header optional** — try at offset 0 relying solely on
368
+ * checksum/parity validation. Handles single-frame headerless captures.
369
+ *
370
+ * @param timings Raw mark/space timing array in microseconds.
371
+ * @param options Optional hints to narrow the search.
372
+ * @returns The first matching protocol's decode result, or null.
373
+ */
374
+ export function decode(timings, options) {
375
+ const candidates = filterCandidates(options);
376
+ if (candidates.length === 0)
377
+ return null;
378
+ // Tier 1: header required at offset 0
379
+ for (const entry of candidates) {
380
+ const result = entry.tryDecode(timings, 0, false);
381
+ if (result)
382
+ return result;
383
+ }
384
+ // Tier 2: find repeat frames (scan for gaps, try after each)
385
+ for (let i = 1; i < timings.length - 1; i += 2) {
386
+ // Gaps are spaces (odd indices in a mark-start array), but hardware
387
+ // captures with missing headers may shift parity. Check all entries.
388
+ if (timings[i] >= GAP_THRESHOLD) {
389
+ const afterGap = i + 1;
390
+ if (afterGap >= timings.length)
391
+ continue;
392
+ for (const entry of candidates) {
393
+ const result = entry.tryDecode(timings, afterGap, false);
394
+ if (result)
395
+ return result;
396
+ }
397
+ }
398
+ }
399
+ // Tier 3: brute force at offset 0, header optional
400
+ for (const entry of candidates) {
401
+ const result = entry.tryDecode(timings, 0, true);
402
+ if (result)
403
+ return result;
404
+ }
405
+ return null;
406
+ }
407
+ function filterCandidates(options) {
408
+ if (!options)
409
+ return PROTOCOL_REGISTRY;
410
+ return PROTOCOL_REGISTRY.filter((entry) => {
411
+ if (options.protocol && entry.protocol !== options.protocol)
412
+ return false;
413
+ if (options.brand && entry.brand !== options.brand)
414
+ return false;
415
+ if (options.type && entry.type !== options.type)
416
+ return false;
417
+ return true;
418
+ });
419
+ }
420
+ //# sourceMappingURL=decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.js","sourceRoot":"","sources":["../../src/decode.ts"],"names":[],"mappings":"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"}