-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathfsk-gen.html
112 lines (97 loc) · 3.19 KB
/
fsk-gen.html
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>FSK Serial Generator in JavaScript for SoftModem board</title>
<script type="text/javascript">
function $(name) {
return document.getElementById(name);
}
function chr8() {
return Array.prototype.map.call(arguments, function(a){
return String.fromCharCode(a&0xff)
}).join('');
}
function chr16() {
return Array.prototype.map.call(arguments, function(a){
return String.fromCharCode(a&0xff, (a>>8)&0xff)
}).join('');
}
function chr32() {
return Array.prototype.map.call(arguments, function(a){
return String.fromCharCode(a&0xff, (a>>8)&0xff,(a>>16)&0xff, (a>>24)&0xff);
}).join('');
}
function toUTF8(str) {
var utf8 = [];
for (var i = 0; i < str.length; i++) {
var c = str.charCodeAt(i);
if (c <= 0x7f)
utf8.push(c);
else if (c <= 0x7ff) {
utf8.push(0xc0 | (c >>> 6));
utf8.push(0x80 | (c & 0x3f));
} else if (c <= 0xffff) {
utf8.push(0xe0 | (c >>> 12));
utf8.push(0x80 | ((c >>> 6) & 0x3f));
utf8.push(0x80 | (c & 0x3f));
} else {
var j = 4;
while (c >>> (6*j)) j++;
utf8.push(((0xff00 >>> j) & 0xff) | (c >>> (6*--j)));
while (j--)
utf8[idx++] = 0x80 | ((c >>> (6*j)) & 0x3f);
}
}
return utf8;
}
var dataURI, audio;
function generate(str) {
if (str.length == 0) return;
var utf8 = toUTF8(str);
//console.log(utf8);
var sampleRate = 29400;
var baud = 1225;
var freqHigh = 7350;
var freqLow = 4900;
var spb = sampleRate/baud; // 24 samples per bit
var preCarrierBits = Math.ceil(sampleRate*40/1000/spb); // 49 bits
var postCarrierBits = Math.ceil(sampleRate*5/1000/spb); // 6.125 bits => 7 bits
var size = (preCarrierBits + postCarrierBits + 10*utf8.length) * spb;
var data = "RIFF" + chr32(size+36) + "WAVE" +
"fmt " + chr32(16, 0x00010001, sampleRate, sampleRate, 0x00080001) +
"data" + chr32(size);
function pushData(freq, samples) {
for (var i = 0; i < samples; i++) {
var v = 128 + 127 * Math.sin((2 * Math.PI) * (i / sampleRate) * freq);
data += chr8(v);
}
}
pushData(freqHigh, preCarrierBits*spb);
for (var x in utf8) {
var c = (utf8[x] << 1) | 0x200;
for (var i = 0; i < 10; i++, c >>>= 1)
pushData((c&1) ? freqHigh : freqLow, spb);
}
pushData(freqHigh, postCarrierBits*spb);
if (size+44 != data.length) alert("wrong size: " + size+44 + " != " + data.length);
dataURI = "data:audio/wav;base64," + escape(btoa(data));
audio = new Audio(dataURI);
audio.play();
$('jmp').disabled = false;
}
</script>
</head>
<body>
<h1>FSK Serial Generator in JavaScript for SoftModem board</h1>
<p>You can send data to the SoftModem breakout board for Arduino using JavaScript in this page.<br>
This works in data-uri audio and HTML5 ready browsers (Firefox, Safari, Opera).</p>
<p><b>About SoftModem: </b>
<a href="http://code.google.com/p/arms22/wiki/SoftModemBreakoutBoard">http://code.google.com/p/arms22/wiki/SoftModemBreakoutBoard</a></p>
<form onsubmit="generate($('data').value); return false;">
Text: <input type="text" id="data" size="40" value="Hello!">
<input type="submit" value="Generate and Send">
<input type="button" value="Jump to Audio data" id="jmp" disabled="true" onclick="location.href=dataURI">
</form>
</body>
</html>