diff --git a/sleepyhead/Resources.qrc b/sleepyhead/Resources.qrc
index ce54198a..99af249c 100644
--- a/sleepyhead/Resources.qrc
+++ b/sleepyhead/Resources.qrc
@@ -49,5 +49,7 @@
icons/prs1_60s.png
icons/dreamstation.png
icons/airsense10.png
+ icons/aircurve.png
+ icons/prs1_960.png
diff --git a/sleepyhead/SleepLib/calcs.cpp b/sleepyhead/SleepLib/calcs.cpp
index e627bc0c..57ac1b5b 100644
--- a/sleepyhead/SleepLib/calcs.cpp
+++ b/sleepyhead/SleepLib/calcs.cpp
@@ -1504,10 +1504,6 @@ void zMaskProfile::updatePressureMin()
EventDataType zMaskProfile::calcLeak(EventStoreType pressure)
{
-// if (maxP == minP) {
-// return pressuremin[pressure];
-// }
-// EventDataType leak = (pressure - minP) * (m_factor) + minL;
// Average mask leak minimum at pressure 4 = 20.167
// Average mask slope = 1.76
@@ -1515,9 +1511,29 @@ EventDataType zMaskProfile::calcLeak(EventStoreType pressure)
// Min/max leak at pressure 4 = 18 - 22
// Min/max leak at pressure 20 = 42 - 54
+ float leak = 0.0;
+ if (p_profile->cpap->customMaskProfile()) {
+ float lpm4 = p_profile->cpap->custom4cmH2OLeaks();
+ float lpm20 = p_profile->cpap->custom20cmH2OLeaks();
+
+ float lpm = lpm20 - lpm4;
+ float ppm = lpm / 16.0;
+
+ float p = (pressure/10.0f) - 4.0;
+
+ leak = p * ppm + lpm4;
+ } else {
+ if (maxP == minP) {
+ leak = pressuremin[pressure];
+ } else {
+ leak = (pressure - minP) * (m_factor) + minL;
+ }
+
+// leak = (pressure/10.0 - 4.0) * 1.76 + 20.167;
+ }
// Generic Average of Masks from a SpreadSheet... will add two sliders to tweak this between the ranges later
- EventDataType leak = (pressure/10.0 - 4.0) * 1.76 + 20.167;
+// EventDataType
return leak;
}
diff --git a/sleepyhead/SleepLib/common.cpp b/sleepyhead/SleepLib/common.cpp
index ab25a8e1..bf1b27d1 100644
--- a/sleepyhead/SleepLib/common.cpp
+++ b/sleepyhead/SleepLib/common.cpp
@@ -275,6 +275,8 @@ QString STR_TR_PrRelief; // Pressure Relief
QString STR_TR_Bookmarks;
QString STR_TR_SleepyHead;
+QString STR_TR_Default;
+
QString STR_TR_Mode;
QString STR_TR_Model;
QString STR_TR_Brand;
@@ -378,6 +380,9 @@ void initializeStrings()
STR_TR_Oximeter = QObject::tr("Oximeter");
STR_TR_EventFlags = QObject::tr("Event Flags");
+
+ STR_TR_Default = QObject::tr("Default");
+
// Machine type names.
STR_TR_CPAP = QObject::tr("CPAP"); // Constant Positive Airway Pressure
STR_TR_BIPAP = QObject::tr("BiPAP"); // Bi-Level Positive Airway Pressure
diff --git a/sleepyhead/SleepLib/common.h b/sleepyhead/SleepLib/common.h
index 7882bfe4..098cbf7e 100644
--- a/sleepyhead/SleepLib/common.h
+++ b/sleepyhead/SleepLib/common.h
@@ -190,6 +190,7 @@ extern QString STR_Empty_Brick;
extern QString STR_Empty_NoGraphs;
extern QString STR_Empty_SummaryOnly;
+extern QString STR_TR_Default;
extern QString STR_TR_BMI; // Short form of Body Mass Index
diff --git a/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp b/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp
index 3083155a..a39d1e20 100644
--- a/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp
+++ b/sleepyhead/SleepLib/loader_plugins/resmed_loader.cpp
@@ -984,13 +984,13 @@ ResmedLoader::ResmedLoader()
{
const QString RMS9_ICON = ":/icons/rms9.png";
const QString RM10_ICON = ":/icons/airsense10.png";
- const QString RM10C_ICON = ":/icons/airsense10.png";
+ const QString RM10C_ICON = ":/icons/aircurve.png";
m_pixmaps[STR_ResMed_S9] = QPixmap(RMS9_ICON);
m_pixmap_paths[STR_ResMed_S9] = RMS9_ICON;
m_pixmaps[STR_ResMed_AirSense10] = QPixmap(RM10_ICON);
m_pixmap_paths[STR_ResMed_AirSense10] = RM10_ICON;
- m_pixmaps[STR_ResMed_AirCurve10] = QPixmap(RM10_ICON);
+ m_pixmaps[STR_ResMed_AirCurve10] = QPixmap(RM10C_ICON);
m_pixmap_paths[STR_ResMed_AirCurve10] = RM10_ICON;
m_type = MT_CPAP;
}
diff --git a/sleepyhead/SleepLib/preferences.cpp b/sleepyhead/SleepLib/preferences.cpp
index 79e322c0..7686c1d9 100644
--- a/sleepyhead/SleepLib/preferences.cpp
+++ b/sleepyhead/SleepLib/preferences.cpp
@@ -185,8 +185,12 @@ bool Preferences::Open(QString filename)
return false;
}
- if (!doc.setContent(&file)) {
+ QString errorMsg;
+ int errorLine;
+ int errorColumn;
+ if (!doc.setContent(&file,false, &errorMsg, &errorLine, &errorColumn)) {
qWarning() << "Invalid XML Content in" << QDir::toNativeSeparators(p_filename);
+ qWarning() << "Error:" << errorMsg << "in line" << errorLine << ":" << errorColumn;
return false;
}
diff --git a/sleepyhead/SleepLib/profiles.cpp b/sleepyhead/SleepLib/profiles.cpp
index bd9b8297..bbe04d1e 100644
--- a/sleepyhead/SleepLib/profiles.cpp
+++ b/sleepyhead/SleepLib/profiles.cpp
@@ -120,7 +120,7 @@ QString Profile::checkLock()
return lockhost;
}
-bool Profile::Open(QString filename)
+bool Profile::Load(QString filename)
{
p_profile = this;
@@ -131,9 +131,9 @@ bool Profile::Open(QString filename)
qDebug() << "Profile" << filename << "all ready open";
return true;
}
- bool b = Preferences::Open(filename);
- m_opened=true;
+ bool b = Open(filename);
+
doctor = new DoctorInfo(this);
user = new UserInfo(this);
cpap = new CPAPSettings(this);
@@ -141,6 +141,8 @@ bool Profile::Open(QString filename)
appearance = new AppearanceSettings(this);
session = new SessionSettings(this);
general = new UserSettings(this);
+
+ m_opened=true;
return b;
}
@@ -906,7 +908,7 @@ Profile *Create(QString name)
//path+="/"+name;
p_profile = new Profile(path);
- p_profile->Open();
+ p_profile->Load();
profiles[name] = p_profile;
p_profile->user->setUserName(name);
//p_profile->Set("Realname",realname);
diff --git a/sleepyhead/SleepLib/profiles.h b/sleepyhead/SleepLib/profiles.h
index 2db57c8d..d44b9635 100644
--- a/sleepyhead/SleepLib/profiles.h
+++ b/sleepyhead/SleepLib/profiles.h
@@ -48,7 +48,7 @@ class Profile : public Preferences
virtual ~Profile();
//! \brief Open profile, parse profile.xml file, and initialize helper classes
- virtual bool Open(QString filename = "");
+ virtual bool Load(QString filename = "");
//! \brief Parse machines.xml
bool OpenMachines();
@@ -305,6 +305,10 @@ const QString STR_CS_ClockDrift = "ClockDrift";
const QString STR_CS_LeakRedline = "LeakRedline";
const QString STR_CS_ShowLeakRedline = "ShowLeakRedline";
+const QString STR_CS_CustomMaskProfile = "CustomMaskProfile";
+const QString STR_CS_4cmH2OLeaks = "Custom4cmH2OLeaks";
+const QString STR_CS_20cmH2OLeaks = "Custom20cmH2OLeaks";
+
// ImportSettings Strings
const QString STR_IS_DaySplitTime = "DaySplitTime";
const QString STR_IS_PreloadSummaries = "PreloadSummaries";
@@ -566,6 +570,10 @@ class CPAPSettings : public ProfileSettings
initPref(STR_CS_AutoImport, false);
initPref(STR_CS_BrickWarning, true);
+ initPref(STR_CS_CustomMaskProfile, false);
+ initPref(STR_CS_4cmH2OLeaks, 20.167);
+ initPref(STR_CS_20cmH2OLeaks, 48.333);
+
initPref(STR_CS_ClockDrift, (int)0);
m_clock_drift = getPref(STR_CS_ClockDrift).toInt();
}
@@ -599,6 +607,10 @@ class CPAPSettings : public ProfileSettings
bool autoImport() const { return getPref(STR_CS_AutoImport).toBool(); }
bool brickWarning() const { return getPref(STR_CS_BrickWarning).toBool(); }
+ bool customMaskProfile() const { return getPref(STR_CS_CustomMaskProfile).toBool(); }
+ double custom4cmH2OLeaks() const { return getPref(STR_CS_4cmH2OLeaks).toDouble(); }
+ double custom20cmH2OLeaks() const { return getPref(STR_CS_20cmH2OLeaks).toDouble(); }
+
//Setters
void setMode(CPAPMode mode) { setPref(STR_CS_PrescribedMode, (int)mode); }
void setMinPressure(double pressure) { setPref(STR_CS_PrescribedMinPressure, pressure); }
@@ -632,6 +644,10 @@ class CPAPSettings : public ProfileSettings
void setAutoImport(bool b) { setPref(STR_CS_AutoImport, b); }
void setBrickWarning(bool b) { setPref(STR_CS_BrickWarning, b); }
+ void setCustomMaskProfile(bool b) { setPref(STR_CS_CustomMaskProfile, b); }
+ void setCustom4cmH2OLeaks(double val) { setPref(STR_CS_4cmH2OLeaks, val); }
+ void setCustom20cmH2OLeaks(double val) { setPref(STR_CS_20cmH2OLeaks, val); }
+
public:
int m_clock_drift;
};
diff --git a/sleepyhead/icons/aircurve.png b/sleepyhead/icons/aircurve.png
new file mode 100644
index 00000000..647ab24d
Binary files /dev/null and b/sleepyhead/icons/aircurve.png differ
diff --git a/sleepyhead/icons/prs1_960.png b/sleepyhead/icons/prs1_960.png
new file mode 100644
index 00000000..eb03566b
Binary files /dev/null and b/sleepyhead/icons/prs1_960.png differ
diff --git a/sleepyhead/mainwindow.cpp b/sleepyhead/mainwindow.cpp
index a90cc5a5..bb6fb791 100644
--- a/sleepyhead/mainwindow.cpp
+++ b/sleepyhead/mainwindow.cpp
@@ -2411,6 +2411,8 @@ void MainWindow::doReprocessEvents()
if (sess->machine()->loaderName() != STR_MACH_PRS1) {
sess->destroyEvent(CPAP_LargeLeak);
+ } else {
+ sess->destroyEvent(CPAP_Leak);
}
sess->SetChanged(true);
diff --git a/sleepyhead/preferencesdialog.cpp b/sleepyhead/preferencesdialog.cpp
index 643267d2..729f5964 100644
--- a/sleepyhead/preferencesdialog.cpp
+++ b/sleepyhead/preferencesdialog.cpp
@@ -16,6 +16,7 @@
#include
#include
#include
+#include
#include "preferencesdialog.h"
#include "common_gui.h"
@@ -217,6 +218,21 @@ PreferencesDialog::PreferencesDialog(QWidget *parent, Profile *_profile) :
ui->showUserFlagsInPie->setChecked(profile->cpap->userEventPieChart());
+
+ bool b;
+ ui->customMaskProfileGroupbox->setChecked(b=profile->cpap->customMaskProfile());
+
+ ui->maskLeaks4Slider->setValue(profile->cpap->custom4cmH2OLeaks()*10.0);
+ ui->maskLeaks20Slider->setValue(profile->cpap->custom20cmH2OLeaks()*10.0);
+
+// if (b) {
+// ui->maskLeaks4Label->setText(tr("%1 %2").arg(profile->cpap->custom4cmH2OLeaks(), 5, 'f', 1).arg(STR_UNIT_LPM));
+// ui->maskLeaks20Label->setText(tr("%1 %2").arg(profile->cpap->custom20cmH2OLeaks(), 5, 'f', 1).arg(STR_UNIT_LPM));
+// } else {
+// ui->maskLeaks4Label->setText(STR_TR_Default);
+// ui->maskLeaks20Label->setText(STR_TR_Default);
+// }
+
/* QLocale locale=QLocale::system();
QString shortformat=locale.dateFormat(QLocale::ShortFormat);
if (!shortformat.toLower().contains("yyyy")) {
@@ -776,6 +792,17 @@ bool PreferencesDialog::Save()
profile->cpap->setUserEventDuplicates(ui->userEventDuplicates->isChecked());
+
+ if ((ui->customMaskProfileGroupbox->isChecked() != profile->cpap->customMaskProfile())
+ || (fabs((ui->maskLeaks4Slider->value()/10.0)-profile->cpap->custom4cmH2OLeaks())>.1)
+ || (fabs((ui->maskLeaks20Slider->value()/10.0)-profile->cpap->custom20cmH2OLeaks())>.1)) {
+ recalc_events = true;
+ }
+
+ profile->cpap->setCustomMaskProfile(ui->customMaskProfileGroupbox->isChecked());
+ profile->cpap->setCustom4cmH2OLeaks(double(ui->maskLeaks4Slider->value()) / 10.0f);
+ profile->cpap->setCustom20cmH2OLeaks(double(ui->maskLeaks20Slider->value()) / 10.0f);
+
PREF[STR_GEN_SkipLogin] = ui->skipLoginScreen->isChecked();
PREF[STR_GEN_UpdatesAutoCheck] = ui->automaticallyCheckUpdates->isChecked();
@@ -1134,3 +1161,28 @@ void PreferencesDialog::on_waveView_doubleClicked(const QModelIndex &index)
}
}
+
+void PreferencesDialog::on_maskLeaks4Slider_sliderMoved(int position)
+{
+}
+
+void PreferencesDialog::on_customMaskProfileGroupbox_toggled(bool arg1)
+{
+ if (arg1) {
+ } else {
+ }
+}
+
+void PreferencesDialog::on_maskLeaks20Slider_sliderMoved(int position)
+{
+}
+
+void PreferencesDialog::on_maskLeaks4Slider_valueChanged(int value)
+{
+ ui->maskLeaks4Label->setText(tr("%1 %2").arg(value/10.0f, 5,'f',1).arg(STR_UNIT_LPM));
+}
+
+void PreferencesDialog::on_maskLeaks20Slider_valueChanged(int value)
+{
+ ui->maskLeaks20Label->setText(tr("%1 %2").arg(value/10.0f, 5,'f',1).arg(STR_UNIT_LPM));
+}
diff --git a/sleepyhead/preferencesdialog.h b/sleepyhead/preferencesdialog.h
index 925bf109..baf3140b 100644
--- a/sleepyhead/preferencesdialog.h
+++ b/sleepyhead/preferencesdialog.h
@@ -87,6 +87,16 @@ class PreferencesDialog : public QDialog
void on_waveView_doubleClicked(const QModelIndex &index);
+ void on_maskLeaks4Slider_sliderMoved(int position);
+
+ void on_customMaskProfileGroupbox_toggled(bool arg1);
+
+ void on_maskLeaks20Slider_sliderMoved(int position);
+
+ void on_maskLeaks4Slider_valueChanged(int value);
+
+ void on_maskLeaks20Slider_valueChanged(int value);
+
private:
void InitChanInfo();
void InitWaveInfo();
diff --git a/sleepyhead/preferencesdialog.ui b/sleepyhead/preferencesdialog.ui
index 0a7893dc..bec4e0a5 100644
--- a/sleepyhead/preferencesdialog.ui
+++ b/sleepyhead/preferencesdialog.ui
@@ -9,8 +9,8 @@
0
0
- 824
- 610
+ 826
+ 600
@@ -50,8 +50,14 @@
-
+
+
+ 0
+ 0
+
+
- 0
+ 1
@@ -75,6 +81,12 @@
-
+
+
+ 0
+ 0
+
+
Session Splitting Settings
@@ -509,6 +521,12 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
-
+
+
+ 0
+ 0
+
+
Memory and Startup Options
@@ -556,19 +574,6 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
@@ -591,626 +596,780 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
4
- -
-
-
-
- 0
- 0
-
+
-
+
+
+ 20
-
- General CPAP and Related Settings
+
+ QLayout::SetMinimumSize
-
-
-
-
-
-
- 0
- 0
-
-
-
- Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.
-
-
- hours
-
-
- 1
-
-
- 8.000000000000000
-
-
- 4.000000000000000
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- User definable threshold considered large leak
-
-
- L/min
-
-
- 1
-
-
-
- -
-
-
- Show flags for machine detected events that haven't been identified yet.
-
-
- Enable Unknown Events Channels
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
-
- AHI
-
-
- -
-
- RDI
-
-
-
-
- -
-
-
- AHI/Hour Graph Time Window
-
-
-
- -
-
-
- Preferred major event index
-
-
-
- -
-
-
- Compliance defined as
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Adjusts the amount of data considered for each point in the AHI/Hour graph.
-Defaults to 60 minutes.. Highly recommend it's left at this value.
-
-
- minutes
-
-
- 5
-
-
- 999
-
-
- 60
-
-
-
- -
-
-
-
- 50
- false
-
-
-
- Whether to show the leak redline in the leak graph
-
-
- Flag leaks over threshold
-
-
-
- -
-
-
- Reset the counter to zero at beginning of each (time) window.
-
-
- Zero Reset
-
-
-
-
-
-
- -
-
-
- Qt::Vertical
+
+ 5
-
-
- 20
- 40
-
+
+ 5
-
-
- -
-
-
-
- 0
- 0
-
+
+ 5
-
- CPAP Clock Drift
+
+ 5
-
-
- 4
-
-
- 4
-
-
- 4
-
-
- 4
-
-
- 4
-
-
-
-
-
- -59
+
-
+
+
+
+ 0
+ 0
+
+
+
+ CPAP Clock Drift
+
+
+
+ 4
-
- 59
+
+ 4
-
- 0
+
+ 4
-
-
- -
-
-
- -99
+
+ 4
-
-
- -
-
-
- Seconds
+
+ 4
-
-
- -
-
-
-
- 0
- 0
-
-
-
- <html><head/><body><p>Note: This is not intended for timezone corrections! Make sure your operating system clock and timezone is set correctly.</p></body></html>
-
-
- true
-
-
-
- -
-
-
- -9999
-
-
- 9999
-
-
-
- -
-
-
- Minutes
-
-
-
- -
-
-
- Hours
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Changes to the following settings needs a restart, but not a recalc.
-
-
- Preferred Calculation Methods
-
-
-
-
-
-
- Upper Percentile
-
-
-
- -
-
-
- Maximum Calcs
-
-
-
- -
-
-
- For consistancy, ResMed users should use 95% here,
-as this is the only value available on summary-only days.
-
-
- %
-
-
- 1
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Middle Calculations
-
-
-
- -
-
-
- Median is recommended for ResMed users.
-
-
-
-
- Median
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+ <html><head/><body><p>Note: This is not intended for timezone corrections! Make sure your operating system clock and timezone is set correctly.</p></body></html>
+
+
+ true
+
+
- -
-
- Weighted Average
-
+
-
+
+
+ -9999
+
+
+ 9999
+
+
- -
-
- Normal Average
-
+
-
+
+
+ Minutes
+
+
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- 140
- 0
-
-
-
- <html><head/><body><p>True maximum is the maximum of the data set.</p><p>99th percentile filters out the rarest outliers.</p></body></html>
-
-
-
-
- True Maximum
-
+
-
+
+
+ -59
+
+
+ 59
+
+
+ 0
+
+
- -
-
- 99% Percentile
-
+
-
+
+
+ -99
+
+
-
-
- -
-
-
-
-
- Combined Count divided by Total Hours
-
+
-
+
+
+ Hours
+
+
- -
-
- Time Weighted average of Indice
-
+
-
+
+
+ Seconds
+
+
- -
-
- Standard average of indice
-
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Use Custom Mask Profile for Unintentional Leaks
+
+
+ true
+
+
+
-
+
+
+ 400
+
+
+ 550
+
+
+ 10
+
+
+ 470
+
+
+ Qt::Horizontal
+
+
+ QSlider::TicksAbove
+
+
+ 20
+
+
- -
-
- Median
-
+
-
+
+
+
+ 0
+ 0
+
+
+
+
+ 80
+ 0
+
+
+
+ QFrame::Box
+
+
+ 48 l/m
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
-
-
- -
-
-
- Culminative Indices
-
-
-
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Enable/disable experimental event flagging enhancements.
+
-
+
+
+ 170
+
+
+ 240
+
+
+ 1
+
+
+ 10
+
+
+ 201
+
+
+ Qt::Horizontal
+
+
+ false
+
+
+ QSlider::TicksAbove
+
+
+
+ -
+
+
+ 4 cmH2O
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ 20 cmH2O
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 80
+ 0
+
+
+
+ QFrame::Box
+
+
+ 20 l/m
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Note: This is linear, so doesn't model the mask leak curve, but it should be close enough.
+
+
+ true
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Enable/disable experimental event flagging enhancements.
It allows detecting borderline events, and some the machine missed.
This option must be enabled before import, otherwise a purge is required.
-
-
- Custom CPAP User Event Flagging
-
-
- false
-
-
- true
-
-
-
- 4
-
-
- 9
-
-
- 4
-
-
- 4
-
-
- 4
-
-
-
-
-
- s
+
+
+ Custom CPAP User Event Flagging
+
+
+ false
+
+
+ true
+
+
+
+ 4
-
- 10.000000000000000
+
+ 9
-
-
- -
-
-
- %
+
+ 4
-
- 10.000000000000000
+
+ 4
-
-
- -
-
-
- This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.
+
+ 4
-
- Resync Machine Detected Events (Experimental)
-
-
-
- -
-
-
- #2
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Flow Restriction
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
-
- true
-
-
-
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
+
-
+
+
+ s
+
+
+ 10.000000000000000
+
+
+
+ -
+
+
+ %
+
+
+ 10.000000000000000
+
+
+
+ -
+
+
+ This experimental option attempts to use SleepyHead's event flagging system to improve machine detected event positioning.
+
+
+ Resync Machine Detected Events (Experimental)
+
+
+
+ -
+
+
+ #2
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Flow Restriction
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ true
+
+
+
+ <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
</style></head><body style=" font-family:'Sans'; font-size:10pt; font-weight:400; font-style:italic;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Custom flagging is an experimental method of detecting events missed by the machine. They are <span style=" text-decoration: underline;">not</span> included in AHI.</p></body></html>
-
-
- Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
-
-
- true
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Percentage of restriction in airflow from the median value.
+
+
+ Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop
+
+
+ true
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Percentage of restriction in airflow from the median value.
A value of 20% works well for detecting apneas.
-
-
- %
-
-
- 10.000000000000000
-
-
-
- -
-
-
- Show in Event Breakdown Piechart
-
-
-
- -
-
-
- Duration of airflow restriction
-
-
- s
-
-
- 1.000000000000000
-
-
- 10.000000000000000
-
-
-
- -
-
-
- #1
-
-
- Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
-
-
-
- -
-
-
- Allow duplicates near machine events.
-
-
-
- -
-
-
-
- 0
- 0
-
-
-
- Event Duration
-
-
-
-
-
+
+
+ %
+
+
+ 10.000000000000000
+
+
+
+ -
+
+
+ Show in Event Breakdown Piechart
+
+
+
+ -
+
+
+ Duration of airflow restriction
+
+
+ s
+
+
+ 1.000000000000000
+
+
+ 10.000000000000000
+
+
+
+ -
+
+
+ #1
+
+
+ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter
+
+
+
+ -
+
+
+ Allow duplicates near machine events.
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Event Duration
+
+
+
+
+
+
+
+
+ -
+
+
+ QLayout::SetMinimumSize
+
+
+ 5
+
+
+ 5
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ General CPAP and Related Settings
+
+
+
-
+
+
+
+ 0
+ 0
+
+
+
+ Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.
+
+
+ hours
+
+
+ 1
+
+
+ 8.000000000000000
+
+
+ 4.000000000000000
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ User definable threshold considered large leak
+
+
+ L/min
+
+
+ 1
+
+
+
+ -
+
+
+ Show flags for machine detected events that haven't been identified yet.
+
+
+ Enable Unknown Events Channels
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
-
+
+ AHI
+
+
+ -
+
+ RDI
+
+
+
+
+ -
+
+
+ AHI/Hour Graph Time Window
+
+
+
+ -
+
+
+ Preferred major event index
+
+
+
+ -
+
+
+ Compliance defined as
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Adjusts the amount of data considered for each point in the AHI/Hour graph.
+Defaults to 60 minutes.. Highly recommend it's left at this value.
+
+
+ minutes
+
+
+ 5
+
+
+ 999
+
+
+ 60
+
+
+
+ -
+
+
+
+ 50
+ false
+
+
+
+ Whether to show the leak redline in the leak graph
+
+
+ Flag leaks over threshold
+
+
+
+ -
+
+
+ Reset the counter to zero at beginning of each (time) window.
+
+
+ Zero Reset
+
+
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Changes to the following settings needs a restart, but not a recalc.
+
+
+ Preferred Calculation Methods
+
+
+
-
+
+
+ Upper Percentile
+
+
+
+ -
+
+
+ Maximum Calcs
+
+
+
+ -
+
+
+ For consistancy, ResMed users should use 95% here,
+as this is the only value available on summary-only days.
+
+
+ %
+
+
+ 1
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+ Middle Calculations
+
+
+
+ -
+
+
+ Median is recommended for ResMed users.
+
+
-
+
+ Median
+
+
+ -
+
+ Weighted Average
+
+
+ -
+
+ Normal Average
+
+
+
+
+ -
+
+
+
+ 0
+ 0
+
+
+
+
+ 140
+ 0
+
+
+
+ <html><head/><body><p>True maximum is the maximum of the data set.</p><p>99th percentile filters out the rarest outliers.</p></body></html>
+
+
-
+
+ True Maximum
+
+
+ -
+
+ 99% Percentile
+
+
+
+
+ -
+
+
-
+
+ Combined Count divided by Total Hours
+
+
+ -
+
+ Time Weighted average of Indice
+
+
+ -
+
+ Standard average of indice
+
+
+ -
+
+ Median
+
+
+
+
+ -
+
+
+ Culminative Indices
+
+
+
+
+
+
+
@@ -1260,6 +1419,12 @@ A value of 20% works well for detecting apneas.
-
+
+
+ 0
+ 0
+
+
Other oximetry options
@@ -1343,6 +1508,12 @@ A value of 20% works well for detecting apneas.
-
+
+
+ 0
+ 0
+
+
Flag rapid changes in oximetry stats
@@ -1452,6 +1623,12 @@ A value of 20% works well for detecting apneas.
-
+
+
+ 0
+ 0
+
+
300
@@ -1462,7 +1639,7 @@ A value of 20% works well for detecting apneas.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
p, li { white-space: pre-wrap; }
-</style></head><body style=" font-family:'.Lucida Grande UI'; font-size:13pt; font-weight:400; font-style:normal;">
+</style></head><body style=" font-family:'.SF NS Text'; font-size:13pt; font-weight:400; font-style:normal;">
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt; font-weight:600;">Syncing Oximetry and CPAP Data</span></p>
<p align="justify" style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans'; font-size:10pt;"><br /></p>
<p align="justify" style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Sans'; font-size:10pt;">CMS50 data imported from SpO2Review (from .spoR files) or the serial import method does </span><span style=" font-family:'Sans'; font-size:10pt; font-weight:600; text-decoration: underline;">not</span><span style=" font-family:'Sans'; font-size:10pt;"> have the correct timestamp needed to sync.</span></p>
@@ -1584,7 +1761,14 @@ p, li { white-space: pre-wrap; }
-
-
+
+
+
+ 0
+ 0
+
+
+
-
@@ -1645,6 +1829,12 @@ p, li { white-space: pre-wrap; }
-
+
+
+ 0
+ 0
+
+
General Settings
@@ -1697,7 +1887,7 @@ Mainly affects the importer.
-
-
+
0
0
@@ -2693,19 +2883,6 @@ this application to be unstable with this feature enabled.
- -
-
-
- Qt::Vertical
-
-
-
- 20
- 40
-
-
-
-
diff --git a/sleepyhead/profileselect.cpp b/sleepyhead/profileselect.cpp
index 99c21a80..816c3d20 100644
--- a/sleepyhead/profileselect.cpp
+++ b/sleepyhead/profileselect.cpp
@@ -134,7 +134,7 @@ void ProfileSelect::editProfile()
if (!profile) { return; }
if (!profile->isOpen()) {
- profile->Open();
+ profile->Load();
}
bool reallyEdit = false;
@@ -212,7 +212,7 @@ void ProfileSelect::deleteProfile()
Profile * profile = Profiles::profiles[name];
p_profile = profile;
- if (!profile->Open()) {
+ if (!profile->Load()) {
QMessageBox::warning(this, STR_MessageBox_Error,
QString(tr("Could not open profile.. You will need to delete this profile directory manually")+
"\n\n"+tr("You will find it under the following location:")+"\n\n%1").arg(QDir::toNativeSeparators(GetAppRoot() + "/Profiles/" + profile->user->userName())), QMessageBox::Ok);
@@ -338,7 +338,7 @@ void ProfileSelect::on_listView_activated(const QModelIndex &index)
}
p_profile = profile;
- profile->Open();
+ profile->Load();
// Do this in case user renames the directory (otherwise it won't load)
// Essentially makes the folder name the user name, but whatever..
// TODO: Change the profile editor one day to make it rename the actual folder