@opendisplay/opendisplay 1.1.4 → 1.2.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.
package/README.md CHANGED
@@ -142,6 +142,54 @@ await device.uploadImage(imageData, {
142
142
  });
143
143
  ```
144
144
 
145
+ ### Upload Progress & Callbacks
146
+
147
+ The `uploadImage()` method supports several optional callbacks for tracking progress and timing:
148
+
149
+ ```typescript
150
+ await device.uploadImage(imageData, {
151
+ refreshMode: RefreshMode.FULL,
152
+ ditherMode: DitherMode.BURKES,
153
+ compress: true,
154
+
155
+ // Called during data transfer with progress updates
156
+ onProgress: (current, total, stage) => {
157
+ const percent = Math.floor((current / total) * 100);
158
+ console.log(`${stage}: ${percent}% (${current}/${total} bytes)`);
159
+ },
160
+
161
+ // Called at various stages with status messages
162
+ onStatusChange: (message) => {
163
+ console.log(`Status: ${message}`);
164
+ // Example messages:
165
+ // - "Preparing image..."
166
+ // - "Compressing..."
167
+ // - "Uploading..."
168
+ // - "Upload complete (X.Xs), refreshing display..."
169
+ // - "Refresh complete (Y.Ys)"
170
+ },
171
+
172
+ // Called when upload is complete (before display refresh)
173
+ onUploadComplete: (uploadTimeSeconds) => {
174
+ console.log(`Upload took ${uploadTimeSeconds.toFixed(1)}s`);
175
+ },
176
+
177
+ // Called when entire operation completes (upload + refresh)
178
+ onComplete: (uploadTime, refreshTime, totalTime) => {
179
+ console.log(`Complete! Upload: ${uploadTime.toFixed(1)}s, Refresh: ${refreshTime.toFixed(1)}s, Total: ${totalTime.toFixed(1)}s`);
180
+ }
181
+ });
182
+ ```
183
+
184
+ **Callback Reference:**
185
+
186
+ | Callback | Parameters | When Called | Use Case |
187
+ |----------|-----------|-------------|----------|
188
+ | `onProgress` | `(current, total, stage)` | After each data chunk sent | Progress bars, upload percentage |
189
+ | `onStatusChange` | `(message)` | At each operation stage | Status messages, user feedback |
190
+ | `onUploadComplete` | `(uploadTimeSeconds)` | Upload done, before refresh | Track upload performance |
191
+ | `onComplete` | `(uploadTime, refreshTime, totalTime)` | After refresh completes | Final timing summary |
192
+
145
193
  **Supported Refresh Modes:**
146
194
  - `RefreshMode.FULL` - Full refresh (recommended, ~15s)
147
195
  - `RefreshMode.FAST` - Fast refresh if supported (~2s, may have ghosting)
package/dist/index.cjs CHANGED
@@ -1744,6 +1744,7 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1744
1744
  const onProgress = options.onProgress;
1745
1745
  const onStatusChange = options.onStatusChange;
1746
1746
  const onUploadComplete = options.onUploadComplete;
1747
+ const onComplete = options.onComplete;
1747
1748
  console.log(
1748
1749
  `Uploading image (${this.width}x${this.height}, ${import_epaper_dithering4.ColorScheme[this.colorScheme]})`
1749
1750
  );
@@ -1770,7 +1771,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1770
1771
  uncompressedSize: encodedData.length,
1771
1772
  onProgress,
1772
1773
  onStatusChange,
1773
- onUploadComplete
1774
+ onUploadComplete,
1775
+ onComplete
1774
1776
  });
1775
1777
  } else {
1776
1778
  console.log(
@@ -1782,7 +1784,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1782
1784
  refreshMode,
1783
1785
  onProgress,
1784
1786
  onStatusChange,
1785
- onUploadComplete
1787
+ onUploadComplete,
1788
+ onComplete
1786
1789
  });
1787
1790
  }
1788
1791
  } else {
@@ -1793,7 +1796,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1793
1796
  refreshMode,
1794
1797
  onProgress,
1795
1798
  onStatusChange,
1796
- onUploadComplete
1799
+ onUploadComplete,
1800
+ onComplete
1797
1801
  });
1798
1802
  }
1799
1803
  console.log("Image upload complete");
@@ -1811,7 +1815,8 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1811
1815
  uncompressedSize,
1812
1816
  onProgress,
1813
1817
  onStatusChange,
1814
- onUploadComplete
1818
+ onUploadComplete,
1819
+ onComplete
1815
1820
  } = params;
1816
1821
  this.connection.clearQueue();
1817
1822
  const uploadStartTime = Date.now();
@@ -1862,6 +1867,7 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1862
1867
  onStatusChange?.(
1863
1868
  `Refresh complete (${refreshTime.toFixed(1)}s)`
1864
1869
  );
1870
+ onComplete?.(uploadTime, refreshTime, totalTime);
1865
1871
  } else if (responseCode === 116 /* REFRESH_TIMEOUT */) {
1866
1872
  throw new ProtocolError("Display refresh timed out");
1867
1873
  } else {
@@ -1870,10 +1876,34 @@ var OpenDisplayDevice = class _OpenDisplayDevice {
1870
1876
  );
1871
1877
  }
1872
1878
  } else {
1873
- const totalTime = (Date.now() - uploadStartTime) / 1e3;
1874
- onUploadComplete?.(totalTime);
1875
- onStatusChange?.(`Upload and refresh complete (${totalTime.toFixed(1)}s)`);
1876
- console.log(`Auto-completed in ${totalTime.toFixed(1)}s (upload + refresh)`);
1879
+ const uploadTime = (Date.now() - uploadStartTime) / 1e3;
1880
+ onUploadComplete?.(uploadTime);
1881
+ onStatusChange?.(
1882
+ `Upload complete (${uploadTime.toFixed(1)}s), refreshing display...`
1883
+ );
1884
+ console.log(`Auto-completed upload in ${uploadTime.toFixed(1)}s, waiting for refresh...`);
1885
+ const refreshStartTime = Date.now();
1886
+ const refreshResponse = await this.connection.readResponse(
1887
+ _OpenDisplayDevice.TIMEOUT_REFRESH
1888
+ );
1889
+ const [responseCode] = checkResponseType(refreshResponse);
1890
+ if (responseCode === 115 /* REFRESH_COMPLETE */) {
1891
+ const refreshTime = (Date.now() - refreshStartTime) / 1e3;
1892
+ const totalTime = (Date.now() - uploadStartTime) / 1e3;
1893
+ console.log(
1894
+ `Refresh complete (${refreshTime.toFixed(1)}s), total time: ${totalTime.toFixed(1)}s`
1895
+ );
1896
+ onStatusChange?.(
1897
+ `Refresh complete (${refreshTime.toFixed(1)}s)`
1898
+ );
1899
+ onComplete?.(uploadTime, refreshTime, totalTime);
1900
+ } else if (responseCode === 116 /* REFRESH_TIMEOUT */) {
1901
+ throw new ProtocolError("Display refresh timed out");
1902
+ } else {
1903
+ throw new ProtocolError(
1904
+ `Unexpected refresh response: 0x${responseCode.toString(16).padStart(4, "0")}`
1905
+ );
1906
+ }
1877
1907
  }
1878
1908
  }
1879
1909
  /**