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,331 @@
1
+ "use strict";
2
+ /**
3
+ * Coolix IR protocol encoder and decoder.
4
+ *
5
+ * Ported from IRremoteESP8266 `ir_Coolix.cpp` / `ir_Coolix.h`.
6
+ *
7
+ * Wire format: 24-bit data sent as 3 bytes MSB-first, each byte
8
+ * followed by its bitwise inverse (48 bits total on the wire).
9
+ *
10
+ * @see https://github.com/crankyoldgit/IRremoteESP8266/issues/484
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.CoolixCommand = exports.CoolixFan = exports.CoolixMode = void 0;
14
+ exports.buildCoolixRaw = buildCoolixRaw;
15
+ exports.encodeCoolixRaw = encodeCoolixRaw;
16
+ exports.sendCoolix = sendCoolix;
17
+ exports.decodeCoolixRaw = decodeCoolixRaw;
18
+ exports.parseCoolixState = parseCoolixState;
19
+ exports.decodeCoolix = decodeCoolix;
20
+ const encode_js_1 = require("../encode.js");
21
+ const decode_js_1 = require("../decode.js");
22
+ // ---------------------------------------------------------------------------
23
+ // Timing constants — must match ir_Coolix.h exactly
24
+ // ---------------------------------------------------------------------------
25
+ const COOLIX_TICK = 276;
26
+ const COOLIX_HDR_MARK = 17 * COOLIX_TICK; // 4692
27
+ const COOLIX_HDR_SPACE = 16 * COOLIX_TICK; // 4416
28
+ const COOLIX_BIT_MARK = 2 * COOLIX_TICK; // 552
29
+ const COOLIX_ONE_SPACE = 6 * COOLIX_TICK; // 1656
30
+ const COOLIX_ZERO_SPACE = 2 * COOLIX_TICK; // 552
31
+ const COOLIX_MIN_GAP = 19 * COOLIX_TICK; // 5244
32
+ /** Extra tolerance for Coolix decode — matches kCoolixExtraTolerance in C++. */
33
+ const COOLIX_TOLERANCE = 30; // 25% default + 5% extra
34
+ const COOLIX_FAN_TEMP_CODE = 0b1110;
35
+ const COOLIX_SENSOR_TEMP_IGNORE = 0x1F; // 31
36
+ // ---------------------------------------------------------------------------
37
+ // Temperature lookup table (index = degrees - 17, value = 4-bit code)
38
+ // ---------------------------------------------------------------------------
39
+ const COOLIX_TEMP_MAP = [
40
+ 0b0000, // 17°C
41
+ 0b0001, // 18°C
42
+ 0b0011, // 19°C
43
+ 0b0010, // 20°C
44
+ 0b0110, // 21°C
45
+ 0b0111, // 22°C
46
+ 0b0101, // 23°C
47
+ 0b0100, // 24°C
48
+ 0b1100, // 25°C
49
+ 0b1101, // 26°C
50
+ 0b1001, // 27°C
51
+ 0b1000, // 28°C
52
+ 0b1010, // 29°C
53
+ 0b1011, // 30°C
54
+ ];
55
+ /** Reverse lookup: 4-bit code → degrees C (undefined for invalid codes). */
56
+ const COOLIX_CODE_TO_TEMP = [];
57
+ for (let i = 0; i < COOLIX_TEMP_MAP.length; i++) {
58
+ COOLIX_CODE_TO_TEMP[COOLIX_TEMP_MAP[i]] = i + 17;
59
+ }
60
+ // ---------------------------------------------------------------------------
61
+ // Mode constants
62
+ // ---------------------------------------------------------------------------
63
+ exports.CoolixMode = {
64
+ Cool: 0b00,
65
+ Dry: 0b01,
66
+ Auto: 0b10,
67
+ Heat: 0b11,
68
+ /** Synthetic mode: encoded as Dry + special temp code on the wire. */
69
+ Fan: 0b100,
70
+ };
71
+ // ---------------------------------------------------------------------------
72
+ // Fan constants
73
+ // ---------------------------------------------------------------------------
74
+ exports.CoolixFan = {
75
+ Auto0: 0b000,
76
+ Max: 0b001,
77
+ Med: 0b010,
78
+ Min: 0b100,
79
+ Auto: 0b101,
80
+ ZoneFollow: 0b110,
81
+ Fixed: 0b111,
82
+ };
83
+ // ---------------------------------------------------------------------------
84
+ // Fixed command codes
85
+ // ---------------------------------------------------------------------------
86
+ exports.CoolixCommand = {
87
+ Off: 0xB27BE0,
88
+ Swing: 0xB26BE0,
89
+ SwingH: 0xB5F5A2,
90
+ SwingV: 0xB20FE0,
91
+ Sleep: 0xB2E003,
92
+ Turbo: 0xB5F5A2,
93
+ Led: 0xB5F5A5,
94
+ Clean: 0xB5F5AA,
95
+ CmdFan: 0xB2BFE4,
96
+ };
97
+ /** Toggle/special commands that don't encode AC state. CmdFan is excluded
98
+ * because it IS a valid fan-mode state frame (Dry + temp 0xE). */
99
+ const COMMAND_SET = new Set([
100
+ exports.CoolixCommand.Off,
101
+ exports.CoolixCommand.Swing,
102
+ exports.CoolixCommand.SwingH,
103
+ exports.CoolixCommand.SwingV,
104
+ exports.CoolixCommand.Sleep,
105
+ exports.CoolixCommand.Turbo,
106
+ exports.CoolixCommand.Led,
107
+ exports.CoolixCommand.Clean,
108
+ ]);
109
+ // ---------------------------------------------------------------------------
110
+ // Encode
111
+ // ---------------------------------------------------------------------------
112
+ const COOLIX_DEFAULT_STATE = 0xB21FC8;
113
+ const COOLIX_TEMP_MIN = 17;
114
+ const COOLIX_TEMP_MAX = 30;
115
+ /**
116
+ * Build a raw 24-bit Coolix code from a state object.
117
+ */
118
+ function buildCoolixRaw(state) {
119
+ let raw = COOLIX_DEFAULT_STATE;
120
+ // Fixed upper nibble 0xB (bits 20-23)
121
+ raw = (raw & ~(0xF << 20)) | (0xB << 20);
122
+ // Mode (bits 2-3)
123
+ let mode = state.mode ?? exports.CoolixMode.Auto;
124
+ let tempCode;
125
+ if (mode === exports.CoolixMode.Fan) {
126
+ // Fan is synthetic: Dry mode + special temp code
127
+ raw = (raw & ~(0x3 << 2)) | (exports.CoolixMode.Dry << 2);
128
+ tempCode = COOLIX_FAN_TEMP_CODE;
129
+ }
130
+ else {
131
+ if (mode !== exports.CoolixMode.Cool && mode !== exports.CoolixMode.Dry &&
132
+ mode !== exports.CoolixMode.Auto && mode !== exports.CoolixMode.Heat) {
133
+ mode = exports.CoolixMode.Auto;
134
+ }
135
+ raw = (raw & ~(0x3 << 2)) | (mode << 2);
136
+ // Temp (bits 4-7)
137
+ const temp = Math.min(Math.max(state.temp ?? 25, COOLIX_TEMP_MIN), COOLIX_TEMP_MAX);
138
+ tempCode = COOLIX_TEMP_MAP[temp - COOLIX_TEMP_MIN];
139
+ }
140
+ raw = (raw & ~(0xF << 4)) | (tempCode << 4);
141
+ // Fan (bits 13-15) — with mode-dependent Auto/Auto0 adjustment.
142
+ // Only Auto and Dry modes use Auto0; all others (Cool, Heat, Fan) use Auto.
143
+ let fan = state.fan ?? exports.CoolixFan.Auto0;
144
+ switch (fan) {
145
+ case exports.CoolixFan.Auto:
146
+ // Auto (5) not valid in Dry/Auto mode → convert to Auto0 (0)
147
+ if (mode === exports.CoolixMode.Auto || mode === exports.CoolixMode.Dry) {
148
+ fan = exports.CoolixFan.Auto0;
149
+ }
150
+ break;
151
+ case exports.CoolixFan.Auto0:
152
+ // Auto0 (0) only valid in Dry/Auto mode → convert to Auto (5) for others
153
+ if (mode !== exports.CoolixMode.Auto && mode !== exports.CoolixMode.Dry) {
154
+ fan = exports.CoolixFan.Auto;
155
+ }
156
+ break;
157
+ case exports.CoolixFan.Min:
158
+ case exports.CoolixFan.Med:
159
+ case exports.CoolixFan.Max:
160
+ case exports.CoolixFan.ZoneFollow:
161
+ case exports.CoolixFan.Fixed:
162
+ break;
163
+ default:
164
+ fan = exports.CoolixFan.Auto;
165
+ }
166
+ raw = (raw & ~(0x7 << 13)) | ((fan & 0x7) << 13);
167
+ // SensorTemp (bits 8-12)
168
+ const sensorTemp = state.sensorTemp !== undefined
169
+ ? Math.min(Math.max(state.sensorTemp, 0), 30)
170
+ : COOLIX_SENSOR_TEMP_IGNORE;
171
+ raw = (raw & ~(0x1F << 8)) | (sensorTemp << 8);
172
+ // ZoneFollow (bits 1 and 19)
173
+ const zf = state.zoneFollow ?? false;
174
+ if (zf) {
175
+ raw |= (1 << 1); // ZoneFollow1
176
+ raw |= (1 << 19); // ZoneFollow2
177
+ }
178
+ else {
179
+ raw &= ~(1 << 1);
180
+ raw &= ~(1 << 19);
181
+ }
182
+ return raw >>> 0; // Ensure unsigned
183
+ }
184
+ /**
185
+ * Encode a raw 24-bit Coolix code into IR timings.
186
+ *
187
+ * Each of the 3 data bytes is sent normal then inverted (MSB-first).
188
+ * Matches IRremoteESP8266 `IRsend::sendCOOLIX`.
189
+ */
190
+ function encodeCoolixRaw(data, repeat = 1) {
191
+ const result = [];
192
+ for (let r = 0; r <= repeat; r++) {
193
+ // Header
194
+ result.push(COOLIX_HDR_MARK, COOLIX_HDR_SPACE);
195
+ // Data: 3 bytes MSB-first, each followed by inverse
196
+ for (let i = 16; i >= 0; i -= 8) {
197
+ const byte = (data >> i) & 0xFF;
198
+ // Normal byte
199
+ const normal = (0, encode_js_1.encodeData)(COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, BigInt(byte), 8, true);
200
+ for (let j = 0; j < normal.length; j++)
201
+ result.push(normal[j]);
202
+ // Inverted byte
203
+ const inverted = (0, encode_js_1.encodeData)(COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, BigInt(byte ^ 0xFF), 8, true);
204
+ for (let j = 0; j < inverted.length; j++)
205
+ result.push(inverted[j]);
206
+ }
207
+ // Footer
208
+ result.push(COOLIX_BIT_MARK, COOLIX_MIN_GAP);
209
+ }
210
+ return result;
211
+ }
212
+ /**
213
+ * Encode a Coolix AC state into raw IR timings.
214
+ */
215
+ function sendCoolix(state, repeat = 1) {
216
+ return encodeCoolixRaw(buildCoolixRaw(state), repeat);
217
+ }
218
+ /**
219
+ * Decode raw IR timings into a 24-bit Coolix code.
220
+ *
221
+ * Validates byte inversion parity for all 3 bytes.
222
+ *
223
+ * @returns Raw 24-bit code and entries consumed, or null on mismatch.
224
+ */
225
+ function decodeCoolixRaw(timings, offset = 0, headerOptional = false) {
226
+ let pos = offset;
227
+ const len = timings.length;
228
+ // Minimum: 48 data bits(96) + footer mark(1) = 97 entries (header may be optional)
229
+ if (len - offset < 97)
230
+ return null;
231
+ // Header — consume if present, fail if required but missing.
232
+ if (pos + 1 < len &&
233
+ (0, decode_js_1.matchMark)(timings[pos], COOLIX_HDR_MARK, COOLIX_TOLERANCE) &&
234
+ (0, decode_js_1.matchSpace)(timings[pos + 1], COOLIX_HDR_SPACE, COOLIX_TOLERANCE)) {
235
+ pos += 2;
236
+ }
237
+ else if (!headerOptional) {
238
+ return null;
239
+ }
240
+ // Decode 3 byte pairs (normal + inverted)
241
+ let data = 0;
242
+ for (let i = 0; i < 3; i++) {
243
+ // Normal byte (8 bits, MSB-first)
244
+ const normal = (0, decode_js_1.matchData)(timings, pos, 8, COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, COOLIX_TOLERANCE);
245
+ if (!normal.success)
246
+ return null;
247
+ pos += normal.used;
248
+ // Inverted byte (8 bits, MSB-first)
249
+ const inverted = (0, decode_js_1.matchData)(timings, pos, 8, COOLIX_BIT_MARK, COOLIX_ONE_SPACE, COOLIX_BIT_MARK, COOLIX_ZERO_SPACE, COOLIX_TOLERANCE);
250
+ if (!inverted.success)
251
+ return null;
252
+ pos += inverted.used;
253
+ // Validate inversion parity
254
+ const normalByte = Number(normal.data & 0xffn);
255
+ const invertedByte = Number(inverted.data & 0xffn);
256
+ if ((normalByte ^ 0xFF) !== invertedByte)
257
+ return null;
258
+ data = (data << 8) | normalByte;
259
+ }
260
+ // Footer mark
261
+ if (pos >= len)
262
+ return null;
263
+ if (!(0, decode_js_1.matchMark)(timings[pos], COOLIX_BIT_MARK, COOLIX_TOLERANCE))
264
+ return null;
265
+ pos++;
266
+ // Footer gap (optional — may be last frame)
267
+ if (pos < len) {
268
+ if (!(0, decode_js_1.matchAtLeast)(timings[pos], COOLIX_MIN_GAP, COOLIX_TOLERANCE))
269
+ return null;
270
+ pos++;
271
+ }
272
+ return { data: data >>> 0, used: pos - offset };
273
+ }
274
+ /**
275
+ * Parse a raw 24-bit Coolix code into a state object.
276
+ *
277
+ * Returns null for command codes (Off, Swing, Turbo, etc.) since
278
+ * they don't encode AC state.
279
+ */
280
+ function parseCoolixState(data) {
281
+ // Reject known command codes
282
+ if (COMMAND_SET.has(data))
283
+ return null;
284
+ const modeRaw = (data >> 2) & 0x3;
285
+ const tempCode = (data >> 4) & 0xF;
286
+ const fanRaw = (data >> 13) & 0x7;
287
+ const sensorTempRaw = (data >> 8) & 0x1F;
288
+ const zf1 = (data >> 1) & 1;
289
+ const zf2 = (data >> 19) & 1;
290
+ // Detect synthetic Fan mode (Dry + special temp code)
291
+ let mode;
292
+ let temp;
293
+ if (modeRaw === exports.CoolixMode.Dry && tempCode === COOLIX_FAN_TEMP_CODE) {
294
+ mode = exports.CoolixMode.Fan;
295
+ temp = undefined;
296
+ }
297
+ else {
298
+ mode = modeRaw;
299
+ temp = COOLIX_CODE_TO_TEMP[tempCode];
300
+ if (temp === undefined)
301
+ return null; // Unknown temp code — not a state frame
302
+ }
303
+ const state = {
304
+ mode,
305
+ fan: fanRaw,
306
+ zoneFollow: !!(zf1 && zf2),
307
+ };
308
+ if (temp !== undefined)
309
+ state.temp = temp;
310
+ if (sensorTempRaw !== COOLIX_SENSOR_TEMP_IGNORE)
311
+ state.sensorTemp = sensorTempRaw;
312
+ return state;
313
+ }
314
+ /**
315
+ * Decode raw IR timings as a Coolix AC state.
316
+ *
317
+ * Returns null if the timings don't match Coolix protocol, or if
318
+ * the decoded code is a command (Off, Swing, etc.) rather than a state frame.
319
+ * Use {@link decodeCoolixRaw} to decode command codes.
320
+ *
321
+ * @param timings Raw mark/space timing array in microseconds.
322
+ * @param offset Starting index in the timings array (default 0).
323
+ * @returns Decoded state (same shape as encode input), or null.
324
+ */
325
+ function decodeCoolix(timings, offset = 0, headerOptional = false) {
326
+ const raw = decodeCoolixRaw(timings, offset, headerOptional);
327
+ if (!raw)
328
+ return null;
329
+ return parseCoolixState(raw.data);
330
+ }
331
+ //# sourceMappingURL=coolix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coolix.js","sourceRoot":"","sources":["../../../src/protocols/coolix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Daikin ESP / standard 280-bit (35-byte) IR protocol encoder.
3
+ *
4
+ * Header (5-bit) + 3 sections: bytes 0–7 (8) + bytes 8–15 (8) + bytes 16–34 (19).
5
+ * Ported from IRremoteESP8266 `ir_Daikin.cpp`.
6
+ */
7
+ import type { DaikinModeValue, DaikinFanValue } from "./daikin_common.js";
8
+ export { DaikinMode, DaikinFan } from "./daikin_common.js";
9
+ export interface DaikinESPState {
10
+ power?: boolean;
11
+ /** Temperature in °C (10–32). Supports 0.5°C increments. */
12
+ temp?: number;
13
+ mode?: DaikinModeValue;
14
+ fan?: DaikinFanValue;
15
+ swingVertical?: boolean;
16
+ swingHorizontal?: boolean;
17
+ quiet?: boolean;
18
+ powerful?: boolean;
19
+ econo?: boolean;
20
+ mold?: boolean;
21
+ comfort?: boolean;
22
+ sensor?: boolean;
23
+ /** Weekly timer enable. */
24
+ weeklyTimer?: boolean;
25
+ /** Current time in minutes past midnight (0–1439). */
26
+ currentTime?: number;
27
+ /** Current day of week (1=SUN..7=SAT). */
28
+ currentDay?: number;
29
+ /** On timer: minutes past midnight. Undefined = disabled. */
30
+ onTime?: number;
31
+ /** Off timer: minutes past midnight. Undefined = disabled. */
32
+ offTime?: number;
33
+ }
34
+ export declare function buildDaikinESPRaw(state: DaikinESPState): Uint8Array;
35
+ export declare function sendDaikinESP(state: DaikinESPState, repeat?: number): number[];
36
+ export declare function encodeDaikinESPRaw(data: Uint8Array, repeat?: number): number[];
37
+ /**
38
+ * Decode raw IR timings as a DaikinESP message.
39
+ *
40
+ * The 5-bit leader preamble is optional — hardware captures often miss it.
41
+ *
42
+ * @param timings Raw mark/space timing array in microseconds.
43
+ * @param offset Starting index in the timings array (default 0).
44
+ * @returns Decoded state (same shape as encode input), or null on mismatch.
45
+ */
46
+ export declare function decodeDaikinESP(timings: number[], offset?: number, headerOptional?: boolean): DaikinESPState | null;
47
+ //# sourceMappingURL=daikin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daikin.d.ts","sourceRoot":"","sources":["../../../src/protocols/daikin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAE1E,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAuB3D,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,eAAe,CAAC;IACvB,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,2BAA2B;IAC3B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,6DAA6D;IAC7D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8DAA8D;IAC9D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuDD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU,CAyFnE;AAMD,wBAAgB,aAAa,CAAC,KAAK,EAAE,cAAc,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAEzE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,SAAI,GAAG,MAAM,EAAE,CAiCzE;AAgDD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,GAAE,MAAU,EAClB,cAAc,GAAE,OAAe,GAC9B,cAAc,GAAG,IAAI,CAmIvB"}