@johntalton/ftdi 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +89 -0
  3. package/lib/consts.d.ts +33 -0
  4. package/lib/consts.d.ts.map +1 -0
  5. package/lib/consts.js +42 -0
  6. package/lib/consts.js.map +1 -0
  7. package/lib/eeprom.d.ts +129 -0
  8. package/lib/eeprom.d.ts.map +1 -0
  9. package/lib/eeprom.js +495 -0
  10. package/lib/eeprom.js.map +1 -0
  11. package/lib/ft232h.d.ts +37 -0
  12. package/lib/ft232h.d.ts.map +1 -0
  13. package/lib/ft232h.js +204 -0
  14. package/lib/ft232h.js.map +1 -0
  15. package/lib/ftdi.d.ts +37 -0
  16. package/lib/ftdi.d.ts.map +1 -0
  17. package/lib/ftdi.js +204 -0
  18. package/lib/ftdi.js.map +1 -0
  19. package/lib/i2c/i2c-template.d.ts +10 -0
  20. package/lib/i2c/i2c-template.d.ts.map +1 -0
  21. package/lib/i2c/i2c-template.js +122 -0
  22. package/lib/i2c/i2c-template.js.map +1 -0
  23. package/lib/i2c/i2c.d.ts +29 -0
  24. package/lib/i2c/i2c.d.ts.map +1 -0
  25. package/lib/i2c/i2c.js +169 -0
  26. package/lib/i2c/i2c.js.map +1 -0
  27. package/lib/i2c/index.d.ts +5 -0
  28. package/lib/i2c/index.d.ts.map +1 -0
  29. package/lib/i2c/index.js +5 -0
  30. package/lib/i2c/index.js.map +1 -0
  31. package/lib/i2c/range.d.ts +2 -0
  32. package/lib/i2c/range.d.ts.map +1 -0
  33. package/lib/i2c/range.js +6 -0
  34. package/lib/i2c/range.js.map +1 -0
  35. package/lib/index.d.ts +9 -0
  36. package/lib/index.d.ts.map +1 -0
  37. package/lib/index.js +9 -0
  38. package/lib/index.js.map +1 -0
  39. package/lib/mpsse/clock.d.ts +16 -0
  40. package/lib/mpsse/clock.d.ts.map +1 -0
  41. package/lib/mpsse/clock.js +34 -0
  42. package/lib/mpsse/clock.js.map +1 -0
  43. package/lib/mpsse/command.d.ts +66 -0
  44. package/lib/mpsse/command.d.ts.map +1 -0
  45. package/lib/mpsse/command.js +89 -0
  46. package/lib/mpsse/command.js.map +1 -0
  47. package/lib/mpsse/index.d.ts +7 -0
  48. package/lib/mpsse/index.d.ts.map +1 -0
  49. package/lib/mpsse/index.js +7 -0
  50. package/lib/mpsse/index.js.map +1 -0
  51. package/lib/mpsse/mpsse-template.d.ts +19 -0
  52. package/lib/mpsse/mpsse-template.d.ts.map +1 -0
  53. package/lib/mpsse/mpsse-template.js +81 -0
  54. package/lib/mpsse/mpsse-template.js.map +1 -0
  55. package/lib/mpsse/mpsse.d.ts +18 -0
  56. package/lib/mpsse/mpsse.d.ts.map +1 -0
  57. package/lib/mpsse/mpsse.js +77 -0
  58. package/lib/mpsse/mpsse.js.map +1 -0
  59. package/lib/status.d.ts +39 -0
  60. package/lib/status.d.ts.map +1 -0
  61. package/lib/status.js +62 -0
  62. package/lib/status.js.map +1 -0
  63. package/lib/util.d.ts +26 -0
  64. package/lib/util.d.ts.map +1 -0
  65. package/lib/util.js +57 -0
  66. package/lib/util.js.map +1 -0
  67. package/package.json +38 -0
  68. package/src/consts.ts +57 -0
  69. package/src/eeprom.ts +663 -0
  70. package/src/ftdi.ts +215 -0
  71. package/src/i2c/i2c-template.ts +156 -0
  72. package/src/i2c/i2c.ts +210 -0
  73. package/src/i2c/index.ts +4 -0
  74. package/src/i2c/range.ts +6 -0
  75. package/src/index.ts +8 -0
  76. package/src/mpsse/clock.ts +36 -0
  77. package/src/mpsse/command.ts +113 -0
  78. package/src/mpsse/index.ts +6 -0
  79. package/src/mpsse/mpsse-template.ts +96 -0
  80. package/src/mpsse/mpsse.ts +95 -0
  81. package/src/status.ts +94 -0
  82. package/src/util.ts +72 -0
package/lib/ft232h.js ADDED
@@ -0,0 +1,204 @@
1
+ import { REQUESTS, RESET_USB } from './consts.js';
2
+ import { MPSSE } from './mpsse/mpsse.js';
3
+ import { DeviceStatus, STATUS_PREFIX_LENGTH, } from './status.js';
4
+ export const USB_TRANSFER_OK = 'ok';
5
+ export const USB_TRANSFER_STALL = 'stall';
6
+ export const USB_TRANSFER_BABBLE = 'babble';
7
+ export const REQUEST_TYPE_VENDOR = 'vendor';
8
+ export const RECIPIENT_DEVICE = 'device';
9
+ export const INTERFACE_DIRECTION_IN = 'in';
10
+ export const INTERFACE_DIRECTION_OUT = 'out';
11
+ export const INTERFACE_TYPE_BULK = 'bulk';
12
+ export const DEFAULT_CONFIGURATION_NUMBER = 1;
13
+ export const DEFAULT_INTERFACE_NUMBER = 0;
14
+ export function assertDataViewNotShared(view) {
15
+ if (typeof SharedArrayBuffer !== 'undefined' && view.buffer instanceof SharedArrayBuffer) {
16
+ throw new TypeError('DataView cannot be backed by a SharedArrayBuffer');
17
+ }
18
+ }
19
+ export class FT232H {
20
+ #device;
21
+ #endpointBulkIn;
22
+ #endpointBulkOut;
23
+ #interfaceNumber;
24
+ #mpsse;
25
+ static async from(device) {
26
+ const { interfaceNumber, epIn, epOut } = await FT232H.#discoverEndpoints(device);
27
+ return new FT232H(device, interfaceNumber, epIn, epOut);
28
+ }
29
+ constructor(device, interfaceNumber, epIn, epOut) {
30
+ this.#device = device;
31
+ this.#endpointBulkIn = epIn;
32
+ this.#endpointBulkOut = epOut;
33
+ this.#interfaceNumber = interfaceNumber;
34
+ this.#mpsse = new MPSSE(this);
35
+ }
36
+ get mpsse() { return this.#mpsse; }
37
+ static async #discoverEndpoints(device) {
38
+ if (device.configuration === null) {
39
+ await device.selectConfiguration(DEFAULT_CONFIGURATION_NUMBER);
40
+ }
41
+ await device.claimInterface(DEFAULT_INTERFACE_NUMBER);
42
+ if (device.configuration === null) {
43
+ throw new Error('Configuration is NULL');
44
+ }
45
+ const { interfaces } = device.configuration;
46
+ const [iface] = interfaces;
47
+ if (iface === undefined) {
48
+ throw new Error('Interface is undefined');
49
+ }
50
+ const { alternate, interfaceNumber } = iface;
51
+ const { endpoints } = alternate;
52
+ const epIn = endpoints.find(ep => ep.direction === INTERFACE_DIRECTION_IN && ep.type === INTERFACE_TYPE_BULK);
53
+ const epOut = endpoints.find(ep => ep.direction === INTERFACE_DIRECTION_OUT && ep.type === INTERFACE_TYPE_BULK);
54
+ if (epIn === undefined) {
55
+ throw new Error('Endpoint In Bulk not found');
56
+ }
57
+ if (epOut === undefined) {
58
+ throw new Error('Endpoint Out Bulk not found');
59
+ }
60
+ return {
61
+ interfaceNumber,
62
+ epIn: epIn.endpointNumber,
63
+ epOut: epOut.endpointNumber
64
+ };
65
+ }
66
+ async #requestIn(request, length, index = undefined) {
67
+ return this.#device.controlTransferIn({
68
+ requestType: REQUEST_TYPE_VENDOR,
69
+ recipient: RECIPIENT_DEVICE,
70
+ request,
71
+ value: 0,
72
+ index: index ?? this.#interfaceNumber
73
+ }, length);
74
+ }
75
+ async #requestOut(request, value, index = undefined) {
76
+ return this.#device.controlTransferOut({
77
+ requestType: REQUEST_TYPE_VENDOR,
78
+ recipient: RECIPIENT_DEVICE,
79
+ request,
80
+ value,
81
+ index: index ?? this.#interfaceNumber
82
+ });
83
+ }
84
+ async reset(kind = RESET_USB.RESET) {
85
+ await this.#requestOut(REQUESTS.RESET, kind);
86
+ }
87
+ async setBitMode(mode) {
88
+ const gpioInit = 0;
89
+ const value = mode | gpioInit;
90
+ await this.#requestOut(REQUESTS.SET_BITMODE, value);
91
+ }
92
+ async getModemStatus() {
93
+ const status = await this.#requestIn(REQUESTS.POLL_MODEM_STATUS, STATUS_PREFIX_LENGTH);
94
+ if (status.status !== USB_TRANSFER_OK) {
95
+ throw new Error('status not ok');
96
+ }
97
+ if (status.data === undefined) {
98
+ throw new Error('undefined data');
99
+ }
100
+ assertDataViewNotShared(status.data);
101
+ return DeviceStatus.parse(status.data);
102
+ }
103
+ async getLatencyTimer() {
104
+ const result = await this.#requestIn(REQUESTS.GET_LATENCY_TIMER, 1);
105
+ if (result.status !== USB_TRANSFER_OK) {
106
+ throw new Error('status not ok');
107
+ }
108
+ if (result.data === undefined) {
109
+ throw new Error('undefined data');
110
+ }
111
+ const latency = result.data.getUint8(0);
112
+ return latency;
113
+ }
114
+ async setLatencyTimer(latency) {
115
+ if (!Number.isInteger(latency)) {
116
+ throw new TypeError('latency is not valid integer');
117
+ }
118
+ if (latency < 0 || latency > 255) {
119
+ throw new RangeError('latency out of range');
120
+ }
121
+ const result = await this.#requestOut(REQUESTS.SET_LATENCY_TIMER, latency);
122
+ if (result.status !== USB_TRANSFER_OK) {
123
+ throw new Error('status not ok');
124
+ }
125
+ }
126
+ async readPins() {
127
+ const result = await this.#requestIn(REQUESTS.READ_PINS, 1);
128
+ if (result.status !== USB_TRANSFER_OK) {
129
+ throw new Error('status not ok');
130
+ }
131
+ if (result.data === undefined) {
132
+ throw new Error('undefined data');
133
+ }
134
+ return result.data.getUint8(0);
135
+ }
136
+ async setModemControl(control) {
137
+ const DTR_ENABLE_BIT = 0x01_00;
138
+ const RTS_ENABLE_BIT = 0x02_00;
139
+ const DTR_SET = 0x01;
140
+ const RTS_SET = 0x02;
141
+ const setDTR = control.DataTerminalReady !== undefined;
142
+ const setRTS = control.RequestToSend !== undefined;
143
+ const dtrValue = setDTR ? DTR_ENABLE_BIT | (control.DataTerminalReady ? DTR_SET : 0) : 0;
144
+ const rtsValue = setRTS ? RTS_ENABLE_BIT | (control.RequestToSend ? RTS_SET : 0) : 0;
145
+ const value = dtrValue | rtsValue;
146
+ const result = await this.#requestOut(REQUESTS.SET_MODEM_CTRL, value);
147
+ if (result.status !== USB_TRANSFER_OK) {
148
+ throw new Error('status not ok');
149
+ }
150
+ }
151
+ async setEventChar(data, enable = true) {
152
+ const ENABLE_BIT = 0x01_00;
153
+ const value = enable ? ENABLE_BIT | data : data;
154
+ const result = await this.#requestOut(REQUESTS.SET_EVENT_CHAR, value);
155
+ if (result.status !== USB_TRANSFER_OK) {
156
+ throw new Error('status not ok');
157
+ }
158
+ }
159
+ async setErrorChar(data, enable = true) {
160
+ const ENABLE_BIT = 0x01_00;
161
+ const value = enable ? ENABLE_BIT | data : data;
162
+ const result = await this.#requestOut(REQUESTS.SET_ERROR_CHAR, value);
163
+ if (result.status !== USB_TRANSFER_OK) {
164
+ throw new Error('status not ok');
165
+ }
166
+ }
167
+ async sendData(data) {
168
+ const result = await this.#device.transferOut(this.#endpointBulkOut, data);
169
+ if (result.status !== USB_TRANSFER_OK) {
170
+ throw new Error('failure sending data');
171
+ }
172
+ return result.bytesWritten;
173
+ }
174
+ async readData(length) {
175
+ const result = await this.#device.transferIn(this.#endpointBulkIn, length);
176
+ if (result.status !== USB_TRANSFER_OK) {
177
+ throw new Error('failure to read data');
178
+ }
179
+ if (result.data === undefined) {
180
+ throw new Error('result data undefined');
181
+ }
182
+ assertDataViewNotShared(result.data);
183
+ return result.data;
184
+ }
185
+ async readEEPROM(address, length) {
186
+ const result = await this.#requestIn(REQUESTS.READ_EEPROM, length, address);
187
+ if (result.status !== USB_TRANSFER_OK) {
188
+ throw new Error('failure to read eeprom');
189
+ }
190
+ if (result.data === undefined) {
191
+ throw new Error('result data undefined');
192
+ }
193
+ assertDataViewNotShared(result.data);
194
+ return result.data;
195
+ }
196
+ async writeEEPROM(address, value) {
197
+ const result = await this.#requestOut(REQUESTS.WRITE_EEPROM, value, address);
198
+ if (result.status !== USB_TRANSFER_OK) {
199
+ throw new Error('failure to read eeprom');
200
+ }
201
+ return result.bytesWritten;
202
+ }
203
+ }
204
+ //# sourceMappingURL=ft232h.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ft232h.js","sourceRoot":"","sources":["../src/ft232h.ts"],"names":[],"mappings":"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"}
package/lib/ftdi.d.ts ADDED
@@ -0,0 +1,37 @@
1
+ /** biome-ignore-all lint/style/noNestedTernary: <explanation> */
2
+ import type { BitMode, ModemControl } from './consts.ts';
3
+ import { MPSSE } from './mpsse/mpsse.ts';
4
+ import { type DeviceStatusInfo } from './status.ts';
5
+ export declare const USB_TRANSFER_OK: USBTransferStatus;
6
+ export declare const USB_TRANSFER_STALL: USBTransferStatus;
7
+ export declare const USB_TRANSFER_BABBLE: USBTransferStatus;
8
+ export declare const REQUEST_TYPE_VENDOR = "vendor";
9
+ export declare const RECIPIENT_DEVICE = "device";
10
+ export declare const INTERFACE_DIRECTION_IN = "in";
11
+ export declare const INTERFACE_DIRECTION_OUT = "out";
12
+ export declare const INTERFACE_TYPE_BULK = "bulk";
13
+ export declare const DEFAULT_CONFIGURATION_NUMBER = 1;
14
+ export declare const DEFAULT_INTERFACE_NUMBER = 0;
15
+ export declare function assertDataViewNotShared(view: DataView): asserts view is DataView & {
16
+ buffer: ArrayBuffer;
17
+ };
18
+ export declare class FTDIDevice {
19
+ #private;
20
+ static from(device: USBDevice): Promise<FTDIDevice>;
21
+ constructor(device: USBDevice, interfaceNumber: number, epIn: number, epOut: number);
22
+ get mpsse(): MPSSE;
23
+ reset(kind?: number): Promise<void>;
24
+ setBitMode(mode: BitMode): Promise<void>;
25
+ getModemStatus(): Promise<DeviceStatusInfo | undefined>;
26
+ getLatencyTimer(): Promise<number>;
27
+ setLatencyTimer(latency: number): Promise<void>;
28
+ readPins(): Promise<number>;
29
+ setModemControl(control: ModemControl): Promise<void>;
30
+ setEventChar(data: number, enable?: boolean): Promise<void>;
31
+ setErrorChar(data: number, enable?: boolean): Promise<void>;
32
+ sendData(data: BufferSource): Promise<number>;
33
+ readData(length: number): Promise<DataView<ArrayBuffer>>;
34
+ readEEPROM(address: number, length: number): Promise<DataView<ArrayBuffer>>;
35
+ writeEEPROM(address: number, value: number): Promise<number>;
36
+ }
37
+ //# sourceMappingURL=ftdi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ftdi.d.ts","sourceRoot":"","sources":["../src/ftdi.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAe,MAAM,aAAa,CAAA;AAErE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AACxC,OAAO,EAEN,KAAK,gBAAgB,EAErB,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,eAAe,EAAE,iBAAwB,CAAA;AACtD,eAAO,MAAM,kBAAkB,EAAE,iBAA2B,CAAA;AAC5D,eAAO,MAAM,mBAAmB,EAAE,iBAA4B,CAAA;AAG9D,eAAO,MAAM,mBAAmB,WAAW,CAAA;AAC3C,eAAO,MAAM,gBAAgB,WAAW,CAAA;AAExC,eAAO,MAAM,sBAAsB,OAAO,CAAA;AAC1C,eAAO,MAAM,uBAAuB,QAAQ,CAAA;AAC5C,eAAO,MAAM,mBAAmB,SAAS,CAAA;AAEzC,eAAO,MAAM,4BAA4B,IAAI,CAAA;AAC7C,eAAO,MAAM,wBAAwB,IAAI,CAAA;AAGzC,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,QAAQ,GAAG;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAI1G;AAED,qBAAa,UAAU;;IAOtB,OAAa,IAAI,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAGxD;IAED,YAAY,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAMlF;IAED,IAAI,KAAK,IAAI,KAAK,CAAuB;IAmDnC,KAAK,CAAC,IAAI,SAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjD;IAEK,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAI7C;IAEK,cAAc,IAAI,OAAO,CAAC,gBAAgB,GAAC,SAAS,CAAC,CAM1D;IAEK,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAOvC;IAEK,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMpD;IAEK,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,CAKhC;IAEK,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1D;IAEK,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAO7D;IAEK,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAQ7D;IAGM,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlD;IAEI,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAM7D;IAEK,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAOhF;IAEK,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAIjE;CAKD"}
package/lib/ftdi.js ADDED
@@ -0,0 +1,204 @@
1
+ import { REQUESTS, RESET_USB } from './consts.js';
2
+ import { MPSSE } from './mpsse/mpsse.js';
3
+ import { DeviceStatus, STATUS_PREFIX_LENGTH, } from './status.js';
4
+ export const USB_TRANSFER_OK = 'ok';
5
+ export const USB_TRANSFER_STALL = 'stall';
6
+ export const USB_TRANSFER_BABBLE = 'babble';
7
+ export const REQUEST_TYPE_VENDOR = 'vendor';
8
+ export const RECIPIENT_DEVICE = 'device';
9
+ export const INTERFACE_DIRECTION_IN = 'in';
10
+ export const INTERFACE_DIRECTION_OUT = 'out';
11
+ export const INTERFACE_TYPE_BULK = 'bulk';
12
+ export const DEFAULT_CONFIGURATION_NUMBER = 1;
13
+ export const DEFAULT_INTERFACE_NUMBER = 0;
14
+ export function assertDataViewNotShared(view) {
15
+ if (typeof SharedArrayBuffer !== 'undefined' && view.buffer instanceof SharedArrayBuffer) {
16
+ throw new TypeError('DataView cannot be backed by a SharedArrayBuffer');
17
+ }
18
+ }
19
+ export class FTDIDevice {
20
+ #device;
21
+ #endpointBulkIn;
22
+ #endpointBulkOut;
23
+ #interfaceNumber;
24
+ #mpsse;
25
+ static async from(device) {
26
+ const { interfaceNumber, epIn, epOut } = await FTDIDevice.#discoverEndpoints(device);
27
+ return new FTDIDevice(device, interfaceNumber, epIn, epOut);
28
+ }
29
+ constructor(device, interfaceNumber, epIn, epOut) {
30
+ this.#device = device;
31
+ this.#endpointBulkIn = epIn;
32
+ this.#endpointBulkOut = epOut;
33
+ this.#interfaceNumber = interfaceNumber;
34
+ this.#mpsse = new MPSSE(this);
35
+ }
36
+ get mpsse() { return this.#mpsse; }
37
+ static async #discoverEndpoints(device) {
38
+ if (device.configuration === null) {
39
+ await device.selectConfiguration(DEFAULT_CONFIGURATION_NUMBER);
40
+ }
41
+ await device.claimInterface(DEFAULT_INTERFACE_NUMBER);
42
+ if (device.configuration === null) {
43
+ throw new Error('Configuration is NULL');
44
+ }
45
+ const { interfaces } = device.configuration;
46
+ const [iface] = interfaces;
47
+ if (iface === undefined) {
48
+ throw new Error('Interface is undefined');
49
+ }
50
+ const { alternate, interfaceNumber } = iface;
51
+ const { endpoints } = alternate;
52
+ const epIn = endpoints.find(ep => ep.direction === INTERFACE_DIRECTION_IN && ep.type === INTERFACE_TYPE_BULK);
53
+ const epOut = endpoints.find(ep => ep.direction === INTERFACE_DIRECTION_OUT && ep.type === INTERFACE_TYPE_BULK);
54
+ if (epIn === undefined) {
55
+ throw new Error('Endpoint In Bulk not found');
56
+ }
57
+ if (epOut === undefined) {
58
+ throw new Error('Endpoint Out Bulk not found');
59
+ }
60
+ return {
61
+ interfaceNumber,
62
+ epIn: epIn.endpointNumber,
63
+ epOut: epOut.endpointNumber
64
+ };
65
+ }
66
+ async #requestIn(request, length, index = undefined) {
67
+ return this.#device.controlTransferIn({
68
+ requestType: REQUEST_TYPE_VENDOR,
69
+ recipient: RECIPIENT_DEVICE,
70
+ request,
71
+ value: 0,
72
+ index: index ?? this.#interfaceNumber
73
+ }, length);
74
+ }
75
+ async #requestOut(request, value, index = undefined) {
76
+ return this.#device.controlTransferOut({
77
+ requestType: REQUEST_TYPE_VENDOR,
78
+ recipient: RECIPIENT_DEVICE,
79
+ request,
80
+ value,
81
+ index: index ?? this.#interfaceNumber
82
+ });
83
+ }
84
+ async reset(kind = RESET_USB.RESET) {
85
+ await this.#requestOut(REQUESTS.RESET, kind);
86
+ }
87
+ async setBitMode(mode) {
88
+ const gpioInit = 0;
89
+ const value = mode | gpioInit;
90
+ await this.#requestOut(REQUESTS.SET_BITMODE, value);
91
+ }
92
+ async getModemStatus() {
93
+ const status = await this.#requestIn(REQUESTS.POLL_MODEM_STATUS, STATUS_PREFIX_LENGTH);
94
+ if (status.status !== USB_TRANSFER_OK) {
95
+ throw new Error('status not ok');
96
+ }
97
+ if (status.data === undefined) {
98
+ throw new Error('undefined data');
99
+ }
100
+ assertDataViewNotShared(status.data);
101
+ return DeviceStatus.parse(status.data);
102
+ }
103
+ async getLatencyTimer() {
104
+ const result = await this.#requestIn(REQUESTS.GET_LATENCY_TIMER, 1);
105
+ if (result.status !== USB_TRANSFER_OK) {
106
+ throw new Error('status not ok');
107
+ }
108
+ if (result.data === undefined) {
109
+ throw new Error('undefined data');
110
+ }
111
+ const latency = result.data.getUint8(0);
112
+ return latency;
113
+ }
114
+ async setLatencyTimer(latency) {
115
+ if (!Number.isInteger(latency)) {
116
+ throw new TypeError('latency is not valid integer');
117
+ }
118
+ if (latency < 0 || latency > 255) {
119
+ throw new RangeError('latency out of range');
120
+ }
121
+ const result = await this.#requestOut(REQUESTS.SET_LATENCY_TIMER, latency);
122
+ if (result.status !== USB_TRANSFER_OK) {
123
+ throw new Error('status not ok');
124
+ }
125
+ }
126
+ async readPins() {
127
+ const result = await this.#requestIn(REQUESTS.READ_PINS, 1);
128
+ if (result.status !== USB_TRANSFER_OK) {
129
+ throw new Error('status not ok');
130
+ }
131
+ if (result.data === undefined) {
132
+ throw new Error('undefined data');
133
+ }
134
+ return result.data.getUint8(0);
135
+ }
136
+ async setModemControl(control) {
137
+ const DTR_ENABLE_BIT = 0x01_00;
138
+ const RTS_ENABLE_BIT = 0x02_00;
139
+ const DTR_SET = 0x01;
140
+ const RTS_SET = 0x02;
141
+ const setDTR = control.DataTerminalReady !== undefined;
142
+ const setRTS = control.RequestToSend !== undefined;
143
+ const dtrValue = setDTR ? DTR_ENABLE_BIT | (control.DataTerminalReady ? DTR_SET : 0) : 0;
144
+ const rtsValue = setRTS ? RTS_ENABLE_BIT | (control.RequestToSend ? RTS_SET : 0) : 0;
145
+ const value = dtrValue | rtsValue;
146
+ const result = await this.#requestOut(REQUESTS.SET_MODEM_CTRL, value);
147
+ if (result.status !== USB_TRANSFER_OK) {
148
+ throw new Error('status not ok');
149
+ }
150
+ }
151
+ async setEventChar(data, enable = true) {
152
+ const ENABLE_BIT = 0x01_00;
153
+ const value = enable ? ENABLE_BIT | data : data;
154
+ const result = await this.#requestOut(REQUESTS.SET_EVENT_CHAR, value);
155
+ if (result.status !== USB_TRANSFER_OK) {
156
+ throw new Error('status not ok');
157
+ }
158
+ }
159
+ async setErrorChar(data, enable = true) {
160
+ const ENABLE_BIT = 0x01_00;
161
+ const value = enable ? ENABLE_BIT | data : data;
162
+ const result = await this.#requestOut(REQUESTS.SET_ERROR_CHAR, value);
163
+ if (result.status !== USB_TRANSFER_OK) {
164
+ throw new Error('status not ok');
165
+ }
166
+ }
167
+ async sendData(data) {
168
+ const result = await this.#device.transferOut(this.#endpointBulkOut, data);
169
+ if (result.status !== USB_TRANSFER_OK) {
170
+ throw new Error('failure sending data');
171
+ }
172
+ return result.bytesWritten;
173
+ }
174
+ async readData(length) {
175
+ const result = await this.#device.transferIn(this.#endpointBulkIn, length);
176
+ if (result.status !== USB_TRANSFER_OK) {
177
+ throw new Error('failure to read data');
178
+ }
179
+ if (result.data === undefined) {
180
+ throw new Error('result data undefined');
181
+ }
182
+ assertDataViewNotShared(result.data);
183
+ return result.data;
184
+ }
185
+ async readEEPROM(address, length) {
186
+ const result = await this.#requestIn(REQUESTS.READ_EEPROM, length, address);
187
+ if (result.status !== USB_TRANSFER_OK) {
188
+ throw new Error('failure to read eeprom');
189
+ }
190
+ if (result.data === undefined) {
191
+ throw new Error('result data undefined');
192
+ }
193
+ assertDataViewNotShared(result.data);
194
+ return result.data;
195
+ }
196
+ async writeEEPROM(address, value) {
197
+ const result = await this.#requestOut(REQUESTS.WRITE_EEPROM, value, address);
198
+ if (result.status !== USB_TRANSFER_OK) {
199
+ throw new Error('failure to read eeprom');
200
+ }
201
+ return result.bytesWritten;
202
+ }
203
+ }
204
+ //# sourceMappingURL=ftdi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ftdi.js","sourceRoot":"","sources":["../src/ftdi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export declare class I2CTemplate {
2
+ #private;
3
+ static initI2C(targetHertz: number, enableClockDivideBy5?: boolean): Uint8Array<ArrayBuffer>;
4
+ static startWithAddress(addr: number, write?: boolean): Uint8Array<ArrayBuffer>;
5
+ static writeByte(data: number): Uint8Array<ArrayBuffer>;
6
+ static repeatStartWithAddress(addr: number, write?: boolean): Uint8Array<ArrayBuffer>;
7
+ static readData(ack?: boolean): Uint8Array<ArrayBuffer>;
8
+ static stop(): Uint8Array<ArrayBuffer>;
9
+ }
10
+ //# sourceMappingURL=i2c-template.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i2c-template.d.ts","sourceRoot":"","sources":["../../src/i2c/i2c-template.ts"],"names":[],"mappings":"AA+BA,qBAAa,WAAW;;IACvB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,oBAAoB,UAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAiBzF;IAsCD,MAAM,CAAC,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAS5E;IAED,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,WAAW,CAAC,CAMtD;IAED,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAUlF;IAED,MAAM,CAAC,QAAQ,CAAC,GAAG,UAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAYnD;IAED,MAAM,CAAC,IAAI,IAAI,UAAU,CAAC,WAAW,CAAC,CAsBrC;CACD"}
@@ -0,0 +1,122 @@
1
+ /** biome-ignore-all lint/style/useConsistentArrayType: <explanation> */
2
+ import { CLOCK_BASE_12, CLOCK_BASE_60, Clock } from '../mpsse/clock.js';
3
+ import { CLOCK_DIVISOR_COMMANDS, FT232H_ONLY_COMMANDS, H_COMMANDS, HOST_AND_MPSSE_MODE_COMMANDS, PIN_STATE_COMMANDS, SHIFT_COMMAND } from '../mpsse/command.js';
4
+ import { MPSSETemplate } from '../mpsse/mpsse-template.js';
5
+ const SDA_PIN_MASK = 0b0000_0010;
6
+ const SCL_PIN_MASK = 0b0000_0001;
7
+ const SCL_HIGH_SDA_HIGH = SDA_PIN_MASK | SCL_PIN_MASK;
8
+ const SCL_HIGH_SDA_LOW = SCL_PIN_MASK;
9
+ const SCL_LOW_SDA_HIGH = SDA_PIN_MASK;
10
+ const SCL_LOW_SDA_LOW = 0;
11
+ const SDA_DIRECTION_OUT = 0b0000_0010;
12
+ const SCL_DIRECTION_OUT = 0b0000_0001;
13
+ const SDA_SCL_DIRECTION_OUT = SDA_DIRECTION_OUT | SCL_DIRECTION_OUT;
14
+ const OPEN_DRAIN_LOW_PIN_MASK = 0b0000_0111;
15
+ const OPEN_DRAIN_HIGH_PIN_MASK = 0b0000_0000;
16
+ export class I2CTemplate {
17
+ static initI2C(targetHertz, enableClockDivideBy5 = false) {
18
+ const clockBase = enableClockDivideBy5 ? CLOCK_BASE_12 : CLOCK_BASE_60;
19
+ const divideBy5Command = enableClockDivideBy5 ? H_COMMANDS.ENABLE_CLOCK_DIVIDE_BY_FIVE : H_COMMANDS.DISABLE_CLOCK_DIVIDE_BY_FIVE;
20
+ const divisor = Clock.clockDivisor(targetHertz, clockBase);
21
+ const divisorH = (divisor >> 8) & 0xFF;
22
+ const divisorL = divisor & 0xFF;
23
+ return Uint8Array.from([
24
+ divideBy5Command,
25
+ H_COMMANDS.ENABLE_THREE_PHASE_CLOCKING,
26
+ FT232H_ONLY_COMMANDS.SET_IO_ONLY_DRIVE_LOW, OPEN_DRAIN_LOW_PIN_MASK, OPEN_DRAIN_HIGH_PIN_MASK, // low pins as open-drain
27
+ PIN_STATE_COMMANDS.SET_DATA_BITS_LOW_BYTE, SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT, // value, direction
28
+ CLOCK_DIVISOR_COMMANDS.SET_CLK_DIVISOR, divisorL, divisorH, // 0x4A, 0x01, // ~100kHz
29
+ HOST_AND_MPSSE_MODE_COMMANDS.SEND_IMMEDIATE
30
+ ]);
31
+ }
32
+ static #consumeAck() {
33
+ return [
34
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_HIGH, SDA_SCL_DIRECTION_OUT), // release SDA
35
+ ...MPSSETemplate.shiftInBits(SHIFT_COMMAND.IN_MSB_BITS_POSITIVE_VE, 1),
36
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT), // regain
37
+ ];
38
+ }
39
+ static #start() {
40
+ return [
41
+ // SDA: 1, SCL: 0
42
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
43
+ // SDA: 1, SCL: 1 (release both lines)
44
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
45
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
46
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
47
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
48
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
49
+ // SDA: 0, SCL: 1 (low data while clock high)
50
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
51
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
52
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
53
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
54
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
55
+ // SDA: 0, SCL: 0 (both low - hold start)
56
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
57
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
58
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
59
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
60
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
61
+ ];
62
+ }
63
+ static startWithAddress(addr, write = false) {
64
+ const data = (addr << 1) | (write ? 0 : 1);
65
+ return Uint8Array.from([
66
+ ...I2CTemplate.#start(),
67
+ ...MPSSETemplate.shiftOutByte(SHIFT_COMMAND.OUT_MSB_BYTES_NEGATIVE_VE, 1, data),
68
+ ...I2CTemplate.#consumeAck(),
69
+ HOST_AND_MPSSE_MODE_COMMANDS.SEND_IMMEDIATE
70
+ ]);
71
+ }
72
+ static writeByte(data) {
73
+ return Uint8Array.from([
74
+ ...MPSSETemplate.shiftOutByte(SHIFT_COMMAND.OUT_MSB_BYTES_NEGATIVE_VE, 1, data),
75
+ ...I2CTemplate.#consumeAck(),
76
+ HOST_AND_MPSSE_MODE_COMMANDS.SEND_IMMEDIATE
77
+ ]);
78
+ }
79
+ static repeatStartWithAddress(addr, write = false) {
80
+ const data = (addr << 1) | (write ? 0 : 1);
81
+ return Uint8Array.from([
82
+ ...I2CTemplate.#start(),
83
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
84
+ ...MPSSETemplate.shiftOutByte(SHIFT_COMMAND.OUT_MSB_BYTES_NEGATIVE_VE, 1, data),
85
+ ...I2CTemplate.#consumeAck(),
86
+ HOST_AND_MPSSE_MODE_COMMANDS.SEND_IMMEDIATE
87
+ ]);
88
+ }
89
+ static readData(ack = true) {
90
+ const MSB_ACK_BIT = 0x00;
91
+ const MSB_NACK_BIT = 0x80;
92
+ const data = ack ? MSB_ACK_BIT : MSB_NACK_BIT;
93
+ return Uint8Array.from([
94
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
95
+ ...MPSSETemplate.shiftInByte(SHIFT_COMMAND.IN_MSB_BYTES_POSITIVE_VE, 1),
96
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
97
+ ...MPSSETemplate.shiftOutBits(SHIFT_COMMAND.OUT_MSB_BITS_NEGATIVE_VE, 1, data),
98
+ HOST_AND_MPSSE_MODE_COMMANDS.SEND_IMMEDIATE
99
+ ]);
100
+ }
101
+ static stop() {
102
+ return Uint8Array.from([
103
+ // Set SDA low, SCL low
104
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
105
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
106
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
107
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
108
+ ...MPSSETemplate.gpioSetLow(SCL_LOW_SDA_LOW, SDA_SCL_DIRECTION_OUT),
109
+ // Set SDA low, SCL high
110
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
111
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
112
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
113
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
114
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_LOW, SDA_SCL_DIRECTION_OUT),
115
+ // Set SDA, SCL high
116
+ ...MPSSETemplate.gpioSetLow(SCL_HIGH_SDA_HIGH, SDA_SCL_DIRECTION_OUT),
117
+ //
118
+ HOST_AND_MPSSE_MODE_COMMANDS.SEND_IMMEDIATE
119
+ ]);
120
+ }
121
+ }
122
+ //# sourceMappingURL=i2c-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i2c-template.js","sourceRoot":"","sources":["../../src/i2c/i2c-template.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,EACN,aAAa,EACb,aAAa,EACb,KAAK,EACL,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACN,sBAAsB,EACtB,oBAAoB,EACpB,UAAU,EACV,4BAA4B,EAC5B,kBAAkB,EAClB,aAAa,EACb,MAAM,qBAAqB,CAAA;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAA;AAE1D,MAAM,YAAY,GAAG,WAAW,CAAA;AAChC,MAAM,YAAY,GAAG,WAAW,CAAA;AAEhC,MAAM,iBAAiB,GAAW,YAAY,GAAG,YAAY,CAAA;AAC7D,MAAM,gBAAgB,GAAW,YAAY,CAAA;AAC7C,MAAM,gBAAgB,GAAW,YAAY,CAAA;AAC7C,MAAM,eAAe,GAAG,CAAC,CAAA;AAEzB,MAAM,iBAAiB,GAAG,WAAW,CAAA;AACrC,MAAM,iBAAiB,GAAG,WAAW,CAAA;AACrC,MAAM,qBAAqB,GAAW,iBAAiB,GAAG,iBAAiB,CAAA;AAE3E,MAAM,uBAAuB,GAAG,WAAW,CAAA;AAC3C,MAAM,wBAAwB,GAAG,WAAW,CAAA;AAE5C,MAAM,OAAO,WAAW;IACvB,MAAM,CAAC,OAAO,CAAC,WAAmB,EAAE,oBAAoB,GAAG,KAAK;QAC/D,MAAM,SAAS,GAAG,oBAAoB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,CAAA;QACtE,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,CAAC,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC,CAAC,UAAU,CAAC,4BAA4B,CAAA;QAEhI,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,SAAS,CAAC,CAAA;QAC1D,MAAM,QAAQ,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,IAAI,CAAA;QACtC,MAAM,QAAQ,GAAG,OAAO,GAAG,IAAI,CAAA;QAE/B,OAAO,UAAU,CAAC,IAAI,CAAC;YACtB,gBAAgB;YAChB,UAAU,CAAC,2BAA2B;YACtC,oBAAoB,CAAC,qBAAqB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,yBAAyB;YACxH,kBAAkB,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,mBAAmB;YACxG,sBAAsB,CAAC,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,yBAAyB;YAErF,4BAA4B,CAAC,cAAc;SAC3C,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,WAAW;QACjB,OAAO;YACN,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC,EAAE,cAAc;YACpF,GAAG,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,uBAAuB,EAAE,CAAC,CAAC;YACtE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC,EAAE,SAAS;SAC9E,CAAA;IACF,CAAC;IAED,MAAM,CAAC,MAAM;QACZ,OAAO;YACN,iBAAiB;YACjB,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YAEpE,uCAAuC;YACvC,GAAG,aAAa,CAAC,UAAU,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;YACrE,GAAG,aAAa,CAAC,UAAU,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;YACrE,GAAG,aAAa,CAAC,UAAU,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;YACrE,GAAG,aAAa,CAAC,UAAU,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;YACrE,GAAG,aAAa,CAAC,UAAU,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;YAErE,+CAA+C;YAC/C,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YAEpE,0CAA0C;YAC1C,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;SACnE,CAAA;IACF,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,IAAY,EAAE,KAAK,GAAG,KAAK;QAClD,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAE1C,OAAO,UAAU,CAAC,IAAI,CAAC;YACtB,GAAG,WAAW,CAAC,MAAM,EAAE;YACvB,GAAG,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,yBAAyB,EAAE,CAAC,EAAE,IAAI,CAAC;YAC/E,GAAG,WAAW,CAAC,WAAW,EAAE;YAC5B,4BAA4B,CAAC,cAAc;SAC3C,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAAY;QAC5B,OAAO,UAAU,CAAC,IAAI,CAAC;YACtB,GAAG,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,yBAAyB,EAAE,CAAC,EAAE,IAAI,CAAC;YAC/E,GAAG,WAAW,CAAC,WAAW,EAAE;YAC5B,4BAA4B,CAAC,cAAc;SAC3C,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,IAAY,EAAE,KAAK,GAAG,KAAK;QACxD,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAE1C,OAAO,UAAU,CAAC,IAAI,CAAC;YACtB,GAAG,WAAW,CAAC,MAAM,EAAE;YACvB,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,yBAAyB,EAAE,CAAC,EAAE,IAAI,CAAC;YAC/E,GAAG,WAAW,CAAC,WAAW,EAAE;YAC5B,4BAA4B,CAAC,cAAc;SAC3C,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI;QACzB,MAAM,WAAW,GAAG,IAAI,CAAA;QACxB,MAAM,YAAY,GAAG,IAAI,CAAA;QACzB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAA;QAE7C,OAAO,UAAU,CAAC,IAAI,CAAC;YACtB,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,WAAW,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC,CAAC;YACvE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,YAAY,CAAC,aAAa,CAAC,wBAAwB,EAAE,CAAC,EAAE,IAAI,CAAC;YAC9E,4BAA4B,CAAC,cAAc;SAC3C,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,IAAI;QACV,OAAO,UAAU,CAAC,IAAI,CAAC;YACtB,uBAAuB;YACvB,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YACnE,GAAG,aAAa,CAAC,UAAU,CAAC,eAAe,EAAE,qBAAqB,CAAC;YAEnE,wBAAwB;YACxB,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YACpE,GAAG,aAAa,CAAC,UAAU,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;YAEpE,oBAAoB;YACpB,GAAG,aAAa,CAAC,UAAU,CAAC,iBAAiB,EAAE,qBAAqB,CAAC;YAErE,EAAE;YACF,4BAA4B,CAAC,cAAc;SAC3C,CAAC,CAAA;IACH,CAAC;CACD"}