リモートにあるIC-7410のVFO周波数を、ブラウザのボタンをクリックすることで変更できます。
index.js
const bufa = new Buffer('fefe80e017', 'hex'); // preamble
const bufz = new Buffer('fd', 'hex'); // postamble
const buf1 = new Buffer('fefe80e0174351fd', 'hex'); // CQ
const buf2 = new Buffer('fefe80e01751525a3ffd', 'hex'); // QRZ?
const buf3 = new Buffer('fefe80e003fd', 'hex'); // read freq
var buf4 = new Buffer('fefe80e0050000000000fd', 'hex'); // send freq
var SerialPort = require('serialport');
var serial = new SerialPort(
'/dev/ttyUSB0',
{baudrate : 19200, parser : SerialPort.parsers.byteDelimiter([ 0xfd ])});
var http = require('http');
var fs = require('fs');
var index = fs.readFileSync(__dirname + '/index.html');
var app = http.createServer(function(req, res) {
res.writeHead(200, {'Content-Type' : 'text/html'});
res.end(index);
})
.listen(3000);
var io = require('socket.io').listen(app);
var freqHz = 7026000;
var ndata = 512; // data[512] + 0x0a
var pos = 0;
var myarray = new Array();
// -- water fall --
var count = 0;
process.stdin.on('readable', function() {
var buf = process.stdin.read();
if (buf !== null) {
for (var i = 0; i < buf.length; i++) {
if (buf[i] == 0x0a) {
if (pos >= 512) {
io.emit('waterfall', myarray);
}
pos = 0;
} else {
myarray[pos++] = buf[i];
}
}
}
});
// -- serial for IC-7410 --
serial.on('open',
function() { console.log('serial port /dev/ttyUSB0 is opened.'); });
var count2 = 0;
serial.on('data', function(data) {
// console.log('received data: ', data.length, data);
if (!(data[0] == 0xfe & data[1] == 0xfe)) {
console.log('------------- received serial data error');
}
if (data[2] == 0xe0 & data[3] == 0x80 & data[4] == 0x03) {
var f10 = data[5] >> 4 & 0x0f;
var f1 = data[5] & 0x0f;
var f1k = data[6] >> 4 & 0x0f;
var f100 = data[6] & 0x0f;
var f100k = data[7] >> 4 & 0x0f;
var f10k = data[7] & 0x0f;
var f10m = data[8] >> 4 & 0x0f;
var f1m = data[8] & 0x0f;
var freq = f10m.toString() + f1m.toString() + "," + f100k.toString() +
f10k.toString() + f1k.toString() + "." + f100.toString() +
f10.toString() + f1 + " kHz";
freqHz = f10m * 10000000 + f1m * 1000000 + f100k * 100000 + f10k * 10000 +
f1k * 1000 + f100 * 100 + f10 * 10 + f1;
// console.log('count2 = ', count2++, 'freq: ' + freq, freqHz);
io.emit('freqmsg', 'VFO A: ' + freq);
}
});
serial
.on('error', function(err) { console.log('Error: ', err.message); })
// -- set frequency --
function setfreq(f) {
var f10m = Math.floor(f / 10000000); f -= f10m * 10000000;
var f1m = Math.floor(f / 1000000); f -= f1m * 1000000;
var f100k = Math.floor(f / 100000); f -= f100k * 100000;
var f10k = Math.floor(f / 10000); f -= f10k * 10000;
var f1k = Math.floor(f / 1000); f -= f1k * 1000;
var f100 = Math.floor(f / 100); f -= f100 * 100;
var f10 = Math.floor(f / 10); f -= f10 * 10;
var f1 = Math.floor(f / 1);
var data = new Array(
[ 0xfe, 0xfe, 0x80, 0xe0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd ]);
buf4[5] = f10 << 4 | f1;
buf4[6] = f1k << 4 | f100;
buf4[7] = f100k << 4 | f10k;
buf4[8] = f10m << 4 | f1m;
buf4[9] = 0;
serial.write(buf4);
}
// -- socket --
io.on('connection', function(socket) {
socket.on('message1', function() { serial.write(buf1); });
socket.on('message2', function() { serial.write(buf2); });
socket.on('message3', function() {
var newfreq = freqHz + 1000;
setfreq(newfreq);
});
socket.on('message4', function() {
var newfreq = freqHz + 100;
setfreq(newfreq);
});
socket.on('message5', function() {
var newfreq = freqHz - 100;
setfreq(newfreq);
});
socket.on('message6', function() {
var newfreq = freqHz - 1000;
setfreq(newfreq);
});
socket.on('your message', function(msg) {
serial.write(bufa);
serial.write(msg);
serial.write(bufz);
io.emit('your message', msg);
});
});
// -- request freq --
function sendTime() {
serial.write(buf3);
// console.log('Freq asked..');
}
setInterval(sendTime, 100);
// -- EOF --
index.html
<!doctype html>
<html>
<head>
<style>
* { margin: 0; padding: 0; box - sizing : border - box; }
body { font: 13px Helvetica, Arial; }
form { background: # 000; padding: 3px; position: fixed; bottom: 0; width: 100 % ; }
form input { border: 0; padding: 10px; width: 80 % ; margin - right : .5 % ; }
form button { width: 15 % ; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages{list - style - type : none; margin : 0; padding : 0; }
#messages li{padding : 5px 10px; }
#messages li : nth - child(odd){background : #eee; }
#messages {margin - bottom : 40px }
#messages {font - size : 2em }
#btn1 {position : fixed; top : 10px; left : 10px; font - size : 2em }
#btn2 {position : fixed; top : 10px; left : 70px; font - size : 2em }
#btn3 {position : fixed; top : 10px; left : 150px; font - size : 2em; width : 30px }
#btn4 {position : fixed; top : 10px; left : 190px; font - size : 2em; width : 30px }
#btn5 {position : fixed; top : 10px; left : 230px; font - size : 2em; width : 30px }
#btn6 {position : fixed; top : 10px; left : 270px; font - size : 2em; width : 30px }
#frequency {position : fixed; top : 10px; left : 310px; font - size : 2em }
#mycanvas {position : fixed; top : 60px; left : 10px; font - size : 2em }
#mycanvas2 {position : fixed; top : 600px; left : 10px; font - size : 2em }
</style>
<script>
window.addEventListener("load", init);
function init(){}
</script>
</head>
<body>
<script src="https://code.jquery.com/jquery-1.11.1.js"></script>
<script src='/socket.io/socket.io.js'></script>
<script src="https://code.createjs.com/createjs-2015.11.26.min.js"></script>
<button id="btn1"><font size="5">CQ</font></button>
<button id="btn2"><font size="5">QRZ?</font></button>
<button id="btn3"><font size="5">++</ font></button>
<button id="btn4"><font size="5">+</font></button>
<button id="btn5"><font size="5">-</font></button>
<button id="btn6"><font size="5">--</font></button>
<div id="frequency"></div>
<div id="messages"></div>
<form action="">
<input id="m" autocomplete="off"/><button>Send</button>
</form>
<canvas id="mycanvas" width="512" height="512" style="background:white;"></canvas>
<canvas id="mycanvas2" width="512" height= "90" style="background:white;"></canvas>
<script>
var myarray = new Array();
var socket = io();
var canvas;
var ctx;
var imgData;
var rgb = new Array(3);
var stage = new createjs.Stage("mycanvas2");
var t = new createjs.Text("IC-7410", "26px serif", "DarkRed");
t.x = 10;
t.y = 10;
stage.addChild(t);
stage.update();
function colormap(charcode) { // 0~9 or 0x30~0x39
var tmp = (charcode - 0x30) * 0.1; // 0.0~0.9
var val;
var r, g, b;
if (tmp < 0.50) {
r = 0.0;
} else if (tmp > 0.75) {
r = 1.0;
} else {
r = 4.0 * tmp - 2.0;
}
if (tmp < 0.25) {
g = 4.0 * tmp;
} else if (tmp > 0.75) {
g = -4.0 * tmp + 4.0;
} else {
g = 1.0;
}
if (tmp < 0.25) {
b = 1.0;
} else if (tmp > 0.50) {
b = 0.0;
} else {
b = -4.0 * tmp + 2.0;
}
rgb[1] = 255.0 * g;
rgb[0] = 255.0 * r;
rgb[2] = 255.0 * b;
}
function waterFall(myarray) {
ctx.putImageData(imgData, 0, 1);
imgData = ctx.getImageData(0, 0, 512, 512);
for (j = 0; j < 512; j++) {
colormap(myarray[j]);
imgData.data[0 + j * 4] = rgb[0];
imgData.data[1 + j * 4] = rgb[1];
imgData.data[2 + j * 4] = rgb[2];
imgData.data[3 + j * 4] = 255;
}
}
canvas = document.getElementById('mycanvas');
ctx = canvas.getContext('2d');
var mx, my;
function onClick(e) {
var rect = e.target.getBoundingClientRect();
mx = e.clientX - rect.left;
my = e.clientY - rect.top;
console.log('mouse clicked: ', mx, my);
}
canvas.addEventListener('click', onClick, false);
imgData = ctx.createImageData(512, 512);
for (i = 0; i < 512; i++) {
for (j = 0; j < 512; j++) {
imgData.data[0 + j * 4 + i * imgData.width * 4] = j % 256;
imgData.data[1 + j * 4 + i * imgData.width * 4] = i % 256;
imgData.data[2 + j * 4 + i * imgData.width * 4] = 128;
imgData.data[3 + j * 4 + i * imgData.width * 4] = 255;
}
}
ctx.putImageData(imgData, 0, 0);
var socket = io();
$('#btn1').click(function() { socket.emit('message1'); });
$('#btn2').click(function() { socket.emit('message2'); });
$('#btn3').click(function() { socket.emit('message3'); });
$('#btn4').click(function() { socket.emit('message4'); });
$('#btn5').click(function() { socket.emit('message5'); });
$('#btn6').click(function() { socket.emit('message6'); });
$('form').submit(function() {
socket.emit('your message', $('#m').val());
$('#m').val('');
return false;
});
socket.on('your message', function(msg) {
$('#messages').append($('<div>').text(msg));
window.scrollTo(0, document.body.scrollHeight);
});
socket.on('waterfall', function(data) { waterFall(data); });
socket.on('freqmsg', function(msg) {
t.text = msg;
stage.update();
document.getElementById("frequency").innerHTML = msg;
});
</script>
</body>
</html>