From 0284420b59cbc35a88eb99f47375ea81c1b3284c Mon Sep 17 00:00:00 2001
From: Mark Watkins <jedimark@users.sourceforge.net>
Date: Thu, 12 Jan 2012 15:57:36 +1000
Subject: [PATCH] Applied the same fix to PRS1, along with minor performance
 improvement to it's event importer

---
 SleepLib/loader_plugins/prs1_loader.cpp | 228 +++++++++++++-----------
 1 file changed, 123 insertions(+), 105 deletions(-)

diff --git a/SleepLib/loader_plugins/prs1_loader.cpp b/SleepLib/loader_plugins/prs1_loader.cpp
index 5d41fcac..840e7ed7 100644
--- a/SleepLib/loader_plugins/prs1_loader.cpp
+++ b/SleepLib/loader_plugins/prs1_loader.cpp
@@ -584,6 +584,29 @@ bool PRS1Loader::Parse002v5(qint32 sequence, quint32 timestamp, unsigned char *b
     int ncodes=sizeof(Codes)/sizeof(QString);
     EventList * Code[0x20]={NULL};
 
+
+    EventList * OA=session->AddEventList(CPAP_Obstructive, EVL_Event);
+    EventList * HY=session->AddEventList(CPAP_Hypopnea, EVL_Event);
+    EventList * CSR=session->AddEventList(CPAP_CSR, EVL_Event);
+    EventList * LEAK=session->AddEventList(CPAP_LeakTotal,EVL_Event);
+    EventList * SNORE=session->AddEventList(CPAP_Snore,EVL_Event);
+    EventList * IPAP=session->AddEventList(CPAP_IPAP,EVL_Event,0.1);
+    EventList * EPAP=session->AddEventList(CPAP_EPAP,EVL_Event,0.1);
+    EventList * PS=session->AddEventList(CPAP_PS,EVL_Event);
+    EventList * IPAPLo=session->AddEventList(CPAP_IPAPLo,EVL_Event,0.1);
+    EventList * IPAPHi=session->AddEventList(CPAP_IPAPHi,EVL_Event,0.1);
+    EventList * RR=session->AddEventList(CPAP_RespRate,EVL_Event);
+    EventList * PTB=session->AddEventList(CPAP_PTB,EVL_Event);
+
+    EventList * MV=session->AddEventList(CPAP_MinuteVent,EVL_Event);
+    EventList * TV=session->AddEventList(CPAP_TidalVolume,EVL_Event);
+
+    EventList * CA=NULL; //session->AddEventList(CPAP_ClearAirway, EVL_Event);
+    EventList * VS=NULL, * VS2=NULL, * FL=NULL;//,* RE=NULL;
+
+    //EventList * PRESSURE=NULL;
+    //EventList * PP=NULL;
+
     EventDataType data[10],tmp;
 
 
@@ -639,14 +662,14 @@ bool PRS1Loader::Parse002v5(qint32 sequence, quint32 timestamp, unsigned char *b
             Code[1]->AddEvent(t,0);
             break;
 
-        case 0x02: // Pressure
+        case 0x02: // Pressure ???
             data[0]=buffer[pos++];
             if (!Code[2]) {
                 if (!(Code[2]=session->AddEventList(cpapcode,EVL_Event,0.1))) return false;
             }
             Code[2]->AddEvent(t,data[0]);
             break;
-        case 0x04: // Pressure Pulse
+        case 0x04: // Pressure Pulse??
             data[0]=buffer[pos++];
             if (!Code[3]) {
                 if (!(Code[3]=session->AddEventList(cpapcode,EVL_Event))) return false;
@@ -655,29 +678,26 @@ bool PRS1Loader::Parse002v5(qint32 sequence, quint32 timestamp, unsigned char *b
             break;
 
         case 0x05:
+            //code=CPAP_Obstructive;
             data[0]=buffer[pos++];
             tt-=qint64(data[0])*1000L; // Subtract Time Offset
-            if (!Code[4]) {
-                if (!(Code[4]=session->AddEventList(cpapcode,EVL_Event))) return false;
-            }
-            Code[4]->AddEvent(tt,data[0]);
+            OA->AddEvent(tt,data[0]);
             break;
 
         case 0x06:
+            //code=CPAP_ClearAirway;
             data[0]=buffer[pos++];
             tt-=qint64(data[0])*1000L; // Subtract Time Offset
-            if (!Code[5]) {
-                if (!(Code[5]=session->AddEventList(cpapcode,EVL_Event))) return false;
+            if (!CA) {
+                if (!(CA=session->AddEventList(cpapcode,EVL_Event))) return false;
             }
-            Code[5]->AddEvent(tt,data[0]);
+            CA->AddEvent(tt,data[0]);
             break;
         case 0x07:
+            //code=CPAP_Hypopnea;
             data[0]=buffer[pos++];
             tt-=qint64(data[0])*1000L; // Subtract Time Offset
-            if (!Code[6]) {
-                if (!(Code[6]=session->AddEventList(cpapcode,EVL_Event))) return false;
-            }
-            Code[6]->AddEvent(tt,data[0]);
+            HY->AddEvent(tt,data[0]);
             break;
         case 0x08: // ASV Codes
             data[0]=buffer[pos++];
@@ -688,12 +708,13 @@ bool PRS1Loader::Parse002v5(qint32 sequence, quint32 timestamp, unsigned char *b
             Code[10]->AddEvent(tt,data[0]);
             break;
         case 0x09: // ASV Codes
+            //code=CPAP_FlowLimit;
             data[0]=buffer[pos++];
             tt-=qint64(data[0])*1000L; // Subtract Time Offset
-            if (!Code[11]) {
-                if (!(Code[11]=session->AddEventList(cpapcode,EVL_Event))) return false;
+            if (!FL) {
+                if (!(FL=session->AddEventList(cpapcode,EVL_Event))) return false;
             }
-            Code[11]->AddEvent(tt,data[0]);
+            FL->AddEvent(tt,data[0]);
 
             break;
 
@@ -706,15 +727,6 @@ bool PRS1Loader::Parse002v5(qint32 sequence, quint32 timestamp, unsigned char *b
             Code[7]->AddEvent(tt,data[0]);
             break;
 
-        case 0x0c:
-            data[0]=buffer[pos++];
-            tt-=qint64(data[0])*1000L; // Subtract Time Offset
-            if (!Code[8]) {
-                if (!(Code[8]=session->AddEventList(cpapcode,EVL_Event))) return false;
-            }
-            Code[8]->AddEvent(tt,data[0]);
-            break;
-
 
         case 0x0b: // Cheyne Stokes
             data[0]=((unsigned char *)buffer)[pos+1]<<8 | ((unsigned char *)buffer)[pos];
@@ -724,47 +736,42 @@ bool PRS1Loader::Parse002v5(qint32 sequence, quint32 timestamp, unsigned char *b
             pos+=1;
             //tt-=delta;
             tt-=qint64(data[1])*1000L;
-            if (!Code[9]) {
-                if (!(Code[9]=session->AddEventList(cpapcode,EVL_Event)))
+            if (!CSR) {
+                if (!(CSR=session->AddEventList(cpapcode,EVL_Event)))
                     return false;
             }
-            Code[9]->AddEvent(tt,data[0]);
-            //session->AddEvent(new Event(tt,cpapcode, data[0], data, 2));
+            CSR->AddEvent(tt,data[0]);
             break;
-        case 0x0d: // All the other ASV graph stuff.
-            if (!Code[12]) {
-                if (!(Code[12]=session->AddEventList(CPAP_IPAP,EVL_Event,0.1))) return false;
-                if (!(Code[13]=session->AddEventList(CPAP_IPAPLo,EVL_Event,0.1))) return false;
-                if (!(Code[14]=session->AddEventList(CPAP_IPAPHi,EVL_Event,0.1))) return false;
-                if (!(Code[15]=session->AddEventList(CPAP_LeakTotal,EVL_Event))) return false;
-                if (!(Code[16]=session->AddEventList(CPAP_RespRate,EVL_Event))) return false;
-                if (!(Code[17]=session->AddEventList(CPAP_PTB,EVL_Event))) return false;
 
-                if (!(Code[18]=session->AddEventList(CPAP_MinuteVent,EVL_Event))) return false;
-                if (!(Code[19]=session->AddEventList(CPAP_TidalVolume,EVL_Event))) return false;
-                if (!(Code[20]=session->AddEventList(CPAP_Snore,EVL_Event))) return false;
-                if (!(Code[22]=session->AddEventList(CPAP_EPAP,EVL_Event,0.1))) return false;
-                if (!(Code[23]=session->AddEventList(CPAP_PS,EVL_Event))) return false;
+        case 0x0c:
+            data[0]=buffer[pos++];
+            tt-=qint64(data[0])*1000L; // Subtract Time Offset
+            if (!Code[8]) {
+                if (!(Code[8]=session->AddEventList(cpapcode,EVL_Event))) return false;
             }
-            Code[12]->AddEvent(t,data[0]=buffer[pos++]); // IAP
-            Code[13]->AddEvent(t,buffer[pos++]); // IAP Low
-            Code[14]->AddEvent(t,buffer[pos++]); // IAP High
-            Code[15]->AddEvent(t,buffer[pos++]); // LEAK
-            Code[16]->AddEvent(t,buffer[pos++]); // Breaths Per Minute
-            Code[17]->AddEvent(t,buffer[pos++]); // Patient Triggered Breaths
-            Code[18]->AddEvent(t,buffer[pos++]); // Minute Ventilation
-            tmp=buffer[pos++]*10.0;
-            Code[19]->AddEvent(t,tmp); // Tidal Volume
-            Code[20]->AddEvent(t,data[2]=buffer[pos++]); // Snore
+            Code[8]->AddEvent(tt,data[0]);
+            break;
+
+        case 0x0d: // All the other ASV graph stuff.
+            IPAP->AddEvent(t,data[0]=buffer[pos++]);    // 00=IAP
+            IPAPLo->AddEvent(t,buffer[pos++]);          // 01=IAP Low
+            IPAPHi->AddEvent(t,buffer[pos++]);          // 02=IAP High
+            LEAK->AddEvent(t,buffer[pos++]);            // 03=LEAK
+            RR->AddEvent(t,buffer[pos++]);              // 04=Breaths Per Minute
+            PTB->AddEvent(t,buffer[pos++]);             // 05=Patient Triggered Breaths
+            MV->AddEvent(t,buffer[pos++]);              // 06=Minute Ventilation
+            tmp=buffer[pos++] * 10.0;
+            TV->AddEvent(t,tmp);                        // 07=Tidal Volume
+            SNORE->AddEvent(t,data[2]=buffer[pos++]);   // 08=Snore
             if (data[2]>0) {
-                if (!Code[21]) {
-                    if (!(Code[21]=session->AddEventList(CPAP_VSnore,EVL_Event)))
+                if (!VS) {
+                    if (!(VS2=session->AddEventList(CPAP_VSnore,EVL_Event)))
                         return false;
                 }
-                Code[21]->AddEvent(t,0); //data[2]); // VSnore
+                VS->AddEvent(t,0); //data[2]); // VSnore
             }
-            Code[22]->AddEvent(t,data[1]=buffer[pos++]); // EPAP
-            Code[23]->AddEvent(t,data[0]-data[1]);      // Pressure Support
+            EPAP->AddEvent(t,data[1]=buffer[pos++]);    // 09=EPAP
+            PS->AddEvent(t,data[0]-data[1]);            // Pressure Support
             break;
         case 0x03: // BIPAP Pressure
             qDebug() << "0x03 Observed in ASV data!!????";
@@ -847,6 +854,26 @@ bool PRS1Loader::Parse002(qint32 sequence, quint32 timestamp, unsigned char *buf
     Session *session=new_sessions[sequence];
     session->updateFirst(t);
 
+
+    EventList * OA=session->AddEventList(CPAP_Obstructive, EVL_Event);
+    EventList * HY=session->AddEventList(CPAP_Hypopnea, EVL_Event);
+    EventList * CSR=session->AddEventList(CPAP_CSR, EVL_Event);
+    EventList * LEAK=session->AddEventList(CPAP_LeakTotal,EVL_Event);
+    EventList * SNORE=session->AddEventList(CPAP_Snore,EVL_Event);
+
+    EventList * CA=NULL; //session->AddEventList(CPAP_ClearAirway, EVL_Event);
+    EventList * VS=NULL, * VS2=NULL, * FL=NULL,* RE=NULL;
+
+    EventList * PRESSURE=NULL;
+    EventList * EPAP=NULL;
+    EventList * IPAP=NULL;
+    EventList * PS=NULL;
+
+    EventList * PP=NULL;
+
+    //session->AddEventList(CPAP_VSnore, EVL_Event);
+    //EventList * VS=session->AddEventList(CPAP_Obstructive, EVL_Event);
+
     for (pos=0;pos<size;) {
         code=buffer[pos++];
         if (code>0x12) {
@@ -875,69 +902,64 @@ bool PRS1Loader::Parse002(qint32 sequence, quint32 timestamp, unsigned char *buf
             Code[1]->AddEvent(t,0);
             break;
         case 0x02: // Pressure
-            if (!Code[2]) {
-                Code[2]=session->AddEventList(CPAP_Pressure,EVL_Event,0.1);
-                if (!Code[2]) return false;
+            if (!PRESSURE) {
+                PRESSURE=session->AddEventList(CPAP_Pressure,EVL_Event,0.1);
+                if (!PRESSURE) return false;
             }
-            Code[2]->AddEvent(t,buffer[pos++]);
+            PRESSURE->AddEvent(t,buffer[pos++]);
             break;
         case 0x03: // BIPAP Pressure
-            if (!Code[3]) {
-                if (!(Code[3]=session->AddEventList(CPAP_EPAP,EVL_Event,0.1))) return false;
-                if (!(Code[4]=session->AddEventList(CPAP_IPAP,EVL_Event,0.1))) return false;
-                if (!(Code[5]=session->AddEventList(CPAP_PS,EVL_Event,0.1))) return false;
+            if (!EPAP) {
+                if (!(EPAP=session->AddEventList(CPAP_EPAP,EVL_Event,0.1))) return false;
+                if (!(IPAP=session->AddEventList(CPAP_IPAP,EVL_Event,0.1))) return false;
+                if (!(PS=session->AddEventList(CPAP_PS,EVL_Event,0.1))) return false;
             }
-            Code[3]->AddEvent(t,data[0]=buffer[pos++]);
-            Code[4]->AddEvent(t,data[1]=buffer[pos++]);
-            Code[5]->AddEvent(t,data[1]-data[0]);
+            EPAP->AddEvent(t,data[0]=buffer[pos++]);
+            IPAP->AddEvent(t,data[1]=buffer[pos++]);
+            PS->AddEvent(t,data[1]-data[0]);
             break;
         case 0x04: // Pressure Pulse
-            if (!Code[6]) {
-                if (!(Code[6]=session->AddEventList(CPAP_PressurePulse,EVL_Event))) return false;
+            if (!PP) {
+                if (!(PP=session->AddEventList(CPAP_PressurePulse,EVL_Event))) return false;
             }
-            Code[6]->AddEvent(t,buffer[pos++]);
-            //qDebug() << hex << data[0];
+            PP->AddEvent(t,buffer[pos++]);
             break;
         case 0x05: // RERA
             data[0]=buffer[pos++];
             tt=t-(qint64(data[0])*1000L);
-            if (!Code[7]) {
-                if (!(Code[7]=session->AddEventList(CPAP_RERA,EVL_Event))) return false;
+            if (!RE) {
+                if (!(RE=session->AddEventList(CPAP_RERA,EVL_Event))) return false;
             }
-            Code[7]->AddEvent(tt,data[0]);
+            RE->AddEvent(tt,data[0]);
             break;
 
         case 0x06: // Obstructive Apoanea
             data[0]=buffer[pos++];
             tt=t-(qint64(data[0])*1000L);
-            if (!Code[8]) {
-                if (!(Code[8]=session->AddEventList(CPAP_Obstructive,EVL_Event))) return false;
-            }
-            Code[8]->AddEvent(tt,data[0]);
+            OA->AddEvent(tt,data[0]);
             break;
         case 0x07: // Clear Airway
             data[0]=buffer[pos++];
             tt=t-(qint64(data[0])*1000L);
-            if (!Code[9]) {
-                if (!(Code[9]=session->AddEventList(CPAP_ClearAirway,EVL_Event))) return false;
+            if (!CA) {
+                if (!(CA=session->AddEventList(CPAP_ClearAirway,EVL_Event))) return false;
             }
-            Code[9]->AddEvent(tt,data[0]);
+            CA->AddEvent(tt,data[0]);
             break;
+
         case 0x0a: // Hypopnea
             data[0]=buffer[pos++];
             tt=t-(qint64(data[0])*1000L);
-            if (!Code[10]) {
-                if (!(Code[10]=session->AddEventList(CPAP_Hypopnea,EVL_Event))) return false;
-            }
-            Code[10]->AddEvent(tt,data[0]);
+            HY->AddEvent(tt,data[0]);
             break;
+
         case 0x0c: // Flow Limitation
             data[0]=buffer[pos++];
             tt=t-(qint64(data[0])*1000L);
-            if (!Code[11]) {
-                if (!(Code[11]=session->AddEventList(CPAP_FlowLimit,EVL_Event))) return false;
+            if (!FL) {
+                if (!(FL=session->AddEventList(CPAP_FlowLimit,EVL_Event))) return false;
             }
-            Code[11]->AddEvent(tt,data[0]);
+            FL->AddEvent(tt,data[0]);
             break;
 
         case 0x0b: // Hypopnea related code
@@ -949,26 +971,25 @@ bool PRS1Loader::Parse002(qint32 sequence, quint32 timestamp, unsigned char *buf
             // FIXME
             Code[12]->AddEvent(t,data[0]);
             break;
+
         case 0x0d: // Vibratory Snore
-            if (!Code[13]) {
-                if (!(Code[13]=session->AddEventList(CPAP_VSnore,EVL_Event))) return false;
+            if (!VS) {
+                if (!(VS=session->AddEventList(CPAP_VSnore,EVL_Event))) return false;
             }
-            Code[13]->AddEvent(t,0);
+            VS->AddEvent(t,0);
             break;
         case 0x11: // Leak Rate & Snore Graphs
             data[0]=buffer[pos++];
             data[1]=buffer[pos++];
-            if (!Code[14]) {
-                if (!(Code[14]=session->AddEventList(CPAP_LeakTotal,EVL_Event))) return false;
-                if (!(Code[15]=session->AddEventList(CPAP_Snore,EVL_Event))) return false;
-            }
-            Code[14]->AddEvent(t,data[0]);
-            Code[15]->AddEvent(t,data[1]);
+
+            LEAK->AddEvent(t,data[0]);
+            SNORE->AddEvent(t,data[1]);
+
             if (data[1]>0) {
-                if (!Code[16]) {
-                    if (!(Code[16]=session->AddEventList(CPAP_VSnore2,EVL_Event))) return false;
+                if (!VS2) {
+                    if (!(VS2=session->AddEventList(CPAP_VSnore2,EVL_Event))) return false;
                 }
-                Code[16]->AddEvent(t,data[1]);
+                VS2->AddEvent(t,data[1]);
             }
             break;
         case 0x0e: // Unknown
@@ -1002,10 +1023,7 @@ bool PRS1Loader::Parse002(qint32 sequence, quint32 timestamp, unsigned char *buf
             pos+=2;
             data[1]=buffer[pos++];
             tt=t-qint64(data[1])*1000L;
-            if (!Code[23]) {
-                if (!(Code[23]=session->AddEventList(CPAP_CSR,EVL_Event))) return false;
-            }
-            Code[23]->AddEvent(tt,data[0]);
+            CSR->AddEvent(tt,data[0]);
             break;
         case 0x12: // Summary
             data[0]=buffer[pos++];