Report fixes, Added CPAP mode to daily & reports

This commit is contained in:
Mark Watkins 2011-12-12 19:16:26 +10:00
parent c74c57f343
commit 83b64776e9
5 changed files with 83 additions and 52 deletions

View File

@ -439,14 +439,18 @@ bool PRS1Loader::ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp,
if (mach->SessionExists(sequence)) if (mach->SessionExists(sequence))
return false; return false;
if (size<40)
return false;
Session *session=new Session(mach,sequence); Session *session=new Session(mach,sequence);
session->really_set_first(qint64(timestamp)*1000L); session->really_set_first(qint64(timestamp)*1000L);
EventDataType max,min; EventDataType max,min;
min=(data[0x03])/10.0; min=float(data[0x03])/10.0;
session->settings[CPAP_PressureMin]=min; session->settings[CPAP_PressureMin]=(double)min;
max=(data[0x04])/10.0; //min=session->settings[CPAP_PressureMin].toDouble();
session->settings[CPAP_PressureMax]=max; max=float(data[0x04])/10.0;
session->settings[CPAP_PressureMax]=(double)max;
int offset=0; int offset=0;
if (version==5) { //data[0x05]!=0) { // This is a time value for ASV stuff if (version==5) { //data[0x05]!=0) { // This is a time value for ASV stuff
offset=4; // non zero adds 4 extra fields.. offset=4; // non zero adds 4 extra fields..
@ -489,11 +493,8 @@ bool PRS1Loader::ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp,
if (max>0) { if (max>0) {
session->setMin(CPAP_Pressure,min); session->setMin(CPAP_Pressure,min);
session->setMax(CPAP_Pressure,max); session->setMax(CPAP_Pressure,max);
} else {
session->setWavg(CPAP_Pressure,min );
} }
session->setWavg(CPAP_Pressure,min);
} else { } else {
// 0X28 & 0X29 is length on r5 // 0X28 & 0X29 is length on r5
@ -509,10 +510,10 @@ bool PRS1Loader::ParseSummary(Machine *mach, qint32 sequence, quint32 timestamp,
// Not using these because sometimes this summary is broken. // Not using these because sometimes this summary is broken.
EventDataType minp,maxp,avgp,p90p; EventDataType minp,maxp,avgp,p90p;
minp=data[offset+0x16]/10.0; minp=float(data[offset+0x16])/10.0;
maxp=data[offset+0x17]/10.0; maxp=float(data[offset+0x17])/10.0;
p90p=data[offset+0x18]/10.0; p90p=float(data[offset+0x18])/10.0;
avgp=data[offset+0x19]/10.0; avgp=float(data[offset+0x19])/10.0;
if (minp>0) session->setMin(CPAP_Pressure,minp); else session->setMin(CPAP_Pressure,min); if (minp>0) session->setMin(CPAP_Pressure,minp); else session->setMin(CPAP_Pressure,min);
if (maxp>0) session->setMax(CPAP_Pressure,maxp); else session->setMax(CPAP_Pressure,min); if (maxp>0) session->setMax(CPAP_Pressure,maxp); else session->setMax(CPAP_Pressure,min);
@ -1107,7 +1108,7 @@ bool PRS1Loader::OpenFile(Machine *mach, QString filename)
} }
datasize=size-hl-2; datasize=size-hl-2;
data=&m_buffer[pos+hl]; data=&header[hl];
#ifdef PRS1_CRC_CHECK #ifdef PRS1_CRC_CHECK
c16=CRC16(data,datasize); c16=CRC16(data,datasize);

View File

@ -372,12 +372,12 @@ int ResmedLoader::Open(QString & path,Profile *profile)
qDebug() << "edf Serial number doesn't match STR.edf!"; qDebug() << "edf Serial number doesn't match STR.edf!";
} }
} else if (i.key()=="PNA") { } else if (i.key()=="PNA") {
m->properties["Model"]=i.value(); //m->properties["Model"]=""; //i.value();
} else if (i.key()=="PCD") { } else if (i.key()=="PCD") {
bool ok; bool ok;
int j=i.value().toInt(&ok); int j=i.value().toInt(&ok);
if (RMS9ModelMap.find(j)!=RMS9ModelMap.end()) { if (RMS9ModelMap.find(j)!=RMS9ModelMap.end()) {
m->properties["SubModel"]=RMS9ModelMap[j]; m->properties["Model"]=RMS9ModelMap[j];
} }
} else { } else {
m->properties[i.key()]=i.value(); m->properties[i.key()]=i.value();
@ -436,27 +436,32 @@ int ResmedLoader::Open(QString & path,Profile *profile)
sig=stredf.lookupSignal("Set Pressure"); sig=stredf.lookupSignal("Set Pressure");
if (sig) { if (sig) {
EventDataType pressure=sig->data[dn]*sig->gain; EventDataType pressure=sig->data[dn]*sig->gain;
sess->settings[CPAP_Pressure]=pressure; sess->settings[CPAP_PressureMin]=pressure;
sess->setWavg(CPAP_Pressure,pressure); //sess->setWavg(CPAP_Pressure,pressure);
sess->setAvg(CPAP_Pressure,pressure); //sess->setAvg(CPAP_Pressure,pressure);
sess->set90p(CPAP_Pressure,pressure); //sess->set90p(CPAP_Pressure,pressure);
sess->setMax(CPAP_Pressure,pressure); //sess->setMax(CPAP_Pressure,pressure);
sess->setMin(CPAP_Pressure,pressure); //sess->setMin(CPAP_Pressure,pressure);
} }
} else { } else {
if (mode>5) { if (mode>5) {
sess->settings[CPAP_Mode]=MODE_BIPAP; sess->settings[CPAP_Mode]=MODE_BIPAP;
} else { } else {
sess->settings[CPAP_Mode]=MODE_APAP; sess->settings[CPAP_Mode]=MODE_APAP;
}
sig=stredf.lookupSignal("Min Pressure");
if (sig) {
EventDataType pressure=sig->data[dn]*sig->gain;
sess->settings[CPAP_PressureMin]=pressure;
sess->setMin(CPAP_Pressure,pressure);
}
sig=stredf.lookupSignal("Max Pressure");
if (sig) {
EventDataType pressure=sig->data[dn]*sig->gain;
sess->settings[CPAP_PressureMax]=pressure;
sess->setMax(CPAP_Pressure,pressure);
} }
sig=stredf.lookupSignal(CPAP_PressureMin);
if (sig)
sess->setMin(CPAP_Pressure,sig->data[dn]*sig->gain);
sig=stredf.lookupSignal(CPAP_PressureMax);
if (sig)
sess->setMax(CPAP_Pressure,sig->data[dn]*sig->gain);
} }
} }
@ -805,21 +810,21 @@ bool ResmedLoader::LoadPLD(Session *sess,EDFParser &edf)
void ResInitModelMap() void ResInitModelMap()
{ {
// Courtesy Troy Schultz // Courtesy Troy Schultz
RMS9ModelMap[36001]="ResMed S9 Escape"; RMS9ModelMap[36001]="S9 Escape";
RMS9ModelMap[36002]="ResMed S9 Escape Auto"; RMS9ModelMap[36002]="S9 Escape Auto";
RMS9ModelMap[36003]="ResMed S9 Elite"; RMS9ModelMap[36003]="S9 Elite";
RMS9ModelMap[36004]="ResMed S9 VPAP S"; RMS9ModelMap[36004]="S9 VPAP S";
RMS9ModelMap[36005]="ResMed S9 AutoSet"; RMS9ModelMap[36005]="S9 AutoSet";
RMS9ModelMap[36006]="ResMed S9 VPAP Auto"; RMS9ModelMap[36006]="S9 VPAP Auto";
RMS9ModelMap[36007]="ResMed S9 VPAP Adapt"; RMS9ModelMap[36007]="S9 VPAP Adapt";
RMS9ModelMap[36008]="ResMed S9 VPAP ST"; RMS9ModelMap[36008]="S9 VPAP ST";
/* S8 Series /* S8 Series
RMS9ModelMap[33007]="ResMed S8 Escape"; RMS9ModelMap[33007]="S8 Escape";
RMS9ModelMap[33039]="ResMed S8 Elite II"; RMS9ModelMap[33039]="S8 Elite II";
RMS9ModelMap[33051]="ResMed S8 Escape II"; RMS9ModelMap[33051]="S8 Escape II";
RMS9ModelMap[33064]="ResMed S8 Escape II AutoSet"; RMS9ModelMap[33064]="S8 Escape II AutoSet";
RMS9ModelMap[33064]="ResMed S8 Escape II AutoSet"; RMS9ModelMap[33064]="S8 Escape II AutoSet";
RMS9ModelMap[33129]="ResMed S8 AutoSet II"; RMS9ModelMap[33129]="S8 AutoSet II";
*/ */
resmed_codes[CPAP_FlowRate].push_back("Flow"); resmed_codes[CPAP_FlowRate].push_back("Flow");

View File

@ -64,7 +64,7 @@ const QString PRS1_FlexSet="FlexSet";
const QString CPAP_Mode="PAPMode"; const QString CPAP_Mode="PAPMode";
const QString CPAP_BrokenSummary="BrokenSummary"; const QString CPAP_BrokenSummary="BrokenSummary";
const QString CPAP_PressureMin="PressureMin"; const QString CPAP_PressureMin="PressureMin";
const QString CPAP_PressureMax="PressureMin"; const QString CPAP_PressureMax="PressureMax";
const QString CPAP_RampTime="RampTime"; const QString CPAP_RampTime="RampTime";
const QString CPAP_RampPressure="RampPressure"; const QString CPAP_RampPressure="RampPressure";
const QString CPAP_Obstructive="Obstructive"; const QString CPAP_Obstructive="Obstructive";

View File

@ -691,15 +691,27 @@ void Daily::Load(QDate date)
//float p90=cpap->p90(CPAP_Pressure); //float p90=cpap->p90(CPAP_Pressure);
//eap90=cpap->p90(CPAP_EPAP); //eap90=cpap->p90(CPAP_EPAP);
//iap90=cpap->p90(CPAP_IPAP); //iap90=cpap->p90(CPAP_IPAP);
QString submodel=tr("Unknown Model"); QString submodel; //=tr("Unknown Model");
//html+="<tr><td colspan=4 align=center><i>"+tr("Machine Information")+"</i></td></tr>\n"; //html+="<tr><td colspan=4 align=center><i>"+tr("Machine Information")+"</i></td></tr>\n";
if (cpap->machine->properties.find("SubModel")!=cpap->machine->properties.end()) if (cpap->machine->properties.find("SubModel")!=cpap->machine->properties.end())
submodel=" <br>"+cpap->machine->properties["SubModel"]; submodel=" <br/>"+cpap->machine->properties["SubModel"];
html+="<tr><td colspan=4 align=center><b>"+cpap->machine->properties["Brand"]+"</b> <br>"+cpap->machine->properties["Model"]+" "+cpap->machine->properties["ModelNumber"]+submodel+"</td></tr>\n"; html+="<tr><td colspan=4 align=center><b>"+cpap->machine->properties["Brand"]+"</b> <br>"+cpap->machine->properties["Model"]+" "+cpap->machine->properties["ModelNumber"]+submodel+"</td></tr>\n";
if (PROFILE.Exists("ShowSerialNumbers") && PROFILE["ShowSerialNumbers"].toBool()) { if (PROFILE.Exists("ShowSerialNumbers") && PROFILE["ShowSerialNumbers"].toBool()) {
html+="<tr><td colspan=4 align=center>"+cpap->machine->properties["Serial"]+"</td></tr>\n"; html+="<tr><td colspan=4 align=center>"+cpap->machine->properties["Serial"]+"</td></tr>\n";
} }
CPAPMode mode=(CPAPMode)cpap->settings_max(CPAP_Mode);
html+="<tr><td colspan=4 align=center>Mode: ";
EventDataType min=cpap->settings_min(CPAP_PressureMin);
EventDataType max=cpap->settings_max(CPAP_PressureMax);
if (mode==MODE_CPAP) html+="CPAP "+QString::number(min)+"cmH2O";
else if (mode==MODE_APAP) html+="APAP "+QString::number(min)+"-"+QString::number(max)+"cmH2O";
else if (mode==MODE_BIPAP) html+="Bi-Level";
else if (mode==MODE_ASV) html+="ASV";
else html+="Unknown";
html+="</td></tr>\n";
html+="<tr><td align='center'><b>Date</b></td><td align='center'><b>"+tr("Sleep")+"</b></td><td align='center'><b>"+tr("Wake")+"</b></td><td align='center'><b>"+tr("Hours")+"</b></td></tr>"; html+="<tr><td align='center'><b>Date</b></td><td align='center'><b>"+tr("Sleep")+"</b></td><td align='center'><b>"+tr("Wake")+"</b></td><td align='center'><b>"+tr("Hours")+"</b></td></tr>";
int tt=qint64(cpap->total_time())/1000L; int tt=qint64(cpap->total_time())/1000L;

View File

@ -810,8 +810,8 @@ void MainWindow::PrintReport(gGraphView *gv,QString name, QDate date)
QString title=name+" Report"; QString title=name+" Report";
//QTextOption t_op(Qt::AlignCenter); //QTextOption t_op(Qt::AlignCenter);
painter.setFont(*bigfont); painter.setFont(*bigfont);
QRectF bounds=painter.boundingRect(QRectF(0,0,res.width(),0),title,QTextOption(Qt::AlignCenter)); QRectF bounds=painter.boundingRect(QRectF(0,0,res.width(),0),title,QTextOption(Qt::AlignHCenter | Qt::AlignTop));
painter.drawText(bounds,title,QTextOption(Qt::AlignCenter)); painter.drawText(bounds,title,QTextOption(Qt::AlignHCenter | Qt::AlignTop));
painter.setFont(*defaultfont); painter.setFont(*defaultfont);
top=bounds.height(); top=bounds.height();
//top+=15*yscale; //spacer //top+=15*yscale; //spacer
@ -827,7 +827,7 @@ void MainWindow::PrintReport(gGraphView *gv,QString name, QDate date)
if (bounds.height()>maxy) maxy=bounds.height(); if (bounds.height()>maxy) maxy=bounds.height();
} }
if (name=="Daily") { if (name=="Daily") {
QString cpapinfo="Date: "+date.toString(Qt::SystemLocaleLongDate)+"\n"; QString cpapinfo=date.toString(Qt::SystemLocaleLongDate)+"\n\n";
Day *cpap=PROFILE.GetDay(date,MT_CPAP); Day *cpap=PROFILE.GetDay(date,MT_CPAP);
if (cpap) { if (cpap) {
time_t f=cpap->first()/1000L; time_t f=cpap->first()/1000L;
@ -837,9 +837,22 @@ void MainWindow::PrintReport(gGraphView *gv,QString name, QDate date)
int m=(tt/60)%60; int m=(tt/60)%60;
int s=tt % 60; int s=tt % 60;
cpapinfo+="Mask Time: "+QString().sprintf("%2i hours %2i minutes, %2i seconds",h,m,s)+"\n"; cpapinfo+="Mask Time: "+QString().sprintf("%2i hours, %2i minutes, %2i seconds",h,m,s)+"\n";
cpapinfo+="Bedtime: "+QDateTime::fromTime_t(f).time().toString("HH:mm:ss")+"\n"; cpapinfo+="Bedtime: "+QDateTime::fromTime_t(f).time().toString("HH:mm:ss")+" ";
cpapinfo+="Wake-up: "+QDateTime::fromTime_t(l).time().toString("HH:mm:ss")+"\n\n"; cpapinfo+="Wake-up: "+QDateTime::fromTime_t(l).time().toString("HH:mm:ss")+"\n\n";
QString submodel;
cpapinfo+="Machine: ";
if (cpap->machine->properties.find("SubModel")!=cpap->machine->properties.end())
submodel="\n"+cpap->machine->properties["SubModel"];
cpapinfo+=cpap->machine->properties["Brand"]+" "+cpap->machine->properties["Model"]+submodel;
CPAPMode mode=(CPAPMode)cpap->settings_max(CPAP_Mode);
cpapinfo+="\nMode: ";
if (mode==MODE_CPAP) cpapinfo+="CPAP";
else if (mode==MODE_APAP) cpapinfo+="Auto-PAP";
else if (mode==MODE_BIPAP) cpapinfo+="Bi-Level";
else if (mode==MODE_ASV) cpapinfo+="ASV";
float ahi=(cpap->count(CPAP_Obstructive)+cpap->count(CPAP_Hypopnea)+cpap->count(CPAP_ClearAirway)+cpap->count(CPAP_Apnea))/cpap->hours(); float ahi=(cpap->count(CPAP_Obstructive)+cpap->count(CPAP_Hypopnea)+cpap->count(CPAP_ClearAirway)+cpap->count(CPAP_Apnea))/cpap->hours();
float csr=(100.0/cpap->hours())*(cpap->sum(CPAP_CSR)/3600.0); float csr=(100.0/cpap->hours())*(cpap->sum(CPAP_CSR)/3600.0);
float uai=cpap->count(CPAP_Apnea)/cpap->hours(); float uai=cpap->count(CPAP_Apnea)/cpap->hours();
@ -994,7 +1007,7 @@ void MainWindow::PrintReport(gGraphView *gv,QString name, QDate date)
PROFILE["UseAntiAliasing"]=aa_setting; PROFILE["UseAntiAliasing"]=aa_setting;
QPixmap pm2=pm.scaledToWidth(pw); QPixmap pm2=pm.scaledToWidth(pw);
painter.drawPixmap(0,top,pm2.width(),pm2.height(),pm2); painter.drawPixmap(0,top,pm2.width(),pm2.height(),pm2);
top+=ph; //pm2.height(); top+=pm2.height();
gcnt++; gcnt++;
if (qprogress) { if (qprogress) {