From 336ac0530231ce9afca85115c3c45df92aaf786b Mon Sep 17 00:00:00 2001 From: Mark Watkins Date: Mon, 6 Jun 2011 14:31:11 +1000 Subject: [PATCH] Oximeter min,max and avg cleanup --- Projects/CodeBlocks/SleepyHead.depend | 8 +- src/GUIFrame.cpp | 2 +- src/SleepyHeadMain.cpp | 20 ++--- src/WxWizFrame.fbp | 2 +- src/graphs/graph.cpp | 9 ++- .../sleeplib/loader_plugins/cms50_loader.cpp | 76 +++++++++++++------ 6 files changed, 75 insertions(+), 42 deletions(-) diff --git a/Projects/CodeBlocks/SleepyHead.depend b/Projects/CodeBlocks/SleepyHead.depend index a01cc05b..3cfe8e5d 100644 --- a/Projects/CodeBlocks/SleepyHead.depend +++ b/Projects/CodeBlocks/SleepyHead.depend @@ -8201,7 +8201,7 @@ "wx/treebase.h" "wx/hashmap.h" -1307245704 source:/home/mark/projects/git/sleepyhead/src/GUIFrame.cpp +1307332633 source:/home/mark/projects/git/sleepyhead/src/GUIFrame.cpp "wx/wxprec.h" "GUIFrame.h" @@ -8312,7 +8312,7 @@ "preferences.h" "tinyxml/tinyxml.h" -1307331240 source:/home/mark/projects/git/sleepyhead/src/SleepyHeadMain.cpp +1307333457 source:/home/mark/projects/git/sleepyhead/src/SleepyHeadMain.cpp "wx_pch.h" "version.h" @@ -8331,7 +8331,7 @@ "sleeplib/profiles.h" "sleeplib/machine_loader.h" -1307331318 source:/home/mark/projects/git/sleepyhead/src/graphs/graph.cpp +1307332921 source:/home/mark/projects/git/sleepyhead/src/graphs/graph.cpp @@ -8412,7 +8412,7 @@ 1307287644 /home/mark/projects/git/sleepyhead/src/libs/sleeplib/loader_plugins/cms50_loader.h "sleeplib/machine_loader.h" -1307289931 source:/home/mark/projects/git/sleepyhead/src/libs/sleeplib/loader_plugins/cms50_loader.cpp +1307334532 source:/home/mark/projects/git/sleepyhead/src/libs/sleeplib/loader_plugins/cms50_loader.cpp "cms50_loader.h" diff --git a/src/GUIFrame.cpp b/src/GUIFrame.cpp index c9a5eb1c..efb05ccf 100644 --- a/src/GUIFrame.cpp +++ b/src/GUIFrame.cpp @@ -27,7 +27,7 @@ GUIFrame::GUIFrame( wxWindow* parent, wxWindowID id, const wxString& title, cons menubar = new wxMenuBar( 0 ); FileMenu = new wxMenu(); wxMenuItem* FileMenuImportSD; - FileMenuImportSD = new wxMenuItem( FileMenu, wxID_ANY, wxString( _("&Import SD") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL ); + FileMenuImportSD = new wxMenuItem( FileMenu, wxID_ANY, wxString( _("&Import Data") ) + wxT('\t') + wxT("F9"), wxEmptyString, wxITEM_NORMAL ); FileMenu->Append( FileMenuImportSD ); wxMenuItem* FileMenuPreferences; diff --git a/src/SleepyHeadMain.cpp b/src/SleepyHeadMain.cpp index 79d1f167..ffc30830 100644 --- a/src/SleepyHeadMain.cpp +++ b/src/SleepyHeadMain.cpp @@ -577,16 +577,16 @@ Daily::Daily(wxWindow *win,Profile *p) G_AHI->AddLayer(l); AddOXIData(pulse=new SkipZeroData(OXI_Pulse,0,32768)); - pulse->ForceMinY(40); - pulse->ForceMaxY(120); + //pulse->ForceMinY(40); + //pulse->ForceMaxY(120); PULSE=new gGraphWindow(ScrolledWindow,-1,wxT("Pulse"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER); PULSE->AddLayer(new gLineChart(pulse,wxRED,32768,false,false,true)); PULSE->AddLayer(new gXAxis(wxBLACK)); AddOXIData(spo2=new SkipZeroData(OXI_SPO2,0,32768)); - spo2->ForceMinY(60); - spo2->ForceMaxY(100); + //spo2->ForceMinY(60); + //spo2->ForceMaxY(100); SPO2=new gGraphWindow(ScrolledWindow,-1,wxT("SpO2"),wxPoint(0,0), wxSize(600,130), wxNO_BORDER); SPO2->AddLayer(new gLineChart(spo2,wxBLUE,32768,false,false,true)); SPO2->AddLayer(new gXAxis(wxBLACK)); @@ -858,12 +858,12 @@ void Daily::RefreshData() if (oxi) { html=html+wxT("")+_("Oximeter Information")+wxT("\n"); - html=html+wxT("")+_("Pulse Avg")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),d->summary_avg(OXI_PulseAverage))+wxT("\n"); - html=html+wxT("")+_("Pulse Min")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),d->summary_min(OXI_PulseMin))+wxT("\n"); - html=html+wxT("")+_("Pulse Max")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),d->summary_max(OXI_PulseMax))+wxT("\n"); - html=html+wxT("")+_("SpO2 Avg")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),d->summary_avg(OXI_SPO2Average))+wxT("\n"); - html=html+wxT("")+_("SpO2 Min")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),d->summary_min(OXI_SPO2Min))+wxT("\n"); - html=html+wxT("")+_("SpO2 Max")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),d->summary_max(OXI_SPO2Max))+wxT("\n"); + html=html+wxT("")+_("Pulse Avg")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),oxi->summary_avg(OXI_PulseAverage))+wxT("\n"); + html=html+wxT("")+_("Pulse Min")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),oxi->summary_min(OXI_PulseMin))+wxT("\n"); + html=html+wxT("")+_("Pulse Max")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),oxi->summary_max(OXI_PulseMax))+wxT("\n"); + html=html+wxT("")+_("SpO2 Avg")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),oxi->summary_avg(OXI_SPO2Average))+wxT("\n"); + html=html+wxT("")+_("SpO2 Min")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),oxi->summary_min(OXI_SPO2Min))+wxT("\n"); + html=html+wxT("")+_("SpO2 Max")+wxT("")+wxString::Format(wxT("%.1fcmH2O"),oxi->summary_max(OXI_SPO2Max))+wxT("\n"); PULSE->Show(true); SPO2->Show(true); } else { diff --git a/src/WxWizFrame.fbp b/src/WxWizFrame.fbp index 4b7d6b0c..4d0ca2d2 100644 --- a/src/WxWizFrame.fbp +++ b/src/WxWizFrame.fbp @@ -208,7 +208,7 @@ wxID_ANY wxITEM_NORMAL - &Import SD + &Import Data FileMenuImportSD none F9 diff --git a/src/graphs/graph.cpp b/src/graphs/graph.cpp index 73041f8c..9af30723 100644 --- a/src/graphs/graph.cpp +++ b/src/graphs/graph.cpp @@ -1601,6 +1601,9 @@ void FlowData::Reload(Day *day) m_ready=true; //graph->Refresh(false); } + + +// This can be merged back in with PressureData (and can be renamed while we are at it) SkipZeroData::SkipZeroData(MachineCode _code,int _field,int _size) :gPointData(_size),code(_code),field(_field) { @@ -1622,7 +1625,7 @@ void SkipZeroData::Reload(Day *day) min_y=max_y=0; int tt=0; bool first=true; - EventDataType lastp; + EventDataType lastp=0; for (vector::iterator s=day->begin();s!=day->end(); s++) { if ((*s)->events.find(code)==(*s)->events.end()) continue; if (vc>=(int)point.size()) { @@ -1630,7 +1633,7 @@ void SkipZeroData::Reload(Day *day) } int t=0; - EventDataType p; //,lastp=-1; + EventDataType p; for (vector::iterator ev=(*s)->events[code].begin(); ev!=(*s)->events[code].end(); ev++) { p=(*(*ev))[field]; if (p!=0) { @@ -1639,6 +1642,7 @@ void SkipZeroData::Reload(Day *day) assert(t1) min_y-=1; } - //} if (force_min_y!=force_max_y) { min_y=force_min_y; max_y=force_max_y; diff --git a/src/libs/sleeplib/loader_plugins/cms50_loader.cpp b/src/libs/sleeplib/loader_plugins/cms50_loader.cpp index 8e519b10..b8b956f6 100644 --- a/src/libs/sleeplib/loader_plugins/cms50_loader.cpp +++ b/src/libs/sleeplib/loader_plugins/cms50_loader.cpp @@ -127,35 +127,62 @@ bool CMS50Loader::OpenSPORFile(wxString path,Machine *mach,Profile *profile) if (br!=num_records) { wxLogDebug(wxT("Short .spoR File: ")+path); } - char last_pulse=buffer[0]; - char last_spo2=buffer[1]; - EventDataType data[2]; + wxDateTime last_pulse_time=date; wxDateTime last_spo2_time=date; - data[0]=last_pulse; - data[1]=last_spo2; + + EventDataType last_pulse=buffer[0]; + EventDataType last_spo2=buffer[1]; + EventDataType cp,cs; Session *sess=new Session(mach,sessid); sess->set_first(date); - sess->AddEvent(new Event(date,OXI_Pulse,data,1)); - sess->AddEvent(new Event(date,OXI_SPO2,&data[1],1)); + sess->AddEvent(new Event(date,OXI_Pulse,&last_pulse,1)); + sess->AddEvent(new Event(date,OXI_SPO2,&last_spo2,1)); + + EventDataType PMin,PMax=0,SMin,SMax=0,PAvg=0,SAvg=0; + int PCnt=0,SCnt=0; //wxDateTime wxDateTime tt=date; + bool first_p=true,first_s=true; + for (int i=2;iAddEvent(new Event(tt,OXI_Pulse,data,1)); + cp=buffer[i]; + cs=buffer[i+1]; + if (last_pulse!=cp) { + sess->AddEvent(new Event(tt,OXI_Pulse,&cp,1)); + if (cp>0) { + if (first_p) { + PMin=cp; + first_p=false; + } else { + if (PMin>cp) PMin=cp; + } + PAvg+=cp; + PCnt++; + } } - if (last_spo2!=buffer[i+1]) { - data[1]=buffer[i+1]; - sess->AddEvent(new Event(tt,OXI_SPO2,&data[1],1)); + if (last_spo2!=cs) { + sess->AddEvent(new Event(tt,OXI_SPO2,&cs,1)); + if (cs>0) { + if (first_s) { + SMin=cs; + first_s=false; + } else { + if (SMin>cs) SMin=cs; + } + SAvg+=cs; + SCnt++; + } } - last_pulse=buffer[i]; - last_spo2=buffer[i+1]; + last_pulse=cp; + last_spo2=cs; + if (PMaxAddEvent(new Event(tt,OXI_Pulse,data,1)); - sess->AddEvent(new Event(tt,OXI_SPO2,&data[1],1)); + sess->AddEvent(new Event(tt,OXI_Pulse,&cp,1)); + sess->AddEvent(new Event(tt,OXI_SPO2,&cs,1)); sess->set_last(tt); wxTimeSpan t=sess->last()-sess->first(); @@ -163,12 +190,15 @@ bool CMS50Loader::OpenSPORFile(wxString path,Machine *mach,Profile *profile) double hours=(t.GetSeconds().GetLo()/3600.0); sess->set_hours(hours); - sess->summary[OXI_PulseAverage]=sess->weighted_avg_event_field(OXI_Pulse,0); - sess->summary[OXI_PulseMin]=sess->min_event_field(OXI_Pulse,0); - sess->summary[OXI_PulseMax]=sess->max_event_field(OXI_Pulse,0); - sess->summary[OXI_SPO2Average]=sess->weighted_avg_event_field(OXI_SPO2,0); - sess->summary[OXI_SPO2Min]=sess->min_event_field(OXI_SPO2,0); - sess->summary[OXI_SPO2Max]=sess->max_event_field(OXI_SPO2,0); + EventDataType pa=0,sa=0; + if (PCnt>0) pa=PAvg/double(PCnt); + if (SCnt>0) sa=SAvg/double(SCnt); + sess->summary[OXI_PulseAverage]=pa; + sess->summary[OXI_PulseMin]=PMin; + sess->summary[OXI_PulseMax]=PMax; + sess->summary[OXI_SPO2Average]=sa; + sess->summary[OXI_SPO2Min]=SMin; + sess->summary[OXI_SPO2Max]=SMax; mach->AddSession(sess,profile); sess->SetChanged(true);