mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-05 18:50:44 +00:00
Unintentional leaks calculation improvements
This commit is contained in:
parent
1a77446155
commit
2fa1f46f53
@ -1512,9 +1512,9 @@ 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;
|
||||
float leak; // = 0.0;
|
||||
|
||||
if (p_profile->cpap->customMaskProfile()) {
|
||||
// if (p_profile->cpap->calculateUnintentionalLeaks()) {
|
||||
float lpm4 = p_profile->cpap->custom4cmH2OLeaks();
|
||||
float lpm20 = p_profile->cpap->custom20cmH2OLeaks();
|
||||
|
||||
@ -1524,14 +1524,15 @@ EventDataType zMaskProfile::calcLeak(EventStoreType pressure)
|
||||
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;
|
||||
}
|
||||
// } else {
|
||||
// the old way sucks!
|
||||
|
||||
// if (maxP == minP) {
|
||||
// leak = pressuremin[pressure];
|
||||
// } else {
|
||||
// leak = (pressure - minP) * (m_factor) + minL;
|
||||
// }
|
||||
// }
|
||||
// Generic Average of Masks from a SpreadSheet... will add two sliders to tweak this between the ranges later
|
||||
// EventDataType
|
||||
|
||||
@ -1543,13 +1544,11 @@ void zMaskProfile::updateProfile(Session *session)
|
||||
scanPressure(session);
|
||||
scanLeaks(session);
|
||||
|
||||
if (p_profile->cpap->customMaskProfile()) {
|
||||
// new method doesn't require any of this, so bail here.
|
||||
return;
|
||||
}
|
||||
|
||||
// Do it the old way
|
||||
updatePressureMin();
|
||||
/* updatePressureMin();
|
||||
|
||||
// PressureMin contains the baseline for each Pressure
|
||||
|
||||
@ -1711,7 +1710,7 @@ void zMaskProfile::updateProfile(Session *session)
|
||||
// }
|
||||
// }
|
||||
// f.close();
|
||||
// }
|
||||
// }*/
|
||||
}
|
||||
|
||||
QMutex zMaskmutex;
|
||||
@ -1720,6 +1719,7 @@ bool mmaskFirst = true;
|
||||
|
||||
int calcLeaks(Session *session)
|
||||
{
|
||||
if (!p_profile->cpap->calculateUnintentionalLeaks()) { return 0; }
|
||||
|
||||
if (session->type() != MT_CPAP) { return 0; }
|
||||
|
||||
|
@ -749,7 +749,8 @@ bool PRS1Import::ParseF5Events()
|
||||
EventList *HY = session->AddEventList(CPAP_Hypopnea, EVL_Event);
|
||||
|
||||
EventList *PB = session->AddEventList(CPAP_PB, EVL_Event);
|
||||
EventList *LEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event);
|
||||
EventList *TOTLEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event);
|
||||
EventList *LEAK = session->AddEventList(CPAP_Leak, EVL_Event);
|
||||
EventList *LL = session->AddEventList(CPAP_LargeLeak, EVL_Event);
|
||||
EventList *SNORE = session->AddEventList(CPAP_Snore, EVL_Event);
|
||||
EventList *IPAP = session->AddEventList(CPAP_IPAP, EVL_Event, 0.1F);
|
||||
@ -773,7 +774,16 @@ bool PRS1Import::ParseF5Events()
|
||||
//EventList * PRESSURE=nullptr;
|
||||
//EventList * PP=nullptr;
|
||||
|
||||
EventDataType data[10];//,tmp;
|
||||
EventDataType data0, data1, data2, data4, data5;
|
||||
|
||||
EventDataType currentPressure=0, leak, p;
|
||||
|
||||
bool calcLeaks = p_profile->cpap->calculateUnintentionalLeaks();
|
||||
float lpm4 = p_profile->cpap->custom4cmH2OLeaks();
|
||||
float lpm20 = p_profile->cpap->custom20cmH2OLeaks();
|
||||
|
||||
float lpm = lpm20 - lpm4;
|
||||
float ppm = lpm / 16.0;
|
||||
|
||||
|
||||
//qint64 start=timestamp;
|
||||
@ -783,7 +793,6 @@ bool PRS1Import::ParseF5Events()
|
||||
int pos = 0;
|
||||
int cnt = 0;
|
||||
short delta;//,duration;
|
||||
QDateTime d;
|
||||
bool badcode = false;
|
||||
unsigned char lastcode3 = 0, lastcode2 = 0, lastcode = 0, code = 0;
|
||||
int lastpos = 0, startpos = 0, lastpos2 = 0, lastpos3 = 0;
|
||||
@ -827,16 +836,16 @@ bool PRS1Import::ParseF5Events()
|
||||
switch (code) {
|
||||
case 0x00: // Unknown (ASV Pressure value)
|
||||
// offset?
|
||||
data[0] = buffer[pos++];
|
||||
data0 = buffer[pos++];
|
||||
fc++;
|
||||
|
||||
if (!buffer[pos - 1]) { // WTH???
|
||||
data[1] = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
fc++;
|
||||
}
|
||||
|
||||
if (!buffer[pos - 1]) {
|
||||
data[2] = buffer[pos++];
|
||||
data2 = buffer[pos++];
|
||||
fc++;
|
||||
}
|
||||
|
||||
@ -851,48 +860,44 @@ bool PRS1Import::ParseF5Events()
|
||||
break;
|
||||
|
||||
case 0x02: // Pressure ???
|
||||
data[0] = buffer[pos++];
|
||||
data0 = buffer[pos++];
|
||||
// if (!Code[2]) {
|
||||
// if (!(Code[2]=session->AddEventList(cpapcode,EVL_Event,0.1))) return false;
|
||||
// }
|
||||
// Code[2]->AddEvent(t,data[0]);
|
||||
// Code[2]->AddEvent(t,data0);
|
||||
break;
|
||||
|
||||
case 0x04: // Pressure Pulse??
|
||||
data[0] = buffer[pos++];
|
||||
case 0x04: // Timed Breath
|
||||
data0 = buffer[pos++];
|
||||
|
||||
// if (!Code[3]) {
|
||||
// if (!(Code[3] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
|
||||
// }
|
||||
|
||||
TB->AddEvent(t, data[0]);
|
||||
TB->AddEvent(t, data0);
|
||||
break;
|
||||
|
||||
case 0x05:
|
||||
//code=CPAP_Obstructive;
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
OA->AddEvent(tt, data[0]);
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
OA->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x06:
|
||||
//code=CPAP_ClearAirway;
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
|
||||
CA->AddEvent(tt, data[0]);
|
||||
CA->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x07:
|
||||
//code=CPAP_Hypopnea;
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
HY->AddEvent(tt, data[0]);
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
HY->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x08: // ???
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
qDebug() << "Code 8 found at " << hex << pos - 1 << " " << tt;
|
||||
|
||||
if (!Code[10]) {
|
||||
@ -900,40 +905,40 @@ bool PRS1Import::ParseF5Events()
|
||||
}
|
||||
|
||||
//????
|
||||
//data[1]=buffer[pos++]; // ???
|
||||
Code[10]->AddEvent(tt, data[0]);
|
||||
//data1=buffer[pos++]; // ???
|
||||
Code[10]->AddEvent(tt, data0);
|
||||
pos++;
|
||||
break;
|
||||
|
||||
case 0x09: // ASV Codes
|
||||
//code=CPAP_FlowLimit;
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
|
||||
FL->AddEvent(tt, data[0]);
|
||||
FL->AddEvent(tt, data0);
|
||||
|
||||
break;
|
||||
|
||||
case 0x0a:
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
|
||||
if (!Code[7]) {
|
||||
if (!(Code[7] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
|
||||
}
|
||||
|
||||
Code[7]->AddEvent(tt, data[0]);
|
||||
Code[7]->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
|
||||
case 0x0b: // Cheyne Stokes
|
||||
data[0] = ((unsigned char *)buffer)[pos + 1] << 8 | ((unsigned char *)buffer)[pos];
|
||||
//data[0]*=2;
|
||||
data0 = ((unsigned char *)buffer)[pos + 1] << 8 | ((unsigned char *)buffer)[pos];
|
||||
//data0*=2;
|
||||
pos += 2;
|
||||
data[1] = ((unsigned char *)buffer)[pos]; //|buffer[pos+1] << 8
|
||||
data1 = ((unsigned char *)buffer)[pos]; //|buffer[pos+1] << 8
|
||||
pos += 1;
|
||||
//tt-=delta;
|
||||
tt -= qint64(data[1]) * 1000L;
|
||||
tt -= qint64(data1) * 1000L;
|
||||
|
||||
if (!PB) {
|
||||
if (!(PB = session->AddEventList(cpapcode, EVL_Event))) {
|
||||
@ -942,37 +947,46 @@ bool PRS1Import::ParseF5Events()
|
||||
}
|
||||
}
|
||||
|
||||
PB->AddEvent(tt, data[0]);
|
||||
PB->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x0c:
|
||||
data[0] = buffer[pos++];
|
||||
tt -= qint64(data[0]) * 1000L; // Subtract Time Offset
|
||||
data0 = buffer[pos++];
|
||||
tt -= qint64(data0) * 1000L; // Subtract Time Offset
|
||||
qDebug() << "Code 12 found at " << hex << pos - 1 << " " << tt;
|
||||
|
||||
if (!Code[8]) {
|
||||
if (!(Code[8] = session->AddEventList(cpapcode, EVL_Event))) { return false; }
|
||||
}
|
||||
|
||||
Code[8]->AddEvent(tt, data[0]);
|
||||
Code[8]->AddEvent(tt, data0);
|
||||
pos += 2;
|
||||
break;
|
||||
|
||||
case 0x0d: // All the other ASV graph stuff.
|
||||
IPAP->AddEvent(t, data[0] = buffer[pos++]); // 00=IAP
|
||||
data[4] = buffer[pos++];
|
||||
IPAPLo->AddEvent(t, data[4]); // 01=IAP Low
|
||||
data[5] = buffer[pos++];
|
||||
IPAPHi->AddEvent(t, data[5]); // 02=IAP High
|
||||
LEAK->AddEvent(t, buffer[pos++]); // 03=LEAK
|
||||
IPAP->AddEvent(t, currentPressure = data0 = buffer[pos++]); // 00=IAP
|
||||
data4 = buffer[pos++];
|
||||
IPAPLo->AddEvent(t, data4); // 01=IAP Low
|
||||
data5 = buffer[pos++];
|
||||
IPAPHi->AddEvent(t, data5); // 02=IAP High
|
||||
|
||||
TOTLEAK->AddEvent(t, leak=buffer[pos++]); // 03=LEAK
|
||||
if (calcLeaks) { // Much Quicker doing this here than the recalc method.
|
||||
leak -= (((currentPressure/10.0f) - 4.0) * ppm + lpm4);
|
||||
if (leak < 0) leak = 0;
|
||||
|
||||
LEAK->AddEvent(t, leak);
|
||||
}
|
||||
|
||||
|
||||
RR->AddEvent(t, buffer[pos++]); // 04=Breaths Per Minute
|
||||
PTB->AddEvent(t, buffer[pos++]); // 05=Patient Triggered Breaths
|
||||
MV->AddEvent(t, buffer[pos++]); // 06=Minute Ventilation
|
||||
//tmp=buffer[pos++] * 10.0;
|
||||
TV->AddEvent(t, buffer[pos++]); // 07=Tidal Volume
|
||||
SNORE->AddEvent(t, data[2] = buffer[pos++]); // 08=Snore
|
||||
SNORE->AddEvent(t, data2 = buffer[pos++]); // 08=Snore
|
||||
|
||||
if (data[2] > 0) {
|
||||
if (data2 > 0) {
|
||||
if (!VS) {
|
||||
if (!(VS = session->AddEventList(CPAP_VSnore, EVL_Event))) {
|
||||
qDebug() << "!VS eventlist exit";
|
||||
@ -980,14 +994,14 @@ bool PRS1Import::ParseF5Events()
|
||||
}
|
||||
}
|
||||
|
||||
VS->AddEvent(t, 0); //data[2]); // VSnore
|
||||
VS->AddEvent(t, 0); //data2); // VSnore
|
||||
}
|
||||
|
||||
EPAP->AddEvent(t, data[1] = buffer[pos++]); // 09=EPAP
|
||||
data[2] = data[0] - data[1];
|
||||
PS->AddEvent(t, data[2]); // Pressure Support
|
||||
EPAP->AddEvent(t, data1 = buffer[pos++]); // 09=EPAP
|
||||
data2 = data0 - data1;
|
||||
PS->AddEvent(t, data2); // Pressure Support
|
||||
if (event->familyVersion >= 1) {
|
||||
data[0] = buffer[pos++];
|
||||
data0 = buffer[pos++];
|
||||
|
||||
}
|
||||
break;
|
||||
@ -995,12 +1009,12 @@ bool PRS1Import::ParseF5Events()
|
||||
case 0x03: // BIPAP Pressure
|
||||
qDebug() << "0x03 Observed in ASV data!!????";
|
||||
|
||||
data[0] = buffer[pos++];
|
||||
data[1] = buffer[pos++];
|
||||
// data[0]/=10.0;
|
||||
// data[1]/=10.0;
|
||||
data0 = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
// data0/=10.0;
|
||||
// data1/=10.0;
|
||||
// session->AddEvent(new Event(t,CPAP_EAP, 0, data, 1));
|
||||
// session->AddEvent(new Event(t,CPAP_IAP, 0, &data[1], 1));
|
||||
// session->AddEvent(new Event(t,CPAP_IAP, 0, &data1, 1));
|
||||
break;
|
||||
|
||||
case 0x11: // Not Leak Rate
|
||||
@ -1013,41 +1027,41 @@ bool PRS1Import::ParseF5Events()
|
||||
|
||||
case 0x0e: // Unknown
|
||||
qDebug() << "0x0E Observed in ASV data!!????";
|
||||
data[0] = buffer[pos++]; // << 8) | buffer[pos];
|
||||
data0 = buffer[pos++]; // << 8) | buffer[pos];
|
||||
//session->AddEvent(new Event(t,cpapcode, 0, data, 1));
|
||||
break;
|
||||
|
||||
case 0x10: // Unknown
|
||||
data[0] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
data0 = buffer[pos + 1] << 8 | buffer[pos];
|
||||
pos += 2;
|
||||
data[1] = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
|
||||
tt = t - qint64(data[1]) * 1000L;
|
||||
LL->AddEvent(tt, data[0]);
|
||||
tt = t - qint64(data1) * 1000L;
|
||||
LL->AddEvent(tt, data0);
|
||||
|
||||
// qDebug() << "0x10 Observed in ASV data!!????";
|
||||
// data[0] = buffer[pos++]; // << 8) | buffer[pos];
|
||||
// data[1] = buffer[pos++];
|
||||
// data[2] = buffer[pos++];
|
||||
// data0 = buffer[pos++]; // << 8) | buffer[pos];
|
||||
// data1 = buffer[pos++];
|
||||
// data2 = buffer[pos++];
|
||||
//session->AddEvent(new Event(t,cpapcode, 0, data, 3));
|
||||
break;
|
||||
|
||||
case 0x0f:
|
||||
qDebug() << "0x0f Observed in ASV data!!????";
|
||||
|
||||
data[0] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
data0 = buffer[pos + 1] << 8 | buffer[pos];
|
||||
pos += 2;
|
||||
data[1] = buffer[pos]; //|buffer[pos+1] << 8
|
||||
data1 = buffer[pos]; //|buffer[pos+1] << 8
|
||||
pos += 1;
|
||||
tt -= qint64(data[1]) * 1000L;
|
||||
tt -= qint64(data1) * 1000L;
|
||||
//session->AddEvent(new Event(tt,cpapcode, 0, data, 2));
|
||||
break;
|
||||
|
||||
case 0x12: // Summary
|
||||
qDebug() << "0x12 Observed in ASV data!!????";
|
||||
data[0] = buffer[pos++];
|
||||
data[1] = buffer[pos++];
|
||||
data[2] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
data0 = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
data2 = buffer[pos + 1] << 8 | buffer[pos];
|
||||
pos += 2;
|
||||
//session->AddEvent(new Event(t,cpapcode, 0, data,3));
|
||||
break;
|
||||
@ -1167,7 +1181,8 @@ bool PRS1Import::ParseF0Events()
|
||||
{
|
||||
unsigned char code=0;
|
||||
EventList *Code[0x20] = {0};
|
||||
EventDataType data[10];
|
||||
|
||||
EventDataType data0, data1, data2;
|
||||
int cnt = 0;
|
||||
short delta;
|
||||
int pos;
|
||||
@ -1178,7 +1193,8 @@ bool PRS1Import::ParseF0Events()
|
||||
EventList *OA = session->AddEventList(CPAP_Obstructive, EVL_Event);
|
||||
EventList *HY = session->AddEventList(CPAP_Hypopnea, EVL_Event);
|
||||
EventList *PB = session->AddEventList(CPAP_PB, EVL_Event);
|
||||
EventList *LEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event);
|
||||
EventList *TOTLEAK = session->AddEventList(CPAP_LeakTotal, EVL_Event);
|
||||
EventList *LEAK = session->AddEventList(CPAP_Leak, EVL_Event);
|
||||
EventList *SNORE = session->AddEventList(CPAP_Snore, EVL_Event);
|
||||
|
||||
EventList *PP = session->AddEventList(CPAP_PressurePulse, EVL_Event);
|
||||
@ -1189,7 +1205,6 @@ bool PRS1Import::ParseF0Events()
|
||||
EventList *VS2 = session->AddEventList(CPAP_VSnore2, EVL_Event);
|
||||
//EventList *T1 = session->AddEventList(CPAP_Test1, EVL_Event, 0.1);
|
||||
|
||||
Code[12] = session->AddEventList(PRS1_0B, EVL_Event);
|
||||
Code[17] = session->AddEventList(PRS1_0E, EVL_Event);
|
||||
EventList * LL = session->AddEventList(CPAP_LargeLeak, EVL_Event);
|
||||
|
||||
@ -1206,6 +1221,15 @@ bool PRS1Import::ParseF0Events()
|
||||
bool FV3 = (event->fileVersion == 3);
|
||||
unsigned char * buffer = (unsigned char *)event->m_data.data();
|
||||
|
||||
EventDataType currentPressure=0, leak, p;
|
||||
|
||||
bool calcLeaks = p_profile->cpap->calculateUnintentionalLeaks();
|
||||
float lpm4 = p_profile->cpap->custom4cmH2OLeaks();
|
||||
float lpm20 = p_profile->cpap->custom20cmH2OLeaks();
|
||||
|
||||
float lpm = lpm20 - lpm4;
|
||||
float ppm = lpm / 16.0;
|
||||
|
||||
//CPAPMode mode = (CPAPMode) session->settings[CPAP_Mode].toInt();
|
||||
|
||||
for (pos = 0; pos < size;) {
|
||||
@ -1253,12 +1277,6 @@ bool PRS1Import::ParseF0Events()
|
||||
break;
|
||||
|
||||
case 0x01: // Unknown
|
||||
if (!Code[1]) {
|
||||
if (!(Code[1] = session->AddEventList(PRS1_01, EVL_Event))) { return false; }
|
||||
}
|
||||
|
||||
Code[1]->AddEvent(t, 0);
|
||||
|
||||
if ((event->family == 0) && (event->familyVersion >= 4)) {
|
||||
if (!PRESSURE) {
|
||||
PRESSURE = session->AddEventList(CPAP_Pressure, EVL_Event, 0.1F);
|
||||
@ -1266,7 +1284,13 @@ bool PRS1Import::ParseF0Events()
|
||||
if (!PRESSURE) { return false; }
|
||||
}
|
||||
|
||||
PRESSURE->AddEvent(t, buffer[pos++]);
|
||||
PRESSURE->AddEvent(t, currentPressure = buffer[pos++]);
|
||||
} else {
|
||||
if (!Code[1]) {
|
||||
if (!(Code[1] = session->AddEventList(PRS1_01, EVL_Event))) { return false; }
|
||||
}
|
||||
|
||||
Code[1]->AddEvent(t, 0);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -1281,9 +1305,9 @@ bool PRS1Import::ParseF0Events()
|
||||
if (!(PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F))) { return false; }
|
||||
}
|
||||
|
||||
EPAP->AddEvent(t, data[0] = buffer[pos++]);
|
||||
IPAP->AddEvent(t, data[1] = buffer[pos++]);
|
||||
PS->AddEvent(t, data[1] - data[0]);
|
||||
EPAP->AddEvent(t, data0 = buffer[pos++]);
|
||||
IPAP->AddEvent(t, data1 = currentPressure = buffer[pos++]);
|
||||
PS->AddEvent(t, data1 - data0);
|
||||
} else {
|
||||
if (!PRESSURE) {
|
||||
PRESSURE = session->AddEventList(CPAP_Pressure, EVL_Event, 0.1F);
|
||||
@ -1291,7 +1315,7 @@ bool PRS1Import::ParseF0Events()
|
||||
if (!PRESSURE) { return false; }
|
||||
}
|
||||
|
||||
PRESSURE->AddEvent(t, buffer[pos++]);
|
||||
PRESSURE->AddEvent(t, currentPressure = buffer[pos++]);
|
||||
}
|
||||
|
||||
break;
|
||||
@ -1303,7 +1327,7 @@ bool PRS1Import::ParseF0Events()
|
||||
|
||||
if (!PRESSURE) { return false; }
|
||||
}
|
||||
PRESSURE->AddEvent(t, buffer[pos++]);
|
||||
PRESSURE->AddEvent(t, currentPressure = buffer[pos++]);
|
||||
|
||||
} else {
|
||||
if (!EPAP) {
|
||||
@ -1314,57 +1338,70 @@ bool PRS1Import::ParseF0Events()
|
||||
if (!(PS = session->AddEventList(CPAP_PS, EVL_Event, 0.1F))) { return false; }
|
||||
}
|
||||
|
||||
EPAP->AddEvent(t, data[0] = buffer[pos++]);
|
||||
IPAP->AddEvent(t, data[1] = buffer[pos++]);
|
||||
PS->AddEvent(t, data[1] - data[0]);
|
||||
EPAP->AddEvent(t, data0 = buffer[pos++]);
|
||||
IPAP->AddEvent(t, data1 = currentPressure = buffer[pos++]);
|
||||
PS->AddEvent(t, data1 - data0);
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x04: // Pressure Pulse
|
||||
data[0] = buffer[pos++];
|
||||
data0 = buffer[pos++];
|
||||
|
||||
PP->AddEvent(t, data[0]);
|
||||
PP->AddEvent(t, data0);
|
||||
break;
|
||||
|
||||
case 0x05: // RERA
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
|
||||
RE->AddEvent(tt, data[0]);
|
||||
RE->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x06: // Obstructive Apoanea
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
OA->AddEvent(tt, data[0]);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
OA->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x07: // Clear Airway
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
|
||||
CA->AddEvent(tt, data[0]);
|
||||
CA->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x0a: // Hypopnea
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
HY->AddEvent(tt, data[0]);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
HY->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x0c: // Flow Limitation
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
|
||||
FL->AddEvent(tt, data[0]);
|
||||
FL->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x0b: // Hypopnea related code
|
||||
data[0] = buffer[pos++];
|
||||
data[1] = buffer[pos++];
|
||||
case 0x0b: // Breathing not Detected flag???? but it doesn't line up
|
||||
data0 = buffer[pos];
|
||||
data1 = buffer[pos+1];
|
||||
pos += 2;
|
||||
|
||||
if (event->familyVersion >= 4) {
|
||||
// might not doublerize on older machines?
|
||||
// data0 *= 2;
|
||||
}
|
||||
// data1 = buffer[pos++];
|
||||
|
||||
tt = t + qint64((data0+data1)*2) * 1000L;
|
||||
|
||||
if (!Code[12]) {
|
||||
Code[12] = session->AddEventList(PRS1_0B, EVL_Event);
|
||||
}
|
||||
|
||||
// FIXME
|
||||
Code[12]->AddEvent(t, data[0]);
|
||||
Code[12]->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x0d: // Vibratory Snore
|
||||
@ -1372,74 +1409,81 @@ bool PRS1Import::ParseF0Events()
|
||||
break;
|
||||
|
||||
case 0x0e: // Unknown
|
||||
data[0] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
data0 = buffer[pos + 1] << 8 | buffer[pos];
|
||||
if (event->familyVersion >= 4) {
|
||||
// might not doublerize on older machines?
|
||||
data[0] *= 2;
|
||||
data0 *= 2;
|
||||
}
|
||||
|
||||
pos += 2;
|
||||
data[1] = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
|
||||
tt = t - qint64(data[1]) * 1000L;
|
||||
Code[17]->AddEvent(t, data[0]);
|
||||
tt = t - qint64(data1) * 1000L;
|
||||
Code[17]->AddEvent(tt, data0);
|
||||
|
||||
break;
|
||||
|
||||
case 0x0f: // Cheyne Stokes Respiration
|
||||
data[0] = (buffer[pos + 1] << 8 | buffer[pos]);
|
||||
data0 = (buffer[pos + 1] << 8 | buffer[pos]);
|
||||
if (event->familyVersion >= 4) {
|
||||
// might not doublerize on older machines
|
||||
data[0] *= 2;
|
||||
data0 *= 2;
|
||||
}
|
||||
pos += 2;
|
||||
data[1] = buffer[pos++];
|
||||
tt = t - qint64(data[1]) * 1000L;
|
||||
PB->AddEvent(tt, data[0]);
|
||||
data1 = buffer[pos++];
|
||||
tt = t - qint64(data1) * 1000L;
|
||||
PB->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x10: // Large Leak
|
||||
data[0] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
data0 = buffer[pos + 1] << 8 | buffer[pos];
|
||||
if (event->familyVersion >= 4) {
|
||||
// might not doublerize on older machines
|
||||
data[0] *= 2;
|
||||
data0 *= 2;
|
||||
}
|
||||
pos += 2;
|
||||
data[1] = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
|
||||
tt = t - qint64(data[1]) * 1000L;
|
||||
LL->AddEvent(tt, data[0]);
|
||||
tt = t - qint64(data1) * 1000L;
|
||||
LL->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x11: // Leak Rate & Snore Graphs
|
||||
data[0] = buffer[pos++];
|
||||
data[1] = buffer[pos++];
|
||||
data0 = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
|
||||
LEAK->AddEvent(t, data[0]);
|
||||
SNORE->AddEvent(t, data[1]);
|
||||
TOTLEAK->AddEvent(t, data0);
|
||||
SNORE->AddEvent(t, data1);
|
||||
|
||||
if (data[1] > 0) {
|
||||
VS2->AddEvent(t, data[1]);
|
||||
if (calcLeaks) { // Much Quicker doing this here than the recalc method.
|
||||
leak = data0-(((currentPressure/10.0f) - 4.0) * ppm + lpm4);
|
||||
if (leak < 0) leak = 0;
|
||||
|
||||
LEAK->AddEvent(t, leak);
|
||||
}
|
||||
|
||||
if (data1 > 0) {
|
||||
VS2->AddEvent(t, data1);
|
||||
}
|
||||
|
||||
if ((event->family == 0) && (event->familyVersion >= 4)) {
|
||||
// EPAP / Flex Pressure
|
||||
data[0] = buffer[pos++];
|
||||
data0 = buffer[pos++];
|
||||
|
||||
// Perhaps this check is not necessary, as it will theoretically add extra resolution to pressure chart
|
||||
// for bipap models and above???
|
||||
// if (mode <= MODE_BILEVEL_FIXED) {
|
||||
// if (!(EPAP = session->AddEventList(CPAP_EPAP, EVL_Event, 0.1F))) { return false; }
|
||||
// EPAP->AddEvent(t, data[0]);
|
||||
// EPAP->AddEvent(t, data0);
|
||||
// }
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 0x12: // Summary
|
||||
data[0] = buffer[pos++];
|
||||
data[1] = buffer[pos++];
|
||||
data[2] = buffer[pos + 1] << 8 | buffer[pos];
|
||||
data0 = buffer[pos++];
|
||||
data1 = buffer[pos++];
|
||||
data2 = buffer[pos + 1] << 8 | buffer[pos];
|
||||
pos += 2;
|
||||
|
||||
// Could end here, but I've seen data sets valid data after!!!
|
||||
@ -1447,15 +1491,15 @@ bool PRS1Import::ParseF0Events()
|
||||
break;
|
||||
|
||||
case 0x14: // DreamStation Hypopnea
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
HY->AddEvent(tt, data[0]);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
HY->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
case 0x15: // DreamStation Hypopnea
|
||||
data[0] = buffer[pos++];
|
||||
tt = t - (qint64(data[0]) * 1000L);
|
||||
HY->AddEvent(tt, data[0]);
|
||||
data0 = buffer[pos++];
|
||||
tt = t - (qint64(data0) * 1000L);
|
||||
HY->AddEvent(tt, data0);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -2893,7 +2937,7 @@ void PRS1Loader::initChannels()
|
||||
QString(unknownshort).arg(0xa,2,16,QChar('0')),
|
||||
STR_UNIT_Unknown,
|
||||
DEFAULT, QColor("black")));
|
||||
channel.add(GRP_CPAP, new Channel(PRS1_0B = 0x1155, UNKNOWN, MT_CPAP, SESSION,
|
||||
channel.add(GRP_CPAP, new Channel(PRS1_0B = 0x1155, SPAN, MT_CPAP, SESSION,
|
||||
"PRS1_0B",
|
||||
QString(unknownname).arg(0xb,2,16,QChar('0')),
|
||||
QString(unknowndesc).arg(0xb,2,16,QChar('0')),
|
||||
|
@ -305,7 +305,7 @@ 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_CalculateUnintentionalLeaks = "CalculateUnintentionalLeaks";
|
||||
const QString STR_CS_4cmH2OLeaks = "Custom4cmH2OLeaks";
|
||||
const QString STR_CS_20cmH2OLeaks = "Custom20cmH2OLeaks";
|
||||
|
||||
@ -570,7 +570,7 @@ class CPAPSettings : public ProfileSettings
|
||||
initPref(STR_CS_AutoImport, false);
|
||||
initPref(STR_CS_BrickWarning, true);
|
||||
|
||||
initPref(STR_CS_CustomMaskProfile, false);
|
||||
initPref(STR_CS_CalculateUnintentionalLeaks, true);
|
||||
initPref(STR_CS_4cmH2OLeaks, 20.167);
|
||||
initPref(STR_CS_20cmH2OLeaks, 48.333);
|
||||
|
||||
@ -607,7 +607,7 @@ 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(); }
|
||||
bool calculateUnintentionalLeaks() const { return getPref(STR_CS_CalculateUnintentionalLeaks).toBool(); }
|
||||
double custom4cmH2OLeaks() const { return getPref(STR_CS_4cmH2OLeaks).toDouble(); }
|
||||
double custom20cmH2OLeaks() const { return getPref(STR_CS_20cmH2OLeaks).toDouble(); }
|
||||
|
||||
@ -644,7 +644,7 @@ 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 setCalculateUnintentionalLeaks(bool b) { setPref(STR_CS_CalculateUnintentionalLeaks, b); }
|
||||
void setCustom4cmH2OLeaks(double val) { setPref(STR_CS_4cmH2OLeaks, val); }
|
||||
void setCustom20cmH2OLeaks(double val) { setPref(STR_CS_20cmH2OLeaks, val); }
|
||||
|
||||
|
@ -220,7 +220,7 @@ PreferencesDialog::PreferencesDialog(QWidget *parent, Profile *_profile) :
|
||||
|
||||
|
||||
bool b;
|
||||
ui->customMaskProfileGroupbox->setChecked(b=profile->cpap->customMaskProfile());
|
||||
ui->calculateUnintentionalLeaks->setChecked(b=profile->cpap->calculateUnintentionalLeaks());
|
||||
|
||||
ui->maskLeaks4Slider->setValue(profile->cpap->custom4cmH2OLeaks()*10.0);
|
||||
ui->maskLeaks20Slider->setValue(profile->cpap->custom20cmH2OLeaks()*10.0);
|
||||
@ -793,13 +793,13 @@ bool PreferencesDialog::Save()
|
||||
profile->cpap->setUserEventDuplicates(ui->userEventDuplicates->isChecked());
|
||||
|
||||
|
||||
if ((ui->customMaskProfileGroupbox->isChecked() != profile->cpap->customMaskProfile())
|
||||
if ((ui->calculateUnintentionalLeaks->isChecked() != profile->cpap->calculateUnintentionalLeaks())
|
||||
|| (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->setCalculateUnintentionalLeaks(ui->calculateUnintentionalLeaks->isChecked());
|
||||
profile->cpap->setCustom4cmH2OLeaks(double(ui->maskLeaks4Slider->value()) / 10.0f);
|
||||
profile->cpap->setCustom20cmH2OLeaks(double(ui->maskLeaks20Slider->value()) / 10.0f);
|
||||
|
||||
@ -1162,21 +1162,6 @@ 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));
|
||||
@ -1186,3 +1171,8 @@ void PreferencesDialog::on_maskLeaks20Slider_valueChanged(int value)
|
||||
{
|
||||
ui->maskLeaks20Label->setText(tr("%1 %2").arg(value/10.0f, 5,'f',1).arg(STR_UNIT_LPM));
|
||||
}
|
||||
|
||||
void PreferencesDialog::on_calculateUnintentionalLeaks_toggled(bool arg1)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -87,16 +87,12 @@ 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);
|
||||
|
||||
void on_calculateUnintentionalLeaks_toggled(bool arg1);
|
||||
|
||||
private:
|
||||
void InitChanInfo();
|
||||
void InitWaveInfo();
|
||||
|
@ -714,15 +714,22 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="customMaskProfileGroupbox">
|
||||
<widget class="QGroupBox" name="calculateUnintentionalLeaks">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Minimum">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>This calculation requires Total Leaks data to be provided by the CPAP machine. (Eg, PRS1, but not ResMed, which has these already)
|
||||
|
||||
The Unintentional Leak calculations used here are linear, they don't model the mask vent curve.
|
||||
|
||||
If you use a few different masks, pick average values instead. It should still be close enough.</string>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Use Custom Mask Profile for Unintentional Leaks</string>
|
||||
<string>Calculate Unintentional Leaks When Not Present</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
@ -730,6 +737,9 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
|
||||
<layout class="QGridLayout" name="gridLayout_11">
|
||||
<item row="2" column="1">
|
||||
<widget class="QSlider" name="maskLeaks20Slider">
|
||||
<property name="toolTip">
|
||||
<string>Your masks vent rate at 20cmH2O pressure</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>400</number>
|
||||
</property>
|
||||
@ -780,6 +790,9 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QSlider" name="maskLeaks4Slider">
|
||||
<property name="toolTip">
|
||||
<string>Your masks vent rate at 4cmH2O pressure</string>
|
||||
</property>
|
||||
<property name="minimum">
|
||||
<number>170</number>
|
||||
</property>
|
||||
@ -848,7 +861,7 @@ SleepyHead can keep a copy of this data if you ever need to reinstall.
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label_39">
|
||||
<property name="text">
|
||||
<string>Note: This is linear, so doesn't model the mask leak curve, but it should be close enough.</string>
|
||||
<string>Note: A linear calculation method is used. Changing these values requires a recalculation.</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
@ -1078,51 +1091,7 @@ A value of 20% works well for detecting apneas. </string>
|
||||
<string>General CPAP and Related Settings</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="2">
|
||||
<widget class="QDoubleSpinBox" name="complianceHours">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> hours</string>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>8.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>4.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QDoubleSpinBox" name="leakRedlineSpinbox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>User definable threshold considered large leak</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> L/min</string>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="showUnknownFlags">
|
||||
<property name="toolTip">
|
||||
<string>Show flags for machine detected events that haven't been identified yet.</string>
|
||||
@ -1132,40 +1101,13 @@ A value of 20% works well for detecting apneas. </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QComboBox" name="eventIndexCombo">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string extracomment="Apnea Hypopnea Index">AHI</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string extracomment="Respiratory Disturbance Index">RDI</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<item row="6" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_27">
|
||||
<property name="text">
|
||||
<string>AHI/Hour Graph Time Window</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_28">
|
||||
<property name="text">
|
||||
<string>Preferred major event index</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="complianceCheckBox">
|
||||
<property name="text">
|
||||
@ -1173,7 +1115,7 @@ A value of 20% works well for detecting apneas. </string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="2">
|
||||
<item row="6" column="2">
|
||||
<widget class="QSpinBox" name="ahiGraphWindowSize">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
@ -1215,7 +1157,14 @@ Defaults to 60 minutes.. Highly recommend it's left at this value.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_28">
|
||||
<property name="text">
|
||||
<string>Preferred major event index</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="3">
|
||||
<widget class="QCheckBox" name="ahiGraphZeroReset">
|
||||
<property name="toolTip">
|
||||
<string>Reset the counter to zero at beginning of each (time) window.</string>
|
||||
@ -1225,6 +1174,70 @@ Defaults to 60 minutes.. Highly recommend it's left at this value.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2" colspan="2">
|
||||
<widget class="QDoubleSpinBox" name="leakRedlineSpinbox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>User definable threshold considered large leak</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> L/min</string>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2" colspan="2">
|
||||
<widget class="QDoubleSpinBox" name="complianceHours">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Regard days with under this usage as "incompliant". 4 hours is usually considered compliant.</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> hours</string>
|
||||
</property>
|
||||
<property name="decimals">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<double>8.000000000000000</double>
|
||||
</property>
|
||||
<property name="value">
|
||||
<double>4.000000000000000</double>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2" colspan="2">
|
||||
<widget class="QComboBox" name="eventIndexCombo">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Minimum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string extracomment="Apnea Hypopnea Index">AHI</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string extracomment="Respiratory Disturbance Index">RDI</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
@ -1269,6 +1282,9 @@ as this is the only value available on summary-only days.</string>
|
||||
<property name="minimum">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>99</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
|
Loading…
Reference in New Issue
Block a user