@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.d.cts CHANGED
@@ -664,6 +664,7 @@ declare class OpenDisplayDevice {
664
664
  compress?: boolean;
665
665
  onProgress?: (current: number, total: number, stage: string) => void;
666
666
  onStatusChange?: (message: string) => void;
667
+ onUploadComplete?: (uploadTimeSeconds: number) => void;
667
668
  }): Promise<void>;
668
669
  /**
669
670
  * Execute image upload using compressed or uncompressed protocol.
package/dist/index.d.ts CHANGED
@@ -664,6 +664,7 @@ declare class OpenDisplayDevice {
664
664
  compress?: boolean;
665
665
  onProgress?: (current: number, total: number, stage: string) => void;
666
666
  onStatusChange?: (message: string) => void;
667
+ onUploadComplete?: (uploadTimeSeconds: number) => void;
667
668
  }): Promise<void>;
668
669
  /**
669
670
  * Execute image upload using compressed or uncompressed protocol.
package/dist/index.js CHANGED
@@ -250,6 +250,8 @@ var CommandCode = /* @__PURE__ */ ((CommandCode3) => {
250
250
  CommandCode3[CommandCode3["DIRECT_WRITE_START"] = 112] = "DIRECT_WRITE_START";
251
251
  CommandCode3[CommandCode3["DIRECT_WRITE_DATA"] = 113] = "DIRECT_WRITE_DATA";
252
252
  CommandCode3[CommandCode3["DIRECT_WRITE_END"] = 114] = "DIRECT_WRITE_END";
253
+ CommandCode3[CommandCode3["REFRESH_COMPLETE"] = 115] = "REFRESH_COMPLETE";
254
+ CommandCode3[CommandCode3["REFRESH_TIMEOUT"] = 116] = "REFRESH_TIMEOUT";
253
255
  return CommandCode3;
254
256
  })(CommandCode || {});
255
257
 
@@ -1340,6 +1342,16 @@ var BLEConnection = class {
1340
1342
  }
1341
1343
  return this.notificationQueue.dequeue(timeoutMs);
1342
1344
  }
1345
+ /**
1346
+ * Clear the notification queue.
1347
+ *
1348
+ * Useful for clearing any stale responses before starting a new operation.
1349
+ * This drains any buffered notifications and cancels pending read requests.
1350
+ */
1351
+ clearQueue() {
1352
+ console.debug(`Clearing notification queue (${this.notificationQueue.size} buffered)`);
1353
+ this.notificationQueue.clear("Queue cleared by request");
1354
+ }
1343
1355
  /**
1344
1356
  * Handle incoming BLE notifications.
1345
1357
  *
@@ -1675,6 +1687,7 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1675
1687
  const compress = options.compress ?? true;
1676
1688
  const onProgress = options.onProgress;
1677
1689
  const onStatusChange = options.onStatusChange;
1690
+ const onUploadComplete = options.onUploadComplete;
1678
1691
  console.log(
1679
1692
  `Uploading image (${this.width}x${this.height}, ${ColorScheme4[this.colorScheme]})`
1680
1693
  );
@@ -1700,7 +1713,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1700
1713
  compressedData,
1701
1714
  uncompressedSize: encodedData.length,
1702
1715
  onProgress,
1703
- onStatusChange
1716
+ onStatusChange,
1717
+ onUploadComplete
1704
1718
  });
1705
1719
  } else {
1706
1720
  console.log(
@@ -1711,7 +1725,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1711
1725
  imageData: encodedData,
1712
1726
  refreshMode,
1713
1727
  onProgress,
1714
- onStatusChange
1728
+ onStatusChange,
1729
+ onUploadComplete
1715
1730
  });
1716
1731
  }
1717
1732
  } else {
@@ -1721,7 +1736,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1721
1736
  imageData: encodedData,
1722
1737
  refreshMode,
1723
1738
  onProgress,
1724
- onStatusChange
1739
+ onStatusChange,
1740
+ onUploadComplete
1725
1741
  });
1726
1742
  }
1727
1743
  console.log("Image upload complete");
@@ -1738,8 +1754,11 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1738
1754
  compressedData,
1739
1755
  uncompressedSize,
1740
1756
  onProgress,
1741
- onStatusChange
1757
+ onStatusChange,
1758
+ onUploadComplete
1742
1759
  } = params;
1760
+ this.connection.clearQueue();
1761
+ const uploadStartTime = Date.now();
1743
1762
  let startCmd;
1744
1763
  let remainingCompressed = null;
1745
1764
  if (useCompression && compressedData && uncompressedSize) {
@@ -1762,13 +1781,38 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1762
1781
  autoCompleted = await this.sendDataChunks(imageData, onProgress, onStatusChange);
1763
1782
  }
1764
1783
  if (!autoCompleted) {
1765
- onStatusChange?.("Refreshing display...");
1766
1784
  const endCmd = buildDirectWriteEndCommand(refreshMode);
1767
1785
  await this.connection.writeCommand(endCmd);
1768
1786
  response = await this.connection.readResponse(
1769
- _OpenDisplayDevice.TIMEOUT_REFRESH
1787
+ _OpenDisplayDevice.TIMEOUT_ACK
1770
1788
  );
1771
1789
  validateAckResponse(response, 114 /* DIRECT_WRITE_END */);
1790
+ const uploadTime = (Date.now() - uploadStartTime) / 1e3;
1791
+ onUploadComplete?.(uploadTime);
1792
+ onStatusChange?.(
1793
+ `Upload complete (${uploadTime.toFixed(1)}s), refreshing display...`
1794
+ );
1795
+ const refreshStartTime = Date.now();
1796
+ const refreshResponse = await this.connection.readResponse(
1797
+ _OpenDisplayDevice.TIMEOUT_REFRESH
1798
+ );
1799
+ const [responseCode] = checkResponseType(refreshResponse);
1800
+ if (responseCode === 115 /* REFRESH_COMPLETE */) {
1801
+ const refreshTime = (Date.now() - refreshStartTime) / 1e3;
1802
+ const totalTime = (Date.now() - uploadStartTime) / 1e3;
1803
+ console.log(
1804
+ `Refresh complete (${refreshTime.toFixed(1)}s), total time: ${totalTime.toFixed(1)}s`
1805
+ );
1806
+ onStatusChange?.(
1807
+ `Refresh complete (${refreshTime.toFixed(1)}s)`
1808
+ );
1809
+ } else if (responseCode === 116 /* REFRESH_TIMEOUT */) {
1810
+ throw new ProtocolError("Display refresh timed out");
1811
+ } else {
1812
+ throw new ProtocolError(
1813
+ `Unexpected refresh response: 0x${responseCode.toString(16).padStart(4, "0")}`
1814
+ );
1815
+ }
1772
1816
  }
1773
1817
  }
1774
1818
  /**