Decoded ASV GraphData Stuff

This commit is contained in:
Mark Watkins 2011-07-11 02:20:51 +10:00
parent 2053e2bfec
commit deb49b1ba4
5 changed files with 71 additions and 45 deletions

View File

@ -665,6 +665,7 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
int pos=0; int pos=0;
int cnt=0; int cnt=0;
short delta,duration; short delta,duration;
QDateTime d;
while (pos<size) { while (pos<size) {
unsigned char code=buffer[pos++]; unsigned char code=buffer[pos++];
if (code>=ncodes) { if (code>=ncodes) {
@ -672,8 +673,8 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
return false; return false;
} }
//assert(code<ncodes); //assert(code<ncodes);
QDateTime d=QDateTime::fromMSecsSinceEpoch(t); //QDateTime d=QDateTime::fromMSecsSinceEpoch(t);
qDebug()<< d.toString("yyyy-MM-dd HH:mm:ss") << ": " << hex << pos+15 << " " << hex << int(code) ; //qDebug()<< d.toString("yyyy-MM-dd HH:mm:ss") << ": " << hex << pos+15 << " " << hex << int(code) ;
if (code==0) { if (code==0) {
int q=4; int q=4;
} else } else
@ -685,6 +686,7 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
t+=delta*1000; t+=delta*1000;
} }
MachineCode cpapcode=Codes[(int)code]; MachineCode cpapcode=Codes[(int)code];
EventDataType PS;
tt=t; tt=t;
cnt++; cnt++;
int fc=0; int fc=0;
@ -692,11 +694,11 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
case 0x01: // Unknown case 0x01: // Unknown
session->AddEvent(new Event(t,cpapcode, data,0)); session->AddEvent(new Event(t,cpapcode, data,0));
break; break;
case 0x00: // Unknown (ASV Pressure value) // could this be RLE? case 0x00: // Unknown (ASV Pressure value)
// offset? // offset?
data[0]=buffer[pos++]; data[0]=buffer[pos++];
fc++; fc++;
if (!buffer[pos-1]) { if (!buffer[pos-1]) { // WTH???
data[1]=buffer[pos++]; data[1]=buffer[pos++];
fc++; fc++;
} }
@ -707,8 +709,8 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
session->AddEvent(new Event(t,cpapcode, data,2)); session->AddEvent(new Event(t,cpapcode, data,2));
break; break;
case 0x02: // Pressure case 0x02: // Pressure
data[0]=buffer[pos++]/10.0; data[0]=buffer[pos++]/10.0; // crappy EPAP pressure value.
session->AddEvent(new Event(t,cpapcode, data,1)); //session->AddEvent(new Event(t,cpapcode, data,1));
break; break;
case 0x04: // Pressure Pulse case 0x04: // Pressure Pulse
data[0]=buffer[pos++]; 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)); session->AddEvent(new Event(tt,cpapcode,data,1));
break; break;
case 0x0d: // All the other ASV graph stuff. case 0x0d: // All the other ASV graph stuff.
data[0]=buffer[pos++]; d=QDateTime::fromMSecsSinceEpoch(t);
if (buffer[pos]<=0x12) { // short type of 0d record data[0]=buffer[pos++]/10.0;
// Type?? session->AddEvent(new Event(t,CPAP_IAP,&data[0],1)); //correct
session->AddEvent(new Event(t,cpapcode, data,1)); data[1]=buffer[pos++]/10.0; // Low IPAP
} else { session->AddEvent(new Event(t,CPAP_IAPLO,&data[1],1)); //correct
data[1]=buffer[pos++]; data[2]=buffer[pos++]/10.0; // Hi IPAP
data[2]=buffer[pos++]; session->AddEvent(new Event(t,CPAP_IAPHI,&data[2],1)); //correct
data[3]=buffer[pos++];
data[4]=buffer[pos++]; // ?? // This may not be necessary.. Check: the average of IAPHI - average of IAPLO may equal the average of this.
data[5]=buffer[pos++]; // Patient Triggered Breaths data[6]=buffer[pos++]; // Patient Triggered Breaths data[2]-=data[1];
data[6]=buffer[pos++]; // Patient Triggered Breaths data[6]=buffer[pos++]; // Patient Triggered Breaths session->AddEvent(new Event(t,CPAP_PS,&data[2],1)); //correct
data[7]=buffer[pos++]; // Patient Triggered Breaths
data[8]=buffer[pos++]; // Patient Triggered Breaths data[3]=buffer[pos++];//Leak
data[9]=buffer[pos++]; // Patient Triggered Breaths session->AddEvent(new Event(t,CPAP_Leak,&data[3],1)); // correct
//session->AddEvent(new Event(t,cpapcode, data,6)); 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; break;
case 0x03: // BIPAP Pressure case 0x03: // BIPAP Pressure
data[0]=buffer[pos++]; data[0]=buffer[pos++];
@ -1037,6 +1054,7 @@ void InitModelMap()
ModelMap[34]="RemStar Pro with C-Flex+"; ModelMap[34]="RemStar Pro with C-Flex+";
ModelMap[35]="RemStar Auto with A-Flex"; ModelMap[35]="RemStar Auto with A-Flex";
ModelMap[37]="RemStar BIPAP Auto with Bi-Flex"; ModelMap[37]="RemStar BIPAP Auto with Bi-Flex";
ModelMap[0x41]="RemStar BIPAP Auto with Bi-Flex";
}; };

View File

@ -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 ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration,50.0); //50.0
} else if (edf.edfsignals[s]->label=="MV") { } else if (edf.edfsignals[s]->label=="MV") {
code=CPAP_MinuteVentilation; 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); ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration);
edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. //Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum);
sess->AddWaveform(w); //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") { } else if (edf.edfsignals[s]->label=="RR") {
code=CPAP_RespiratoryRate; 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); ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration);
edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. //Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum);
sess->AddWaveform(w); //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") { } else if (edf.edfsignals[s]->label=="Vt") {
code=CPAP_TidalVolume; 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); ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration);
edf.edfsignals[s]->data=NULL; // so it doesn't get deleted when edf gets trashed. //Waveform *w=new Waveform(edf.startdate,code,edf.edfsignals[s]->data,recs,duration,edf.edfsignals[s]->digital_minimum,edf.edfsignals[s]->digital_maximum);
sess->AddWaveform(w); //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") { } else if (edf.edfsignals[s]->label=="Leak") {
code=CPAP_Leak; code=CPAP_Leak;
ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration,1.0); ToTimeDelta(sess,edf,edf.edfsignals[s]->data, code,recs,duration,1.0);

View File

@ -36,13 +36,14 @@ enum MachineCode//:qint16
CPAP_Obstructive, CPAP_Hypopnea, CPAP_ClearAirway, CPAP_RERA, CPAP_VSnore, CPAP_FlowLimit, 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_Leak, CPAP_Pressure, CPAP_EAP, CPAP_IAP, CPAP_CSR, CPAP_FlowRate, CPAP_MaskPressure,
CPAP_Snore,CPAP_MinuteVentilation, CPAP_RespiratoryRate, CPAP_TidalVolume,CPAP_FlowLimitGraph, CPAP_Snore,CPAP_MinuteVentilation, CPAP_RespiratoryRate, CPAP_TidalVolume,CPAP_FlowLimitGraph,
CPAP_PatientTriggeredBreaths, CPAP_PS, CPAP_IAPLO, CPAP_IAPHI,
// General CPAP Summary Information // General CPAP Summary Information
CPAP_PressureMin=0x80, CPAP_PressureMax, CPAP_RampTime, CPAP_RampStartingPressure, CPAP_Mode, CPAP_PressureReliefType, CPAP_PressureMin=0x80, CPAP_PressureMax, CPAP_RampTime, CPAP_RampStartingPressure, CPAP_Mode, CPAP_PressureReliefType,
CPAP_PressureReliefSetting, CPAP_HumidifierSetting, CPAP_HumidifierStatus, CPAP_PressureMinAchieved, CPAP_PressureReliefSetting, CPAP_HumidifierSetting, CPAP_HumidifierStatus, CPAP_PressureMinAchieved,
CPAP_PressureMaxAchieved, CPAP_PressurePercentValue, CPAP_PressurePercentName, CPAP_PressureAverage, CPAP_PressureMedian, CPAP_PressureMaxAchieved, CPAP_PressurePercentValue, CPAP_PressurePercentName, CPAP_PressureAverage, CPAP_PressureMedian,
CPAP_LeakMedian,CPAP_LeakMinimum,CPAP_LeakMaximum,CPAP_LeakAverage,CPAP_Duration, 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, BIPAP_EAPAverage,BIPAP_IAPAverage,BIPAP_EAPMin,BIPAP_EAPMax,BIPAP_IAPMin,BIPAP_IAPMax,CPAP_BrokenSummary,

View File

@ -93,6 +93,9 @@ Daily::Daily(QWidget *parent,QGLContext *context) :
AddCPAPData(pressure_iap=new EventData(CPAP_IAP)); AddCPAPData(pressure_iap=new EventData(CPAP_IAP));
AddCPAPData(pressure_eap=new EventData(CPAP_EAP)); AddCPAPData(pressure_eap=new EventData(CPAP_EAP));
AddCPAPData(prd=new EventData(CPAP_Pressure)); AddCPAPData(prd=new EventData(CPAP_Pressure));
pressure_eap->ForceMinY(0);
pressure_eap->ForceMaxY(30);
PRD=new gGraphWindow(gSplitter,tr("Pressure"),SF); PRD=new gGraphWindow(gSplitter,tr("Pressure"),SF);
PRD->AddLayer(new gXAxis()); PRD->AddLayer(new gXAxis());
PRD->AddLayer(new gYAxis()); PRD->AddLayer(new gYAxis());
@ -104,8 +107,6 @@ Daily::Daily(QWidget *parent,QGLContext *context) :
PRD->setMinimumHeight(150); PRD->setMinimumHeight(150);
AddCPAPData(leakdata=new EventData(CPAP_Leak,0)); AddCPAPData(leakdata=new EventData(CPAP_Leak,0));
//leakdata->ForceMinY(0);
//leakdata->ForceMaxY(120);
LEAK=new gGraphWindow(gSplitter,tr("Leaks"),SF); LEAK=new gGraphWindow(gSplitter,tr("Leaks"),SF);
LEAK->AddLayer(new gXAxis()); LEAK->AddLayer(new gXAxis());
LEAK->AddLayer(new gYAxis()); LEAK->AddLayer(new gYAxis());
@ -153,25 +154,25 @@ Daily::Daily(QWidget *parent,QGLContext *context) :
FLG->setMinimumHeight(150); FLG->setMinimumHeight(150);
AddCPAPData(mv=new WaveData(CPAP_MinuteVentilation)); AddCPAPData(mv=new EventData(CPAP_MinuteVentilation));
MV=new gGraphWindow(gSplitter,tr("Minute Ventilation"),SF); MV=new gGraphWindow(gSplitter,tr("Minute Ventilation"),SF);
MV->AddLayer(new gXAxis()); MV->AddLayer(new gXAxis());
MV->AddLayer(new gYAxis()); 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); MV->setMinimumHeight(150);
AddCPAPData(tv=new WaveData(CPAP_TidalVolume)); AddCPAPData(tv=new EventData(CPAP_TidalVolume));
TV=new gGraphWindow(gSplitter,tr("Tidal Volume"),SF); TV=new gGraphWindow(gSplitter,tr("Tidal Volume"),SF);
TV->AddLayer(new gXAxis()); TV->AddLayer(new gXAxis());
TV->AddLayer(new gYAxis()); 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); TV->setMinimumHeight(150);
AddCPAPData(rr=new WaveData(CPAP_RespiratoryRate)); AddCPAPData(rr=new EventData(CPAP_RespiratoryRate));
RR=new gGraphWindow(gSplitter,tr("Respiratory Rate"),SF); RR=new gGraphWindow(gSplitter,tr("Respiratory Rate"),SF);
RR->AddLayer(new gXAxis()); RR->AddLayer(new gXAxis());
RR->AddLayer(new gYAxis()); 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); RR->setMinimumHeight(150);
@ -658,15 +659,18 @@ void Daily::Load(QDate date)
SF->hide(); SF->hide();
SNORE->hide(); SNORE->hide();
} }
// Instead of doing this, check whether any data exists..
// and show based on this factor.
if (cpap && (cpap->machine->GetClass()=="ResMed")) { if (cpap && (cpap->machine->GetClass()=="ResMed")) {
MV->show(); //MV->show();
TV->show(); //TV->show();
RR->show(); //RR->show();
FLG->show(); FLG->show();
} else { } else {
MV->hide(); //MV->hide();
TV->hide();
RR->hide(); //TV->hide();
//RR->hide();
FLG->hide(); FLG->hide();
} }

BIN
docs/PRS1 Data Format.odt Normal file

Binary file not shown.