info-display/transmit.ts

92 lines
2.3 KiB
TypeScript
Raw Normal View History

2023-05-25 22:59:22 +02:00
export const byteToStr = (v: number) => String.fromCharCode((v & 0xF) + 97, ((v >> 4) & 0xF) + 97)
export const wordToStr = (v: number) => byteToStr(v & 0xFF) + byteToStr((v >> 8) & 0xFF)
// Waveshare 7.5 V2, derived from original source code
export const DisplayCode = `EPD${String.fromCharCode(22 + 97)}_`
type Pixel = 0 | 1 | 2 | 3 // monochrome ePaper display
export function getPixelValue (bitmap: Uint8ClampedArray, index: number): Pixel {
const px = bitmap[index]
const px2 = bitmap[index + 1]
if (px === px2) {
if (px === 0x00) return 0
if (px === 0xFF) return 1
if (px === 0x7F) return 2
}
return 3
}
function getImageData (bitmap: Uint8ClampedArray, width: number, height: number): Pixel[] {
const imageData = Array(width * height) as Pixel[]
let i = 0
for (let y = 0; y < height; y++) {
for (let x = 0; x < width; x++, i++) {
imageData[i] = getPixelValue(bitmap, i << 2)
}
}
return imageData
}
export default function initializeTransmitter (ip: string) {
const POST_URL = `http://${ip}/`
let stIndex = 0 // some index
let pxIndex = 0 // pixel value index
let rqMsg = '' // message sent to server
let imageData: Pixel[]
let dataLen: number
async function u_send (cmd: string, next: boolean) {
try {
await fetch(`${POST_URL}${cmd}`, {
method: 'POST',
body: '',
})
} catch {
/* ignore errors */
} finally {
if (stIndex === 0) u_data()
else if (stIndex === 1) u_done()
}
if (next) stIndex++
}
function u_done () {
console.log('Transfer Complete!')
u_send('SHOW_', true)
}
function u_show () {
const percentage = pxIndex / dataLen * 100
console.log(`Transfer: ${pxIndex}/${dataLen} (${Math.round(percentage)}%)`)
const cmd = `${rqMsg}${wordToStr(rqMsg.length)}LOAD_`
u_send(cmd, pxIndex >= dataLen)
}
function u_data () {
rqMsg = ""
while ((pxIndex < dataLen) && (rqMsg.length < 1000)) {
let v = 0;
for (let i = 0; i < 8; i++) {
if ((pxIndex < dataLen) && imageData[pxIndex++]) v |= 128 >> i
}
rqMsg += byteToStr(v)
}
u_show()
}
return function uploadImage (bitmap: Uint8ClampedArray, width: number, height: number) {
imageData = getImageData(bitmap, width, height)
dataLen = imageData.length
u_send(DisplayCode, false);
}
}