@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 +48 -0
- package/dist/index.cjs +38 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +38 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
|
1874
|
-
onUploadComplete?.(
|
|
1875
|
-
onStatusChange?.(
|
|
1876
|
-
|
|
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
|
/**
|