@audiofab-io/fv1-core 0.2.1 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,8 @@ export interface PedalClientOptions {
12
12
  export declare class PedalClient {
13
13
  readonly device: MCP2221;
14
14
  readonly eeprom: EEPROM;
15
+ private readonly i2cAddress;
16
+ private readonly writePageSize;
15
17
  private constructor();
16
18
  /**
17
19
  * Open a pedal connection using a pre-built HID stream binding.
@@ -24,6 +26,19 @@ export declare class PedalClient {
24
26
  readAllSlots(): Promise<Uint8Array[]>;
25
27
  /** Write one program slot (512 bytes) to EEPROM and verify the write. */
26
28
  writeSlot(slot: number, data: Uint8Array): Promise<void>;
29
+ /**
30
+ * Issue a single EEPROM page write (address prefix + data) and then wait
31
+ * for the MCP2221 I²C state machine to return to IDLE. Handles the 24LC32
32
+ * internal write cycle (~5 ms) by retrying if the chip NACKs the address.
33
+ */
34
+ private writePageWithPolling;
35
+ /**
36
+ * Poll MCP2221 status until the I²C state is IDLE or a terminal error
37
+ * state. Returns the final state name.
38
+ */
39
+ private waitForIdle;
40
+ /** Force the I²C state machine to IDLE, cancelling any stuck transaction. */
41
+ private ensureIdle;
27
42
  }
28
43
  export {};
29
44
  //# sourceMappingURL=pedal-client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pedal-client.d.ts","sourceRoot":"","sources":["../../src/pedal/pedal-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAY3C,KAAK,mBAAmB,GAAG,eAAe,GAAG,eAAe,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IAEvB,OAAO;IAKP;;;OAGG;WACU,IAAI,CACf,OAAO,EAAE,oBAAoB,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,EACvE,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC;IAkBvB,qDAAqD;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMjD,yDAAyD;IACnD,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAU3C,yEAAyE;IACnE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;CAc/D"}
1
+ {"version":3,"file":"pedal-client.d.ts","sourceRoot":"","sources":["../../src/pedal/pedal-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAG7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAY3C,KAAK,mBAAmB,GAAG,eAAe,GAAG,eAAe,CAAA;AAE5D,MAAM,WAAW,kBAAkB;IACjC,8DAA8D;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAID,qBAAa,WAAW;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAQ;IAEtC,OAAO;IAOP;;;OAGG;WACU,IAAI,CACf,OAAO,EAAE,oBAAoB,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,EACvE,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,WAAW,CAAC;IAkBvB,qDAAqD;IAC/C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAMjD,yDAAyD;IACnD,YAAY,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IAU3C,yEAAyE;IACnE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC9D;;;;OAIG;YACW,oBAAoB;IA8BlC;;;OAGG;YACW,WAAW;IAazB,6EAA6E;YAC/D,UAAU;CAMzB"}
@@ -6,10 +6,13 @@ import { I2CBusMCP2221 } from '@johntalton/i2c-bus-mcp2221';
6
6
  import { I2CAddressedBus } from '@johntalton/and-other-delights';
7
7
  import { EEPROM } from '@johntalton/eeprom';
8
8
  import { DEFAULT_EEPROM_I2C_ADDRESS, DEFAULT_I2C_CLOCK_HZ, DEFAULT_WRITE_PAGE_SIZE, EEPROM_TOTAL_BYTES, PROGRAM_SLOT_COUNT, PROGRAM_SLOT_SIZE_BYTES, slotBaseAddress, } from './constants.js';
9
+ const delayMs = (ms) => new Promise(resolve => setTimeout(resolve, ms));
9
10
  export class PedalClient {
10
- constructor(device, eeprom) {
11
+ constructor(device, eeprom, i2cAddress, writePageSize) {
11
12
  this.device = device;
12
13
  this.eeprom = eeprom;
14
+ this.i2cAddress = i2cAddress;
15
+ this.writePageSize = writePageSize;
13
16
  }
14
17
  /**
15
18
  * Open a pedal connection using a pre-built HID stream binding.
@@ -25,7 +28,7 @@ export class PedalClient {
25
28
  const bus = I2CBusMCP2221.from(device);
26
29
  const abus = new I2CAddressedBus(bus, i2cAddress);
27
30
  const eeprom = new EEPROM(abus, { writePageSize });
28
- return new PedalClient(device, eeprom);
31
+ return new PedalClient(device, eeprom, i2cAddress, writePageSize);
29
32
  }
30
33
  /** Read one program slot (512 bytes) from EEPROM. */
31
34
  async readSlot(slot) {
@@ -48,9 +51,25 @@ export class PedalClient {
48
51
  if (data.length !== PROGRAM_SLOT_SIZE_BYTES) {
49
52
  throw new Error(`writeSlot expects ${PROGRAM_SLOT_SIZE_BYTES} bytes, got ${data.length}`);
50
53
  }
51
- const address = slotBaseAddress(slot);
52
- await this.eeprom.write(address, data);
53
- const verifyBuffer = await this.eeprom.read(address, PROGRAM_SLOT_SIZE_BYTES);
54
+ const baseAddress = slotBaseAddress(slot);
55
+ // Page-by-page write that bypasses @johntalton/i2c-bus-mcp2221's checkWrite.
56
+ // The library polls MCP2221 status immediately after each writeData and
57
+ // throws if the I²C state machine isn't in a terminal state, which races
58
+ // against the in-flight transaction. We drive writeData directly and then
59
+ // poll for IDLE before moving on.
60
+ for (let offset = 0; offset < data.length;) {
61
+ const pageAddr = baseAddress + offset;
62
+ const nextBoundary = Math.floor((pageAddr + this.writePageSize) / this.writePageSize) * this.writePageSize;
63
+ const chunkLen = Math.min(nextBoundary - pageAddr, data.length - offset);
64
+ const pageData = data.subarray(offset, offset + chunkLen);
65
+ const buffer = new Uint8Array(2 + chunkLen);
66
+ buffer[0] = (pageAddr >> 8) & 0xFF;
67
+ buffer[1] = pageAddr & 0xFF;
68
+ buffer.set(pageData, 2);
69
+ await this.writePageWithPolling(buffer, `writeSlot::${slot}::${offset}`);
70
+ offset += chunkLen;
71
+ }
72
+ const verifyBuffer = await this.eeprom.read(baseAddress, PROGRAM_SLOT_SIZE_BYTES);
54
73
  const verify = new Uint8Array(verifyBuffer);
55
74
  for (let i = 0; i < data.length; i++) {
56
75
  if (data[i] !== verify[i]) {
@@ -58,5 +77,61 @@ export class PedalClient {
58
77
  }
59
78
  }
60
79
  }
80
+ /**
81
+ * Issue a single EEPROM page write (address prefix + data) and then wait
82
+ * for the MCP2221 I²C state machine to return to IDLE. Handles the 24LC32
83
+ * internal write cycle (~5 ms) by retrying if the chip NACKs the address.
84
+ */
85
+ async writePageWithPolling(buffer, opaque) {
86
+ // Make sure the state machine is clean before we start. If a prior op
87
+ // left it non-idle (e.g., a racy status poll), cancel and give it a beat.
88
+ await this.ensureIdle(`${opaque}::pre`);
89
+ // Retry the whole page up to a few times in case the EEPROM is still in
90
+ // its internal write cycle from a previous page and NACKs the address.
91
+ const MAX_ATTEMPTS = 20;
92
+ for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {
93
+ await this.device.i2c.writeData({
94
+ opaque: `${opaque}::writeData::${attempt}`,
95
+ address: this.i2cAddress,
96
+ buffer,
97
+ });
98
+ const state = await this.waitForIdle(`${opaque}::poll::${attempt}`, 50);
99
+ if (state === 'IDLE')
100
+ return;
101
+ // Chip is in its internal write cycle; wait a bit and retry.
102
+ if (state === 'ADDRESS_NACK_STOP' || state === 'ADDRESS_NACK_STOP_END') {
103
+ await delayMs(2);
104
+ continue;
105
+ }
106
+ throw new Error(`EEPROM page write stuck at state ${state}`);
107
+ }
108
+ throw new Error(`EEPROM page write did not complete after ${MAX_ATTEMPTS} attempts`);
109
+ }
110
+ /**
111
+ * Poll MCP2221 status until the I²C state is IDLE or a terminal error
112
+ * state. Returns the final state name.
113
+ */
114
+ async waitForIdle(opaque, timeoutMs) {
115
+ const deadline = Date.now() + timeoutMs;
116
+ let lastState = 'UNKNOWN';
117
+ while (Date.now() < deadline) {
118
+ const status = await this.device.common.status({ opaque });
119
+ lastState = status.i2cStateName ?? 'UNKNOWN';
120
+ if (status.i2cState === 0)
121
+ return 'IDLE';
122
+ if (lastState === 'ADDRESS_NACK_STOP' || lastState === 'ADDRESS_NACK_STOP_END')
123
+ return lastState;
124
+ await delayMs(1);
125
+ }
126
+ return lastState;
127
+ }
128
+ /** Force the I²C state machine to IDLE, cancelling any stuck transaction. */
129
+ async ensureIdle(opaque) {
130
+ const status = await this.device.common.status({ opaque });
131
+ if (status.i2cState === 0)
132
+ return;
133
+ await this.device.common.status({ opaque: `${opaque}::cancel`, cancelI2c: true });
134
+ await delayMs(10);
135
+ }
61
136
  }
62
137
  //# sourceMappingURL=pedal-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pedal-client.js","sourceRoot":"","sources":["../../src/pedal/pedal-client.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,+EAA+E;AAC/E,4EAA4E;AAE5E,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAA;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,gCAAgC,CAAA;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,OAAO,EACL,0BAA0B,EAC1B,oBAAoB,EACpB,uBAAuB,EACvB,kBAAkB,EAClB,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,GAChB,MAAM,gBAAgB,CAAA;AAavB,MAAM,OAAO,WAAW;IAItB,YAAoB,MAAe,EAAE,MAAc;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,KAAK,CAAC,IAAI,CACf,OAAuE,EACvE,UAA8B,EAAE;QAEhC,MAAM,EACJ,UAAU,GAAG,0BAA0B,EACvC,UAAU,GAAG,oBAAoB,EACjC,aAAa,GAAG,uBAAuB,GACxC,GAAG,OAAO,CAAA;QAEX,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACpC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC;YACzB,MAAM,EAAE,uBAAuB,UAAU,EAAE;YAC3C,QAAQ,EAAE,UAAU;SACrB,CAAC,CAAA;QACF,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACtC,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC,GAAG,EAAE,UAAU,CAAC,CAAA;QACjD,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,CAAC,CAAA;QAClD,OAAO,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACxC,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,QAAQ,CAAC,IAAY;QACzB,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAA;QACvE,OAAO,IAAI,UAAU,CAAC,MAAyB,CAAC,CAAA;IAClD,CAAC;IAED,yDAAyD;IACzD,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,kBAAkB,CAAC,CAAA;QAC5D,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAyB,CAAC,CAAA;QACrD,MAAM,KAAK,GAAiB,EAAE,CAAA;QAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,uBAAuB,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAA;QACvF,CAAC;QACD,OAAO,KAAK,CAAA;IACd,CAAC;IAED,yEAAyE;IACzE,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,IAAgB;QAC5C,IAAI,IAAI,CAAC,MAAM,KAAK,uBAAuB,EAAE,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,qBAAqB,uBAAuB,eAAe,IAAI,CAAC,MAAM,EAAE,CAAC,CAAA;QAC3F,CAAC;QACD,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAA;QACrC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;QACtC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAA;QAC7E,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,YAA+B,CAAC,CAAA;QAC9D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM,IAAI,KAAK,CAAC,QAAQ,IAAI,gCAAgC,CAAC,EAAE,CAAC,CAAA;YAClE,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
1
+ {"version":3,"file":"pedal-client.js","sourceRoot":"","sources":["../../src/pedal/pedal-client.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@audiofab-io/fv1-core",
3
- "version": "0.2.1",
3
+ "version": "0.2.2",
4
4
  "description": "FV-1 DSP toolchain: assembler, simulator, and Intel HEX parser",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",