mbed-simulator
Version:
Mbed OS 5 simulator
97 lines (78 loc) • 2.99 kB
JavaScript
window.MbedJSHal.lora = (function() {
var host = window.location.protocol + '//' + window.location.host;
var radioPtr = 0;
var ts = null; // timesync
window.socket.on('lora-downlink', function (ev) {
let buffer = ev.data;
// todo check if its actually msg for us
console.log(Date.now(), 'lora-downlink', ev);
obj.downlinkMsg = buffer;
var dataPtr = Module._malloc(buffer.length);
var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, buffer.length);
for (var ix = 0; ix < buffer.length; ix++) {
dataHeap[ix] = buffer[ix];
}
if (!radioPtr) {
return console.error('LoRa radio ptr is 0!');
}
// when to send?
var delay = ev.sendTs - ts.now();
console.log('send delay is', delay);
function go() {
// @todo: check modulation
ccall('handle_lora_downlink', null,
[ 'number', 'number', 'number', 'number', 'number', 'number' ],
[ radioPtr, dataPtr, buffer.length, ev.freq, ev.bandwidth, ev.datarate ],
{ async: true });
}
if (delay <= 0) {
go();
}
else {
setTimeout(go, delay);
}
});
function init(ptr) {
console.log('LoRa radio init', ptr);
radioPtr = ptr;
// create a timesync instance
ts = timesync.create({
server: '/timesync',
interval: 10000
});
}
function sendLoRa(channel, power, bandwidth, datarate, data, size) {
var buffer = [].slice.call(new Uint8Array(Module.HEAPU8.buffer, data, size));
var x = new XMLHttpRequest();
x.onload = function() {
console.log('sendLoRa', x.status, x.responseText);
};
x.open('POST', host + '/api/lora/send');
x.setRequestHeader('Content-Type', 'application/json');
x.send(JSON.stringify({
host: 'router.eu.thethings.network',
port: 1700,
payload:
buffer,
freq: channel,
bandwidth: bandwidth,
datarate: datarate
}));
console.log('sendLoRa', 'channel', channel, 'power', power, 'bandwidth', bandwidth, 'datarate', datarate, 'buffer', buffer, 'size', size);
console.log('encoded packet', buffer.map(function(b) {
var j = b.toString(16).toUpperCase();
if (j.length === 1) return '0' + j;
return j;
}).join(''));
}
function sendFsk(channel, power, bandwidth, datarate, data, size) {
var buffer = [].slice.call(new Uint8Array(Module.HEAPU8.buffer, data, size));
console.log('sendFsk', 'channel', channel, 'power', power, 'bandwidth', bandwidth, 'datarate', datarate, 'buffer', buffer, 'size', size);
}
var obj = {
init: init,
sendLoRa: sendLoRa,
sendFsk: sendFsk
};
return obj;
})();