Skip to content

Commit

Permalink
Merge pull request #131 from analogdevicesinc/namedRepeaters
Browse files Browse the repository at this point in the history
session save&restore, and configuration persistence. closes #21.
  • Loading branch information
itdaniher committed Apr 27, 2015
2 parents bbdc297 + baff1f6 commit 9685055
Show file tree
Hide file tree
Showing 12 changed files with 135 additions and 24 deletions.
2 changes: 1 addition & 1 deletion libsmu
1 change: 1 addition & 0 deletions qml.qrc
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
<file>qml/DeviceRow.qml</file>
<file>qml/jsutils.js</file>
<file>qml/dataexport.js</file>
<file>qml/sesssave.js</file>
<file>icons/simv.png</file>
<file>icons/svmi.png</file>
<file>icons/mv.png</file>
Expand Down
2 changes: 2 additions & 0 deletions qml/ChannelRow.qml
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import QtQuick.Controls.Styles 1.1

Rectangle {
property var channel
property alias signalRepeater:signalRepeater
color: '#333'

Button {
Expand Down Expand Up @@ -64,6 +65,7 @@ Rectangle {
spacing: 0

Repeater {
id: signalRepeater
model: modelData.signals

SignalRow {
Expand Down
1 change: 1 addition & 0 deletions qml/ContentPane.qml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import QtQuick.Layouts 1.0
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.3
import "jsutils.js" as JSUtils
import "sesssave.js" as StateSave

ColumnLayout {
id: cLayout
Expand Down
4 changes: 4 additions & 0 deletions qml/Controller.qml
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import QtQuick 2.0
import "sesssave.js" as StateSave

Item {
id: controlItem
Expand All @@ -14,6 +15,9 @@ Item {
session.sampleRate = sampleRate
session.sampleCount = sampleCount
session.start(continuous);
if ( session.devices.length > 0 ) {
lastConfig = StateSave.saveState();
}
}

Timer {
Expand Down
1 change: 1 addition & 0 deletions qml/DeviceRow.qml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import QtQuick.Layouts 1.0

Rectangle {
property var device
property alias channelRepeater: channelRepeater
color: '#222'

Text {
Expand Down
3 changes: 2 additions & 1 deletion qml/SignalRow.qml
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,10 @@ import QtQuick.Controls.Styles 1.1

Rectangle {
id: signalBlock
property alias ymin: axes.ymin;
property alias ymax: axes.ymax;
property var xaxis
property var signal

color: '#444'

function updateMode() {
Expand Down
50 changes: 31 additions & 19 deletions qml/Toolbar.qml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import QtQuick.Controls 1.0
import QtQuick.Controls.Styles 1.1
import QtQuick.Dialogs 1.0
import "dataexport.js" as CSVExport
import "sesssave.js" as StateSave

ToolbarStyle {
ExclusiveGroup {
Expand All @@ -15,27 +16,28 @@ ToolbarStyle {
property alias contentVisible: contentVisibleItem.checked

FileDialog {
id: fileDialog
id: dataDialog
selectExisting: false
sidebarVisible: false
title: "Please enter a location to save your data."
nameFilters: [ "CSV files (*.csv)", "All files (*)" ]
onAccepted: {
var labels = [];
var columns = [];
if (session.devices) {
for (var i = 0; i < session.devices.length; i++) {
for (var j = 0; j < session.devices[i].channels.length; j++) {
for (var k = 0; k < session.devices[i].channels[i].signals.length; k++) {
var label = '' + i + session.devices[i].channels[j].label +"_"+ session.devices[i].channels[j].signals[k].label;
labels.push(label);
columns.push(session.devices[i].channels[j].signals[k].buffer.getData());
};
};
};
fileio.writeByURI(fileDialog.fileUrls[0], CSVExport.dumpsample(columns, labels));
};
}
onAccepted: { CSVExport.saveData(dataDialog.fileUrls[0]);}
}
FileDialog {
id: sessSaveDialog
selectExisting: false
sidebarVisible: false
title: "Please enter a location to save your session."
nameFilters: [ "JSON files (*.json)", "All files (*)" ]
onAccepted: { fileio.writeByURI(sessSaveDialog.fileUrls[0], JSON.stringify(StateSave.saveState(), 0, 2));}
}
FileDialog {
id: sessRestoreDialog
selectExisting: true
sidebarVisible: false
title: "Please select a session to restore."
nameFilters: [ "JSON files (*.json)", "All files (*)" ]
onAccepted: { StateSave.restoreState(JSON.parse(fileio.readByURI(sessRestoreDialog.fileUrls[0])));}
}

Button {
Expand Down Expand Up @@ -78,9 +80,19 @@ ToolbarStyle {

MenuSeparator{}
MenuItem {
id: dialogVisibleItem
id: dataSaveVisibleItem
text: "Export Data"
onTriggered: fileDialog.visible = true
onTriggered: dataDialog.visible = true
}
MenuItem {
id: sessionSaveVisibleItem
text: "Save Session"
onTriggered: sessSaveDialog.visible = true
}
MenuItem {
id: sessionRestoreVisibleItem
text: "Restore Session"
onTriggered: sessRestoreDialog.visible = true
}
MenuSeparator{}
MenuItem { text: "Exit"; onTriggered: Qt.quit() }
Expand Down
20 changes: 19 additions & 1 deletion qml/dataexport.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// basic csv serialisation function
// accepts a list of lists representing the columns of data, and a list of text labels
var dumpsample = function (columns, labels) {
var dumpSamples = function (columns, labels) {
if (columns.length != labels.length) {
throw("label length mismatches number of columns");
}
Expand All @@ -21,3 +21,21 @@ var dumpsample = function (columns, labels) {
}
return csvContent
}

var saveData = function (target) {
var labels = [];
var columns = [];
if (session.devices) {
for (var i = 0; i < session.devices.length; i++) {
for (var j = 0; j < session.devices[i].channels.length; j++) {
for (var k = 0; k < session.devices[i].channels[i].signals.length; k++) {
var label = '' + i + session.devices[i].channels[j].label +"_"+ session.devices[i].channels[j].signals[k].label;
labels.push(label);
columns.push(session.devices[i].channels[j].signals[k].buffer.getData());
};
};
};
fileio.writeByURI(target, dumpSamples(columns, labels));
};
};

12 changes: 10 additions & 2 deletions qml/main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import QtQuick 2.1
import QtQuick.Window 2.0
import QtQuick.Layouts 1.0
import QtQuick.Controls 1.0
import "sesssave.js" as StateSave

ApplicationWindow {
width: 1024
Expand All @@ -11,13 +12,14 @@ ApplicationWindow {
property var toolbarHeight: 56
id: window

property alias repeatedSweep: toolbar.repeatedSweep
property alias repeatedSweep: toolbar.repeatedSweep
property alias plotsVisible: toolbar.plotsVisible
property alias contentVisible: toolbar.contentVisible
property var lastConfig: {}

Controller {
id: controller
continuous: !repeatedSweep
continuous: !repeatedSweep
}

Rectangle {
Expand Down Expand Up @@ -80,12 +82,18 @@ ApplicationWindow {
spacing: 0

Repeater {
id: deviceRepeater
model: session.devices
DeviceRow {
Layout.fillHeight: true
Layout.fillWidth: true
device: model
}
onItemAdded: {
if ((Object.keys(lastConfig).length) > 0) {
StateSave.restoreState(lastConfig);
}
}
}
}
}
Expand Down
55 changes: 55 additions & 0 deletions qml/sesssave.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
var saveState = function () {
var signalStates = {};
for (var a = 0; a < deviceRepeater.count; a++){
var deviceItem = deviceRepeater.itemAt(a);
for (var b = 0; b < deviceItem.channelRepeater.count; b++){
var channelItem = deviceItem.channelRepeater.itemAt(b);
var channel = channelItem.channel;
for (var c = 0; c < channelItem.signalRepeater.count; c++) {
var label = '' + a + session.devices[a].channels[b].label +"_"+ session.devices[a].channels[b].signals[c].label;
var signalState = {};
var signalItem = channelItem.signalRepeater.itemAt(c);
var signal = signalItem.signal;
signalState.src = signal.src.src;
signalState.v1 = signal.src.v1;
signalState.v2 = signal.src.v2;
signalState.period = signal.src.period;
signalState.phase = signal.src.phase;
signalState.duty = signal.src.duty;
signalState.xscale = signalItem.xaxis.xscale;
signalState.ymin = signalItem.ymin;
signalState.ymax = signalItem.ymax;
signalState.mode = channel.mode;
signalStates[label] = signalState;
}
}
}
return signalStates;
};


var restoreState = function (signalStates){
for (var a = 0; a < deviceRepeater.count; a++){
var deviceItem = deviceRepeater.itemAt(a);
for (var b = 0; b < deviceItem.channelRepeater.count; b++){
var channelItem = deviceItem.channelRepeater.itemAt(b);
var channel = channelItem.channel;
for (var c = 0; c < channelItem.signalRepeater.count; c++) {
var label = '' + a + session.devices[a].channels[b].label +"_"+ session.devices[a].channels[b].signals[c].label;
var signalItem = channelItem.signalRepeater.itemAt(c);
var signalState = signalStates[label];
var signal = signalItem.signal;
channel.mode = signalState.mode;
signal.src.src = signalState.src;
signal.src.v1 = signalState.v1;
signal.src.v2 = signalState.v2;
signal.src.period = signalState.period;
signal.src.phase = signalState.phase;
signal.src.duty = signalState.duty;
signalItem.ymin = signalState.ymin;
signalItem.ymax = signalState.ymax;
signalItem.xaxis.xscale = signalState.xscale;
}
}
}
}
8 changes: 8 additions & 0 deletions utils/fileio.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,14 @@ public slots:
return true;
}

QString readByURI(const QUrl& source) {
auto path = source.toLocalFile();
QFile file(path);
file.open(QIODevice::ReadOnly | QIODevice::Text);
QTextStream in(&file);
return in.readAll();
}

public:
FileIO() {}
};
Expand Down

0 comments on commit 9685055

Please sign in to comment.