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 cnt=0;
short delta,duration;
QDateTime d;
while (pos<size) {
unsigned char code=buffer[pos++];
if (code>=ncodes) {
@ -672,8 +673,8 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
return false;
}
//assert(code<ncodes);
QDateTime d=QDateTime::fromMSecsSinceEpoch(t);
qDebug()<< d.toString("yyyy-MM-dd HH:mm:ss") << ": " << hex << pos+15 << " " << hex << int(code) ;
//QDateTime d=QDateTime::fromMSecsSinceEpoch(t);
//qDebug()<< d.toString("yyyy-MM-dd HH:mm:ss") << ": " << hex << pos+15 << " " << hex << int(code) ;
if (code==0) {
int q=4;
} else
@ -685,6 +686,7 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
t+=delta*1000;
}
MachineCode cpapcode=Codes[(int)code];
EventDataType PS;
tt=t;
cnt++;
int fc=0;
@ -692,11 +694,11 @@ bool PRS1Loader::Parse002ASV(Session *session,unsigned char *buffer,int size,qin
case 0x01: // Unknown
session->AddEvent(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";
};

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
} 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);

View File

@ -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,

View File

@ -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();
}

BIN
docs/PRS1 Data Format.odt Normal file

Binary file not shown.