Commit Graph

192 Commits

Author SHA1 Message Date
sawinglogz
a7f249218f Fix start time for 900X TB, PB, and LL.
It turns out OSCAR silently treats span events' timestamps as
and end time when drawing.
2019-06-15 21:45:58 -04:00
sawinglogz
4e5174343e First pass at 900X event parsing and clean up F5V3 pressure gain throughout.
This fixes the mask pressure graph as well as many of the events.
There are still some issues with presentation: some of the events are
being drawn at the wrong time, and certain events and statistics
don't really behave the way they're displayed.

Also several events have yet to be encountered in sample data.
2019-06-15 21:04:09 -04:00
sawinglogz
fcd7f8d463 Finish cleaning up 900X summary parsing.
There are still unknown values, but they'll need to be tracked down
after events are cleaned up. They no longer emit warnings.
2019-06-13 22:20:34 -04:00
sawinglogz
b1d76becab Fill in some 900X summary statistics values. 2019-06-13 21:29:43 -04:00
sawinglogz
2634aa0d16 Initial support for 900X summary.
Pressure settings are now properly being found and decoded, but there are lots
of unknown fields to figure out.

It turns out it uses the same humidifier setting encoding as F0V6, and the first
several slices seem to be the same. But pressure encodings are different, with
a gain of 0.125 instead of 0.1, presumably to allow for a maximum pressure of
30 cmH2O.
2019-06-13 20:31:21 -04:00
sawinglogz
4527a7091d Clean up remaining DreamStation parsing warnings. 2019-06-12 20:37:04 -04:00
sawinglogz
d0903ce3bd Add initial support for DreamStation Auto-Trial and CPAP-Check modes.
This resolves many of the unexpected value warnings in the sample
data, but there are still a bunch to tackle.
2019-06-11 21:26:40 -04:00
sawinglogz
2383c11be2 Minor clean up of F0V6 summary parsing, fix GUI build bug. 2019-06-10 20:57:05 -04:00
sawinglogz
96815cb068 Add support for 700X summary data. 2019-06-10 20:30:05 -04:00
sawinglogz
4e8a6514ef Add support for 600X summary data. 2019-06-10 15:30:22 -04:00
sawinglogz
92f029a5f4 Add support for 502G summary data.
Not many changes, just some new unknown settings, and warning
when there's a 0-length slice.
2019-06-10 15:07:20 -04:00
sawinglogz
a66dd145b8 Add support for 500X summary data.
This one's slice 8 is shorter than anything else we've seen before!

Also add support for a new slice type and noted possible values
for other data, including a possible lead on the CPAP mode.
2019-06-10 14:30:50 -04:00
sawinglogz
2120289792 Add support for 400G summary data.
Interestingly, it looks like settings and other slices can be of
varying length, even on the same machine. Stranger still, sometimes
the list of possible slices can change on the same machine.
2019-06-08 21:36:51 -04:00
sawinglogz
08ad973a6a Wrap up of 400X summary for now.
Mostly this is commenting out warnings about values that are different
for every session. They can be sorted out later.

Humidifier status and tube temperature are cleaned up as well.
2019-06-08 14:45:57 -04:00
sawinglogz
2a82ee09d6 Refinement of 400X summary data.
Fixed a bug in the ramp pressure setting, identified the mask resistance
setting, and found the summary equivalent of the humidifier setting change
slice.
2019-06-08 14:21:54 -04:00
sawinglogz
e41515891b First pass at fixing 400X summary data.
This is mostly a cut-and-paste of the ParseComplianceF0V6,
but the some of the slice codes and sizes are different.

Also start adding machine names for tested models.
2019-06-07 22:05:52 -04:00
sawinglogz
2ace7d3a6d First pass at PRS1 200X humidifier settings.
Some of the values still aren't known, and OSCAR doesn't yet define
a channel for heated tube temperature.
2019-06-07 16:40:26 -04:00
sawinglogz
250566f3f2 Refinement of 200X compliance data.
The new slice type appears when humidifier settings have changed during
the session, and includes a timestamp. The session time now matches
reports.

Otherwise just comments to indicate other values seen in the sample data,
including a lead on humidifier encoding.
2019-06-07 16:03:20 -04:00
sawinglogz
ff4ec4fdab Create slices for 200X compliance data, along with first confirmed settings.
There's a new slice type to be examined and additional settings remain
that vary within the sample data.
2019-06-07 14:32:53 -04:00
sawinglogz
ca23791414 First pass at 200X compliance data.
Lots of debug messages and unknown values, but the structure seems right.

This is largely based on a combination of the mainblock parsing for fileVersion 3
as found in ParseSummary() and the switch statements of ParseSummaryF0V6,
based on our understanding of slices from F0V23. The slice types here
come from sample 200X files.
2019-06-07 14:32:00 -04:00
sawinglogz
330bdb6fb3 Split ParseCompliance into F0V23 and F0V6.
Also add some debug messages to FV3 parsing. It's clear the current
approach is wrong. This looks a lot like the slices seen earlier,
since hbdata values appear more than once in a given file.

Also turn off summary YAML since the next bit of work will focus on
parsing.
2019-06-06 16:08:40 -04:00
sawinglogz
ce38fbcdde Restore session end time to previous behavior, with better logging and documentation.
It turns out the session end time was intentionally not being set in ParseSummary,
probably due to its unreliability. This may be revisited once things are more
stable, but for now the old behavior is retained.
2019-06-05 17:08:45 -04:00
sawinglogz
fd6f3c3f0a Resolve new PRS1 warning messages, add the missing session end time in ParseSummary. 2019-06-05 11:12:08 -04:00
sawinglogz
092d46be33 Add debug messages for exceptional events in PRS1Import::ParseSession.
Lots of new warnings that were being silently eaten!
2019-06-05 10:24:32 -04:00
sawinglogz
8fa5df5f89 Fix PRS1 typo, resolve use of multiple event lists and refine warning. 2019-06-05 10:00:11 -04:00
sawinglogz
44d134dee5 Fix a sign error and don't consider 1-second gaps to be BND events in PRS1.
Presumably due to clock drift, there are occasionally 1-second discontinuities
in waveform data, in either direction. These will need to be addressed.
2019-06-05 08:34:36 -04:00
sawinglogz
c2b8699ee9 Chase down all unusual values in F0V23 summary sample data.
Chunk parsing is now a lot quieter, and PS for non-auto bilevel has been fixed.
2019-06-04 23:19:35 -04:00
sawinglogz
d80426af5e Add slices to PRS1 F0V23 summaries.
This doesn't have much observable effect, other than reducing a
day's total usage time if there are periods with no breathing
detected. Most of the shortcomings were obscured by information
gleaned from the events and waveform files.
2019-06-04 20:26:43 -04:00
sawinglogz
5ac6745eef Fix PRS1 F0V23 PB parsing bug that triggered unordered data warnings.
A PB event obviously can't start so late that its duration ends in the future!
The fix hasn't been applied to F0V4 or F0V6 yet, since those haven't been
tested yet.

Also fix a sign bug in EventList::AddEvent when there *is* unordered data.
2019-06-04 20:11:50 -04:00
sawinglogz
2021e91426 Fix parsing PRS1 F0V2 settings and add value checks based on a few sample sessions. 2019-06-04 12:18:20 -04:00
sawinglogz
27c169e61e Report parsing failure when PRS1 sanity checks fail.
Remarkably, this resulted in nearly no changes to the test output.
Only one session with 0 duration had its start/end times reset to 0,
since it will no longer get imported.
2019-06-03 22:01:02 -04:00
sawinglogz
1a0a4bbf52 Convert compliance "slices" to events with a starting delta.
Also fix the related enums and add more value checks.
Also add YAML output of the cumulative mask-on slice time.
2019-06-03 20:12:17 -04:00
sawinglogz
a6455b6b05 Add sanity check for presumed humidifier setting in compliance.
Also suppress "untested" user alerts for a known bogus model number.
2019-06-03 14:21:06 -04:00
sawinglogz
66585d939e Chase down all unusual values in 251P compliance sample data.
The big discovery is that slices aren't slices with durations,
they're events with a starting delta.
2019-06-02 21:50:45 -04:00
sawinglogz
5fee567066 Fix PRS1 loader bug where chunks could be incorrectly skipped.
This doesn't fix the bigger bug where files are skipped based on
their filename rather than the actual chunk session IDs. That's
a trickier challenge for another day.
2019-05-31 21:47:28 -04:00
sawinglogz
264c41379b Fix PRS1 compliance parsing based on 251P data, check for any unexpected values.
Also get rid of a premature parsing check in ScanFiles.
2019-05-31 21:00:35 -04:00
sawinglogz
a327a7ed1c Add logging of unexpected data to ParseCompliance, disable broken 200X compliance. 2019-05-31 16:58:58 -04:00
sawinglogz
bc3b93cf9c Merge branch 'master' into prs1-split-parsing 2019-05-30 16:33:55 -04:00
sawinglogz
f62d99bb31 Add machines to tested PRS1 list, alert user if their machine is untested.
This introduces a very slight change UI behavior, where the user
will receive an alert if their machine has a supported family/version
but is a model number for which we don't have any test data.

Also, the user alert for an unsupported machine has been updated
to align with the actual underlying parsing limitations. It's
possible this will create some new warnings, but it doesn't seem
like any such machines would have worked anyway, in which case
an explanatory message is an improvement.

The "untested" alert will happen on import once per launch of OSCAR.
Ideally this would only happen the first time an untested machine is
imported, but that will require figuring out how to serialize an
additional value in the user's machine profile.
2019-05-30 16:32:57 -04:00
sawinglogz
135ac25c1e Add YAML output for PRS1DataChunks.
Also move a data check from PRS1Import::ImportSummary to PRS1DataChunk::ParseSummary
to prevent crashing in regression tests.
2019-05-29 12:11:53 -04:00
sawinglogz
ea008273ab Add PRS1DataChunk::ParseEvents for testing and future unification. 2019-05-29 11:20:20 -04:00
sawinglogz
d0150d18ef Limit raw data in PRS1/Session YAML to 100 bytes per entry.
This changes the reference output, compared to prior versions, but
it runs much faster and doesn't affect user-observable behavior.
2019-05-28 21:09:17 -04:00
sawinglogz
1892ceda85 Clean PRS1ParsedEvents and reorder PRS1Import::Parse*Events for more consistency, no functional changes. 2019-05-28 18:25:08 -04:00
sawinglogz
7c949fc843 Convert PRS1ParsedEvent enums to static constants, update switch statements. 2019-05-28 16:05:23 -04:00
sawinglogz
3b4a5b4dd6 Clean up PRS1Import::ParseF*Events functions in preparation for merging, no functional changes. 2019-05-27 12:38:55 -04:00
sawinglogz
685527b993 Remove unused ParseSummaryF* functions, move ParseSummary from PRS1Import to PRS1DataChunk. 2019-05-27 11:14:55 -04:00
sawinglogz
e47c4934ef Merge PRS1Import::ParseSummaryF* functionality into PRS1Import::ImportSummary.
Only PRS1Import::ParseSummaryF0V23 has disappeared, being merged into
ImportSummary. The only change it needed to subsume the functionality of
all other variants was the addition of one extra setting.

The rest of the now-unused variants will be removed next.
2019-05-27 11:05:34 -04:00
sawinglogz
44e4b25471 Move PRS1Import::ParseSummaryF0V23 in preparation for merge; no changes. 2019-05-27 10:28:14 -04:00
sawinglogz
4d1b947e22 Split PRS1Import::ParseSummary into ImportSummar/ParseSummary. 2019-05-27 10:25:57 -04:00
sawinglogz
e3a4edaca2 Add PRS1ModelInfo to manage the set of supported and tested machines.
Also move an extra unsupported check out of PRSImport::ImportSummary
into CreateMachineFromProperties, where it should intervene before
reaching PRS1Import. Leave a warning debug message in its place.
2019-05-27 10:05:16 -04:00
sawinglogz
739ba7d5d5 Clean up ParseSummaryF5V3 to align more closely with all other summary parsers. 2019-05-26 19:02:08 -04:00
sawinglogz
44558e4c06 Merge redundant code into single PRS1DataChunk::ParseHumidifierSetting function. 2019-05-26 18:46:26 -04:00
sawinglogz
d13b417d5b Fix regression from eb758602 that was missed by the initial testing. 2019-05-26 17:43:10 -04:00
sawinglogz
923fb7bf86 Merge redundant code into single PRS1DataChunk::ParseFlexSetting function. 2019-05-26 17:36:12 -04:00
sawinglogz
53f1a881a3 Split parsing from importing for compliance (brick) data.
This isn't fully tested yet, since I don't currently have fileVersion 2 samples.
It has been tested with 200X devices and doesn't change behavior there,
but the slice parsing immediately bails, so it's not really being exercised.

It seems very weird that "slices", whatever they are, would only show
up on bricks, the least capable devices. This needs more investigation.
2019-05-26 14:17:58 -04:00
sawinglogz
eb75860221 Split parsing from importing for F0V2 and F0V3 summaries. 2019-05-25 21:57:29 -04:00
sawinglogz
7a153a6516 Split parsing from importing for F0V4 summaries. 2019-05-25 21:25:56 -04:00
sawinglogz
e49c947b6b Split parsing from importing for F0V6 summaries. 2019-05-25 21:08:53 -04:00
sawinglogz
b6c35c7610 Split parsing from importing for F3 (probably V6) summaries.
This looks discouragingly redundant at first glance, but eventually
the import stage will probably be unified across all families, leaving
the parsers the only difference. That'll happen after all summary
importers have been split.
2019-05-25 19:43:35 -04:00
sawinglogz
6b1b7e225c Split parsing from importing for remaining F5 summaries. 2019-05-25 19:21:46 -04:00
sawinglogz
1cd7ac7c14 Merge identical F5V0 and F5V1 and remove unused F5V2 summary parsers. 2019-05-25 18:01:09 -04:00
sawinglogz
0d8e37c94c Split parsing from importing for F0 events. 2019-05-25 17:00:44 -04:00
sawinglogz
abac19bbf1 Split parsing from importing for F3V3 events. 2019-05-24 20:09:53 -04:00
sawinglogz
5a88887cc3 Split parsing from importing for F3V6 events. 2019-05-24 19:41:42 -04:00
sawinglogz
a4612a4f24 Split parsing from importing for F5V0, F5V1, F5V2 events. 2019-05-24 17:08:51 -04:00
Phil Olynyk
f05cc5fbc5 warn empty filename for QT < 5.12 2019-05-24 16:22:44 +00:00
sawinglogz
a5b4851583 Remove unused code from PRS1 event parsers.
Also temporarily disable the time-consuming chunk unit test, since
the current work is on conversion from chunk to sessions.
2019-05-23 12:17:21 -04:00
sawinglogz
795e9414be Split parsing from importing for F5V3 summaries.
This looks even uglier than the F5V3 event split for now,
since portions of the fileVersion 3 parsing are still stuck in
PRS1Import, and can't be reasonably moved until all the parsers
are split into PRS1DataChunk.

Also, PRS1ParsedSettingEvent may be the wrong abstraction. That's
a first attempt, so that it can inherit PRS1ParsedEvent's notion
of gain and unit, and because m_parsedData is currently a list
of PRS1ParsedEvent pointers. But it has no notion of time (start=0)
and requires yet another enum to specify which setting it
represents.

This should be revisited once all the parsers have been split
and the summary parsing can be examined in more detail.
2019-05-22 20:11:48 -04:00
sawinglogz
5b959efc37 Split parsing from importing for F5V3 events.
This doesn't look much prettier yet, since it requires double the
switch statements, but the expectation is that once all event
parsers are split out from import, the import routines will be
identical among all machines, and can then be consolidated.

Regardless, it's important to drive a wedge between file parsing
and the internal database structure.
2019-05-22 11:00:45 -04:00
sawinglogz
21adfb7987 Fix header parsing for 1160P event files, fix misconceptions in ReadWaveformHeader.
Now that we check header checksums, it uncovered a problem parsing 1160P event
headers. It turns out that the 1160P uses a "waveform" header for its .002
events files. So we can't use the file extension to decide which header to
parse, but there's a flag in the standard header that seems to reliably indicate
a waveform header. The 1160P events are listed at fixed intervals, as are
waveforms, so the flag has been named "interval" rather than "waveform."

The 1160P event headers have more than 2 signals in the header and an interval
longer than 1sec. This clarified the meaning of multiple waveform header fields
that were previously being parsed incorrectly.
2019-05-18 19:17:55 -04:00
sawinglogz
ccafa1f16e Calculate and check PRS1 CRC32 on V3 files, fix memory leak. 2019-05-15 17:41:37 -04:00
sawinglogz
1c564fb296 Calculate and check PRS1 CRC16 on V2 files. 2019-05-15 15:16:14 -04:00
sawinglogz
c8cd66992a Split PRS1DataChunk::ReadHeader into ReadHeader/ReadNormalHeaderV2/ReadNormalHeaderV3. 2019-05-15 12:32:39 -04:00
sawinglogz
d3c6d6445b Split PRS1DataChunk::ReadHeader into ReadHeader/ReadWaveformHeader. 2019-05-15 10:26:31 -04:00
sawinglogz
e07c4ce63c Split PRS1DataChunk::ReadHeader into ReadHeader/ReadData. 2019-05-15 08:36:31 -04:00
sawinglogz
451963de25 Move chunk parsing into PRS1DataChunk class.
The diff looks messy, but it's mostly chunk -> this search-and-replace.
2019-05-14 22:49:41 -04:00
sawinglogz
7103650023 Move PRS1Loader::ParseChunk variable declarations and V3 header unpacking to the appropriate scope. 2019-05-14 21:49:43 -04:00
sawinglogz
d7cd22c918 Separate checksum reading in PRS1Loader::ParseChunk instead of burying it with other data.
While slightly more verbose, this makes the code more clearly correct.
2019-05-14 20:47:00 -04:00
sawinglogz
d216e677e1 Simplify PRS1Loader::ParseChunk by using a chunk instead of local variables. 2019-05-14 19:57:01 -04:00
sawinglogz
74863e538a Split PRS1Loader::ParseFile in to ParseFile/ParseChunk. 2019-05-14 18:57:04 -04:00
sawinglogz
76053b0469 Check for format change before coalescing PRS1 chunks, move data warnings out of parsing. 2019-05-14 16:20:32 -04:00
sawinglogz
9b3aaad4b0 Move PRS1 waveform chunk coalescing out of parsing and into importing. 2019-05-13 21:23:20 -04:00
sawinglogz
f19ad331c9 Add debugging output to all error handling in PRS1 loader. 2019-05-13 21:23:20 -04:00
sawinglogz
e47660e15a Disable broken "ignore" setting for PRS1. Fixes #73. 2019-05-08 17:09:15 -04:00
sawinglogz
e4082fff22 Add compiler flags and debug messages in search of memory access errors. 2019-05-05 15:50:38 -04:00
sawinglogz
9da60239c8 Fix memory access error in certain summary files.
This currently doesn't make the parsing more complete, it just bails rather than running off the end of memory.
2019-05-05 15:45:50 -04:00
sawinglogz
af375af090 Disable GUI widgets in Loader and PRS1Loader when unit testing. 2019-05-04 21:49:50 -04:00
sawinglogz
7c0c13486c More refactoring of PRS1Loader::OpenMachine(). 2019-05-03 16:59:26 -04:00
sawinglogz
7937b57b5f Split out PRS1Loader::ScanFiles() from PRS1Loader::OpenMachine(). 2019-05-03 15:07:15 -04:00
sawinglogz
4599dd781f Refactor PRS1Import::run() so that parsing can be called separately from saving to the database. 2019-05-03 14:45:21 -04:00
Phil Olynyk
108e0354d9 Change OSCR to OSCAR in cpp, h, ui, and html files 2019-02-23 19:58:25 -05:00
Phil Olynyk
17b53482bd Change folder and file name from oscr to oscar 2019-02-22 19:23:39 -05:00