Эксперимент в этом приложении состоит из таймера подсчета по сравнению с 5, при котором активируются датчики. Их значения сохраняются в векторах и записываются еще 30 секунд. По истечении этого времени датчики отключаются, и в диалоговом окне сообщения пользователю задается вопрос, хотят ли они сохранить эксперимент или отменить его. Я также использую внутренний класс C++ (FitnessExperiment) для отслеживания всех параметров, которые необходимо сохранить. Ниже приведены соответствующие строки кода QML, которые я только что описал:
Код: Выделить всё
Rectangle {
id: root
property int timerValue: 5 //starting value of the timer
property int sampleRate: 50 //default sampling rate, passed from a different screen
Accelerometer {
id: accSensor
dataRate: sampleRate
property real x: 0
property real y: 0
property real z: 0
onReadingChanged: {
x = reading.x;
y = reading.y;
z = reading.z;
experimentData.addAccReading(reading.timestamp, x, y, z); //the current experiment
//instance adds a reading
//to the accelerometer
//readings vector
}
}
Gyroscope {
id: gyrSensor
dataRate: sampleRate
property real x: 0
property real y: 0
property real z: 0
onReadingChanged: {
x = reading.x
y = reading.y
z = reading.z
experimentData.addGyrReading(reading.timestamp, x, y, z); //the current experiment
//instance adds a reading
//to the gyroscope readings
//vector
}
}
//internal class instance
FitnessExperiment {
id: experimentData
}
ColumnLayout {
Timer {
id: timer
running: true
repeat: true
onTriggered: {
if (timerValue == 0) {
if (startCountdown) {
//if the timer has counted down from 30
accSensor.active = false;
gyrSensor.active = false;
timer.stop();
saveExperimentDialog.visible = true; //open the message dialog
} else {
//if the timer has counted down from 5
timerValue = 30;
startCountdown = true;
accSensor.active = true;
gyrSensor.active = true;
}
}
countdownText.text = timerValue.toString(); //show the countdown in a separate
//Text component that isn't shown here
timerValue--;
}
}
MessageDialog //message dialog for saving or cancelling experiment
{
id: saveExperimentDialog
title: "Save Experiment"
standardButtons: StandardButton.Yes | StandardButton.No
visible: false
onYes: {
experimentData.saveFile();
stack.pop();
}
onNo: {
experimentData.cancelExperiment(); //clear all properties of experimentData
stack.pop();
}
}
}
}
В настоящее время результаты показывают, что в массиве измерений ускорителя для частоты 26 Гц имеется около 2990 выборок. эксперименте и 2994 в эксперименте на частоте 104 Гц. Учитывая, что оба эксперимента длились 30 секунд, это означало бы, что частота дискретизации составляет 99,1 и 99,8 соответственно. Однако ожидаемые результаты составляют 26 Гц * 30 с = 780 выборок и 104 Гц * 30 с = 3120 выборок.
Я ознакомился с документацией и убедился, что действительно передаю правильное значение в строке dataRate: sampleRate. Я проанализировал и попытался разобраться в числах из выходных файлов JSON, но безуспешно. Может ли это быть связано с ограничением, установленным ОС?
Подробнее здесь: https://stackoverflow.com/questions/789 ... sor-in-qml