mirror of
https://github.com/GoldenCheetah/GoldenCheetah.git
synced 2026-02-14 00:28:42 +00:00
243 lines
9.3 KiB
C++
243 lines
9.3 KiB
C++
#include "VMProWidget.h"
|
|
|
|
#include <QThread>
|
|
#include <QPushButton>
|
|
#include <QFileDialog>
|
|
#include <QStandardPaths>
|
|
#include <QScrollBar>
|
|
#include <QDateTime>
|
|
|
|
VMProWidget::VMProWidget(QLowEnergyService * service, QObject * parent)
|
|
: QObject(parent)
|
|
{
|
|
m_vmProConfigurator = new VMProConfigurator(service, this);
|
|
|
|
connect(m_vmProConfigurator, &VMProConfigurator::logMessage, this, &VMProWidget::addStatusMessage);
|
|
|
|
QWidget * settingsWidget = new QWidget();
|
|
|
|
// User Piece Setting
|
|
QLabel * userPieceLabel = new QLabel(tr("The size engraved on the user pieces. This is the skrew-in part that attaches to the mask."));
|
|
userPieceLabel->setWordWrap(true);
|
|
m_userPiecePicker = new QComboBox();
|
|
m_userPiecePicker->addItem(tr("Resting"), VMProVenturiSize::VM_VENTURI_RESTING);
|
|
m_userPiecePicker->addItem(tr("Medium"), VMProVenturiSize::VM_VENTURI_MEDIUM);
|
|
m_userPiecePicker->addItem(tr("Large"), VMProVenturiSize::VM_VENTURI_LARGE);
|
|
|
|
QVBoxLayout *userPieceLayout = new QVBoxLayout();
|
|
userPieceLayout->addWidget(userPieceLabel);
|
|
userPieceLayout->addWidget(m_userPiecePicker);
|
|
|
|
QGroupBox *userPieceBox = new QGroupBox(tr("User Piece Size"));
|
|
userPieceBox->setLayout(userPieceLayout);
|
|
|
|
|
|
// Volume Correction Mode
|
|
QLabel * volumeLabel = new QLabel(tr("This is an advanced setting. If you don't know what it is, it's recommended that you leave it on STPD."));
|
|
volumeLabel->setWordWrap(true);
|
|
m_volumePicker = new QComboBox();
|
|
m_volumePicker->addItem("STPD", VMProVolumeCorrectionMode::VM_STPD);
|
|
m_volumePicker->addItem("BTPS", VMProVolumeCorrectionMode::VM_BTPS);
|
|
|
|
QVBoxLayout *volumeLayout = new QVBoxLayout();
|
|
volumeLayout->addWidget(volumeLabel);
|
|
volumeLayout->addWidget(m_volumePicker);
|
|
|
|
QGroupBox *volumeBox = new QGroupBox(tr("Volume Correction Mode"));
|
|
volumeBox->setLayout(volumeLayout);
|
|
|
|
// Auto Re-Calibration
|
|
QLabel * autocalibLabel = new QLabel(tr("If enabled, the device will automatically start a recalibration 5 minutes into the session. If disabled you can still trigger a manual calibration."));
|
|
autocalibLabel->setWordWrap(true);
|
|
m_autocalibPicker = new QComboBox();
|
|
|
|
QVBoxLayout *autocalibLayout = new QVBoxLayout();
|
|
autocalibLayout->addWidget(autocalibLabel);
|
|
autocalibLayout->addWidget(m_autocalibPicker);
|
|
|
|
m_autocalibPicker->addItem(tr("Enabled"), VMProIdleTimeout::VM_ON);
|
|
m_autocalibPicker->addItem(tr("Disabled"), VMProIdleTimeout::VM_OFF);
|
|
QGroupBox *autocalibBox = new QGroupBox(tr("Auto Recalibration"));
|
|
autocalibBox->setLayout(autocalibLayout);
|
|
|
|
// Idle Timeout
|
|
QLabel * idleTimeoutLabel = new QLabel(tr("If enabled, the device will shut off after 15 minutes of no breathing."));
|
|
idleTimeoutLabel->setWordWrap(true);
|
|
m_idleTimeoutPicker = new QComboBox();
|
|
|
|
QVBoxLayout *idleTimeoutLayout = new QVBoxLayout();
|
|
idleTimeoutLayout->addWidget(idleTimeoutLabel);
|
|
idleTimeoutLayout->addWidget(m_idleTimeoutPicker);
|
|
|
|
m_idleTimeoutPicker->addItem(tr("Enabled"), VMProIdleTimeout::VM_ON);
|
|
m_idleTimeoutPicker->addItem(tr("Disabled"), VMProIdleTimeout::VM_OFF);
|
|
QGroupBox *idleTimeoutBox = new QGroupBox(tr("Idle Timeout"));
|
|
idleTimeoutBox->setLayout(idleTimeoutLayout);
|
|
|
|
// Calibration Progress
|
|
QLabel * calibrationProgressInfoLabel = new QLabel(tr("Calibration Status:"));
|
|
m_calibrationProgressLabel = new QLabel(tr("Unknown"));
|
|
|
|
QVBoxLayout *calibrationProgressLayout = new QVBoxLayout();
|
|
calibrationProgressLayout->addWidget(calibrationProgressInfoLabel);
|
|
calibrationProgressLayout->addWidget(m_calibrationProgressLabel);
|
|
|
|
QGroupBox *calibrationProgressBox = new QGroupBox(tr("Calibration Status"));
|
|
calibrationProgressBox->setLayout(calibrationProgressLayout);
|
|
|
|
// Manual calibration
|
|
QPushButton * startCalibration = new QPushButton(tr("Start Calibration"));
|
|
|
|
// Settings Widget
|
|
QVBoxLayout *settingsLayout = new QVBoxLayout();
|
|
settingsLayout->addWidget(userPieceBox);
|
|
settingsLayout->addWidget(volumeBox);
|
|
settingsLayout->addWidget(autocalibBox);
|
|
settingsLayout->addWidget(idleTimeoutBox);
|
|
settingsLayout->addWidget(calibrationProgressBox);
|
|
settingsLayout->addWidget(startCalibration);
|
|
settingsWidget->setLayout(settingsLayout);
|
|
|
|
QWidget * dbgWidget = new QWidget();
|
|
QGroupBox *dbgBox = new QGroupBox(tr("Status Information"));
|
|
QVBoxLayout *dbgLayout = new QVBoxLayout(dbgWidget);
|
|
m_deviceLog = new QTextEdit("", dbgWidget);
|
|
QPushButton * saveButton = new QPushButton(tr("Save log to file"));
|
|
saveButton->setMaximumHeight(25);
|
|
dbgLayout->addWidget(m_deviceLog);
|
|
dbgLayout->addWidget(saveButton);
|
|
dbgBox->setLayout(dbgLayout);
|
|
|
|
// Main layout
|
|
QWidget * w = new QWidget();
|
|
QHBoxLayout *mainLayout = new QHBoxLayout(w);
|
|
mainLayout->addWidget(settingsWidget);
|
|
mainLayout->addWidget(dbgBox);
|
|
|
|
w->setLayout(mainLayout);
|
|
|
|
w->show();
|
|
|
|
// Basic init of settings
|
|
m_vmProConfigurator->setIdleTimeout(VMProIdleTimeout::VM_ON);
|
|
QThread::msleep(50);
|
|
m_vmProConfigurator->setUserPieceSize(VMProVenturiSize::VM_VENTURI_MEDIUM);
|
|
QThread::msleep(50);
|
|
m_vmProConfigurator->setVolumeCorrectionMode(VMProVolumeCorrectionMode::VM_STPD);
|
|
|
|
|
|
// set up connections
|
|
connect(m_vmProConfigurator, &VMProConfigurator::idleTimeoutStateChanged, this, &VMProWidget::onIdleTimeoutChanged);
|
|
connect(m_vmProConfigurator, &VMProConfigurator::userPieceSizeChanged, this, &VMProWidget::onUserPieceSizeChanged);
|
|
connect(m_vmProConfigurator, &VMProConfigurator::calibrationProgressChanged, this, &VMProWidget::onCalibrationProgressChanged);
|
|
connect(m_vmProConfigurator, &VMProConfigurator::volumeCorrectionModeChanged, this, &VMProWidget::onVolumeCorrectionModeChanged);
|
|
connect(saveButton, &QPushButton::clicked, this, &VMProWidget::onSaveClicked);
|
|
connect(startCalibration, &QPushButton::clicked, m_vmProConfigurator, &VMProConfigurator::startCalibration);
|
|
|
|
connect(m_userPiecePicker, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged), this, &VMProWidget::onUserPieceSizePickerChanged);
|
|
connect(m_volumePicker, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged), this, &VMProWidget::onVolumeCorrectionModePickerChanged);
|
|
connect(m_idleTimeoutPicker, static_cast<void (QComboBox::*)(int index)>(&QComboBox::currentIndexChanged), this, &VMProWidget::onIdleTimeoutPickerChanged);
|
|
}
|
|
|
|
void VMProWidget::addStatusMessage(const QString & msg)
|
|
{
|
|
QString timestamp = QDateTime::currentDateTime().toString("hh:mm:ss.zzz");
|
|
m_deviceLog->append(timestamp + ": " + msg);
|
|
QScrollBar *sb = m_deviceLog->verticalScrollBar();
|
|
sb->setValue(sb->maximum());
|
|
}
|
|
|
|
void VMProWidget::onVolumeCorrectionModeChanged(VMProVolumeCorrectionMode mode)
|
|
{
|
|
m_currVolumeCorrectionMode = mode;
|
|
|
|
int index = m_volumePicker->findData(mode);
|
|
if (index != -1) {
|
|
m_volumePicker->setCurrentIndex(index);
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onUserPieceSizeChanged(VMProVenturiSize size)
|
|
{
|
|
m_currVenturiSize = size;
|
|
|
|
int index = m_userPiecePicker->findData(size);
|
|
if (index != -1) {
|
|
m_userPiecePicker->setCurrentIndex(index);
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onIdleTimeoutChanged(VMProIdleTimeout state)
|
|
{
|
|
m_currIdleTimeoutState = state;
|
|
|
|
int index = m_idleTimeoutPicker->findData(state);
|
|
if (index != -1) {
|
|
m_idleTimeoutPicker->setCurrentIndex(index);
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onCalibrationProgressChanged(quint8 percentCompleted)
|
|
{
|
|
m_calibrationProgressLabel->setText(QString::number(percentCompleted));
|
|
emit setNotification(QString("VMPro Calibration: %1 %").arg(percentCompleted), 3);
|
|
}
|
|
|
|
void VMProWidget::onIdleTimeoutPickerChanged(int /*index*/)
|
|
{
|
|
VMProIdleTimeout newState = m_idleTimeoutPicker->currentData().value<VMProIdleTimeout>();
|
|
|
|
if (newState != m_currIdleTimeoutState)
|
|
{
|
|
m_vmProConfigurator->setIdleTimeout(newState);
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onUserPieceSizePickerChanged(int /*index*/)
|
|
{
|
|
VMProVenturiSize newState = m_userPiecePicker->currentData().value<VMProVenturiSize>();
|
|
|
|
if (newState != m_currVenturiSize)
|
|
{
|
|
m_vmProConfigurator->setUserPieceSize(newState);
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onVolumeCorrectionModePickerChanged(int /*index*/)
|
|
{
|
|
VMProVolumeCorrectionMode newState = m_volumePicker->currentData().value<VMProVolumeCorrectionMode>();
|
|
if (newState != m_currVolumeCorrectionMode)
|
|
{
|
|
m_vmProConfigurator->setVolumeCorrectionMode(newState);
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onSaveClicked()
|
|
{
|
|
QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save File"),
|
|
QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
|
|
if (!fileName.isEmpty())
|
|
{
|
|
QFile outfile(fileName);
|
|
if (outfile.open(QIODevice::WriteOnly | QIODevice::Text))
|
|
{
|
|
QTextStream stream(&outfile);
|
|
stream << m_deviceLog->toPlainText();
|
|
outfile.flush();
|
|
outfile.close();
|
|
}
|
|
}
|
|
}
|
|
|
|
void VMProWidget::onReconnected(QLowEnergyService *service)
|
|
{
|
|
m_vmProConfigurator->setupCharNotifications(service);
|
|
|
|
// Basic init of settings
|
|
m_vmProConfigurator->getIdleTimeout();
|
|
QThread::msleep(50);
|
|
m_vmProConfigurator->getUserPieceSize();
|
|
QThread::msleep(50);
|
|
m_vmProConfigurator->getVolumeCorrectionMode();
|
|
}
|