-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserial_extension.js
84 lines (70 loc) · 2.08 KB
/
serial_extension.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
(function(ext) {
var device = null;
var potentialDevices = [];
var recvDataQueue = [];
var recvHandlerQueue = [];
ext._deviceConnected = function(dev) {
potentialDevices.push(dev);
if(!device){
tryNextDevice();
}
};
function recvQueuePoll(){
var nextData = recvDataQueue.shift();
var nextHandler = recvHandlerQueue.shift();
if(nextData && !nextHandler){
recvDataQueue.unshift(data);
}
else if(nextHandler && !nextData){
recvHandlerQueue.unshift(nextHandler);
}
else{
nextHandler(nextData);
}
};
function tryNextDevice() {
nextDevice = potentialDevices.shift();
if (!device)
return;
device.open({ stopBits: 1, bitRate: 9600});
device.set_receive_handler(function(data) {
recvDataQueue.push(data);
recvQueuePoll();
});
};
ext._shutdown = function() {
if (device) device.close();
device = null;
};
ext._deviceRemoved = function(dev) {
if(dev == device){
device = null;
}
};
ext._getStatus = function() {
if(!device) return {status: 1, msg: 'Device not connected'};
return {status: 2, msg: 'Device connected'};
};
ext.sendall = function(raw_byte){
if(0 <= raw_bye && raw_byte <= 255){
if(device){
device.send(UInt8Array.of(raw_byte).buffer)
return true;
}
}
return false;
};
ext.recv = function(callback){
recvHandlerQueue.push(callback);
recvQueuePoll();
};
var descriptor = {
blocks: [
['r', 'send byte: %n', 'sendall', 0x00],
['R', 'recv byte', 'recv']
],
url: 'https://github.com/bsb20/scratch-to-serial/tree/gh-pages'
};
// Register the extension
ScratchExtensions.register('Sample extension', descriptor, ext, {type: 'serial'});
})({});