diff --git a/SleepLib/loader_plugins/prs1_loader.cpp b/SleepLib/loader_plugins/prs1_loader.cpp index b0a64d57..f69b74ce 100644 --- a/SleepLib/loader_plugins/prs1_loader.cpp +++ b/SleepLib/loader_plugins/prs1_loader.cpp @@ -665,6 +665,7 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin int pos=0; int cnt=0; short delta,duration; + QDateTime d; while (pos=ncodes) { @@ -672,8 +673,8 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin return false; } //assert(codeAddEvent(new Event(t,cpapcode, data,0)); break; - case 0x00: // Unknown (ASV Pressure value) // could this be RLE? + case 0x00: // Unknown (ASV Pressure value) // offset? data[0]=buffer[pos++]; fc++; - if (!buffer[pos-1]) { + if (!buffer[pos-1]) { // WTH??? data[1]=buffer[pos++]; fc++; } @@ -707,8 +709,8 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin session->AddEvent(new Event(t,cpapcode, data,2)); break; case 0x02: // Pressure - data[0]=buffer[pos++]/10.0; - session->AddEvent(new Event(t,cpapcode, data,1)); + data[0]=buffer[pos++]/10.0; // crappy EPAP pressure value. + //session->AddEvent(new Event(t,cpapcode, data,1)); break; case 0x04: // Pressure Pulse data[0]=buffer[pos++]; @@ -743,22 +745,37 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin session->AddEvent(new Event(tt,cpapcode,data,1)); break; case 0x0d: // All the other ASV graph stuff. - data[0]=buffer[pos++]; - if (buffer[pos]<=0x12) { // short type of 0d record - // Type?? - session->AddEvent(new Event(t,cpapcode, data,1)); - } else { - data[1]=buffer[pos++]; - data[2]=buffer[pos++]; - data[3]=buffer[pos++]; - data[4]=buffer[pos++]; // ?? - data[5]=buffer[pos++]; // Patient Triggered Breaths data[6]=buffer[pos++]; // Patient Triggered Breaths - data[6]=buffer[pos++]; // Patient Triggered Breaths data[6]=buffer[pos++]; // Patient Triggered Breaths - data[7]=buffer[pos++]; // Patient Triggered Breaths - data[8]=buffer[pos++]; // Patient Triggered Breaths - data[9]=buffer[pos++]; // Patient Triggered Breaths - //session->AddEvent(new Event(t,cpapcode, data,6)); + d=QDateTime::fromMSecsSinceEpoch(t); + data[0]=buffer[pos++]/10.0; + session->AddEvent(new Event(t,CPAP_IAP,&data[0],1)); //correct + data[1]=buffer[pos++]/10.0; // Low IPAP + session->AddEvent(new Event(t,CPAP_IAPLO,&data[1],1)); //correct + data[2]=buffer[pos++]/10.0; // Hi IPAP + session->AddEvent(new Event(t,CPAP_IAPHI,&data[2],1)); //correct + + // This may not be necessary.. Check: the average of IAPHI - average of IAPLO may equal the average of this. + data[2]-=data[1]; + session->AddEvent(new Event(t,CPAP_PS,&data[2],1)); //correct + + data[3]=buffer[pos++];//Leak + session->AddEvent(new Event(t,CPAP_Leak,&data[3],1)); // correct + data[4]=buffer[pos++];//Breaths Per Minute + session->AddEvent(new Event(t,CPAP_RespiratoryRate,&data[4],1)); //correct + data[5]=buffer[pos++];//Patient Triggered Breaths + session->AddEvent(new Event(t,CPAP_PatientTriggeredBreaths,&data[5],1)); //correct + data[6]=buffer[pos++];//Minute Ventilation + session->AddEvent(new Event(t,CPAP_MinuteVentilation,&data[6],1)); //correct + data[7]=buffer[pos++]*10.0; // Tidal Volume + session->AddEvent(new Event(t,CPAP_TidalVolume,&data[7],1)); //correct + data[8]=buffer[pos++]; + session->AddEvent(new Event(t,CPAP_Snore,&data[8],1)); //correct + if (data[8]>0) { + session->AddEvent(new Event(t,CPAP_VSnore,&data[8],1)); //correct } + data[9]=buffer[pos++]/10.0; // This is a pressure value + session->AddEvent(new Event(t,CPAP_EAP,&data[9],1)); //correct + + qDebug()<< d.toString("yyyy-MM-dd HH:mm:ss") << hex << session->session() << pos+15 << hex << int(code) << ": " << hex << int(data[0]) << " " << int(data[1]) << " " << int(data[2]) << " " << int(data[3]) << " " << int(data[4]) << " " << int(data[5])<< " " << int(data[6]) << " " << int(data[7]) << " " << int(data[8]) << " " << int(data[9]); break; case 0x03: // BIPAP Pressure data[0]=buffer[pos++]; @@ -1037,6 +1054,7 @@ void InitModelMap() ModelMap[34]="RemStar Pro with C-Flex+"; ModelMap[35]="RemStar Auto with A-Flex"; ModelMap[37]="RemStar BIPAP Auto with Bi-Flex"; + ModelMap[0x41]="RemStar BIPAP Auto with Bi-Flex"; }; diff --git a/SleepLib/loader_plugins/resmed_loader.cpp b/SleepLib/loader_plugins/resmed_loader.cpp index a2de2f39..03e14ff1 100644 --- a/SleepLib/loader_plugins/resmed_loader.cpp +++ b/SleepLib/loader_plugins/resmed_loader.cpp @@ -559,19 +559,22 @@ bool ResmedLoader::LoadPLD(Session *sess,EDFParser &edf) ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration,50.0); //50.0 } else if (edf.edfsignals[s]->label=="MV") { code=CPAP_MinuteVentilation; - Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum); - edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. - sess->AddWaveform(w); + ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration); + //Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum); + //edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. + //sess->AddWaveform(w); } else if (edf.edfsignals[s]->label=="RR") { code=CPAP_RespiratoryRate; - Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum); - edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. - sess->AddWaveform(w); + ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration); + //Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum); + //edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. + //sess->AddWaveform(w); } else if (edf.edfsignals[s]->label=="Vt") { code=CPAP_TidalVolume; - Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum); - edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. - sess->AddWaveform(w); + ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration); + //Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum); + //edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. + //sess->AddWaveform(w); } else if (edf.edfsignals[s]->label=="Leak") { code=CPAP_Leak; ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration,1.0); diff --git a/SleepLib/machine_common.h b/SleepLib/machine_common.h index d4aad891..e100dd18 100644 --- a/SleepLib/machine_common.h +++ b/SleepLib/machine_common.h @@ -36,13 +36,14 @@ enum MachineCode//:qint16 CPAP_Obstructive, CPAP_Hypopnea, CPAP_ClearAirway, CPAP_RERA, CPAP_VSnore, CPAP_FlowLimit, CPAP_Leak, CPAP_Pressure, CPAP_EAP, CPAP_IAP, CPAP_CSR, CPAP_FlowRate, CPAP_MaskPressure, CPAP_Snore,CPAP_MinuteVentilation, CPAP_RespiratoryRate, CPAP_TidalVolume,CPAP_FlowLimitGraph, + CPAP_PatientTriggeredBreaths, CPAP_PS, CPAP_IAPLO, CPAP_IAPHI, // General CPAP Summary Information CPAP_PressureMin=0x80, CPAP_PressureMax, CPAP_RampTime, CPAP_RampStartingPressure, CPAP_Mode, CPAP_PressureReliefType, CPAP_PressureReliefSetting, CPAP_HumidifierSetting, CPAP_HumidifierStatus, CPAP_PressureMinAchieved, CPAP_PressureMaxAchieved, CPAP_PressurePercentValue, CPAP_PressurePercentName, CPAP_PressureAverage, CPAP_PressureMedian, CPAP_LeakMedian,CPAP_LeakMinimum,CPAP_LeakMaximum,CPAP_LeakAverage,CPAP_Duration, - CPAP_SnoreGraph, CPAP_SnoreMinimum, CPAP_SnoreMaximum, CPAP_SnoreAverage, CPAP_SnoreMedian, + CPAP_SnoreMinimum, CPAP_SnoreMaximum, CPAP_SnoreAverage, CPAP_SnoreMedian, BIPAP_EAPAverage,BIPAP_IAPAverage,BIPAP_EAPMin,BIPAP_EAPMax,BIPAP_IAPMin,BIPAP_IAPMax,CPAP_BrokenSummary, diff --git a/daily.cpp b/daily.cpp index 82df8744..e9c17b63 100644 --- a/daily.cpp +++ b/daily.cpp @@ -93,6 +93,9 @@ Daily::Daily(QWidget *parent,QGLContext *context) : AddCPAPData(pressure_iap=new EventData(CPAP_IAP)); AddCPAPData(pressure_eap=new EventData(CPAP_EAP)); AddCPAPData(prd=new EventData(CPAP_Pressure)); + pressure_eap->ForceMinY(0); + pressure_eap->ForceMaxY(30); + PRD=new gGraphWindow(gSplitter,tr("Pressure"),SF); PRD->AddLayer(new gXAxis()); PRD->AddLayer(new gYAxis()); @@ -104,8 +107,6 @@ Daily::Daily(QWidget *parent,QGLContext *context) : PRD->setMinimumHeight(150); AddCPAPData(leakdata=new EventData(CPAP_Leak,0)); - //leakdata->ForceMinY(0); - //leakdata->ForceMaxY(120); LEAK=new gGraphWindow(gSplitter,tr("Leaks"),SF); LEAK->AddLayer(new gXAxis()); LEAK->AddLayer(new gYAxis()); @@ -153,25 +154,25 @@ Daily::Daily(QWidget *parent,QGLContext *context) : FLG->setMinimumHeight(150); - AddCPAPData(mv=new WaveData(CPAP_MinuteVentilation)); + AddCPAPData(mv=new EventData(CPAP_MinuteVentilation)); MV=new gGraphWindow(gSplitter,tr("Minute Ventilation"),SF); MV->AddLayer(new gXAxis()); MV->AddLayer(new gYAxis()); - MV->AddLayer(new gLineChart(mv,QColor(0x20,0x20,0x7f),65536,false,false,false)); + MV->AddLayer(new gLineChart(mv,QColor(0x20,0x20,0x7f),65536,false,false,true)); MV->setMinimumHeight(150); - AddCPAPData(tv=new WaveData(CPAP_TidalVolume)); + AddCPAPData(tv=new EventData(CPAP_TidalVolume)); TV=new gGraphWindow(gSplitter,tr("Tidal Volume"),SF); TV->AddLayer(new gXAxis()); TV->AddLayer(new gYAxis()); - TV->AddLayer(new gLineChart(tv,QColor(0x7f,0x20,0x20),65536,false,false,false)); + TV->AddLayer(new gLineChart(tv,QColor(0x7f,0x20,0x20),65536,false,false,true)); TV->setMinimumHeight(150); - AddCPAPData(rr=new WaveData(CPAP_RespiratoryRate)); + AddCPAPData(rr=new EventData(CPAP_RespiratoryRate)); RR=new gGraphWindow(gSplitter,tr("Respiratory Rate"),SF); RR->AddLayer(new gXAxis()); RR->AddLayer(new gYAxis()); - RR->AddLayer(new gLineChart(rr,Qt::gray,65536,false,false,false)); + RR->AddLayer(new gLineChart(rr,Qt::gray,65536,false,false,true)); RR->setMinimumHeight(150); @@ -658,15 +659,18 @@ void Daily::Load(QDate date) SF->hide(); SNORE->hide(); } + // Instead of doing this, check whether any data exists.. + // and show based on this factor. if (cpap && (cpap->machine->GetClass()=="ResMed")) { - MV->show(); - TV->show(); - RR->show(); + //MV->show(); + //TV->show(); + //RR->show(); FLG->show(); } else { - MV->hide(); - TV->hide(); - RR->hide(); + //MV->hide(); + + //TV->hide(); + //RR->hide(); FLG->hide(); } diff --git a/docs/PRS1 Data Format.odt b/docs/PRS1 Data Format.odt new file mode 100644 index 00000000..1d8542ee Binary files /dev/null and b/docs/PRS1 Data Format.odt differ