From 537f42953a57bcd2fc33cf1b8dc7aaee0e4f5435 Mon Sep 17 00:00:00 2001 From: Mark Watkins Date: Thu, 21 Jul 2011 21:02:23 +1000 Subject: [PATCH] Rewrite of PRS1 Waveform Loader --- SleepLib/event.h | 2 +- SleepLib/loader_plugins/prs1_loader.cpp | 206 ++++++++++++++++++++++-- SleepLib/session.cpp | 7 +- docs/PRS1 Data Format.odt | Bin 14597 -> 14574 bytes mainwindow.cpp | 2 +- 5 files changed, 200 insertions(+), 17 deletions(-) diff --git a/SleepLib/event.h b/SleepLib/event.h index dd2af625..52e3de7d 100644 --- a/SleepLib/event.h +++ b/SleepLib/event.h @@ -10,7 +10,7 @@ #include #include "machine_common.h" -typedef double EventDataType; +typedef float EventDataType; class Event { diff --git a/SleepLib/loader_plugins/prs1_loader.cpp b/SleepLib/loader_plugins/prs1_loader.cpp index e0aad523..6366d23a 100644 --- a/SleepLib/loader_plugins/prs1_loader.cpp +++ b/SleepLib/loader_plugins/prs1_loader.cpp @@ -889,7 +889,181 @@ bool PRS1Loader::OpenEvents(Session *session,QString filename) return true; } +struct WaveHeaderList { + quint16 interleave; + quint8 sample_format; + WaveHeaderList(quint16 i,quint8 f){ interleave=i; sample_format=f; } +}; + bool PRS1Loader::OpenWaveforms(Session *session,QString filename) +{ + //int sequence,seconds,br,htype,version,numsignals; + QFile file(filename); + if (!file.open(QIODevice::ReadOnly)) { + qWarning() << "Couldn't open waveform file" << filename; + return false; + } + + int pos,br,size=file.size(); + if (size>max_load_buffer_size) { + qWarning() << "Waveform too big, increase max_load_buffer_size in PRS1Loader sourcecode" << filename; + return false; + } + + br=file.read((char *)m_buffer,size); + if (br2) { + qWarning() << "More than 2 Waveforms in " << filename; + return false; + } + pos=0x14+(num_signals-1)*3; + vector whl; + // add the in reverse... + for (int i=0;i3) { + qDebug() << "3 Faulty Waveform Headers in a row.. Aborting" << filename; + return false; + } + qDebug() << "Faulty Header Checksum, skipping block" << block; + pos+=length; + continue; + } else { + int diff=(lasttimestamp+duration)-timestamp; + length=m_buffer[pos+0x1] | m_buffer[pos+0x2] << 8; // block length in bytes + duration=m_buffer[pos+0xf] | m_buffer[pos+0x10] << 8; // block duration in seconds + if (diff || corrupt) { + qDebug() << "Timestamp restarts" << diff << corrupt << duration; + + + for (int i=0;iAddWaveform(w); + wlength[i]=0; + wdur[i]=0; + } + start=timestamp; + corrupt=0; + } + } + + pos+=hl+1; + //qDebug() << (duration*num_signals*whl[0].interleave) << length-(hl+3); + if (num_signals==1) { // no interleave.. this is much quicker. + int bs=duration*whl[0].interleave; + memcpy((char *)&(waveform[0])[wlength[0]],(char *)&m_buffer[pos],bs); + + wlength[0]+=bs; + + pos+=bs; + } else { + for (int i=0;iAddWaveform(w); + } + + int froog=3; + /* file.read(headerbytes,sizeof(PRS1Header)); + file.read(waveheaderbytes,sizeof(PRS1Header)); + int ns=waveheader.num_signals; + WaveHeaderList ws[ns]; + char * wsc=&ws[0]; + file.read(wsc,waveheader.num_signals*3); + chksum8=0; + for (int i=0;i<15;i++) chksum8+=headerbytes[i]; + for (int i=0;i<5;i++) chksum8+=waveheaderbytes[i]; + for (int i=0;iabs(diff)) { - duration+=diff; // really Subtracting.. - samples+=diff*5; - } else { - qWarning() << "Waveform out of sync beyond the first entry" << sequence << duration << diff; + if (version==5) { + qWarning() << "ASV Waveform out of sync" << sequence << duration << diff << timestamp-lastts; + } else { + if (diff<0) { + if (duration>abs(diff)) { + duration+=diff; // really Subtracting.. + samples+=diff*5; + } else { + qWarning() << "Waveform out of sync beyond the first entry" << sequence << duration << diff; + } + } else if (diff>0) { + qDebug() << "Fixing up Waveform sync" << sequence; + for (int i=0;i0) { - qDebug() << "Fixing up Waveform sync" << sequence; - for (int i=0;i >::iterator i; vector::iterator j; + int zz=0; for (i=waveforms.begin(); i!=waveforms.end(); i++) { + qDebug() << "Storing Waveform" << zz++ << filename; out << (quint16)i->first; // Machine Code t16=i->second.size(); out << t16; // Number of (hopefully non-linear) waveform chunks - + int chnk=0; for (j=i->second.begin(); j!=i->second.end(); j++) { + qDebug() << "Storing Waveform Chunk" << chnk++; Waveform &w=*(*j); // 64bit number.. @@ -656,6 +660,7 @@ bool Session::StoreWaveforms(QString filename) //t8=0; // 0=signed, 1=unsigned, 2=float // followed by sample data. + qDebug() << "Writing " << (*j)->samples() << "samples"; for (int k=0; k<(*j)->samples(); k++) out << w[k]; } } diff --git a/docs/PRS1 Data Format.odt b/docs/PRS1 Data Format.odt index 4608054c2f370c13a9f980ca91796f6a7beff96e..97668957298f66e5a84881e93cdd30ea796747d7 100644 GIT binary patch delta 9059 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 G;(q|(4)z%U delta 9128 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 zJo@jBLjP|KfHvgCBMUb-8wacZaction_Link_Graphs->setChecked(pref["LinkGraphMovement"].toBool()); - if (!pref.Exists("ShowDebug")) pref["ShowDebug"]=false; + if (!pref.Exists("ShowDebug")) pref["ShowDebug"]=true; else ui->actionDebug->setChecked(pref["ShowDebug"].toBool()); if (!pref["ShowDebug"].toBool()) {