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