This commit is contained in:
pvvx 2018-03-04 14:05:52 +03:00
parent 1c773d745a
commit 2bc9cc61b3
22 changed files with 1244 additions and 108 deletions

View file

@ -644,18 +644,18 @@
<buildTargets> <buildTargets>
<target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> <target name="all" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>mingw32-make.exe</buildCommand> <buildCommand>mingw32-make.exe</buildCommand>
<buildArguments>-s -j 2</buildArguments> <buildArguments>-s -j 16</buildArguments>
<buildTarget>all</buildTarget> <buildTarget>all</buildTarget>
<stopOnError>true</stopOnError> <stopOnError>true</stopOnError>
<useDefaultCommand>false</useDefaultCommand> <useDefaultCommand>false</useDefaultCommand>
<runAllBuilders>false</runAllBuilders> <runAllBuilders>false</runAllBuilders>
</target> </target>
<target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> <target name="clean" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">
<buildCommand>make</buildCommand> <buildCommand>mingw32-make.exe</buildCommand>
<buildArguments>-s</buildArguments> <buildArguments>-s -j 16</buildArguments>
<buildTarget>clean</buildTarget> <buildTarget>clean</buildTarget>
<stopOnError>true</stopOnError> <stopOnError>true</stopOnError>
<useDefaultCommand>true</useDefaultCommand> <useDefaultCommand>false</useDefaultCommand>
<runAllBuilders>false</runAllBuilders> <runAllBuilders>false</runAllBuilders>
</target> </target>
<target name="flashburn" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder"> <target name="flashburn" path="" targetID="org.eclipse.cdt.build.MakeTargetBuilder">

119
ExampleHTM/dygraph/ina2.css Normal file
View file

@ -0,0 +1,119 @@
/**
* Default styles for the dygraphs charting library.
*/
.dygraph-legend {
position: relative;
font-size: 12px;
z-index: 10;
width: 250px; /* labelsDivWidth */
/*
dygraphs determines these based on the presence of chart labels.
It might make more sense to create a wrapper div around the chart proper.
top: 0px;
right: 2px;
*/
background: white;
line-height: normal;
text-align: center;
overflow: hidden;
}
/* styles for a solid line in the legend */
.dygraph-legend-line {
display: inline-block;
position: relative;
bottom: .5ex;
padding-left: 1em;
height: 1px;
border-bottom-width: 2px;
border-bottom-style: solid;
/* border-bottom-color is set based on the series color */
}
/* styles for a dashed line in the legend, e.g. when strokePattern is set */
.dygraph-legend-dash {
display: inline-block;
position: relative;
bottom: .5ex;
height: 1px;
border-bottom-width: 2px;
border-bottom-style: solid;
/* border-bottom-color is set based on the series color */
/* margin-right is set based on the stroke pattern */
/* padding-left is set based on the stroke pattern */
}
.dygraph-roller {
position: absolute;
z-index: 10;
}
/* This class is shared by all annotations, including those with icons */
.dygraph-annotation {
position: absolute;
z-index: 10;
overflow: hidden;
}
/* This class only applies to annotations without icons */
/* Old class name: .dygraphDefaultAnnotation */
.dygraph-default-annotation {
border: 1px solid black;
background-color: white;
text-align: center;
}
.dygraph-axis-label {
/* position: absolute; */
/* font-size: 14px; */
z-index: 10;
line-height: normal;
overflow: hidden;
color: black; /* replaces old axisLabelColor option */
}
.dygraph-axis-label-x {
}
.dygraph-axis-label-y {
color: rgb(51,204,204);
}
.dygraph-axis-label-y2 {
color: rgb(255,100,100);
}
.dygraph-title {
font-weight: bold;
z-index: 10;
text-align: center;
/* font-size: based on titleHeight option */
}
.dygraph-xlabel {
text-align: center;
/* font-size: based on xLabelHeight option */
}
/* For y-axis label */
.dygraph-label-rotate-left {
text-align: center;
/* See http://caniuse.com/#feat=transforms2d */
transform: rotate(90deg);
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
}
/* For y2-axis label */
.dygraph-label-rotate-right {
text-align: center;
/* See http://caniuse.com/#feat=transforms2d */
transform: rotate(-90deg);
-webkit-transform: rotate(-90deg);
-moz-transform: rotate(-90deg);
-o-transform: rotate(-90deg);
-ms-transform: rotate(-90deg);
}

View file

@ -0,0 +1,178 @@
<!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=></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://rtl871x1/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]-10500)*0.000078, (wordarray[i+1]-10500)*0.000078]);
}
cur_idx++;
}
if(!stg) {
gu = new Dygraph(
$("div_v"),
datau,
{
title: 'RTL871xAx ADCs',
showRangeSelector: true,
showRoller: true,
xlabel: 'T(sec)',
ylabel: 'U19(V)',
y2label: 'Uvbat(V)',
colors: ['red','green'],
series : { 'Uvbat': { axis: 'y2' } },
axes: {
x: {valueFormatter: function(x){return this.getLabels()[0] + ': '+ x.toPrecision(5);}}},
labels: ['T', 'U19', 'Uvbat'],
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>

View file

@ -25,7 +25,7 @@ var $ = function(id) {
return document.getElementById(id); return document.getElementById(id);
} }
var stg = 0; var stg = 0;
var smprate = 1819; var smprate = 963.4; // 1819;
var smps = smprate; var smps = smprate;
var samples = 10*smprate; var samples = 10*smprate;
var rend = 1; var rend = 1;
@ -74,7 +74,7 @@ ws.onmessage = function (event) {
if(cur_idx >= samples ) datau.shift(); if(cur_idx >= samples ) datau.shift();
if(wordarray[i] & 2) datau.push([cur_idx/smprate, wordarray[i]*0.0005, wordarray[i+1]*0.1]); if(wordarray[i] & 2) datau.push([cur_idx/smprate, wordarray[i]*0.0005, wordarray[i+1]*0.1]);
else datau.push([cur_idx/smprate]); else datau.push([cur_idx/smprate]);
} }
cur_idx++; cur_idx++;
} }
if(!stg) { if(!stg) {
@ -91,7 +91,6 @@ ws.onmessage = function (event) {
// fillGraph: true, // fillGraph: true,
showRoller: true, showRoller: true,
// maxNumberWidth: 10, // maxNumberWidth: 10,
// digitsAfterDecimal: 3,
xlabel: 'T(sec)', xlabel: 'T(sec)',
ylabel: 'U(V)', ylabel: 'U(V)',
y2label: 'I(mA)', y2label: 'I(mA)',
@ -99,12 +98,13 @@ ws.onmessage = function (event) {
// highlightSeriesOpts: { strokeWidth: 2 }, // highlightSeriesOpts: { strokeWidth: 2 },
series : { 'I': { axis: 'y2' } }, series : { 'I': { axis: 'y2' } },
axes: { axes: {
x: {valueFormatter: function(x){return this.getLabels()[0] + ': '+ x.toPrecision(3);}}, x: {valueFormatter: function(x){return this.getLabels()[0] + ': '+ x.toPrecision(5);}},
y: {valueRange: [0,]}, y: {valueRange: [0,]},
y2: {valueRange: [0,]}}, y2: {valueRange: [0,]}},
labels: ['T', 'U', 'I'], labels: ['T', 'U', 'I'],
labelsDiv: $('labdiv'), labelsDiv: $('labdiv'),
legend: 'always', // "follow" legend: 'always', // "follow"
digitsAfterDecimal: 3,
// legendFormatter: legendFormatter // legendFormatter: legendFormatter
}); });
setInterval(function(){renderChart()}, 50); setInterval(function(){renderChart()}, 50);

View file

@ -0,0 +1,155 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="ina2.css">
<title>Get ADC data</title>
</head>
<body>
<div style="height: auto; width: auto; text-align: center;">
<div id='div_v' style="height:512px;">
<canvas id='scope' width=975 height=512></canvas>
</div>
Window: <span id='wdsize'>?</span> sec, Sample Rate: <span id='smprate'>?</span> smps
<div>
<span id='labdiv'>?</span>
<input type="button" id="butOnOff" value="Stop">
<input type="button" id="butSave" value="Save data.csv"><br>
</div>
</div>
</body>
<script type="text/javascript">
var $ = function(id) {return document.getElementById(id);}
var smprate = 3900; // adc1: 3900 sps, adc2: 1950 sps, adc4: 975 sps, adc8: 487.5 sps
var sttim = 0;
var cur_idx = 0;
var old_idx = 0;
var frend = 0;
function wsSmpRate() {
var idx = cur_idx, tt = new Date().getTime();
var sps = (idx - old_idx) * 1000/ (tt - sttim);
sttim = tt; old_idx = idx;
if(smprate) smprate = smprate * 0.9 + sps * 0.1;
else smprate = sps;
$('smprate').innerHTML = smprate.toFixed(1);
$('wdsize').innerHTML = ($('scope').width/smprate).toFixed(2);
$('labdiv').innerHTML = 'Render ' + frend + ' Hz';
frend = 0;
}
var samples = smprate*3;
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 data_ch1 = [];
var data_ch2 = [];
var gu;
function wsping() {
clearTimeout(wstt);
ws.send('adc*');
wstt = setTimeout(wsping, 400);
}
var ctx = document.getElementById('scope').getContext('2d');
function draw() {
var width = ctx.canvas.width;
var height = ctx.canvas.height;
var timeData1 = data_ch1;
var timeData2 = data_ch2;
var scaling = height / 65536 / 2;
var risingEdge = 0;
var len = timeData1.length;
ctx.fillStyle = 'rgba(0, 20, 0, 0.1)';
ctx.fillRect(0, 0, width, height);
ctx.lineWidth = 1;
ctx.strokeStyle = 'rgb(0, 255, 0)';
ctx.beginPath();
while (timeData1[486 + risingEdge++] > 32768 && risingEdge <= width);
if (risingEdge >= width) risingEdge = 0;
while (timeData1[486 + risingEdge++] < 32768 && risingEdge <= width);
if (risingEdge >= width) risingEdge = 0;
for (var x = risingEdge; x < timeData1.length && x - risingEdge < width; x++)
ctx.lineTo(x - risingEdge, height - timeData1[x] * scaling);
ctx.moveTo(0,0);
for (var x = risingEdge; x < timeData2.length && x - risingEdge < width; x++)
ctx.lineTo(x - risingEdge, height - 256 - timeData2[x] * scaling);
ctx.stroke();
frend++;
requestAnimationFrame(draw);
}
var wsUri = 'ws://rtl871x1/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('sys_debug=0');
ws.send('adcz'); // drv deinit
ws.send('adcy'); // mode 2 chls
ws.send('adc1'); // decimation
ws.send('adcd'); // xclk
wstt = setTimeout(wsping,100);};
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) {
var blkid = wordarray[1] & 0xFFFF;
if(rdnextflg) cur_idx += (blkid - oldblkid) & 0xFFFF;
else {
rdnextflg = true;
sttim = new Date().getTime();
setInterval(function(){wsSmpRate()}, 1000);
$('wdsize').innerHTML = 975/smprate;
draw();
}
oldblkid = blkid + blksz;
for (var i=2; i<wordarray.length; i+=2) {
if(rend) {
if(data_ch1.length >= samples) {
data_ch1.shift();
data_ch2.shift();
}
data_ch1.push([wordarray[i]]);
data_ch2.push([wordarray[i+1]]);
}
cur_idx++;
} }
wstt = setTimeout(wsping, 40);
} } }
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();
}
</script>
</html>

View file

@ -0,0 +1,167 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="ina2.css">
<title>Get ADC data</title>
</head>
<body>
<div style="height: auto; width: auto; text-align: center;">
<div id='div_v' style="height:512px;">
<canvas id='scope' width=976 height=512></canvas>
</div>
Window: <span id='wdsize'>?</span> sec, Sample Rate: <span id='smprate'>?</span> sps
<div>
<span id='labdiv'>?</span>
<input type="button" id="butOnOff" value="Stop">
<input type="button" id="butSave" value="Save data.csv"><br>
</div>
</div>
</body>
<script type="text/javascript">
var $ = function(id) {
return document.getElementById(id);
}
var ctx = $('scope').getContext('2d');
//===================================
// | adc1 adc2 adc4 adc8
//----+------------------------------
//adca| 12200 6100 3050 1525
//adcb| 24400 12200 6100 3050
//adcc| 48800 24400 12200 6100
//adcd| 97600 48800 24400 12200
//===================================
var data_ch1 = [];
var smprate = 0;
var smpbuffer = ctx.canvas.width*10;
zero_level = 10500;
trigger = 32768-zero_level/2;
var sttim = 0;
var cur_idx = 0;
var old_idx = 0;
var frend = 0;
function wsSmpRate() {
var idx = cur_idx, tt = new Date().getTime();
var sps = (idx - old_idx) * 2000/ (tt - sttim);
sttim = tt; old_idx = idx;
if(smprate) smprate = smprate * 0.9 + sps * 0.1;
else smprate = sps;
$('smprate').innerHTML = smprate.toFixed(1);
$('wdsize').innerHTML = ($('scope').width/smprate).toFixed(3);
$('labdiv').innerHTML = 'Render ' + frend + ' Hz';
frend = 0;
}
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 gu;
function wsping() {
clearTimeout(wstt);
ws.send('adc*');
wstt = setTimeout(wsping, 100);
}
var scope_height = ctx.canvas.height;
var scaling = scope_height / (65536 - zero_level);
function draw() {
var scope_width = ctx.canvas.width;
ctx.fillStyle = 'rgba(0, 20, 0, 0.1)';
ctx.fillRect(0, 0, scope_width, scope_height);
ctx.lineWidth = 1;
ctx.beginPath();
var data_start = scope_width/2;
var timeData1 = data_ch1.slice();
var data_max = timeData1.length - scope_width;
if(scope_width > data_max) scope_width = data_max;
var risingEdge = data_start;
while(risingEdge < data_max && timeData1[risingEdge++] < trigger);
while(risingEdge < data_max && timeData1[risingEdge++] > trigger);
if(risingEdge >= data_max) {
risingEdge = data_start;
ctx.strokeStyle = 'rgb(0, 0, 255)';
} else ctx.strokeStyle = 'rgb(0, 255, 0)';
risingEdge -= data_start;
for(var x = 0; x < scope_width; x++)
ctx.lineTo(x, scope_height - timeData1[x + risingEdge] * scaling);
ctx.stroke();
frend++;
requestAnimationFrame(draw);
}
var wsUri = 'ws://rtl871x1/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('sys_debug=0');
ws.send('adcz'); // drv deinit
ws.send('adcx'); // mode Audio
ws.send('adc1'); // decimation
ws.send('adcd'); // xclk
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) {
var blkid = wordarray[1] & 0xFFFF;
if(rdnextflg) cur_idx += (blkid - oldblkid) & 0xFFFF;
else {
rdnextflg = true;
sttim = new Date().getTime();
setInterval(function(){wsSmpRate()}, 1000);
draw();
}
oldblkid = blkid + blksz;
for (var i=2; i<wordarray.length; i+=2) {
if(rend) {
if(data_ch1.length > smpbuffer) {
data_ch1.shift();
data_ch1.shift();
}
data_ch1.push([wordarray[i]-zero_level]);
data_ch1.push([wordarray[i+1]-zero_level]);
}
cur_idx++;
} }
wstt = setTimeout(wsping, 5);
} } }
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();
}
</script>
</html>

View file

@ -447,7 +447,12 @@ int wifi_get_lps_dtim(unsigned char *dtim);
* @return RTW_SUCCESS : if successfully creates an AP * @return RTW_SUCCESS : if successfully creates an AP
* RTW_ERROR : if an error occurred * RTW_ERROR : if an error occurred
*/ */
int wifi_start_ap(char *ssid, rtw_security_t security_type, char *password, int channel, char ssid_hidden); int wifi_start_ap(
char *ssid,
rtw_security_t security_type,
char *password,
int channel,
char ssid_hidden);
/* /*
int wifi_start_ap( int wifi_start_ap(
char *ssid, char *ssid,

View file

@ -90,7 +90,7 @@ mp: OTA_IMAGE = $(BIN_DIR)/ota_mp.bin
.PHONY: genbin flashburn reset test readfullflash flashboot flashwebfs flash_OTA runram runsdram .PHONY: genbin flashburn reset test readfullflash flashboot flashwebfs flash_OTA runram runsdram
.NOTPARALLEL: all mp genbin1 genbin23 flashburn reset test readfullflash _endgenbin flashwebfs flash_OTA .NOTPARALLEL: all mp genbin flashburn reset test readfullflash _endgenbin flashwebfs flash_OTA
all: $(ELFFILE) $(FLASH_IMAGE) _endgenbin all: $(ELFFILE) $(FLASH_IMAGE) _endgenbin
mp: $(ELFFILE) $(FLASH_IMAGE) _endgenbin mp: $(ELFFILE) $(FLASH_IMAGE) _endgenbin
@ -110,6 +110,9 @@ $(NMAPFILE): $(ELFFILE)
$(FLASH_IMAGE):$(ELFFILE) $(FLASH_IMAGE):$(ELFFILE)
@echo "===========================================================" @echo "==========================================================="
$(IMAGETOOL) -a -r -o $(BIN_DIR)/ $(ELFFILE) $(IMAGETOOL) -a -r -o $(BIN_DIR)/ $(ELFFILE)
ifdef USE_SDRAM
@cat $(RAM3P_IMAGE) >> $(RAM2P_IMAGE)
endif
_endgenbin: _endgenbin:
@echo "-----------------------------------------------------------" @echo "-----------------------------------------------------------"
@ -240,7 +243,7 @@ reset:
-c 'mww 0x40000210 0x111157' -c 'rtl8710_reboot' -c shutdown -c 'mww 0x40000210 0x111157' -c 'rtl8710_reboot' -c shutdown
runram: runram:
@$(OPENOCD) -f interface/$(FLASHER).cfg -c 'transport select swd' -c 'adapter_khz 1000' \ $(OPENOCD) -f interface/$(FLASHER).cfg -c 'transport select swd' -c 'adapter_khz 1000' \
-f $(FLASHER_PATH)rtl8710.ocd -c 'init' -c 'reset halt' -c 'adapter_khz $(FLASHER_SPEED)' \ -f $(FLASHER_PATH)rtl8710.ocd -c 'init' -c 'reset halt' -c 'adapter_khz $(FLASHER_SPEED)' \
-c 'load_image $(RAM1_IMAGE) 0x10000bc8 bin' \ -c 'load_image $(RAM1_IMAGE) 0x10000bc8 bin' \
-c 'load_image $(RAM2_IMAGE) 0x10006000 bin' \ -c 'load_image $(RAM2_IMAGE) 0x10006000 bin' \

6
WEBFiles/dygraph.min.js vendored Normal file

File diff suppressed because one or more lines are too long

110
WEBFiles/i219ws.htm Normal file
View file

@ -0,0 +1,110 @@
~inc:grfx1.inc~
<td width="50%">U: <span id="xdata1" style="font-weight:bold">?</span> V, I: <span id="xdata2" style="font-weight:bold">?</span> mA</td>
<td style="font-size:10pt">
<div id="sl"></div>Scale: <span id="toutid" style="font-weight:bold">?</span> ms per line</td></tr></table>
<canvas id="mycanvas1" width="620pt" height="150pt"></canvas>
<canvas id="mycanvas2" width="620pt" height="250pt"></canvas>
SampleRate: <span id="smprate" style="font-weight:bold">?</span> sps
</div>
<script src="/smoothie.js" type="text/javascript"></script>
<script src="/slider.js" type="text/javascript"></script>
<script type="text/javascript">
var line1 = new TimeSeries();
var line2 = new TimeSeries();
var oldtimeout = 20;
var smoothie1 = new SmoothieChart({ millisPerPixel: oldtimeout, maxValueScale:1.05, interpolation:'linear', maxDataSetLength: 2000,
grid: { strokeStyle:'rgb(75, 75, 75)', lineWidth: 1, millisPerLine: oldtimeout*50, verticalSections: 6 },
labels: { fillStyle:'rgb(255, 255, 255)' }
});
var smoothie2 = new SmoothieChart({ millisPerPixel: oldtimeout, maxValueScale:1.05, interpolation:'linear', maxDataSetLength: 2000,
grid: { strokeStyle:'rgb(75, 75, 75)', lineWidth: 1, millisPerLine: oldtimeout*50, verticalSections: 6 },
labels: { fillStyle:'rgb(255, 255, 255)' }
});
smoothie1.addTimeSeries(line1, { strokeStyle:'rgb(0, 255, 0)', lineWidth: 2 });
smoothie2.addTimeSeries(line2, { strokeStyle:'rgb(255, 0, 255)', lineWidth: 2 });
smoothie1.streamTo(document.getElementById("mycanvas1"));
smoothie2.streamTo(document.getElementById("mycanvas2"));
var mysl1 = new slider('sl', 333, 1, 200, 0);
var ttout = 20;
function NewTimeScale(t) {
if(oldtimeout != t) {
oldtimeout = t;
smoothie1.options.grid.millisPerLine = t*50;
smoothie1.options.millisPerPixel = t;
smoothie2.options.grid.millisPerLine = t*50;
smoothie2.options.millisPerPixel = t
ttout = t*2;
if(ttout < 2) ttout = 2;
else if(ttout > 250) ttout = 250;
document.getElementById('toutid').innerHTML = t*50; //+'/'+ttout
} }
mysl1.setValue(oldtimeout);
var wstt;
function wsSendMsg() {
ws.send('ina219');
wstt = setTimeout(wsSendMsg, 1000);
}
var smprate = 1000;
var sttim;
var fsmpr = 0;
var oldblkid = 0;
var rdnextflg = false;
var cur_idx = 0;
var sig = 10;
function onMessage(evt) {
if(event.data instanceof ArrayBuffer) {
clearTimeout(wstt);
var wordarray = new Int16Array(event.data);
if(wordarray.length > 2) {
var blksz = wordarray[0];
if(wordarray.length == blksz*2 + 2) {
var blkid = wordarray[1] & 0xFFFF;
if(rdnextflg) {
cur_idx += (blkid - oldblkid) & 0xFFFF;
} else rdnextflg = true;
oldblkid = blkid + blksz;
if(!fsmpr) {
sttim = new Date().getTime();
fsmpr = 1;
setInterval(wsSmpRate, 1000);
} else {
u = 0; s = 0; cnt = 0;
tt = new Date().getTime();
for (var i=2; i<wordarray.length; i+=2) {
u += wordarray[i];
s += wordarray[i+1];
cnt++;
}
cur_idx += cnt;
u = u*0.0005/cnt;
s = 0.15 + s*0.1/cnt;
line1.append(new Date().getTime(), u, true);
document.getElementById('xdata1').innerHTML = u.toFixed(3);
line2.append(new Date().getTime(), s, true);
document.getElementById('xdata2').innerHTML = s.toFixed(2);
} } }
wstt = setTimeout(wsSendMsg, ttout);
} }
function wsSmpRate() {
smprate = (new Date().getTime() - sttim) * 1000 / cur_idx;
document.getElementById('smprate').innerHTML = smprate.toFixed(1);
}
function onOpen(evt) {
ctim = new Date().getTime();
ws.binaryType = 'arraybuffer';
document.getElementById('xdata1').style.color = 'rgb(0, 155, 100)';
document.getElementById('xdata2').style.color = 'rgb(155, 0, 100)';
ws.send('user=rtl871x:supervisor');
ws.send('sys_debug=0');
wstt = setTimeout(wsSendMsg, ttout);
}
var wsUri = "ws://"+window.location.host.toString()+"/web.cgi";
function RunWebSocket() {
ws = new WebSocket(wsUri);
ws.onopen = function(evt) {onOpen(evt)};
ws.onmessage = function(evt) {onMessage(evt)};
}
RunWebSocket();
</script>
~inc:footer.inc~
</body></html>

119
WEBFiles/ina2.css Normal file
View file

@ -0,0 +1,119 @@
/**
* Default styles for the dygraphs charting library.
*/
.dygraph-legend {
position: relative;
font-size: 12px;
z-index: 10;
width: 250px; /* labelsDivWidth */
/*
dygraphs determines these based on the presence of chart labels.
It might make more sense to create a wrapper div around the chart proper.
top: 0px;
right: 2px;
*/
background: white;
line-height: normal;
text-align: center;
overflow: hidden;
}
/* styles for a solid line in the legend */
.dygraph-legend-line {
display: inline-block;
position: relative;
bottom: .5ex;
padding-left: 1em;
height: 1px;
border-bottom-width: 2px;
border-bottom-style: solid;
/* border-bottom-color is set based on the series color */
}
/* styles for a dashed line in the legend, e.g. when strokePattern is set */
.dygraph-legend-dash {
display: inline-block;
position: relative;
bottom: .5ex;
height: 1px;
border-bottom-width: 2px;
border-bottom-style: solid;
/* border-bottom-color is set based on the series color */
/* margin-right is set based on the stroke pattern */
/* padding-left is set based on the stroke pattern */
}
.dygraph-roller {
position: absolute;
z-index: 10;
}
/* This class is shared by all annotations, including those with icons */
.dygraph-annotation {
position: absolute;
z-index: 10;
overflow: hidden;
}
/* This class only applies to annotations without icons */
/* Old class name: .dygraphDefaultAnnotation */
.dygraph-default-annotation {
border: 1px solid black;
background-color: white;
text-align: center;
}
.dygraph-axis-label {
/* position: absolute; */
/* font-size: 14px; */
z-index: 10;
line-height: normal;
overflow: hidden;
color: black; /* replaces old axisLabelColor option */
}
.dygraph-axis-label-x {
}
.dygraph-axis-label-y {
color: rgb(51,204,204);
}
.dygraph-axis-label-y2 {
color: rgb(255,100,100);
}
.dygraph-title {
font-weight: bold;
z-index: 10;
text-align: center;
/* font-size: based on titleHeight option */
}
.dygraph-xlabel {
text-align: center;
/* font-size: based on xLabelHeight option */
}
/* For y-axis label */
.dygraph-label-rotate-left {
text-align: center;
/* See http://caniuse.com/#feat=transforms2d */
transform: rotate(90deg);
-webkit-transform: rotate(90deg);
-moz-transform: rotate(90deg);
-o-transform: rotate(90deg);
-ms-transform: rotate(90deg);
}
/* For y2-axis label */
.dygraph-label-rotate-right {
text-align: center;
/* See http://caniuse.com/#feat=transforms2d */
transform: rotate(-90deg);
-webkit-transform: rotate(-90deg);
-moz-transform: rotate(-90deg);
-o-transform: rotate(-90deg);
-ms-transform: rotate(-90deg);
}

View file

@ -8,7 +8,7 @@
<div class="content"> <div class="content">
<h2 class="title">Debug and Tests</h2> <h2 class="title">Debug and Tests</h2>
<p class="center"> <p class="center">
Chart <a href="/heap.htm">'heap'</a>, <a href="/tst.htm">ST-AP RSSI</a>, <a href="/i219ws.htm">INA219</a><br><br> Chart <a href="/heap.htm">'heap'</a>, <a href="/tst.htm">ST-AP RSSI</a>, <a href="/wso_audio.htm">ADC Audio</a><br><br>
<a href='/protect/timeout.htm?sys_restart=12345'>System Restart</a><br><br> <a href='/protect/timeout.htm?sys_restart=12345'>System Restart</a><br><br>
Counter erase the last flash sector config: ~sys_rdec0x980FE000~<br><br> Counter erase the last flash sector config: ~sys_rdec0x980FE000~<br><br>
</p> </p>

BIN
WEBFiles/rtl2.gif Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

166
WEBFiles/wso_audio.htm Normal file
View file

@ -0,0 +1,166 @@
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="ina2.css">
<title>Get ADC data</title>
</head>
<body>
<div style="height: auto; width: auto; text-align: center;">
<div id='div_v' style="height:512px;">
<canvas id='scope' width=976 height=512></canvas>
</div>
Window: <span id='wdsize'>?</span> sec, Sample Rate: <span id='smprate'>?</span> sps
<div>
<span id='labdiv'>?</span>
<input type="button" id="butOnOff" value="Stop">
<input type="button" id="butSave" value="Save data.csv"><br>
</div>
</div>
</body>
<script type="text/javascript">
var $ = function(id) {
return document.getElementById(id);
}
var ctx = $('scope').getContext('2d');
//===================================
// | adc1 adc2 adc4 adc8
//----+------------------------------
//adca| 12200 6100 3050 1525
//adcb| 24400 12200 6100 3050
//adcc| 48800 24400 12200 6100
//adcd| 97600 48800 24400 12200
//===================================
var data_ch1 = [];
var smprate = 0;
var smpbuffer = ctx.canvas.width*10;
zero_level = 10500;
trigger = 32768-zero_level/2;
var sttim = 0;
var cur_idx = 0;
var old_idx = 0;
var frend = 0;
function wsSmpRate() {
var idx = cur_idx, tt = new Date().getTime();
var sps = (idx - old_idx) * 2000/ (tt - sttim);
sttim = tt; old_idx = idx;
if(smprate) smprate = smprate * 0.9 + sps * 0.1;
else smprate = sps;
$('smprate').innerHTML = smprate.toFixed(1);
$('wdsize').innerHTML = ($('scope').width/smprate).toFixed(3);
$('labdiv').innerHTML = 'Render ' + frend + ' Hz';
frend = 0;
}
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 gu;
function wsping() {
clearTimeout(wstt);
ws.send('adc*');
wstt = setTimeout(wsping, 100);
}
var scope_height = ctx.canvas.height;
var scaling = scope_height / (65536 - zero_level);
function draw() {
var scope_width = ctx.canvas.width;
ctx.fillStyle = 'rgba(0, 20, 0, 0.1)';
ctx.fillRect(0, 0, scope_width, scope_height);
ctx.lineWidth = 1;
ctx.beginPath();
var data_start = scope_width/2;
var timeData1 = data_ch1.slice();
var data_max = timeData1.length - scope_width;
if(scope_width > data_max) scope_width = data_max;
var risingEdge = data_start;
while(risingEdge < data_max && timeData1[risingEdge++] < trigger);
while(risingEdge < data_max && timeData1[risingEdge++] > trigger);
if(risingEdge >= data_max) {
risingEdge = data_start;
ctx.strokeStyle = 'rgb(0, 0, 255)';
} else ctx.strokeStyle = 'rgb(0, 255, 0)';
risingEdge -= data_start;
for(var x = 0; x < scope_width; x++)
ctx.lineTo(x, scope_height - timeData1[x + risingEdge] * scaling);
ctx.stroke();
frend++;
requestAnimationFrame(draw);
}
//var wsUri = 'ws://rtl871x1/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('sys_debug=0');
ws.send('adcz'); // drv deinit
ws.send('adcx'); // mode Audio
ws.send('adc1'); // decimation
ws.send('adcd'); // xclk
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) {
var blkid = wordarray[1] & 0xFFFF;
if(rdnextflg) cur_idx += (blkid - oldblkid) & 0xFFFF;
else {
rdnextflg = true;
sttim = new Date().getTime();
setInterval(function(){wsSmpRate()}, 1000);
draw();
}
oldblkid = blkid + blksz;
for (var i=2; i<wordarray.length; i+=2) {
if(rend) {
if(data_ch1.length > smpbuffer) {
data_ch1.shift();
data_ch1.shift();
}
data_ch1.push([wordarray[i]-zero_level]);
data_ch1.push([wordarray[i+1]-zero_level]);
}
cur_idx++;
} }
wstt = setTimeout(wsping, 5);
} } }
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();
}
</script>
</html>

View file

@ -2,9 +2,9 @@
# SDK CONFIG # SDK CONFIG
#============================================= #=============================================
USE_SDRAM = 1 USE_SDRAM = 1
WEB_INA219_DRV = 1 #WEB_INA219_DRV = 1
#WEB_MLX90614_DRV = 1 #WEB_MLX90614_DRV = 1
#WEB_ADC_DRV = 1 WEB_ADC_DRV = 1
#USE_SDCARD = 1 #USE_SDCARD = 1
#USE_UVC = 1 #USE_UVC = 1
#USE_AT = 1 #USE_AT = 1

View file

@ -14,10 +14,38 @@
void ADCIrqInit(IRQ_FUN IrqFunc, u32 IrqData, u32 intr_enable); // intr_enable = bits: REG_ADC_INTR_EN - BIT_ADC_FIFO_RD_ERROR_EN | BIT_ADC_FIFO_RD_REQ_EN | BIT_ADC_FIFO_FULL_EN ... void ADCIrqInit(IRQ_FUN IrqFunc, u32 IrqData, u32 intr_enable); // intr_enable = bits: REG_ADC_INTR_EN - BIT_ADC_FIFO_RD_ERROR_EN | BIT_ADC_FIFO_RD_REQ_EN | BIT_ADC_FIFO_FULL_EN ...
void ADCIrqDeInit(void); void ADCIrqDeInit(void);
void ADCInit(ADC_MODULE_SEL adc_idx); // RTL8711AM: adc_idx = ADC2_SEL = 2 void ADCInit(unsigned char mode, unsigned char xclk, unsigned char dcmf);
void ADCDeInit(void); void ADCDeInit(void);
void ADCEnable(void); // ADC Start void ADCEnable(void); // ADC Start
void ADCDisable(void); // ADC Stop void ADCDisable(void); // ADC Stop
#define ADC_DECIMATION_1 1
#define ADC_DECIMATION_2 2
#define ADC_DECIMATION_4 3
#define ADC_DECIMATION_8 4
#define ADC_SAMPLE_CLK_x1 0
#define ADC_SAMPLE_CLK_x2 1
#define ADC_SAMPLE_CLK_x4 2
#define ADC_SAMPLE_CLK_x8 3
#define ADC_DECIMATION_FILTER ADC_DECIMATION_1
#define ADC_SAMPLE_XCLK ADC_SAMPLE_CLK_x8
#define ADC_SMPS = 975*(1<<ADC_SAMPLE_XCLK)/(1<<ADC_DECIMATION_FILTER)
// 975*(1<<2)/(1<<1) = 1950 sps
// Add ADC_ANAPAR_AD0
#define BIT_SHIFT_ADC_SAMPLE_CLK 14
#define BIT_MASK_ADC_SAMPLE_CLK 0x3
#define BIT_CTRL_ADC_SAMPLE_CLKL(x) (((x) & BIT_MASK_ADC_SAMPLE_CLK) << BIT_SHIFT_ADC_SAMPLE_CLK)
// Add ADC_ANAPAR_AD1
#define BIT_SHIFT_DOWN_SAMPLE_RATE 18
#define BIT_MASK_DOWN_SAMPLE_RATE 0x7
#define BIT_CTRL_DOWN_SAMPLE_RATE(x) (((x) & BIT_MASK_DOWN_SAMPLE_RATE) << BIT_SHIFT_DOWN_SAMPLE_RATE)
#define BIT_ADC_DECIMATION_FILTER_ORDER ((u32)0x00000001 << 12) /*!< decimation filter order, 0: order3, 1: order4 */
#define BIT_ADC_EXT_VREF_EN ((u32)0x00000001 << 2)
#define BIT_ADC_FEEDBK_CAPACITY_VAL ((u32)0x00000001 << 1)
#define BIT_ADC_DIGITAL_RST_BAR ((u32)0x00000001 << 0)
#endif /* _DRIVER_ADC_DRV_H_ */ #endif /* _DRIVER_ADC_DRV_H_ */

View file

@ -26,6 +26,10 @@
#include "hal_com_reg.h" #include "hal_com_reg.h"
#ifndef mMIN
#define mMIN(a, b) ((a<b)?a:b)
#endif
#define MLX90614_I2CADDR 0x5A #define MLX90614_I2CADDR 0x5A
// RAM // RAM
#define MLX90614_RAWIR1 0x04 #define MLX90614_RAWIR1 0x04

View file

@ -51,13 +51,16 @@ extern void *pvPortMalloc(size_t xWantedSize);
#endif #endif
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
typedef union _adc_data { typedef struct _adc_data {
unsigned short us; uint16_t us0;
uint16_t us1;
} ADC_DATA, *PADC_DATA; } ADC_DATA, *PADC_DATA;
typedef struct _adc_drv { typedef struct _adc_drv {
signed char init; // флаг signed char init; // флаг
unsigned char tmp; unsigned char dcmf; // ADC_DECIMATION_FILTER
unsigned char xclk; // ADC_SAMPLE_XCLK
unsigned char audio; // Audio mode
unsigned short count; // счетчик считанных значений unsigned short count; // счетчик считанных значений
unsigned short overrun; // счет переполнений буфера unsigned short overrun; // счет переполнений буфера
@ -71,56 +74,95 @@ typedef struct _adc_drv {
#endif #endif
} ADC_DRV, *PADC_DRV; } ADC_DRV, *PADC_DRV;
//#define mMIN(a, b) ((a<b)?a:b) #define mMIN(a, b) ((a<b)?a:b)
//#define mMAX(a, b) ((a>b)?a:b) //#define mMAX(a, b) ((a>b)?a:b)
ADC_DRV adc_drv = { ADC_DRV adc_drv = {
.buf_idx = (1460*2 - 80)/(sizeof(ADC_DATA)/2) // циклический буфер на ~1420 замеров (см. sizeof(ADC_DATA)) .dcmf = ADC_DECIMATION_FILTER,
// Если шаг заполнения 1 ms -> буфер на 1.4 сек .xclk = ADC_SAMPLE_XCLK,
// Оптимизация под TCP: (TCP_MSS*2 - 80)/2 = (1460*2 - 80)/2 = 1420 // .audio = 0,
.buf_idx = 709 // (1460*2 - 80)/(sizeof(ADC_DATA)/2) // циклический буфер на ~1420 замеров (см. sizeof(ADC_DATA))
// Если шаг заполнения 1 ms -> буфер на 1.4 сек
// Оптимизация под TCP: (TCP_MSS*2 - 80)/2 = (1460*2 - 80)/2 = 1420
}; };
void adc_int_handler(void *par) { void adc_int_handler(void *par) {
union {
uint16_t w[4];
uint32_t d[2];
}buf;
PADC_DRV p = par; // &adc_drv PADC_DRV p = par; // &adc_drv
// uint32_t adc_isr = HAL_ADC_READ32(REG_ADC_INTR_STS);
buf.d[0] = HAL_ADC_READ32(REG_ADC_FIFO_READ);
buf.d[1] = HAL_ADC_READ32(REG_ADC_FIFO_READ);
if(p->pbuf) { if(p->pbuf) {
#ifndef ADC_USE_TIMER PADC_DATA pd = p->pbuf + p->buf_tx;
int i = 4; pd->us0 = buf.w[3];
while(i--) pd->us1 = buf.w[0];
#endif if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
{ else p->buf_tx++;
PADC_DATA pd = p->pbuf + p->buf_tx; if(p->buf_rx == p->buf_tx) {
pd->us = HAL_ADC_READ32(REG_ADC_FIFO_READ); // 2 -> sample -> 24.4 kHz (if ADC irq!) p->overrun++;
// (void)HAL_ADC_READ32(REG_ADC_FIFO_READ); // 4 sample -> 12.2 kHz (if ADC irq!) if(p->overrun == 0) p->init = 2; // overrun
// (void)HAL_ADC_READ32(REG_ADC_FIFO_READ); // 6 sample -> 8.133 kHz (if ADC irq!) if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
// (void)HAL_ADC_READ32(REG_ADC_FIFO_READ); // 8 sample -> 6.1 kHz (if ADC irq!) else p->buf_rx++;
};
if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
else p->buf_tx++;
if(p->buf_rx == p->buf_tx) {
p->overrun++; // todo: if(p->overrun++ > 100000) deinit() ?
if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
else p->buf_rx++;
};
}
/* Clear ADC Status */
(void)HAL_ADC_READ32(REG_ADC_INTR_STS);
}; };
/* Clear ADC Status */
// HAL_ADC_WRITE32(REG_ADC_INTR_STS, adc_isr);
(void)HAL_ADC_READ32(REG_ADC_INTR_STS);
} }
size_t adc_getdata(void *pd, uint16 cnt) void adc_int_handler_audio(void *par) {
union {
uint16_t w[4];
uint32_t d[2];
}buf;
PADC_DRV p = par; // &adc_drv
buf.d[0] = HAL_ADC_READ32(REG_ADC_FIFO_READ);
buf.d[1] = HAL_ADC_READ32(REG_ADC_FIFO_READ);
if(p->pbuf) {
PADC_DATA pd = p->pbuf + p->buf_tx;
pd->us0 = buf.w[0];
pd->us1 = buf.w[1];
if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
else p->buf_tx++;
if(p->buf_rx == p->buf_tx) {
p->overrun++;
if(p->overrun == 0) p->init = 2; // overrun
if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
else p->buf_rx++;
};
pd = p->pbuf + p->buf_tx;
pd->us0 = buf.w[2];
pd->us1 = buf.w[3];
if(p->buf_tx >= p->buf_idx) p->buf_tx = 0;
else p->buf_tx++;
if(p->buf_rx == p->buf_tx) {
p->overrun++;
if(p->overrun == 0) p->init = 2; // overrun
if(p->buf_rx >= p->buf_idx) p->buf_rx = 0;
else p->buf_rx++;
};
};
/* Clear ADC Status */
(void)HAL_ADC_READ32(REG_ADC_INTR_STS);
}
size_t adc_getdata(void *pd, uint16_t cnt)
{ {
PADC_DRV p = &adc_drv; PADC_DRV p = &adc_drv;
if(p->init <= 0) return 0; if(p->init <= 0) return 0;
unsigned short *pus = (unsigned short *) pd; uint16_t *pus = (uint16_t *) pd;
taskDISABLE_INTERRUPTS(); taskDISABLE_INTERRUPTS();
uint16 buf_rx = p->buf_rx; uint16_t buf_rx = p->buf_rx;
*pus++ = cnt; // кол-во замеров *pus++ = cnt; // кол-во замеров
*pus++ = p->count + p->overrun; // индекс замера для анализа пропусков на стороне приемника *pus++ = p->count + p->overrun; // индекс замера для анализа пропусков на стороне приемника
// если не пропущено, то равен прошлому + кол-во считанных замеров в прошлом блоке // если не пропущено, то равен прошлому + кол-во считанных замеров в прошлом блоке
p->count += cnt; // p->overrun = 0; p->count += cnt; // p->overrun = 0;
unsigned char *puc = (unsigned char *) pus; uint8_t *puc = (uint8_t *) pus;
if(cnt) { if(cnt) {
uint16 lend = buf_rx + cnt; uint16_t lend = buf_rx + cnt;
if(lend > p->buf_idx) { if(lend > p->buf_idx) {
lend -= p->buf_idx + 1; lend -= p->buf_idx + 1;
p->buf_rx = lend; p->buf_rx = lend;
@ -136,13 +178,13 @@ size_t adc_getdata(void *pd, uint16 cnt)
return cnt * sizeof(ADC_DATA) + 4; return cnt * sizeof(ADC_DATA) + 4;
} }
uint16 adc_chkdata(uint16 cnt) uint16_t adc_chkdata(uint16_t cnt)
{ {
PADC_DRV p = &adc_drv; PADC_DRV p = &adc_drv;
if(p->init <= 0) return 0; if(p->init <= 0) return 0;
int len = p->buf_tx - p->buf_rx; int len = p->buf_tx - p->buf_rx;
if(len < 0) len += p->buf_idx + 1; if(len < 0) len += p->buf_idx + 1;
if(cnt > (uint16)len) cnt = (uint16)len; if(cnt > (uint16_t)len) cnt = (uint16_t)len;
return cnt; return cnt;
} }
@ -150,7 +192,47 @@ int adc_ws(TCP_SERV_CONN *ts_conn, char cmd)
{ {
PADC_DRV p = &adc_drv; PADC_DRV p = &adc_drv;
switch(cmd) { switch(cmd) {
case 'd': // deinit case '*': // get_data
if(p->init <= 0) {
p->count = 0;
p->overrun = 0;
// p->errs = 0;
if(!p->pbuf) {
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(ADC_DATA));
if(!p->pbuf) {
error_printf("Error create buffer!\n");
return -1;
};
p->buf_tx = 0;
p->buf_rx = 0;
};
ADCInit(p->audio, p->xclk, p->dcmf);
#ifdef ADC_USE_TIMER
// Initial a periodical timer
gtimer_init(&p->timer, ADC_USE_TIMER);
gtimer_start_periodical(&p->timer, 1000, (void*)adc_int_handler, (uint32_t)p);
rtl_printf("ADC Timer Period = %u us\n", &p->timer.hal_gtimer_adp.TimerLoadValueUs);
#else
if(p->audio)
ADCIrqInit(adc_int_handler_audio,(uint32)p, BIT_ADC_FIFO_FULL_EN | BIT_ADC_FIFO_RD_REQ_EN);
else
ADCIrqInit(adc_int_handler,(uint32)p, BIT_ADC_FIFO_FULL_EN | BIT_ADC_FIFO_RD_REQ_EN);
#endif
ADCEnable();
p->init = 1;
}
case 'g': // get_data
{
uint32_t i = adc_chkdata(p->buf_idx + 1);
if(i) {
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
i = mMIN((web_conn->msgbufsize / sizeof(ADC_DATA)), i);
if(websock_tx_frame(ts_conn, WS_OPCODE_BINARY | WS_FRAGMENT_FIN, web_conn->msgbuf, adc_getdata(web_conn->msgbuf, i)) != ERR_OK)
return -1;
}
return i;
}
case 'z': // deinit
if(p->init > 0) { if(p->init > 0) {
#ifdef ADC_USE_TIMER #ifdef ADC_USE_TIMER
gtimer_stop(&p->timer); gtimer_stop(&p->timer);
@ -169,48 +251,40 @@ int adc_ws(TCP_SERV_CONN *ts_conn, char cmd)
return 0; return 0;
} }
return 1; return 1;
case 'c': // get count case '?': // get count
return adc_chkdata(p->buf_idx + 1); return adc_chkdata(p->buf_idx + 1);
case 'i': // init case 'i': // info init
return p->init; return p->init;
default: // get_data case '1': // set ADC_DECIMATION_1
if(p->init <= 0) { p->dcmf = 1;
p->count = 0; return 0;
p->overrun = 0; case '2': // set ADC_DECIMATION_2
// p->errs = 0; p->dcmf = 2;
if(!p->pbuf) { return 0;
p->pbuf = zalloc((p->buf_idx + 1) * sizeof(ADC_DATA)); case '4': // set ADC_DECIMATION_4
if(!p->pbuf) { p->dcmf = 3;
error_printf("Error create buffer!\n"); return 0;
return -1; case '8': // set ADC_DECIMATION_8
}; p->dcmf = 4;
p->buf_tx = 0; return 0;
p->buf_rx = 0; case 'a': // set ADC_SAMPLE_XCLK x1
}; p->xclk = 0;
ADCInit(ADC2_SEL); return 0;
#ifdef ADC_USE_TIMER case 'b': // set ADC_SAMPLE_XCLK x2
// Initial a periodical timer p->xclk = 1;
gtimer_init(&p->timer, ADC_USE_TIMER); return 0;
gtimer_start_periodical(&p->timer, 1000, (void*)adc_int_handler, (uint32_t)p); case 'c': // set ADC_SAMPLE_XCLK x4
rtl_printf("ADC Timer Period = %u us\n", &p->timer.hal_gtimer_adp.TimerLoadValueUs); p->xclk = 2;
#else return 0;
ADCIrqInit(adc_int_handler,(uint32)p, BIT_ADC_FIFO_FULL_EN); // BIT_ADC_FIFO_RD_REQ_EN ? case 'd': // set ADC_SAMPLE_XCLK x8
#endif p->xclk = 3;
ADCEnable(); return 0;
p->init = 1; case 'x': // set Audio mode
// return 0; p->audio = 1;
} return 0;
case 'g': // get case 'y': // set 4 channel mode
{ p->audio = 0;
uint32 i = adc_chkdata(p->buf_idx + 1); return 0;
if(i) {
WEB_SRV_CONN *web_conn = (WEB_SRV_CONN *)ts_conn->linkd;
i = mMIN((web_conn->msgbufsize / sizeof(ADC_DATA)), i);
if(websock_tx_frame(ts_conn, WS_OPCODE_BINARY | WS_FRAGMENT_FIN, web_conn->msgbuf, adc_getdata(web_conn->msgbuf, i)) != ERR_OK)
return -1;
}
return i;
}
} }
return -1; return -1;
} }

View file

@ -82,7 +82,7 @@ static void ADCEnablePS(void)
} }
#endif #endif
void ADCInit(ADC_MODULE_SEL adc_idx) { void ADCInit(unsigned char mode, unsigned char xclk, unsigned char dcmf) {
/* ADC Function and Clock Enable */ /* ADC Function and Clock Enable */
/* To release DAC delta sigma clock gating */ /* To release DAC delta sigma clock gating */
HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2, HAL_WRITE32(SYSTEM_CTRL_BASE, REG_SYS_SYSPLL_CTRL2,
@ -97,10 +97,10 @@ void ADCInit(ADC_MODULE_SEL adc_idx) {
HAL_ADC_WRITE32(REG_ADC_CONTROL, HAL_ADC_WRITE32(REG_ADC_CONTROL,
BIT_CTRL_ADC_COMP_ONLY(ADC_FEATURE_DISABLED) // compare mode only enable (without FIFO enable) BIT_CTRL_ADC_COMP_ONLY(ADC_FEATURE_DISABLED) // compare mode only enable (without FIFO enable)
| BIT_CTRL_ADC_ONESHOT(ADC_FEATURE_DISABLED) // one-shot mode enable | BIT_CTRL_ADC_ONESHOT(ADC_FEATURE_DISABLED) // one-shot mode enable
| BIT_CTRL_ADC_OVERWRITE(ADC_FEATURE_DISABLED) // overwrite mode enable | BIT_CTRL_ADC_OVERWRITE(ADC_FEATURE_ENABLED) // overwrite mode enable
| BIT_CTRL_ADC_ENDIAN(ADC_DATA_ENDIAN_LITTLE) // endian selection | BIT_CTRL_ADC_ENDIAN(ADC_DATA_ENDIAN_LITTLE) // endian selection
| BIT_CTRL_ADC_BURST_SIZE(8) // DMA operation threshold | BIT_CTRL_ADC_BURST_SIZE(8) // DMA operation threshold
| BIT_CTRL_ADC_THRESHOLD(8) // one shot mode threshold | BIT_CTRL_ADC_THRESHOLD(8) // one shot mode threshold
| BIT_CTRL_ADC_DBG_SEL(ADC_DBG_SEL_DISABLE)); | BIT_CTRL_ADC_DBG_SEL(ADC_DBG_SEL_DISABLE));
#if 0 #if 0
/* ADC compare value and compare method setting*/ /* ADC compare value and compare method setting*/
@ -141,23 +141,25 @@ void ADCInit(ADC_MODULE_SEL adc_idx) {
& (~(1 << adc_idx))); // compare mode control : less than the compare threshold & (~(1 << adc_idx))); // compare mode control : less than the compare threshold
#endif #endif
/* ADC audio mode set-up */ /* ADC audio mode set-up */
#if 0
/* ADC enable manually setting */ /* ADC enable manually setting */
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0,
HAL_ADC_READ32(REG_ADC_ANAPAR_AD0) HAL_ADC_READ32(REG_ADC_ANAPAR_AD0)
// & (~(BIT_ADC_AUDIO_EN))) // & (~(BIT_ADC_AUDIO_EN)))
// & (~(BIT_ADC_EN_MANUAL)) // & (~(BIT_ADC_EN_MANUAL))
| BIT_ADC_AUDIO_EN // ADC audio mode enable // | BIT_ADC_AUDIO_EN // ADC audio mode enable
| BIT_ADC_EN_MANUAL // ADC enable manually | BIT_ADC_EN_MANUAL // ADC enable manually
); );
#endif
/* ADC analog parameter 0 */ /* ADC analog parameter 0 */
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD0, 0x00953b10
(HAL_ADC_READ32(REG_ADC_ANAPAR_AD0) | BIT_CTRL_ADC_AUDIO_EN(mode)
// & (~BIT14) //ADC Input is internal? | BIT_CTRL_ADC_SAMPLE_CLKL(xclk));
| (BIT14))
& (~(BIT3|BIT2)));
/* ADC analog parameter 1 */ /* ADC analog parameter 1 */
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD1, HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD1, BIT_ADC_DIGITAL_RST_BAR
(HAL_ADC_READ32(REG_ADC_ANAPAR_AD1) & (~BIT1)) | (BIT2|BIT0)); | BIT_ADC_EXT_VREF_EN
| BIT_ADC_DECIMATION_FILTER_ORDER
| BIT_CTRL_DOWN_SAMPLE_RATE(dcmf));
/* ADC analog parameter 2 */ /* ADC analog parameter 2 */
HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD2, 0x67884400); HAL_ADC_WRITE32(REG_ADC_ANAPAR_AD2, 0x67884400);
/* ADC analog parameter 3 */ /* ADC analog parameter 3 */

View file

@ -47,8 +47,8 @@ INA219DRV ina219drv = {
// Если шаг заполнения 1 ms -> буфер на 0.71 сек // Если шаг заполнения 1 ms -> буфер на 0.71 сек
// Оптимизация под TCP: (TCP_MSS*2 - 80)/4 = (1460*2 - 80)/4 = 710 // Оптимизация под TCP: (TCP_MSS*2 - 80)/4 = (1460*2 - 80)/4 = 710
.i2c.status = DRV_I2C_OFF, .i2c.status = DRV_I2C_OFF,
.i2c.idx = 1, // =1: I2C1 .i2c.idx = 3, //1, // =1: I2C1, =2: I2C2, =3: I2C3
.i2c.io_sel = S0, // =S0: PC_4, PC_5 .i2c.io_sel = S0, // =S0: PC_4, PC_5; PB_6, PB_7; PB_2, PB_3
.i2c.mode = DRV_I2C_FS_MODE // DRV_I2C_FS_MODE .i2c.mode = DRV_I2C_FS_MODE // DRV_I2C_FS_MODE
}; };
/* /*

View file

@ -466,7 +466,7 @@ extern int ina219_ws(TCP_SERV_CONN *ts_conn, char cmd);
else ifcmp("mlx90614") { else ifcmp("mlx90614") {
if(CheckSCB(SCB_WEBSOC)) { if(CheckSCB(SCB_WEBSOC)) {
extern int mlx90614_ws(TCP_SERV_CONN *ts_conn, char cmd); extern int mlx90614_ws(TCP_SERV_CONN *ts_conn, char cmd);
int x = mlx90614_ws(ts_conn, cstr[6]); int x = mlx90614_ws(ts_conn, cstr[8]);
if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT); if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
else tcp_puts("%d", x); else tcp_puts("%d", x);
} }
@ -476,7 +476,7 @@ extern int mlx90614_ws(TCP_SERV_CONN *ts_conn, char cmd);
else ifcmp("adc") { else ifcmp("adc") {
if(CheckSCB(SCB_WEBSOC)) { if(CheckSCB(SCB_WEBSOC)) {
extern int adc_ws(TCP_SERV_CONN *ts_conn, char cmd); extern int adc_ws(TCP_SERV_CONN *ts_conn, char cmd);
int x = adc_ws(ts_conn, cstr[6]); int x = adc_ws(ts_conn, cstr[3]);
if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT); if(x < 0) SetSCB(SCB_FCLOSE|SCB_DISCONNECT);
else tcp_puts("%d", x); else tcp_puts("%d", x);
} }

View file

@ -6,8 +6,8 @@ SDK_PATH = USDK/
#GCC_PATH = d:/MCU/GNU_Tools_ARM_Embedded/6.2017-q1-update/bin/# + or set in PATH #GCC_PATH = d:/MCU/GNU_Tools_ARM_Embedded/6.2017-q1-update/bin/# + or set in PATH
#OPENOCD_PATH = D:/MCU/OpenOCD/bin/# + or set in PATH #OPENOCD_PATH = D:/MCU/OpenOCD/bin/# + or set in PATH
TOOLS_PATH ?= $(SDK_PATH)component/soc/realtek/8195a/misc/iar_utility/common/tools/ TOOLS_PATH ?= $(SDK_PATH)component/soc/realtek/8195a/misc/iar_utility/common/tools/
FLASHER_TYPE = Jlink #FLASHER_TYPE = Jlink
#FLASHER_TYPE = cmsis-dap FLASHER_TYPE = cmsis-dap
FLASHER_SPEED = 3500 FLASHER_SPEED = 3500
FLASHER_PATH = flasher/ FLASHER_PATH = flasher/
JLINK_PATH ?= D:/MCU/SEGGER/JLink_V612i/ JLINK_PATH ?= D:/MCU/SEGGER/JLink_V612i/