mirror of
https://gitlab.com/pholy/OSCAR-code.git
synced 2025-04-08 20:20:44 +00:00
Decoded ASV GraphData Stuff
This commit is contained in:
parent
2053e2bfec
commit
deb49b1ba4
@ -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";
|
||||
};
|
||||
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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,
|
||||
|
||||
|
32
daily.cpp
32
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();
|
||||
}
|
||||
|
||||
|
BIN
docs/PRS1 Data Format.odt
Normal file
BIN
docs/PRS1 Data Format.odt
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user