From 925a621f20b0a1eb72e74431f1190732de7d1d8a Mon Sep 17 00:00:00 2001 From: LoudSnorer Date: Fri, 10 Nov 2023 13:54:49 -0500 Subject: [PATCH] iBreeze trigger: added days to cpap usage section --- oscar/SleepLib/profiles.cpp | 2 +- oscar/statistics.cpp | 35 +++++++++++++++++++++++++++++------ oscar/statistics.h | 2 +- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/oscar/SleepLib/profiles.cpp b/oscar/SleepLib/profiles.cpp index e7aa2a10..9f3b9bee 100644 --- a/oscar/SleepLib/profiles.cpp +++ b/oscar/SleepLib/profiles.cpp @@ -1266,7 +1266,7 @@ int Profile::countCompliantDays(MachineType mt, QDate start, QDate end) Day *day = FindGoodDay(date, mt); if (day) { - if (day->hours(mt) > compliance) { days++; } + if (day->hours(mt) >= compliance) { days++; } // compliant days includes the value specified. } date = date.addDays(1); diff --git a/oscar/statistics.cpp b/oscar/statistics.cpp index d9792a19..ba5271ee 100644 --- a/oscar/statistics.cpp +++ b/oscar/statistics.cpp @@ -645,8 +645,12 @@ Statistics::Statistics(QObject *parent) : rows.push_back(StatisticsRow("", SC_DAYS, MT_CPAP)); rows.push_back(StatisticsRow("", SC_COLUMNHEADERS, MT_CPAP)); rows.push_back(StatisticsRow(tr("CPAP Usage"), SC_SUBHEADING, MT_CPAP)); + rows.push_back(StatisticsRow(tr("Days In Period"), SC_SELECTED_DAYS , MT_CPAP)); + rows.push_back(StatisticsRow(tr("Days Used"), SC_DAYS_W_DATA , MT_CPAP)); + rows.push_back(StatisticsRow(tr("Days Not Used"), SC_DAYS_WO_DATA , MT_CPAP)); + rows.push_back(StatisticsRow(tr("Days (%1 hrs/day)"), SC_COMPLIANCE_DAYS , MT_CPAP)); + rows.push_back(StatisticsRow(tr("Percent Days (%1 hrs/day)"), SC_COMPLIANCE, MT_CPAP)); rows.push_back(StatisticsRow(tr("Average Hours per Night"), SC_HOURS, MT_CPAP)); - rows.push_back(StatisticsRow(tr("Compliance (%1 hrs/day)"), SC_COMPLIANCE, MT_CPAP)); rows.push_back(StatisticsRow(tr("Therapy Efficacy"), SC_SUBHEADING, MT_CPAP)); rows.push_back(StatisticsRow("AHI", SC_AHI, MT_CPAP)); @@ -1360,6 +1364,14 @@ QString Statistics::GenerateCPAPUsage() } html += ""; continue; + } else if (row.calc == SC_DAYS_WO_DATA) { + name = row.src; + } else if (row.calc == SC_DAYS_W_DATA) { + name = row.src; + } else if (row.calc == SC_SELECTED_DAYS) { + name = row.src; + } else if (row.calc == SC_COMPLIANCE_DAYS) { + name = QString(row.src).arg(p_profile->cpap->m_complianceHours); } else if (row.calc == SC_DAYS) { QDate first=p_profile->FirstGoodDay(row.type); QDate last=p_profile->LastGoodDay(row.type); @@ -1417,7 +1429,8 @@ QString Statistics::GenerateCPAPUsage() // both create header column and 5 data columns for a total of 100 int dataWidth = 14; int headerWidth = 30; - if (p_profile->general->statReportMode() == STAT_MODE_MONTHLY) { + if (p_profile->general->statReportMode() == STAT_MODE_MONTHLY) + { // both create header column and 13 data columns for a total of 100 dataWidth = 6; headerWidth = 22; @@ -1549,7 +1562,7 @@ QString Statistics::UpdateRecordsBox() int totalDays = 1+first.daysTo(last); int daysUsed = p_profile->countDays(MT_CPAP, first, last); int daysSkipped = totalDays - daysUsed; - int compliant = p_profile->countCompliantDays(MT_CPAP, first, last); + int compliant = p_profile->countCompliantDays(MT_CPAP, first, last ); int lowUsed = daysUsed - compliant; float comperc = (100.0 / float(totalDays)) * float(compliant); @@ -1842,11 +1855,21 @@ QString StatisticsRow::value(QDate start, QDate end) } else if (calc == SC_HOURS) { value = QString("%1").arg(formatTime(p_profile->calcHours(type, start, end) / days)); } else if (calc == SC_COMPLIANCE) { - float c = p_profile->countCompliantDays(type, start, end); + float c = p_profile->countCompliantDays(type, start, end ); // float p = (100.0 / days) * c; float realDays = qAbs(start.daysTo(end)) + 1; - float p = (100.0 / realDays) * c; - value = QString("%1%").arg(p, 0, 'f', 0); + float p = (100.0 *c / realDays) ; + value = QString("%1%").arg(p, 0, 'f', 2); + } else if (calc == SC_DAYS_WO_DATA) { + value = QString::number((1+start.daysTo(end)) - p_profile->countDays(type, start, end )); + } else if (calc == SC_DAYS_W_DATA) { + value = QString::number(p_profile->countDays(type, start, end)); + } else if (calc == SC_SELECTED_DAYS) { + value = QString::number(1+start.daysTo(end)); + } else if (calc == SC_COMPLIANCE_DAYS) { + int value1 = p_profile->countCompliantDays(type, start, end ); + value = QString("%1 ").arg(value1); + //value += QString(" / %1").arg(double(100*value1)/double(1+start.daysTo(end))); } else if (calc == SC_DAYS) { value = QString("%1").arg(p_profile->countDays(type, start, end)); } else if ((calc == SC_COLUMNHEADERS) || (calc == SC_SUBHEADING) || (calc == SC_UNDEFINED)) { diff --git a/oscar/statistics.h b/oscar/statistics.h index 799378d6..5b16765c 100644 --- a/oscar/statistics.h +++ b/oscar/statistics.h @@ -58,7 +58,7 @@ public: //! \brief Type of calculation on one statistics row enum StatCalcType { - SC_UNDEFINED=0, SC_COLUMNHEADERS, SC_HEADING, SC_SUBHEADING, SC_MEDIAN, SC_AVG, SC_WAVG, SC_90P, SC_MIN, SC_MAX, SC_CPH, SC_SPH, SC_AHI, SC_HOURS, SC_COMPLIANCE, SC_DAYS, SC_ABOVE, SC_BELOW , SC_WARNING , SC_WARNING2 + SC_UNDEFINED=0, SC_COLUMNHEADERS, SC_HEADING, SC_SUBHEADING, SC_MEDIAN, SC_AVG, SC_WAVG, SC_90P, SC_MIN, SC_MAX, SC_CPH, SC_SPH, SC_AHI, SC_HOURS, SC_COMPLIANCE, SC_DAYS, SC_ABOVE, SC_BELOW , SC_WARNING , SC_WARNING2 , SC_SELECTED_DAYS , SC_COMPLIANCE_DAYS , SC_DAYS_W_DATA , SC_DAYS_WO_DATA }; /*! \struct StatisticsRow