The following commit has been merged in the master branch:
commit 2740814d17937df8aaebb488214b39fd1ccc3f61
Author: Andrei Zavada <[email protected]>
Date:   Tue Apr 9 02:22:14 2013 +0300

    introducing edf subtype

diff --git a/src/libsigfile/edf.cc b/src/libsigfile/edf.cc
index 14c660f..36389cb 100644
--- a/src/libsigfile/edf.cc
+++ b/src/libsigfile/edf.cc
@@ -75,6 +75,7 @@ int
 sigfile::CEDFFile::
 set_comment( const char *s)
 {
+       fprintf( stderr, "Writing to reserved EDF field: don't do that!\n");
        memcpy( header.reserved, agh::str::pad( s, 44).c_str(), 44);
        return strlen(s) > 44;
 }
@@ -219,13 +220,14 @@ CEDFFile (const char *fname_, int flags_)
 
 
 sigfile::CEDFFile::
-CEDFFile (const char *fname_, int flags_,
+CEDFFile (const char *fname_, TSubtype subtype_, int flags_,
          const list<pair<string, size_t>>& channels_,
          size_t data_record_size_,
          size_t n_data_records_)
       : CSource (fname_, flags_),
        data_record_size (data_record_size_),
-       n_data_records (n_data_records_)
+       n_data_records (n_data_records_),
+       _subtype (subtype_)
 {
        _fd = open( fname_, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | 
S_IRGRP);
        if ( _fd == -1 ) {
@@ -358,6 +360,7 @@ CEDFFile (CEDFFile&& rv)
        n_data_records   = rv.n_data_records;
        data_record_size = rv.data_record_size;
 
+       _subtype    = rv._subtype;
        _start_time = rv._start_time;
        _end_time   = rv._end_time;
 
@@ -508,6 +511,13 @@ _parse_header()
                _get_next_field( header.data_record_size, 8);
                _get_next_field( header.n_channels,       4);
 
+               _subtype =
+                       (strncasecmp( header.reserved, "edf+c", 5) == 0)
+                       ? edfplus_c
+                       : (strncasecmp( header.reserved, "edf+d", 5) == 0)
+                       ? edfplus_d
+                       : edf;
+
                if ( strncmp( header.version_number, version_string, 8) ) {
                        _status |= (bad_version | inoperable);
                        return -2;
@@ -759,6 +769,7 @@ sigfile::CEDFFile::details( bool channels_too) const
                char *outp;
                if ( asprintf( &outp,
                               "File\t: %s\n"
+                              " subtype\t: %s\n"
                               " PatientID\t: %s\n"
                               " RecordingID\t: %s\n"
                               " Date\t: %s\n"
@@ -767,6 +778,7 @@ sigfile::CEDFFile::details( bool channels_too) const
                               " # of records\t: %zu\n"
                               " Record length\t: %zu sec\n",
                               filename(),
+                              subtype_s(),
                               subject(),
                               agh::str::trim( string (header.recording_id, 
80)).c_str(),
                               agh::str::trim( string (header.recording_date, 
8)).c_str(),
diff --git a/src/libsigfile/edf.hh b/src/libsigfile/edf.hh
index fe61706..e70c1d2 100644
--- a/src/libsigfile/edf.hh
+++ b/src/libsigfile/edf.hh
@@ -4,7 +4,7 @@
  *          Author:  Andrei Zavada <[email protected]>
  * Initial version:  2008-07-01
  *
- *         Purpose:  EDF class
+ *         Purpose:  EDF class, also accommodating EDF+
  *
  *         License:  GPL
  */
@@ -46,13 +46,35 @@ class CEDFFile
        CEDFFile() = delete;
 
     public:
+       // subtype
+       enum TSubtype {
+               edf,
+               edfplus_c,  // continuous
+               edfplus_d   // discontinuous
+       };
+       TSubtype subtype() const
+               { return _subtype; }
+       static const char*
+       subtype_s( TSubtype t)
+               {
+                       switch (t) {
+                       case edf:       return "edf";
+                       case edfplus_c: return "edf+c";
+                       case edfplus_d: return "edf+d";
+                       default:        return "(invalid)";
+                       }
+               }
+       const char*
+       subtype_s() const
+               { return subtype_s( _subtype); }
+
       // ctor
        CEDFFile( const CEDFFile&)
              : CSource("")
                {
                        throw invalid_argument("nono");
                }
-       enum {
+       enum TFlags {
                no_mmap                         = 1<<3,
                no_cache                        = 1<<4, // just considering
                no_field_consistency_check      = 1<<5,
@@ -60,7 +82,7 @@ class CEDFFile
        // open existing
        CEDFFile (const char *fname, int flags = 0);
        // create new
-       CEDFFile (const char *fname, int flags,
+       CEDFFile (const char *fname, TSubtype subtype_, int flags,
                  const list<pair<string, size_t>>& channels,
                  size_t data_record_size = 1,
                  size_t n_data_records = 0);
@@ -490,6 +512,8 @@ class CEDFFile
        static string explain_edf_status( int);
 
     private:
+       TSubtype _subtype;
+
        time_t  _start_time,
                _end_time;
 
diff --git a/src/tools/edfcat.cc b/src/tools/edfcat.cc
index c22981f..62b814e 100644
--- a/src/tools/edfcat.cc
+++ b/src/tools/edfcat.cc
@@ -341,6 +341,7 @@ exec_convert( const SOperation::SObject& obj)
                grand_min, grand_max);
 
        sigfile::CEDFFile F ((obj + ".edf").c_str(),
+                            sigfile::CEDFFile::TSubtype::edf,
                             sigfile::CTypedSource::no_ancillary_files,
                             make_channel_headers_for_CEDFFile( Hh.size(), 
"channel%zu", obj.samplerate),
                             obj.record_size,
@@ -383,6 +384,7 @@ exec_prune( const SOperation::SObject& obj)
        printf( "Keeping %zu channel(s)\n", selected_channels.size());
 
        sigfile::CEDFFile G ((agh::fs::make_fname_base( obj, ".edf", false) + 
"-mod.edf").c_str(),
+                            sigfile::CEDFFile::TSubtype::edf,
                             sigfile::CTypedSource::no_ancillary_files,
                             selected_channels,
                             F.data_record_size,

-- 
Sleep experiment manager

_______________________________________________
debian-med-commit mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit

Reply via email to