@opendisplay/opendisplay 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -306,6 +306,8 @@ var CommandCode = /* @__PURE__ */ ((CommandCode3) => {
306
306
  CommandCode3[CommandCode3["DIRECT_WRITE_START"] = 112] = "DIRECT_WRITE_START";
307
307
  CommandCode3[CommandCode3["DIRECT_WRITE_DATA"] = 113] = "DIRECT_WRITE_DATA";
308
308
  CommandCode3[CommandCode3["DIRECT_WRITE_END"] = 114] = "DIRECT_WRITE_END";
309
+ CommandCode3[CommandCode3["REFRESH_COMPLETE"] = 115] = "REFRESH_COMPLETE";
310
+ CommandCode3[CommandCode3["REFRESH_TIMEOUT"] = 116] = "REFRESH_TIMEOUT";
309
311
  return CommandCode3;
310
312
  })(CommandCode || {});
311
313
 
@@ -1396,6 +1398,16 @@ var BLEConnection = class {
1396
1398
  }
1397
1399
  return this.notificationQueue.dequeue(timeoutMs);
1398
1400
  }
1401
+ /**
1402
+ * Clear the notification queue.
1403
+ *
1404
+ * Useful for clearing any stale responses before starting a new operation.
1405
+ * This drains any buffered notifications and cancels pending read requests.
1406
+ */
1407
+ clearQueue() {
1408
+ console.debug(`Clearing notification queue (${this.notificationQueue.size} buffered)`);
1409
+ this.notificationQueue.clear("Queue cleared by request");
1410
+ }
1399
1411
  /**
1400
1412
  * Handle incoming BLE notifications.
1401
1413
  *
@@ -1731,6 +1743,7 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1731
1743
  const compress = options.compress ?? true;
1732
1744
  const onProgress = options.onProgress;
1733
1745
  const onStatusChange = options.onStatusChange;
1746
+ const onUploadComplete = options.onUploadComplete;
1734
1747
  console.log(
1735
1748
  `Uploading image (${this.width}x${this.height}, ${import_epaper_dithering4.ColorScheme[this.colorScheme]})`
1736
1749
  );
@@ -1756,7 +1769,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1756
1769
  compressedData,
1757
1770
  uncompressedSize: encodedData.length,
1758
1771
  onProgress,
1759
- onStatusChange
1772
+ onStatusChange,
1773
+ onUploadComplete
1760
1774
  });
1761
1775
  } else {
1762
1776
  console.log(
@@ -1767,7 +1781,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1767
1781
  imageData: encodedData,
1768
1782
  refreshMode,
1769
1783
  onProgress,
1770
- onStatusChange
1784
+ onStatusChange,
1785
+ onUploadComplete
1771
1786
  });
1772
1787
  }
1773
1788
  } else {
@@ -1777,7 +1792,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1777
1792
  imageData: encodedData,
1778
1793
  refreshMode,
1779
1794
  onProgress,
1780
- onStatusChange
1795
+ onStatusChange,
1796
+ onUploadComplete
1781
1797
  });
1782
1798
  }
1783
1799
  console.log("Image upload complete");
@@ -1794,8 +1810,11 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1794
1810
  compressedData,
1795
1811
  uncompressedSize,
1796
1812
  onProgress,
1797
- onStatusChange
1813
+ onStatusChange,
1814
+ onUploadComplete
1798
1815
  } = params;
1816
+ this.connection.clearQueue();
1817
+ const uploadStartTime = Date.now();
1799
1818
  let startCmd;
1800
1819
  let remainingCompressed = null;
1801
1820
  if (useCompression && compressedData && uncompressedSize) {
@@ -1818,13 +1837,38 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1818
1837
  autoCompleted = await this.sendDataChunks(imageData, onProgress, onStatusChange);
1819
1838
  }
1820
1839
  if (!autoCompleted) {
1821
- onStatusChange?.("Refreshing display...");
1822
1840
  const endCmd = buildDirectWriteEndCommand(refreshMode);
1823
1841
  await this.connection.writeCommand(endCmd);
1824
1842
  response = await this.connection.readResponse(
1825
- _OpenDisplayDevice.TIMEOUT_REFRESH
1843
+ _OpenDisplayDevice.TIMEOUT_ACK
1826
1844
  );
1827
1845
  validateAckResponse(response, 114 /* DIRECT_WRITE_END */);
1846
+ const uploadTime = (Date.now() - uploadStartTime) / 1e3;
1847
+ onUploadComplete?.(uploadTime);
1848
+ onStatusChange?.(
1849
+ `Upload complete (${uploadTime.toFixed(1)}s), refreshing display...`
1850
+ );
1851
+ const refreshStartTime = Date.now();
1852
+ const refreshResponse = await this.connection.readResponse(
1853
+ _OpenDisplayDevice.TIMEOUT_REFRESH
1854
+ );
1855
+ const [responseCode] = checkResponseType(refreshResponse);
1856
+ if (responseCode === 115 /* REFRESH_COMPLETE */) {
1857
+ const refreshTime = (Date.now() - refreshStartTime) / 1e3;
1858
+ const totalTime = (Date.now() - uploadStartTime) / 1e3;
1859
+ console.log(
1860
+ `Refresh complete (${refreshTime.toFixed(1)}s), total time: ${totalTime.toFixed(1)}s`
1861
+ );
1862
+ onStatusChange?.(
1863
+ `Refresh complete (${refreshTime.toFixed(1)}s)`
1864
+ );
1865
+ } else if (responseCode === 116 /* REFRESH_TIMEOUT */) {
1866
+ throw new ProtocolError("Display refresh timed out");
1867
+ } else {
1868
+ throw new ProtocolError(
1869
+ `Unexpected refresh response: 0x${responseCode.toString(16).padStart(4, "0")}`
1870
+ );
1871
+ }
1828
1872
  }
1829
1873
  }
1830
1874
  /**