Histogram implementation

This commit is contained in:
2019-11-09 11:09:36 +01:00
parent 5a7507a93e
commit f377535ed8
8 changed files with 453 additions and 437 deletions

245
main.qml
View File

@@ -3,217 +3,96 @@ import QtQuick.Window 2.2
import QtQuick.Controls 2.4
import QtQuick.Layouts 1.3
import Test 1.0
Window {
id: window
objectName: "qmlWindow"
visible: true
width: 640
height: 680
title: qsTr("Hello World")
Column {
id: column
Connections {
target: mgmt
Label {
text: "FTM dist1: " + ((mgmt.dist1 ? mgmt.dist1+sld1.value : 0)/1000).toFixed(2);
}
onNewDistMeas: {
Label {
text: "FTM dist2: " + ((mgmt.dist2 ? mgmt.dist2+sld1.value : 0)/1000).toFixed(2);
}
Label {
text: "FTM dist3: " + ((mgmt.dist3 ? mgmt.dist3+sld1.value : 0)/1000).toFixed(2);
}
Label {
text: "FTM dist4: " + ((mgmt.dist4 ? mgmt.dist4+sld1.value : 0)/1000).toFixed(2);
}
Slider {
width: 400;
id: sld1;
from: -1000;
to: 1000;
value: mgmt.offset;
onValueChanged: {
mgmt.offset = value;
leCanvas.requestPaint();
if (cbNUC.currentIndex == idx) {
chart.pushData(value);
lblMean.text = "Mean: " + chart.mean.toFixed(3) + "\nStdDev: " + chart.stdDev.toFixed(3);
lblCount.text = "Count: " + chart.totalCount + "\nMax bin: " + chart.maxBinValue.toFixed(3);
lblRunTime.text = "Time: " + (mgmt.runTimeInMs() / 1000.0).toFixed(0) + "s";
}
}
Label {
text: "offset: " + sld1.value;
}
Label {
text: "UWB dist1: " + mgmt.uwbDist1.toFixed(2);
}
}
Label {
text: "UWB dist2: " + mgmt.uwbDist2.toFixed(2);
}
GridLayout {
anchors.fill: parent;
Label {
text: "UWB dist3: " + mgmt.uwbDist3.toFixed(2);
}
Row {
Layout.row: 0;
Layout.column: 0;
spacing: 3;
Label {
text: "UWB dist4: " + mgmt.uwbDist4.toFixed(2);
}
Connections {
target: mgmt
onDistChanged: leCanvas.requestPaint();
}
RowLayout {
Button {
text: "party hard";
onClicked: mgmt.trigger();
}
Button {
text: "stop"
onClicked: mgmt.stop();
}
Button {
text: "reset sld"
onClicked: {
sld1.value = 0;
ComboBox {
id: cbNUC;
model: ["NUC1", "NUC2", "NUC3", "NUC4", "NUC5"];
onCurrentIndexChanged: {
chart.reset();
}
}
Button {
text: "High Five"
id: btnTrigger;
text: "Start";
onClicked: {
mgmt.manualCheckpoint();
if (mgmt.trigger()) {
// running
btnTrigger.text = "Stop";
} else {
btnTrigger.text = "Start";
}
}
}
Button {
text: "Reset"
onClicked: {
chart.reset();
chart.update();
}
}
}
Row {
Layout.row: 1;
Layout.column: 0;
spacing: 5;
}
Canvas {
id: leCanvas;
anchors.right: parent.right
anchors.rightMargin: 0
anchors.left: parent.left
anchors.leftMargin: 0
anchors.bottom: parent.bottom
anchors.bottomMargin: 0
anchors.top: column.bottom
anchors.topMargin: 20
readonly property double s: 0.02;
function leArc(ctx, cx, cy, dist, stdDev, caption) {
// center circle
ctx.fillStyle = (dist < 0 ? "#FF0000" : "#000000");
ctx.beginPath();
ctx.arc(cx*s, cy*s, 2, 0, 360);
ctx.fill();
ctx.font = "12px Arial";
ctx.fillText(caption, cx*s, cy*s);
// error circle
// ctx.beginPath();
// ctx.arc(cx*s, cy*s, (dist+sld1.value)*s, 0, 360);
// ctx.closePath();
// ctx.lineWidth = stdDev*s*0.5;
// ctx.strokeStyle = "#66000000";
// ctx.stroke();
// circle
if (dist > 0) {
ctx.lineWidth = 1;
ctx.strokeStyle = "#aa000000";
ctx.beginPath();
ctx.arc(cx*s, cy*s, dist*s, 0, 360);
ctx.stroke();
Label {
id: lblMean;
}
}
onPaint: {
var ctx = getContext("2d")
Label {
id: lblCount;
}
ctx.reset();
Label {
id: lblRunTime;
}
}
ctx.fillStyle = "#dddddd";
ctx.clearRect(0, 0, leCanvas.width, leCanvas.height);
HistogramChart {
Layout.row: 2;
Layout.column: 0;
Layout.fillHeight: true;
Layout.fillWidth: true;
//ctx.strokeStyle = Qt.rgba(0, 0, 0, 1)
//ctx.lineWidth = 1
id: chart
objectName: "qmlChart"
}
// var ox = 4000;
// var oy = 4000;
// var cx1 = ox+0;
// var cy1 = oy+0;
// var cx2 = ox+0;
// var cy2 = oy+7250;
// var cx3 = ox+9000;
// var cy3 = oy+7250;
// var cx4 = ox+9000;
// var cy4 = oy+0;
var ox = 4000;
var oy = 4000;
var cx1 = ox+0;
var cy1 = oy+0;
var cx2 = ox+9000;
var cy2 = oy+0;
var cx3 = ox+9000;
var cy3 = oy+6200;
var cx4 = ox+0;
var cy4 = oy+6200;
leArc(ctx, cx1, cy1, mgmt.dist1, mgmt.stdDev1, 1);
leArc(ctx, cx2, cy2, mgmt.dist2, mgmt.stdDev2, 2);
leArc(ctx, cx3, cy3, mgmt.dist3, mgmt.stdDev3, 3);
leArc(ctx, cx4, cy4, mgmt.dist4, mgmt.stdDev4, 4);
var sigma = 2000;
var stepSize = 333;
var maxP = Math.pow( 1.0 / Math.sqrt(2*Math.PI*sigma), 4.1);
// for (var y = 0; y < leCanvas.height/s; y += stepSize) {
// for (var x = 0; x < leCanvas.width/s; x += stepSize) {
// var d1 = Math.sqrt( Math.pow(x-cx1, 2) + Math.pow(y-cy1, 2) ) - (mgmt.dist1-sld1.value);
// var d2 = Math.sqrt( Math.pow(x-cx2, 2) + Math.pow(y-cy2, 2) ) - (mgmt.dist2-sld1.value);
// var d3 = Math.sqrt( Math.pow(x-cx3, 2) + Math.pow(y-cy3, 2) ) - (mgmt.dist3-sld1.value);
// var d4 = Math.sqrt( Math.pow(x-cx4, 2) + Math.pow(y-cy4, 2) ) - (mgmt.dist4-sld1.value);
// var p = 1;
// p *= 1.0 / Math.sqrt(2*Math.PI*sigma) * Math.exp( - d1*d1/(2*sigma*sigma) );
// p *= 1.0 / Math.sqrt(2*Math.PI*sigma) * Math.exp( - d2*d2/(2*sigma*sigma) );
// p *= 1.0 / Math.sqrt(2*Math.PI*sigma) * Math.exp( - d3*d3/(2*sigma*sigma) );
// p *= 1.0 / Math.sqrt(2*Math.PI*sigma) * Math.exp( - d4*d4/(2*sigma*sigma) );
// //p = Math.pow(p, 1);
// if (p > maxP / 50) {
// ctx.fillStyle = Qt.rgba(1,0,0, p/maxP);
// ctx.fillRect(x*s, y*s, stepSize*s, stepSize*s);
// }
// }
// }
}
}
}
}