Skip to content

Commit

Permalink
almost there
Browse files Browse the repository at this point in the history
  • Loading branch information
Yrr0r committed Jul 15, 2022
1 parent 11642f2 commit addfb7e
Show file tree
Hide file tree
Showing 4 changed files with 250 additions and 13 deletions.
10 changes: 8 additions & 2 deletions index.html
Original file line number Diff line number Diff line change
@@ -1,14 +1,20 @@
<!DOCTYPE html>
<head>
<script src="script.js"></script>
<link rel="stylesheet" href="bulma.min.css">
<script src="util/crc32.js"></script>
<script src="util/dom-to-image.min.js"></script>
<script src="script.js"></script>
</head>
<body>
<div class="container">
<p class="title">WebBLE with Paperang</p>
<div class="block">
<button class="button" onclick="connect();">connect</button>
<button class="button" onclick="selfdiag()">Diagnostics</button>
<button class="button" onclick="printText()">Print</button>
<button class="button" onclick="bitmapRender()">Render</button>
</div>
<div class="block">
<textarea class="textarea" id="inputtext"></textarea>
</div>
</div>
</body>
136 changes: 125 additions & 11 deletions script.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,136 @@

var btservice;
var sockchar;
// service: 49535343-fe7d-4ae5-8fa9-9fafd205e455
// characteristic: 49535343-6daa-4d02-abf6-19569aca69fe

async function connect(){
var notify;
/*
Some useful facts about printers:
service: 49535343-fe7d-4ae5-8fa9-9fafd205e455
characteristics values are
Write to: 49535343-6daa-4d02-abf6-19569aca69fe
notify: 49535343-1e4d-4bd9-ba61-23c647249616
On BLE, max size of one pack is 512, means 502 for each data pack.
*/
async function connect() {
// Call browser popup to let user select device
let printer = await navigator.bluetooth.requestDevice({
acceptAllDevices:true,
optionalServices:['49535343-fe7d-4ae5-8fa9-9fafd205e455']
acceptAllDevices: true,
optionalServices: ['49535343-fe7d-4ae5-8fa9-9fafd205e455']
});
console.log(printer);
let pserver = await printer.gatt.connect();

let pserver = await printer.gatt.connect(); // BLE connect
btservice = await pserver.getPrimaryService('49535343-fe7d-4ae5-8fa9-9fafd205e455');
sockchar = await btservice.getCharacteristic('49535343-6daa-4d02-abf6-19569aca69fe');
notify = await btservice.getCharacteristic('49535343-1e4d-4bd9-ba61-23c647249616');
notify.startNotifications().then(() => {
notify.addEventListener('characteristicvaluechanged', (event) => {
let value = event.target.value;
let a = [];
// Convert raw data bytes to hex values just for the sake of showing something.
// In the "real" world, you'd use data.getUint8, data.getUint16 or even
// TextDecoder to process raw data bytes.
for (let i = 0; i < value.byteLength; i++) {
a.push(('00' + value.getUint8(i).toString(16)).slice(-2));
}
console.log('Notify:' , a.join(' '));
})
})
}

async function selfdiag() {
let cmdstr = Uint8Array.from([2, 27, 0, 1, 0, 0, 70, 137, 94, 158, 3]);
await sockchar.writeValue(cmdstr);
}

async function sendprint(data) {
if (data.length < 500) {
await sockchar.writeValue(genpack(0, data));
return;
}
function aslice(arr, size) {
let ret = [];
for (let i = 0; i < arr.length; i += size) {
let piece = arr.slice(i, i + size);
ret.push(piece);
}
return ret;
}
let packs = aslice(data, 500);
console.log(packs)
for (each in packs) {
let m = await sockchar.writeValue(genpack(0, packs[each]));
console.log(m)
}
}


function randfill(n) {
let arr = Array(n);
for (let i = 0; i < n; i += 40) {
for (let j = 0; j < 40; j++) {
if (j % 2) {
arr[i + j] = 255;
} else {
arr[i + j] = 0;
}

}
}
return arr;
}

async function selfdiag(){
let cmdstr = Uint8Array.from([2,27,0,1,0,0,70,137,94,158,3]);
sockchar.writeValue(cmdstr);

// --- JSDoc Enabled funcs

/**
*
* @param {int} cmd Command Byte (1 byte)
* @param {array} data Data Array (Max 2016 bytes)
* @param {int} packetid Packet id (1 byte)
*/
function genpack(cmd, data = [0], packetid = 0) {
function b32split(i) {
// js sucks to be a low level byte manipulator.
let r = new ArrayBuffer(4);
let v = new DataView(r);
v.setUint32(0, i, true);
let t8 = new Uint8Array(r);
let arr = [...t8];
return arr;
}
let length = data.length;
if (length > 2016) { console.error("genpack: Requested pack too large"); return null; };
let bytes = Array();
bytes.push(2); //First byte 0x02
bytes.push(cmd); // 2nd byte is command
bytes.push(packetid); // 3rd byte is packet id

// Spliting the length byte
let lengthByte = b32split(length);
bytes.push(lengthByte[0], lengthByte[1]); // 4th and 5th byte is length

// append payload, starts from 6th byte.
bytes = bytes.concat(data);

// calculate CRC32.
let crcval = CRC32.buf(data, 0x35769521);
bytes = bytes.concat(b32split(crcval)); // append that 4 bytes.

bytes.push(3); // last ending byte

let bytestream = Uint8Array.from(bytes)
return bytestream;
}

/*
* Graphical rendering
*/

function bitmapRender(){
let node = document.getElementById("inputtext");
domtoimage.toPng(node, {width: 340}).then(function(dataUrl){
var img = new Image();
img.src = dataUrl;
document.body.appendChild(img);
})
}
115 changes: 115 additions & 0 deletions util/crc32.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,115 @@
/*! crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */
/* vim: set ts=2: */
/*exported CRC32 */
var CRC32;
(function (factory) {
/*jshint ignore:start */
/*eslint-disable */
if(typeof DO_NOT_EXPORT_CRC === 'undefined') {
if('object' === typeof exports) {
factory(exports);
} else if ('function' === typeof define && define.amd) {
define(function () {
var module = {};
factory(module);
return module;
});
} else {
factory(CRC32 = {});
}
} else {
factory(CRC32 = {});
}
/*eslint-enable */
/*jshint ignore:end */
}(function(CRC32) {
CRC32.version = '1.2.2';
/*global Int32Array */
function signed_crc_table() {
var c = 0, table = new Array(256);

for(var n =0; n != 256; ++n){
c = n;
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
c = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));
table[n] = c;
}

return typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;
}

var T0 = signed_crc_table();
function slice_by_16_tables(T) {
var c = 0, v = 0, n = 0, table = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ;

for(n = 0; n != 256; ++n) table[n] = T[n];
for(n = 0; n != 256; ++n) {
v = T[n];
for(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF];
}
var out = [];
for(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256);
return out;
}
var TT = slice_by_16_tables(T0);
var T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4];
var T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9];
var Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14];
function crc32_bstr(bstr, seed) {
var C = seed ^ -1;
for(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF];
return ~C;
}

function crc32_buf(B, seed) {
var C = seed ^ -1, L = B.length - 15, i = 0;
for(; i < L;) C =
Tf[B[i++] ^ (C & 255)] ^
Te[B[i++] ^ ((C >> 8) & 255)] ^
Td[B[i++] ^ ((C >> 16) & 255)] ^
Tc[B[i++] ^ (C >>> 24)] ^
Tb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^
T7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^
T3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]];
L += 15;
while(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF];
return ~C;
}

function crc32_str(str, seed) {
var C = seed ^ -1;
for(var i = 0, L = str.length, c = 0, d = 0; i < L;) {
c = str.charCodeAt(i++);
if(c < 0x80) {
C = (C>>>8) ^ T0[(C^c)&0xFF];
} else if(c < 0x800) {
C = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF];
C = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];
} else if(c >= 0xD800 && c < 0xE000) {
c = (c&1023)+64; d = str.charCodeAt(i++)&1023;
C = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF];
C = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF];
C = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];
C = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF];
} else {
C = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF];
C = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF];
C = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];
}
}
return ~C;
}
CRC32.table = T0;
// $FlowIgnore
CRC32.bstr = crc32_bstr;
// $FlowIgnore
CRC32.buf = crc32_buf;
// $FlowIgnore
CRC32.str = crc32_str;
}));
2 changes: 2 additions & 0 deletions util/dom-to-image.min.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit addfb7e

Please sign in to comment.