<!DOCTYPE html>
<html>
  <head>
    <link rel="stylesheet" href="ina2.css">
    <title>Get ADC data</title>
    <script type="text/javascript" src="dygraph.min.js"></script>
  </head>
  <body>
    <div style="height: auto; width: auto; text-align: center;">
    <div id="div_v"	style="height:400px;"></div>
		<input type="button" id="butOnOff" value="Stop">
		<input type="radio" checked name='rm1'  id="FixEnd"/>
		<label for="FixEnd">Fixed</label>
		<input type="radio" name='rm1' id="FixNone"/> 
		<label for="FixNone">Float</label>
		<input type="button" id="butSave" value="Save data.csv"><br>
		Window: <span id='wdsize'>?</span> sec, Sample Rate: <span id='smprate'>?</span> smps
	<div id='labdiv' style="text-align: center;"></div>
	</div>
  </body>
<script type="text/javascript">
var $ = function(id) {
	return document.getElementById(id);
}
var stg = 0;
var smprate = 975; // adc1: 3900 sps, adc2: 1950 sps, adc4: 975 sps, adc8: 487.5 sps
var smps = smprate;
var sttim = 0;
var cur_idx = 0;
var old_idx = 0;
var smpsa = [];
function wsSmpRate() {
	var idx = cur_idx, tt = new Date().getTime();
	var sps = (idx - old_idx) * 1000/ (tt - sttim);
	sttim = tt;	old_idx = idx;
	smpsa.push(sps);
	var len = smpsa.length;	
	if(len > 100) { smpsa.shift(); len-- };
	var csps = 0;
	for (var i = 0; i < len; i++) csps += smpsa[i];
	csps = csps/len;
	$('smprate').innerHTML = csps.toFixed(1);
}
var samples = 10*smprate;
var rend = 1;
var oldblkid = 0;
var rdnextflg = false;
$("butOnOff").onclick =  function() {
	if(rend) {rend = 0; $("butOnOff").value = "Run";} 
	else {rend = 1; $("butOnOff").value = "Stop";}
}
var datau = [];
var gu;
function wsping() {
	clearTimeout(wstt);
	ws.send('adc*'); 
	wstt = setTimeout(wsping, 400);
}
var wsUri = 'ws://rtl871x0/web.cgi'
//var wsUri = "ws://"+window.location.host.toString()+"/web.cgi";
ws = new WebSocket(wsUri);
ws.binaryType = 'arraybuffer';
ws.onopen = function(){ 
	ws.send('user=rtl871x:supervisor'); 
	ws.send('adcz'); // drv deinit
	ws.send('adcy'); // mode 2 chnl
	ws.send('adc4'); // decimation
	ws.send('adcd'); // xclk 
	ws.send('sys_debug=0'); // print off
	wstt = setTimeout(wsping,50);};
ws.onmessage = function (event) {
	if(event.data instanceof ArrayBuffer) {
		clearTimeout(wstt);
		var wordarray = new Uint16Array(event.data);
		if(wordarray.length > 2) {
			var blksz = wordarray[0]; 
			if(wordarray.length == blksz*2 + 2) {
				if(!sttim) {
					sttim = new Date().getTime();
					setInterval(function(){wsSmpRate()}, 500);
				} else {
					var blkid = wordarray[1] & 0xFFFF;
					if(rdnextflg) cur_idx += (blkid - oldblkid) & 0xFFFF;
					else rdnextflg = true;
					oldblkid = blkid + blksz;
					for (var i=2; i<wordarray.length; i+=2) {
						if(rend) {
 							if(cur_idx >= samples) datau.shift();
 							datau.push([cur_idx/smprate, (wordarray[i]-11460)*0.00007757]);
// 							datau.push([cur_idx/smprate, wordarray[i]]);
						}
						cur_idx++;
					}
					if(!stg) {
						gu = new Dygraph(
						$("div_v"), 
					    datau,
						{
							title: 'RTL8711Ax ADCs',
							showRangeSelector: true,
							showRoller: true,
							xlabel: 'T(sec)',
							ylabel: 'U(V)',
							colors: ['green'],
							axes: { 
								x: {valueFormatter: function(x){return this.getLabels()[0] + ': '+ x.toPrecision(5);}}}, 
							labels: ['T', 'U'],
							labelsDiv: $('labdiv'),
							legend: 'always',  // "follow"
							digitsAfterDecimal: 3,
						});
						setInterval(function(){renderChart()}, 50);
						stg = 1;
					}
			}	}
			wstt = setTimeout(wsping, 40);
}	}	}
function avg(arr) {
	var arrLen = arr.length, result = 0;
	for (var i = 0; i < arrLen; i++) result += arr[i];
	return result / arrLen;
}
var renderChart = function() {
	var dl;
	if (gu.dateWindow_) { 
		dl = gu.dateWindow_[1] - gu.dateWindow_[0];
	    if ($("FixEnd").checked) {
			var ls = datau.length - 1;
			gu.dateWindow_[1] = datau[ls][0];
			gu.dateWindow_[0] = datau[ls][0] - dl;
    	} else if (gu.dateWindow_[0] < datau[0][0]) { 
			gu.dateWindow_[0] = datau[0][0];
			gu.dateWindow_[1] = datau[0][0] + dl;
	   	}
	} else dl = datau.length/smprate;
	$("wdsize").innerHTML = dl.toFixed(3);
	if(rend) gu.updateOptions({'file': datau});
}
function convertArrayOfObjectsToCSV(value){
	var result, ctr, keys, columnDelimiter, lineDelimiter, data;

	data = value.data || null;
	if (data == null || !data.length) {return null;}
	columnDelimiter = value.columnDelimiter || ';';
	lineDelimiter = value.lineDelimiter || '\n';
	keys = Object.keys(data[1]);
	result = '';
	result += keys.join(columnDelimiter);
	result += lineDelimiter;
	data.forEach(function(item){
		ctr = 0;
		keys.forEach(function(key){
			if (ctr > 0) 
				result += columnDelimiter;
			result += item[key];
			ctr++;
		});
		result += lineDelimiter;
	});
    return result;
} 
$("butSave").onclick =  function() { 	
	var csv = convertArrayOfObjectsToCSV({data: datau});
	if (!csv.match(/^data:text\/csv/i)) {csv = 'data:text/csv;charset=utf-8,' + csv;}
	var encodedUri = encodeURI(csv);
	var link = document.createElement('a');
	link.setAttribute('href', encodedUri);
	link.setAttribute('download',"data.csv");
	link.click(); 
}
if(window.innerHeight > 320) $('div_v').style.height = (window.innerHeight-80) + 'px';
window.onresize = function(){    
	if(window.innerHeight > 320) $('div_v').style.height = (window.innerHeight-80) + 'px';
//	$('div_v').style.width = (window.innerWidth-50) + 'px';
}	
</script>
</html>