This is an automated email from the git hooks/post-receive script. tille pushed a commit to branch master in repository edflib.
commit 6533763c46fd0bc7522dedabba9c48ccec29cd33 Author: Andreas Tille <[email protected]> Date: Tue Jan 2 21:23:51 2018 +0100 New upstream version 1.13 --- Makefile | 2 +- edflib.c | 1605 +++++++++++++++++++++++++++++++++-------------------- edflib.h | 46 +- sine_generator.c | 2 +- sweep_generator.c | 12 +- test_generator.c | 36 +- 6 files changed, 1065 insertions(+), 638 deletions(-) diff --git a/Makefile b/Makefile old mode 100755 new mode 100644 index 4dd8c4c..6368069 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC = gcc -CFLAGS = -Wall -Wextra -Wshadow -Wformat-nonliteral -Wformat-security -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE +CFLAGS = -O2 -Wall -Wextra -Wshadow -Wformat-nonliteral -Wformat-security -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE LDLIBS = -lm programs = sine_generator sweep_generator test_edflib test_generator diff --git a/edflib.c b/edflib.c index 31e65f4..f505e18 100644 --- a/edflib.c +++ b/edflib.c @@ -1,7 +1,7 @@ /* ***************************************************************************** * -* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Teunis van Beelen +* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Teunis van Beelen * All rights reserved. * * email: [email protected] @@ -39,7 +39,7 @@ #include "edflib.h" -#define EDFLIB_VERSION 112 +#define EDFLIB_VERSION 113 #define EDFLIB_MAXFILES 64 @@ -78,9 +78,12 @@ /* max size of annotationtext */ #define EDFLIB_WRITE_MAX_ANNOTATION_LEN 40 -/* bytes in datarecord for EDF annotations, must be a multiple of three and two */ +/* bytes in datarecord for EDF annotations, must be an integer multiple of three and two */ #define EDFLIB_ANNOTATION_BYTES 114 +/* for writing only */ +#define EDFLIB_MAX_ANNOTATION_CHANNELS 64 + #define EDFLIB_ANNOT_MEMBLOCKSZ 1000 @@ -147,6 +150,8 @@ struct edfhdrblock{ int annotlist_sz; int total_annot_bytes; int eq_sf; + char *wrbuf; + int wrbufsize; struct edfparamblock *edfparam; }; @@ -190,14 +195,14 @@ static int edflib_sprint_int_number_nonlocalized(char *, int, int, int); static int edflib_sprint_ll_number_nonlocalized(char *, long long, int, int); static int edflib_fprint_int_number_nonlocalized(FILE *, int, int, int); static int edflib_fprint_ll_number_nonlocalized(FILE *, long long, int, int); - +static int edflib_write_tal(struct edfhdrblock *, FILE *); int edflib_is_file_used(const char *path) { - int i, file_used=0; + int i; for(i=0; i<EDFLIB_MAXFILES; i++) { @@ -205,20 +210,18 @@ int edflib_is_file_used(const char *path) { if(!(strcmp(path, hdrlist[i]->path))) { - file_used = 1; - - break; + return 1; } } } - return(file_used); + return 0; } int edflib_get_number_of_open_files() { - return(edf_files_open); + return edf_files_open; } @@ -232,12 +235,12 @@ int edflib_get_handle(int file_number) { if(file_count++ == file_number) { - return(i); + return i; } } } - return(-1); + return -1; } @@ -256,14 +259,14 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r { edfhdr->filetype = EDFLIB_INVALID_READ_ANNOTS_VALUE; - return(-1); + return -1; } if(read_annotations>2) { edfhdr->filetype = EDFLIB_INVALID_READ_ANNOTS_VALUE; - return(-1); + return -1; } memset(edfhdr, 0, sizeof(struct edf_hdr_struct)); @@ -272,7 +275,7 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r { edfhdr->filetype = EDFLIB_MAXFILES_REACHED; - return(-1); + return -1; } for(i=0; i<EDFLIB_MAXFILES; i++) @@ -283,7 +286,7 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r { edfhdr->filetype = EDFLIB_FILE_ALREADY_OPENED; - return(-1); + return -1; } } } @@ -293,7 +296,7 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r { edfhdr->filetype = EDFLIB_NO_SUCH_FILE_OR_DIRECTORY; - return(-1); + return -1; } hdr = edflib_check_edf_file(file, &edf_error); @@ -303,7 +306,7 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r fclose(file); - return(-1); + return -1; } if(hdr->discontinuous) @@ -315,7 +318,7 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r fclose(file); - return(-1); + return -1; } hdr->writemode = 0; @@ -409,9 +412,14 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r fclose(file); free(hdr->edfparam); + hdr->edfparam = NULL; free(hdr); + hdr = NULL; + hdrlist[edfhdr->handle] = NULL; + free(annotationslist[edfhdr->handle]); + annotationslist[edfhdr->handle] = NULL; - return(-1); + return -1; } } @@ -448,7 +456,7 @@ int edfopen_file_readonly(const char *path, struct edf_hdr_struct *edfhdr, int r edfhdr->signalparam[i].smp_in_datarecord = hdr->edfparam[channel].smp_per_record; } - return(0); + return 0; } @@ -456,7 +464,7 @@ int edfclose_file(int handle) { struct edf_write_annotationblock *annot2; - int i, j, k, n, p, + int i, j, k, n, p, err, datrecsize, nmemb; @@ -470,17 +478,17 @@ int edfclose_file(int handle) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -489,9 +497,26 @@ int edfclose_file(int handle) { if(hdr->datarecords == 0LL) { - if(edflib_write_edf_header(hdr)) + err = edflib_write_edf_header(hdr); + if(err) { - return(-1); + fclose(hdr->file_hdl); + + free(hdr->edfparam); + + free(hdr->wrbuf); + + free(hdr); + + hdrlist[handle] = NULL; + + free(write_annotationslist[handle]); + + write_annotationslist[handle] = NULL; + + edf_files_open--; + + return err; } for(k=0; k<hdr->annots_in_file; k++) @@ -650,13 +675,15 @@ int edfclose_file(int handle) free(hdr->edfparam); + free(hdr->wrbuf); + free(hdr); hdrlist[handle] = NULL; edf_files_open--; - return(0); + return 0; } @@ -669,32 +696,32 @@ long long edfseek(int handle, int edfsignal, long long offset, int whence) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(hdrlist[handle]->writemode) { - return(-1); + return -1; } if(edfsignal>=(hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { - return(-1); + return -1; } channel = hdrlist[handle]->mapped_signals[edfsignal]; @@ -727,7 +754,7 @@ long long edfseek(int handle, int edfsignal, long long offset, int whence) hdrlist[handle]->edfparam[channel].sample_pntr = 0LL; } - return(hdrlist[handle]->edfparam[channel].sample_pntr); + return hdrlist[handle]->edfparam[channel].sample_pntr; } @@ -738,37 +765,37 @@ long long edftell(int handle, int edfsignal) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(hdrlist[handle]->writemode) { - return(-1); + return -1; } if(edfsignal>=(hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { - return(-1); + return -1; } channel = hdrlist[handle]->mapped_signals[edfsignal]; - return(hdrlist[handle]->edfparam[channel].sample_pntr); + return hdrlist[handle]->edfparam[channel].sample_pntr; } @@ -844,44 +871,44 @@ int edfread_physical_samples(int handle, int edfsignal, int n, double *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(hdrlist[handle]->writemode) { - return(-1); + return -1; } if(edfsignal>=(hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { - return(-1); + return -1; } channel = hdrlist[handle]->mapped_signals[edfsignal]; if(n<0LL) { - return(-1); + return -1; } if(n==0LL) { - return(0LL); + return 0LL; } hdr = hdrlist[handle]; @@ -904,12 +931,12 @@ int edfread_physical_samples(int handle, int edfsignal, int n, double *buf) if(n==0) { - return(0LL); + return 0LL; } if(n<0) { - return(-1); + return -1; } } @@ -948,7 +975,7 @@ int edfread_physical_samples(int handle, int edfsignal, int n, double *buf) tmp = fgetc(file); if(tmp==EOF) { - return(-1); + return -1; } var.four[1] = tmp; @@ -975,7 +1002,7 @@ int edfread_physical_samples(int handle, int edfsignal, int n, double *buf) tmp = fgetc(file); if(tmp==EOF) { - return(-1); + return -1; } var.four[2] = tmp; @@ -996,7 +1023,7 @@ int edfread_physical_samples(int handle, int edfsignal, int n, double *buf) hdr->edfparam[channel].sample_pntr = sample_pntr; - return(n); + return n; } @@ -1028,44 +1055,44 @@ int edfread_digital_samples(int handle, int edfsignal, int n, int *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(hdrlist[handle]->writemode) { - return(-1); + return -1; } if(edfsignal>=(hdrlist[handle]->edfsignals - hdrlist[handle]->nr_annot_chns)) { - return(-1); + return -1; } channel = hdrlist[handle]->mapped_signals[edfsignal]; if(n<0LL) { - return(-1); + return -1; } if(n==0LL) { - return(0LL); + return 0LL; } hdr = hdrlist[handle]; @@ -1088,12 +1115,12 @@ int edfread_digital_samples(int handle, int edfsignal, int n, int *buf) if(n==0) { - return(0LL); + return 0LL; } if(n<0) { - return(-1); + return -1; } } @@ -1128,7 +1155,7 @@ int edfread_digital_samples(int handle, int edfsignal, int n, int *buf) tmp = fgetc(file); if(tmp==EOF) { - return(-1); + return -1; } var.four[1] = tmp; @@ -1155,7 +1182,7 @@ int edfread_digital_samples(int handle, int edfsignal, int n, int *buf) tmp = fgetc(file); if(tmp==EOF) { - return(-1); + return -1; } var.four[2] = tmp; @@ -1176,7 +1203,7 @@ int edfread_digital_samples(int handle, int edfsignal, int n, int *buf) hdr->edfparam[channel].sample_pntr = sample_pntr; - return(n); + return n; } @@ -1186,39 +1213,39 @@ int edf_get_annotation(int handle, int n, struct edf_annotation_struct *annot) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(hdrlist[handle]->writemode) { - return(-1); + return -1; } if(n<0) { - return(-1); + return -1; } if(n>=hdrlist[handle]->annots_in_file) { - return(-1); + return -1; } annot->onset = (annotationslist[handle] + n)->onset; strcpy(annot->duration, (annotationslist[handle] + n)->duration); strcpy(annot->annotation, (annotationslist[handle] + n)->annotation); - return(0); + return 0; } @@ -1240,7 +1267,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro if(edf_hdr==NULL) { *edf_error = EDFLIB_MALLOC_ERROR; - return(NULL); + return NULL; } edfhdr = (struct edfhdrblock *)calloc(1, sizeof(struct edfhdrblock)); @@ -1248,7 +1275,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro { free(edf_hdr); *edf_error = EDFLIB_MALLOC_ERROR; - return(NULL); + return NULL; } rewind(inputfile); @@ -1257,7 +1284,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_READ_ERROR; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } /**************************** VERSION ***************************************/ @@ -1274,7 +1301,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1283,7 +1310,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->bdf = 1; @@ -1297,7 +1324,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1306,7 +1333,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->edf = 1; @@ -1327,7 +1354,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1345,7 +1372,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1363,7 +1390,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1384,7 +1411,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } scratchpad[2] = 0; @@ -1398,7 +1425,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } if((edflib_atof_nonlocalized(scratchpad+3)<1)||(edflib_atof_nonlocalized(scratchpad+3)>12)) @@ -1408,7 +1435,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->startdate_day = edflib_atof_nonlocalized(scratchpad); @@ -1434,7 +1461,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1457,7 +1484,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } scratchpad[2] = 0; @@ -1471,7 +1498,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } if(edflib_atof_nonlocalized(scratchpad+3)>59) @@ -1481,7 +1508,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } if(edflib_atof_nonlocalized(scratchpad+6)>59) @@ -1491,7 +1518,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->starttime_hour = edflib_atof_nonlocalized(scratchpad); @@ -1515,7 +1542,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1524,7 +1551,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->edfsignals = edflib_atof_nonlocalized(scratchpad); if(edfhdr->edfsignals<1) @@ -1532,7 +1559,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } if(edfhdr->edfsignals>EDFLIB_MAXSIGNALS) @@ -1540,7 +1567,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } /***************** NUMBER OF BYTES IN HEADER *******************************/ @@ -1555,7 +1582,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1564,7 +1591,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } n = edflib_atof_nonlocalized(scratchpad); @@ -1573,7 +1600,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } /********************* RESERVED FIELD *************************************/ @@ -1590,7 +1617,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1637,7 +1664,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1646,7 +1673,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->datarecords = edflib_atof_nonlocalized(scratchpad); @@ -1655,7 +1682,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } /********************* DATARECORD DURATION *************************************/ @@ -1670,7 +1697,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } } @@ -1679,7 +1706,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->data_record_duration = edflib_atof_nonlocalized(scratchpad); @@ -1688,7 +1715,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->long_data_record_duration = edflib_get_long_duration(scratchpad); @@ -1702,7 +1729,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro { *edf_error = EDFLIB_MALLOC_ERROR; free(edfhdr); - return(NULL); + return NULL; } rewind(inputfile); @@ -1711,7 +1738,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_FILE_READ_ERROR; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } edfhdr->edfparam = (struct edfparamblock *)calloc(1, sizeof(struct edfparamblock) * edfhdr->edfsignals); @@ -1720,7 +1747,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro *edf_error = EDFLIB_MALLOC_ERROR; free(edf_hdr); free(edfhdr); - return(NULL); + return NULL; } /**************************** LABELS *************************************/ @@ -1737,7 +1764,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } if(edfhdr->edfplus) @@ -1767,7 +1794,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } if(edfhdr->bdfplus&&(!edfhdr->nr_annot_chns)) { @@ -1775,7 +1802,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } if((edfhdr->edfsignals!=edfhdr->nr_annot_chns)||((!edfhdr->edfplus)&&(!edfhdr->bdfplus))) { @@ -1785,7 +1812,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -1802,7 +1829,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } strncpy(edfhdr->edfparam[i].transducer, edf_hdr + 256 + (edfhdr->edfsignals * 16) + (i * 80), 80); @@ -1820,7 +1847,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } } @@ -1840,7 +1867,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } strncpy(edfhdr->edfparam[i].physdimension, edf_hdr + 256 + (edfhdr->edfsignals * 96) + (i * 8), 8); @@ -1862,7 +1889,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -1872,7 +1899,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } edfhdr->edfparam[i].phys_min = edflib_atof_nonlocalized(scratchpad); @@ -1893,7 +1920,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -1903,7 +1930,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } edfhdr->edfparam[i].phys_max = edflib_atof_nonlocalized(scratchpad); @@ -1913,7 +1940,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -1932,7 +1959,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -1942,7 +1969,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } n = edflib_atof_nonlocalized(scratchpad); @@ -1956,7 +1983,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } } @@ -1970,7 +1997,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } } @@ -1982,7 +2009,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } if(edfhdr->bdf) @@ -1993,7 +2020,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } edfhdr->edfparam[i].dig_min = n; @@ -2014,7 +2041,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -2024,7 +2051,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } n = edflib_atof_nonlocalized(scratchpad); @@ -2038,7 +2065,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } } @@ -2052,7 +2079,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } } @@ -2064,7 +2091,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } else @@ -2075,7 +2102,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } edfhdr->edfparam[i].dig_max = n; @@ -2085,7 +2112,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -2102,7 +2129,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } strncpy(edfhdr->edfparam[i].prefilter, edf_hdr + 256 + (edfhdr->edfsignals * 136) + (i * 80), 80); @@ -2120,7 +2147,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } } @@ -2144,7 +2171,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -2154,7 +2181,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } n = edflib_atof_nonlocalized(scratchpad); @@ -2164,7 +2191,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } edfhdr->edfparam[i].smp_per_record = n; edfhdr->recordsize += n; @@ -2174,26 +2201,26 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro { edfhdr->recordsize *= 3; - if(edfhdr->recordsize > 15728640) + if(edfhdr->recordsize > (15 * 1024 * 1024)) { *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } else { edfhdr->recordsize *= 2; - if(edfhdr->recordsize > 10485760) + if(edfhdr->recordsize > (10 * 1024 * 1024)) { *edf_error = EDFLIB_FILE_CONTAINS_FORMAT_ERRORS; free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -2210,7 +2237,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } strncpy(edfhdr->edfparam[i].reserved, edf_hdr + 256 + (edfhdr->edfsignals * 224) + (i * 32), 32); @@ -2285,7 +2312,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } p = 0; @@ -2447,7 +2474,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } if(edf_hdr[98]!='X') @@ -2468,7 +2495,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } edfhdr->startdate_year = edflib_atof_nonlocalized(scratchpad2 + 7); @@ -2479,7 +2506,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } } @@ -2579,7 +2606,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); free(edfhdr->edfparam); free(edfhdr); - return(NULL); + return NULL; } n = 0; @@ -2598,7 +2625,7 @@ static struct edfhdrblock * edflib_check_edf_file(FILE *inputfile, int *edf_erro free(edf_hdr); - return(edfhdr); + return edfhdr; } @@ -2610,7 +2637,7 @@ static int edflib_is_integer_number(char *str) l = strlen(str); - if(!l) return(1); + if(!l) return 1; if((str[0]=='+')||(str[0]=='-')) { @@ -2624,7 +2651,7 @@ static int edflib_is_integer_number(char *str) { if(!digit) { - return(1); + return 1; } hasspace++; } @@ -2632,21 +2659,21 @@ static int edflib_is_integer_number(char *str) { if((str[i]<48)||(str[i]>57)) { - return(1); + return 1; } else { if(hasspace) { - return(1); + return 1; } digit++; } } } - if(digit) return(0); - else return(1); + if(digit) return 0; + else return 1; } @@ -2657,7 +2684,7 @@ static int edflib_is_number(char *str) l = strlen(str); - if(!l) return(1); + if(!l) return 1; if((str[0]=='+')||(str[0]=='-')) { @@ -2671,7 +2698,7 @@ static int edflib_is_number(char *str) { if((!digit)||hasexp) { - return(1); + return 1; } hasexp++; hassign = 0; @@ -2684,7 +2711,7 @@ static int edflib_is_number(char *str) { if(!digit) { - return(1); + return 1; } hasspace++; } @@ -2692,17 +2719,17 @@ static int edflib_is_number(char *str) { if(((str[i]<48)||(str[i]>57))&&str[i]!='.') { - return(1); + return 1; } else { if(hasspace) { - return(1); + return 1; } if(str[i]=='.') { - if(hasdot) return(1); + if(hasdot) return 1; hasdot++; } else @@ -2717,7 +2744,7 @@ static int edflib_is_number(char *str) { if(++i==l) { - return(1); + return 1; } if((str[i]=='+')||(str[i]=='-')) @@ -2732,7 +2759,7 @@ static int edflib_is_number(char *str) { if(!digit) { - return(1); + return 1; } hasspace++; } @@ -2740,13 +2767,13 @@ static int edflib_is_number(char *str) { if((str[i]<48)||(str[i]>57)) { - return(1); + return 1; } else { if(hasspace) { - return(1); + return 1; } digit++; @@ -2755,8 +2782,8 @@ static int edflib_is_number(char *str) } } - if(digit) return(0); - else return(1); + if(digit) return 0; + else return 1; } @@ -2824,13 +2851,13 @@ static long long edflib_get_long_duration(char *str) } } - return(value); + return value; } int edflib_version(void) { - return(EDFLIB_VERSION); + return EDFLIB_VERSION; } @@ -2893,7 +2920,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ cnv_buf = (char *)calloc(1, recordsize); if(cnv_buf==NULL) { - return(1); + return 1; } max_tal_ln = 0; @@ -2909,7 +2936,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ if(scratchpad==NULL) { free(cnv_buf); - return(1); + return 1; } time_in_txt = (char *)calloc(1, max_tal_ln + 3); @@ -2917,7 +2944,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ { free(cnv_buf); free(scratchpad); - return(1); + return 1; } duration_in_txt = (char *)calloc(1, max_tal_ln + 3); @@ -2926,7 +2953,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ free(cnv_buf); free(scratchpad); free(time_in_txt); - return(1); + return 1; } if(fseeko(inputfile, (long long)((edfsignals + 1) * 256), SEEK_SET)) @@ -2935,7 +2962,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ free(scratchpad); free(time_in_txt); free(duration_in_txt); - return(2); + return 2; } elapsedtime = 0; @@ -2948,7 +2975,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ free(scratchpad); free(time_in_txt); free(duration_in_txt); - return(2); + return 2; } @@ -3102,7 +3129,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ free(scratchpad); free(time_in_txt); free(duration_in_txt); - return(-1); + return -1; } annotationslist[hdl] = malloc_list; @@ -3201,7 +3228,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ free(scratchpad); free(time_in_txt); free(duration_in_txt); - return(9); + return 9; } } } @@ -3211,7 +3238,7 @@ static int edflib_get_annotations(struct edfhdrblock *edfhdr, int hdl, int read_ free(time_in_txt); free(duration_in_txt); - return(0); + return 0; } @@ -3221,24 +3248,24 @@ static int edflib_is_duration_number(char *str) l = strlen(str); - if(!l) return(1); + if(!l) return 1; - if((str[0] == '.')||(str[l-1] == '.')) return(1); + if((str[0] == '.')||(str[l-1] == '.')) return 1; for(i=0; i<l; i++) { if(str[i]=='.') { - if(hasdot) return(1); + if(hasdot) return 1; hasdot++; } else { - if((str[i]<48)||(str[i]>57)) return(1); + if((str[i]<48)||(str[i]>57)) return 1; } } - return(0); + return 0; } @@ -3249,37 +3276,45 @@ static int edflib_is_onset_number(char *str) l = strlen(str); - if(l<2) return(1); + if(l<2) return 1; - if((str[0]!='+')&&(str[0]!='-')) return(1); + if((str[0]!='+')&&(str[0]!='-')) return 1; - if((str[1] == '.')||(str[l-1] == '.')) return(1); + if((str[1] == '.')||(str[l-1] == '.')) return 1; for(i=1; i<l; i++) { if(str[i]=='.') { - if(hasdot) return(1); + if(hasdot) return 1; hasdot++; } else { - if((str[i]<48)||(str[i]>57)) return(1); + if((str[i]<48)||(str[i]>57)) return 1; } } - return(0); + return 0; } static long long edflib_get_long_time(char *str) { - int i, len, hasdot=0, dotposition=0; + int i, len, hasdot=0, dotposition=0, neg=0; long long value=0, radix; - str = str + 1; + if(str[0] == '+') + { + str++; + } + else if(str[0] == '-') + { + neg = 1; + str++; + } len = strlen(str); @@ -3322,9 +3357,9 @@ static long long edflib_get_long_time(char *str) } } - if(str[-1]=='-') value = -value; + if(neg) value = -value; - return(value); + return value; } @@ -3602,12 +3637,12 @@ int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals if((filetype!=EDFLIB_FILETYPE_EDFPLUS)&&(filetype!=EDFLIB_FILETYPE_BDFPLUS)) { - return(EDFLIB_FILETYPE_ERROR); + return EDFLIB_FILETYPE_ERROR; } if(edf_files_open>=EDFLIB_MAXFILES) { - return(EDFLIB_MAXFILES_REACHED); + return EDFLIB_MAXFILES_REACHED; } for(i=0; i<EDFLIB_MAXFILES; i++) @@ -3616,25 +3651,25 @@ int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals { if(!(strcmp(path, hdrlist[i]->path))) { - return(EDFLIB_FILE_ALREADY_OPENED); + return EDFLIB_FILE_ALREADY_OPENED; } } } if(number_of_signals<0) { - return(EDFLIB_NUMBER_OF_SIGNALS_INVALID); + return EDFLIB_NUMBER_OF_SIGNALS_INVALID; } if(number_of_signals>EDFLIB_MAXSIGNALS) { - return(EDFLIB_NUMBER_OF_SIGNALS_INVALID); + return EDFLIB_NUMBER_OF_SIGNALS_INVALID; } hdr = (struct edfhdrblock *)calloc(1, sizeof(struct edfhdrblock)); if(hdr==NULL) { - return(EDFLIB_MALLOC_ERROR); + return EDFLIB_MALLOC_ERROR; } hdr->edfparam = (struct edfparamblock *)calloc(1, sizeof(struct edfparamblock) * number_of_signals); @@ -3642,7 +3677,7 @@ int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals { free(hdr); - return(EDFLIB_MALLOC_ERROR); + return EDFLIB_MALLOC_ERROR; } hdr->writemode = 1; @@ -3669,7 +3704,7 @@ int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals free(hdr); - return(EDFLIB_MAXFILES_REACHED); + return EDFLIB_MAXFILES_REACHED; } write_annotationslist[handle] = NULL; @@ -3682,10 +3717,12 @@ int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals if(file==NULL) { free(hdr->edfparam); - + hdr->edfparam = NULL; free(hdr); + hdr = NULL; + hdrlist[handle] = NULL; - return(EDFLIB_NO_SUCH_FILE_OR_DIRECTORY); + return EDFLIB_NO_SUCH_FILE_OR_DIRECTORY; } hdr->file_hdl = file; @@ -3712,7 +3749,7 @@ int edfopen_file_writeonly(const char *path, int filetype, int number_of_signals hdr->nr_annot_chns = 1; - return(handle); + return handle; } @@ -3720,47 +3757,47 @@ int edf_set_samplefrequency(int handle, int edfsignal, int samplefrequency) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(samplefrequency<1) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } hdrlist[handle]->edfparam[edfsignal].smp_per_record = samplefrequency; - return(0); + return 0; } @@ -3768,37 +3805,37 @@ int edf_set_number_of_annotation_signals(int handle, int annot_signals) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } - if((annot_signals < 1) || (annot_signals > 64)) + if((annot_signals < 1) || (annot_signals > EDFLIB_MAX_ANNOTATION_CHANNELS)) { - return(-1); + return -1; } hdrlist[handle]->nr_annot_chns = annot_signals; - return(0); + return 0; } @@ -3806,32 +3843,32 @@ int edf_set_datarecord_duration(int handle, int duration) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } if((duration < 100) || (duration > 6000000)) { - return(-1); + return -1; } hdrlist[handle]->long_data_record_duration = (long long)duration * 100LL; @@ -3851,13 +3888,53 @@ int edf_set_datarecord_duration(int handle, int duration) hdrlist[handle]->data_record_duration = ((double)(hdrlist[handle]->long_data_record_duration)) / EDFLIB_TIME_DIMENSION; - return(0); + return 0; +} + + +int edf_set_micro_datarecord_duration(int handle, int duration) +{ + if(handle<0) + { + return -1; + } + + if(handle>=EDFLIB_MAXFILES) + { + return -1; + } + + if(hdrlist[handle]==NULL) + { + return -1; + } + + if(!(hdrlist[handle]->writemode)) + { + return -1; + } + + if(hdrlist[handle]->datarecords) + { + return -1; + } + + if((duration < 1) || (duration > 99)) + { + return -1; + } + + hdrlist[handle]->long_data_record_duration = (long long)duration * 10LL; + + hdrlist[handle]->data_record_duration = ((double)(hdrlist[handle]->long_data_record_duration)) / EDFLIB_TIME_DIMENSION; + + return 0; } int edfwrite_digital_short_samples(int handle, short *buf) { - int i, p, + int i, error, sf, digmax, @@ -3872,32 +3949,32 @@ int edfwrite_digital_short_samples(int handle, short *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } if(hdrlist[handle]->bdf == 1) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -3914,7 +3991,7 @@ int edfwrite_digital_short_samples(int handle, short *buf) if(error) { - return(error); + return error; } } } @@ -3925,32 +4002,72 @@ int edfwrite_digital_short_samples(int handle, short *buf) digmin = hdr->edfparam[edfsignal].dig_min; - for(i=0; i<sf; i++) + if(hdr->edf) { - value = buf[i]; - - if(value>digmax) + if((digmax != 32767) || (digmin != -32768)) { - value = digmax; + for(i=0; i<sf; i++) + { + if(buf[i]>digmax) + { + buf[i] = digmax; + } + + if(buf[i]<digmin) + { + buf[i] = digmin; + } + } } - if(value<digmin) + if(fwrite(buf, sf * 2, 1, file) != 1) { - value = digmin; + return -1; } + } + else // BDF + { + if(hdr->wrbufsize < (sf * 3)) + { + free(hdr->wrbuf); - fputc((value)&0xff, file); + hdr->wrbufsize = 0; - if(fputc((value>>8)&0xff, file)==EOF) - { - return(-1); + hdr->wrbuf = (char *)malloc(sf * 3); + + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 3; } - if(hdr->bdf) + for(i=0; i<sf; i++) { - fputc((value>>16)&0xff, file); + value = buf[i]; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 3] = value & 0xff; + + hdr->wrbuf[i * 3 + 1] = (value >> 8) & 0xff; + + hdr->wrbuf[i * 3 + 2] = (value >> 16) & 0xff; } + if(fwrite(hdr->wrbuf, sf * 3, 1, file) != 1) + { + return -1; + } } hdr->signal_write_sequence_pos++; @@ -3959,19 +4076,9 @@ int edfwrite_digital_short_samples(int handle, short *buf) { hdr->signal_write_sequence_pos = 0; - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) - { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) + if(edflib_write_tal(hdr, file)) { - fputc(0, file); + return -1; } hdr->datarecords++; @@ -3979,13 +4086,13 @@ int edfwrite_digital_short_samples(int handle, short *buf) fflush(file); } - return(0); + return 0; } int edfwrite_digital_samples(int handle, int *buf) { - int i, p, + int i, error, sf, digmax, @@ -4000,27 +4107,27 @@ int edfwrite_digital_samples(int handle, int *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -4037,7 +4144,7 @@ int edfwrite_digital_samples(int handle, int *buf) if(error) { - return(error); + return error; } } } @@ -4048,30 +4155,90 @@ int edfwrite_digital_samples(int handle, int *buf) digmin = hdr->edfparam[edfsignal].dig_min; - for(i=0; i<sf; i++) + if(hdr->edf) { - value = buf[i]; + if(hdr->wrbufsize < (sf * 2)) + { + free(hdr->wrbuf); - if(value>digmax) + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 2); + + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 2; + } + + for(i=0; i<sf; i++) { - value = digmax; + value = buf[i]; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 2] = value & 0xff; + + hdr->wrbuf[i * 2 + 1] = (value >> 8) & 0xff; } - if(value<digmin) + if(fwrite(hdr->wrbuf, sf * 2, 1, file) != 1) { - value = digmin; + return -1; } + } + else // BDF + { + if(hdr->wrbufsize < (sf * 3)) + { + free(hdr->wrbuf); + + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 3); - fputc((value)&0xff, file); + if(hdr->wrbuf == NULL) + { + return -1; + } - if(fputc((value>>8)&0xff, file)==EOF) + hdr->wrbufsize = sf * 3; + } + + for(i=0; i<sf; i++) { - return(-1); + value = buf[i]; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 3] = value & 0xff; + + hdr->wrbuf[i * 3 + 1] = (value >> 8) & 0xff; + + hdr->wrbuf[i * 3 + 2] = (value >> 16) & 0xff; } - if(hdr->bdf) + if(fwrite(hdr->wrbuf, sf * 3, 1, file) != 1) { - fputc((value>>16)&0xff, file); + return -1; } } @@ -4081,19 +4248,9 @@ int edfwrite_digital_samples(int handle, int *buf) { hdr->signal_write_sequence_pos = 0; - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + if(edflib_write_tal(hdr, file)) { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) - { - fputc(0, file); + return -1; } hdr->datarecords++; @@ -4101,13 +4258,13 @@ int edfwrite_digital_samples(int handle, int *buf) fflush(file); } - return(0); + return 0; } int edf_blockwrite_digital_samples(int handle, int *buf) { - int i, j, p, + int i, j, error, sf, digmax, @@ -4123,32 +4280,32 @@ int edf_blockwrite_digital_samples(int handle, int *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->signal_write_sequence_pos) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -4163,7 +4320,7 @@ int edf_blockwrite_digital_samples(int handle, int *buf) if(error) { - return(error); + return error; } } @@ -4177,62 +4334,112 @@ int edf_blockwrite_digital_samples(int handle, int *buf) digmin = hdr->edfparam[j].dig_min; - for(i=0; i<sf; i++) + if(hdr->edf) { - value = buf[i + buf_offset]; + if(hdr->wrbufsize < (sf * 2)) + { + free(hdr->wrbuf); - if(value>digmax) + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 2); + + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 2; + } + + for(i=0; i<sf; i++) { - value = digmax; + value = buf[i + buf_offset]; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 2] = value & 0xff; + + hdr->wrbuf[i * 2 + 1] = (value >> 8) & 0xff; } - if(value<digmin) + if(fwrite(hdr->wrbuf, sf * 2, 1, file) != 1) { - value = digmin; + return -1; } + } + else // BDF + { + if(hdr->wrbufsize < (sf * 3)) + { + free(hdr->wrbuf); + + hdr->wrbufsize = 0; - fputc(value&0xff, file); + hdr->wrbuf = (char *)malloc(sf * 3); - if(fputc((value>>8)&0xff, file)==EOF) + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 3; + } + + for(i=0; i<sf; i++) { - return(-1); + value = buf[i + buf_offset]; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 3] = value & 0xff; + + hdr->wrbuf[i * 3 + 1] = (value >> 8) & 0xff; + + hdr->wrbuf[i * 3 + 2] = (value >> 16) & 0xff; } - if(hdr->bdf) + if(fwrite(hdr->wrbuf, sf * 3, 1, file) != 1) { - fputc((value>>16)&0xff, file); + return -1; } } buf_offset += sf; } - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + if(edflib_write_tal(hdr, file)) { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) - { - fputc(0, file); + return -1; } hdr->datarecords++; fflush(file); - return(0); + return 0; } int edf_blockwrite_digital_short_samples(int handle, short *buf) { - int i, j, p, + int i, j, error, sf, digmax, @@ -4248,37 +4455,37 @@ int edf_blockwrite_digital_short_samples(int handle, short *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->signal_write_sequence_pos) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } if(hdrlist[handle]->bdf == 1) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -4293,7 +4500,7 @@ int edf_blockwrite_digital_short_samples(int handle, short *buf) if(error) { - return(error); + return error; } } @@ -4307,62 +4514,93 @@ int edf_blockwrite_digital_short_samples(int handle, short *buf) digmin = hdr->edfparam[j].dig_min; - for(i=0; i<sf; i++) + if(hdr->edf) { - value = buf[i + buf_offset]; - - if(value>digmax) + if((digmax != 32767) || (digmin != -32768)) { - value = digmax; + for(i=0; i<sf; i++) + { + if(buf[i + buf_offset] > digmax) + { + buf[i + buf_offset] = digmax; + } + + if(buf[i + buf_offset] < digmin) + { + buf[i + buf_offset] = digmin; + } + } } - if(value<digmin) + if(fwrite(buf + buf_offset, sf * 2, 1, file) != 1) { - value = digmin; + return -1; } + } + else // BDF + { + if(hdr->wrbufsize < (sf * 3)) + { + free(hdr->wrbuf); + + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 3); - fputc(value&0xff, file); + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 3; + } - if(fputc((value>>8)&0xff, file)==EOF) + for(i=0; i<sf; i++) { - return(-1); + value = buf[i + buf_offset]; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 3] = value & 0xff; + + hdr->wrbuf[i * 3 + 1] = (value >> 8) & 0xff; + + hdr->wrbuf[i * 3 + 2] = (value >> 16) & 0xff; } - if(hdr->bdf) + if(fwrite(hdr->wrbuf, sf * 3, 1, file) != 1) { - fputc((value>>16)&0xff, file); + return -1; } } buf_offset += sf; } - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + if(edflib_write_tal(hdr, file)) { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) - { - fputc(0, file); + return -1; } hdr->datarecords++; fflush(file); - return(0); + return 0; } int edf_blockwrite_digital_3byte_samples(int handle, void *buf) { - int j, p, + int j, error, edfsignals, total_samples=0; @@ -4374,37 +4612,37 @@ int edf_blockwrite_digital_3byte_samples(int handle, void *buf) if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->signal_write_sequence_pos) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } if(hdrlist[handle]->bdf != 1) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -4419,7 +4657,7 @@ int edf_blockwrite_digital_3byte_samples(int handle, void *buf) if(error) { - return(error); + return error; } } @@ -4430,35 +4668,25 @@ int edf_blockwrite_digital_3byte_samples(int handle, void *buf) if(fwrite(buf, total_samples * 3, 1, file) != 1) { - return(-1); + return -1; } - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + if(edflib_write_tal(hdr, file)) { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) - { - fputc(0, file); + return -1; } hdr->datarecords++; fflush(file); - return(0); + return 0; } int edfwrite_physical_samples(int handle, double *buf) { - int i, p, + int i, error, sf, digmax, @@ -4474,31 +4702,29 @@ int edfwrite_physical_samples(int handle, double *buf) struct edfhdrblock *hdr; - - if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -4515,7 +4741,7 @@ int edfwrite_physical_samples(int handle, double *buf) if(error) { - return(error); + return error; } } } @@ -4530,30 +4756,90 @@ int edfwrite_physical_samples(int handle, double *buf) phys_offset = hdr->edfparam[edfsignal].offset; - for(i=0; i<sf; i++) + if(hdr->edf) { - value = (buf[i] / bitvalue) - phys_offset; + if(hdr->wrbufsize < (sf * 2)) + { + free(hdr->wrbuf); + + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 2); + + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 2; + } - if(value>digmax) + for(i=0; i<sf; i++) { - value = digmax; + value = (buf[i] / bitvalue) - phys_offset; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 2] = value & 0xff; + + hdr->wrbuf[i * 2 + 1] = (value >> 8) & 0xff; } - if(value<digmin) + if(fwrite(hdr->wrbuf, sf * 2, 1, file) != 1) { - value = digmin; + return -1; } + } + else // BDF + { + if(hdr->wrbufsize < (sf * 3)) + { + free(hdr->wrbuf); - fputc(value&0xff, file); + hdr->wrbufsize = 0; - if(fputc((value>>8)&0xff, file)==EOF) + hdr->wrbuf = (char *)malloc(sf * 3); + + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 3; + } + + for(i=0; i<sf; i++) { - return(-1); + value = (buf[i] / bitvalue) - phys_offset; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 3] = value & 0xff; + + hdr->wrbuf[i * 3 + 1] = (value >> 8) & 0xff; + + hdr->wrbuf[i * 3 + 2] = (value >> 16) & 0xff; } - if(hdr->bdf) + if(fwrite(hdr->wrbuf, sf * 3, 1, file) != 1) { - fputc((value>>16)&0xff, file); + return -1; } } @@ -4563,19 +4849,9 @@ int edfwrite_physical_samples(int handle, double *buf) { hdr->signal_write_sequence_pos = 0; - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + if(edflib_write_tal(hdr, file)) { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) - { - fputc(0, file); + return -1; } hdr->datarecords++; @@ -4583,13 +4859,13 @@ int edfwrite_physical_samples(int handle, double *buf) fflush(file); } - return(0); + return 0; } int edf_blockwrite_physical_samples(int handle, double *buf) { - int i, j, p, + int i, j, error, sf, digmax, @@ -4606,36 +4882,34 @@ int edf_blockwrite_physical_samples(int handle, double *buf) struct edfhdrblock *hdr; - - if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->signal_write_sequence_pos) { - return(-1); + return -1; } if(hdrlist[handle]->edfsignals == 0) { - return(-1); + return -1; } hdr = hdrlist[handle]; @@ -4650,7 +4924,7 @@ int edf_blockwrite_physical_samples(int handle, double *buf) if(error) { - return(error); + return error; } } @@ -4668,56 +4942,106 @@ int edf_blockwrite_physical_samples(int handle, double *buf) phys_offset = hdr->edfparam[j].offset; - for(i=0; i<sf; i++) + if(hdr->edf) { - value = (buf[i + buf_offset] / bitvalue) - phys_offset; + if(hdr->wrbufsize < (sf * 2)) + { + free(hdr->wrbuf); - if(value>digmax) + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 2); + + if(hdr->wrbuf == NULL) + { + return -1; + } + + hdr->wrbufsize = sf * 2; + } + + for(i=0; i<sf; i++) { - value = digmax; + value = (buf[i + buf_offset] / bitvalue) - phys_offset; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 2] = value & 0xff; + + hdr->wrbuf[i * 2 + 1] = (value >> 8) & 0xff; } - if(value<digmin) + if(fwrite(hdr->wrbuf, sf * 2, 1, file) != 1) { - value = digmin; + return -1; } + } + else // BDF + { + if(hdr->wrbufsize < (sf * 3)) + { + free(hdr->wrbuf); + + hdr->wrbufsize = 0; + + hdr->wrbuf = (char *)malloc(sf * 3); - fputc(value&0xff, file); + if(hdr->wrbuf == NULL) + { + return -1; + } - if(fputc((value>>8)&0xff, file)==EOF) + hdr->wrbufsize = sf * 3; + } + + for(i=0; i<sf; i++) { - return(-1); + value = (buf[i + buf_offset] / bitvalue) - phys_offset; + + if(value>digmax) + { + value = digmax; + } + + if(value<digmin) + { + value = digmin; + } + + hdr->wrbuf[i * 3] = value & 0xff; + + hdr->wrbuf[i * 3 + 1] = (value >> 8) & 0xff; + + hdr->wrbuf[i * 3 + 2] = (value >> 16) & 0xff; } - if(hdr->bdf) + if(fwrite(hdr->wrbuf, sf * 3, 1, file) != 1) { - fputc((value>>16)&0xff, file); + return -1; } } buf_offset += sf; } - p = edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); - if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + if(edflib_write_tal(hdr, file)) { - fputc('.', file); - p++; - p += edflib_fprint_ll_number_nonlocalized(file, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); - } - fputc(20, file); - fputc(20, file); - p += 2; - for(; p<hdr->total_annot_bytes; p++) - { - fputc(0, file); + return -1; } hdr->datarecords++; fflush(file); - return(0); + return 0; } @@ -4743,38 +5067,44 @@ static int edflib_write_edf_header(struct edfhdrblock *hdr) if(edfsignals<0) { - return(-20); + return EDFLIB_NO_SIGNALS; } if(edfsignals>EDFLIB_MAXSIGNALS) { - return(-21); + return EDFLIB_TOO_MANY_SIGNALS; } hdr->eq_sf = 1; + hdr->recordsize = 0; + + hdr->total_annot_bytes = EDFLIB_ANNOTATION_BYTES * hdr->nr_annot_chns; + for(i=0; i<edfsignals; i++) { if(hdr->edfparam[i].smp_per_record<1) { - return(-22); + return EDFLIB_NO_SAMPLES_IN_RECORD; } if(hdr->edfparam[i].dig_max==hdr->edfparam[i].dig_min) { - return(-23); + return EDFLIB_DIGMIN_IS_DIGMAX; } if(hdr->edfparam[i].dig_max<hdr->edfparam[i].dig_min) { - return(-24); + return EDFLIB_DIGMAX_LOWER_THAN_DIGMIN; } if(hdr->edfparam[i].phys_max==hdr->edfparam[i].phys_min) { - return(-25); + return EDFLIB_PHYSMIN_IS_PHYSMAX; } + hdr->recordsize += hdr->edfparam[i].smp_per_record; + if(i > 0) { if(hdr->edfparam[i].smp_per_record != hdr->edfparam[i-1].smp_per_record) @@ -4784,6 +5114,31 @@ static int edflib_write_edf_header(struct edfhdrblock *hdr) } } + if(hdr->edf) + { + hdr->recordsize *= 2; + + hdr->recordsize += hdr->total_annot_bytes; + + if(hdr->recordsize > (10 * 1024 * 1024)) /* datarecord size should not exceed 10MB for EDF */ + { + return EDFLIB_DATARECORD_SIZE_TOO_BIG; + } /* if your application gets hit by this limitation, lower the value for the datarecord duration */ + /* using the function edf_set_datarecord_duration() */ + } + else + { + hdr->recordsize *= 3; + + hdr->recordsize += hdr->total_annot_bytes; + + if(hdr->recordsize > (15 * 1024 * 1024)) /* datarecord size should not exceed 15MB for BDF */ + { + return EDFLIB_DATARECORD_SIZE_TOO_BIG; + } /* if your application gets hit by this limitation, lower the value for the datarecord duration */ + /* using the function edf_set_datarecord_duration() */ + } + for(i=0; i<edfsignals; i++) { hdr->edfparam[i].bitvalue = (hdr->edfparam[i].phys_max - hdr->edfparam[i].phys_min) / (hdr->edfparam[i].dig_max - hdr->edfparam[i].dig_min); @@ -5312,9 +5667,7 @@ static int edflib_write_edf_header(struct edfhdrblock *hdr) fputc(' ', file); } - hdr->total_annot_bytes = EDFLIB_ANNOTATION_BYTES * hdr->nr_annot_chns; - - return(0); + return 0; } @@ -5322,37 +5675,37 @@ int edf_set_label(int handle, int edfsignal, const char *label) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->edfparam[edfsignal].label, label, 16); @@ -5361,7 +5714,7 @@ int edf_set_label(int handle, int edfsignal, const char *label) edflib_remove_padding_trailing_spaces(hdrlist[handle]->edfparam[edfsignal].label); - return(0); + return 0; } @@ -5369,37 +5722,37 @@ int edf_set_physical_dimension(int handle, int edfsignal, const char *phys_dim) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->edfparam[edfsignal].physdimension, phys_dim, 8); @@ -5408,7 +5761,7 @@ int edf_set_physical_dimension(int handle, int edfsignal, const char *phys_dim) edflib_remove_padding_trailing_spaces(hdrlist[handle]->edfparam[edfsignal].physdimension); - return(0); + return 0; } @@ -5416,42 +5769,42 @@ int edf_set_physical_maximum(int handle, int edfsignal, double phys_max) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } hdrlist[handle]->edfparam[edfsignal].phys_max = phys_max; - return(0); + return 0; } @@ -5459,42 +5812,42 @@ int edf_set_physical_minimum(int handle, int edfsignal, double phys_min) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } hdrlist[handle]->edfparam[edfsignal].phys_min = phys_min; - return(0); + return 0; } @@ -5502,57 +5855,57 @@ int edf_set_digital_maximum(int handle, int edfsignal, int dig_max) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->edf) { if(dig_max > 32767) { - return(-1); + return -1; } } else { if(dig_max > 8388607) { - return(-1); + return -1; } } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } hdrlist[handle]->edfparam[edfsignal].dig_max = dig_max; - return(0); + return 0; } @@ -5560,57 +5913,57 @@ int edf_set_digital_minimum(int handle, int edfsignal, int dig_min) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->edf) { if(dig_min < (-32768)) { - return(-1); + return -1; } } else { if(dig_min < (-8388608)) { - return(-1); + return -1; } } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } hdrlist[handle]->edfparam[edfsignal].dig_min = dig_min; - return(0); + return 0; } @@ -5618,27 +5971,27 @@ int edf_set_patientname(int handle, const char *patientname) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_patient_name, patientname, 80); @@ -5647,7 +6000,7 @@ int edf_set_patientname(int handle, const char *patientname) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_patient_name); - return(0); + return 0; } @@ -5655,27 +6008,27 @@ int edf_set_patientcode(int handle, const char *patientcode) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_patientcode, patientcode, 80); @@ -5684,7 +6037,7 @@ int edf_set_patientcode(int handle, const char *patientcode) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_patientcode); - return(0); + return 0; } @@ -5692,32 +6045,32 @@ int edf_set_gender(int handle, int gender) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } if((gender<0)||(gender>1)) { - return(-1); + return -1; } if(gender) @@ -5731,7 +6084,7 @@ int edf_set_gender(int handle, int gender) hdrlist[handle]->plus_gender[1] = 0; - return(0); + return 0; } @@ -5739,41 +6092,41 @@ int edf_set_birthdate(int handle, int birthdate_year, int birthdate_month, int b { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } if((birthdate_year<1800) || (birthdate_year>3000) || (birthdate_month<1) || (birthdate_month>12) || (birthdate_day<1) || (birthdate_day>31)) { - return(-1); + return -1; } sprintf(hdrlist[handle]->plus_birthdate, "%02i.%02i.%02i%02i", birthdate_day, birthdate_month, birthdate_year / 100, birthdate_year % 100); hdrlist[handle]->plus_birthdate[10] = 0; - return(0); + return 0; } @@ -5781,27 +6134,27 @@ int edf_set_patient_additional(int handle, const char *patient_additional) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_patient_additional, patient_additional, 80); @@ -5810,7 +6163,7 @@ int edf_set_patient_additional(int handle, const char *patient_additional) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_patient_additional); - return(0); + return 0; } @@ -5818,27 +6171,27 @@ int edf_set_admincode(int handle, const char *admincode) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_admincode, admincode, 80); @@ -5847,7 +6200,7 @@ int edf_set_admincode(int handle, const char *admincode) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_admincode); - return(0); + return 0; } @@ -5855,27 +6208,27 @@ int edf_set_technician(int handle, const char *technician) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_technician, technician, 80); @@ -5884,7 +6237,7 @@ int edf_set_technician(int handle, const char *technician) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_technician); - return(0); + return 0; } @@ -5892,27 +6245,27 @@ int edf_set_equipment(int handle, const char *equipment) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_equipment, equipment, 80); @@ -5921,7 +6274,7 @@ int edf_set_equipment(int handle, const char *equipment) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_equipment); - return(0); + return 0; } @@ -5929,27 +6282,27 @@ int edf_set_recording_additional(int handle, const char *recording_additional) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->plus_recording_additional, recording_additional, 80); @@ -5958,7 +6311,7 @@ int edf_set_recording_additional(int handle, const char *recording_additional) edflib_remove_padding_trailing_spaces(hdrlist[handle]->plus_recording_additional); - return(0); + return 0; } @@ -5967,27 +6320,27 @@ int edf_set_startdatetime(int handle, int startdate_year, int startdate_month, i { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } if((startdate_year<1970) || (startdate_year>3000) || @@ -5997,7 +6350,7 @@ int edf_set_startdatetime(int handle, int startdate_year, int startdate_month, i (starttime_minute<0) || (starttime_minute>59) || (starttime_second<0) || (starttime_second>59)) { - return(-1); + return -1; } hdrlist[handle]->startdate_year = startdate_year; @@ -6007,7 +6360,7 @@ int edf_set_startdatetime(int handle, int startdate_year, int startdate_month, i hdrlist[handle]->starttime_minute = starttime_minute; hdrlist[handle]->starttime_second = starttime_second; - return(0); + return 0; } @@ -6020,27 +6373,27 @@ int edfwrite_annotation_utf8(int handle, long long onset, long long duration, co if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(onset<0LL) { - return(-1); + return -1; } if(hdrlist[handle]->annots_in_file >= hdrlist[handle]->annotlist_sz) @@ -6049,7 +6402,7 @@ int edfwrite_annotation_utf8(int handle, long long onset, long long duration, co sizeof(struct edf_write_annotationblock) * (hdrlist[handle]->annotlist_sz + EDFLIB_ANNOT_MEMBLOCKSZ)); if(malloc_list==NULL) { - return(-1); + return -1; } write_annotationslist[handle] = malloc_list; @@ -6079,7 +6432,7 @@ int edfwrite_annotation_utf8(int handle, long long onset, long long duration, co hdrlist[handle]->annots_in_file++; - return(0); + return 0; } @@ -6092,27 +6445,27 @@ int edfwrite_annotation_latin1(int handle, long long onset, long long duration, if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(onset<0LL) { - return(-1); + return -1; } if(hdrlist[handle]->annots_in_file >= hdrlist[handle]->annotlist_sz) @@ -6121,7 +6474,7 @@ int edfwrite_annotation_latin1(int handle, long long onset, long long duration, sizeof(struct edf_write_annotationblock) * (hdrlist[handle]->annotlist_sz + EDFLIB_ANNOT_MEMBLOCKSZ)); if(malloc_list==NULL) { - return(-1); + return -1; } write_annotationslist[handle] = malloc_list; @@ -6141,7 +6494,7 @@ int edfwrite_annotation_latin1(int handle, long long onset, long long duration, hdrlist[handle]->annots_in_file++; - return(0); + return 0; } @@ -6180,37 +6533,37 @@ int edf_set_prefilter(int handle, int edfsignal, const char *prefilter) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->edfparam[edfsignal].prefilter, prefilter, 80); @@ -6219,7 +6572,7 @@ int edf_set_prefilter(int handle, int edfsignal, const char *prefilter) edflib_remove_padding_trailing_spaces(hdrlist[handle]->edfparam[edfsignal].prefilter); - return(0); + return 0; } @@ -6227,37 +6580,37 @@ int edf_set_transducer(int handle, int edfsignal, const char *transducer) { if(handle<0) { - return(-1); + return -1; } if(handle>=EDFLIB_MAXFILES) { - return(-1); + return -1; } if(hdrlist[handle]==NULL) { - return(-1); + return -1; } if(!(hdrlist[handle]->writemode)) { - return(-1); + return -1; } if(edfsignal<0) { - return(-1); + return -1; } if(edfsignal>=hdrlist[handle]->edfsignals) { - return(-1); + return -1; } if(hdrlist[handle]->datarecords) { - return(-1); + return -1; } strncpy(hdrlist[handle]->edfparam[edfsignal].transducer, transducer, 80); @@ -6266,7 +6619,7 @@ int edf_set_transducer(int handle, int edfsignal, const char *transducer) edflib_remove_padding_trailing_spaces(hdrlist[handle]->edfparam[edfsignal].transducer); - return(0); + return 0; } @@ -6336,7 +6689,7 @@ static int edflib_fprint_int_number_nonlocalized(FILE *file, int q, int minimum, j++; } - return(j); + return j; } @@ -6408,7 +6761,7 @@ static int edflib_fprint_ll_number_nonlocalized(FILE *file, long long q, int min j++; } - return(j); + return j; } @@ -6473,7 +6826,7 @@ static int edflib_sprint_int_number_nonlocalized(char *str, int q, int minimum, str[j] = 0; - return(j); + return j; } */ @@ -6539,7 +6892,7 @@ static int edflib_sprint_ll_number_nonlocalized(char *str, long long q, int mini str[j] = 0; - return(j); + return j; } @@ -6599,7 +6952,7 @@ static int edflib_sprint_number_nonlocalized(char *str, double nr) { str[j] = 0; - return(j); + return j; } str[j++] = '.'; @@ -6633,7 +6986,7 @@ static int edflib_sprint_number_nonlocalized(char *str, double nr) } } - return(j); + return j; } @@ -6708,7 +7061,7 @@ static double edflib_atof_nonlocalized(const char *str) value2 /= i; } - return(value + value2); + return value + value2; } @@ -6748,10 +7101,36 @@ static int edflib_atoi_nonlocalized(const char *str) value += (str[i] - '0'); } - return(value * sign); + return value * sign; } +static int edflib_write_tal(struct edfhdrblock *hdr, FILE *file) +{ + int p; + + char str[EDFLIB_ANNOTATION_BYTES * (EDFLIB_MAX_ANNOTATION_CHANNELS + 1)]; + + p = edflib_sprint_ll_number_nonlocalized(str, (hdr->datarecords * hdr->long_data_record_duration) / EDFLIB_TIME_DIMENSION, 0, 1); + if(hdr->long_data_record_duration % EDFLIB_TIME_DIMENSION) + { + str[p++] = '.'; + p += edflib_sprint_ll_number_nonlocalized(str + p, (hdr->datarecords * hdr->long_data_record_duration) % EDFLIB_TIME_DIMENSION, 7, 0); + } + str[p++] = 20; + str[p++] = 20; + for(; p<hdr->total_annot_bytes; p++) + { + str[p] = 0; + } + + if(fwrite(str, hdr->total_annot_bytes, 1, file) != 1) + { + return -1; + } + + return 0; +} diff --git a/edflib.h b/edflib.h index 2b28798..2250a53 100644 --- a/edflib.h +++ b/edflib.h @@ -1,7 +1,7 @@ /* ***************************************************************************** * -* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017 Teunis van Beelen +* Copyright (c) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 Teunis van Beelen * All rights reserved. * * email: [email protected] @@ -63,7 +63,11 @@ #define EDFLIB_FILETYPE_BDFPLUS 3 #define EDFLIB_MALLOC_ERROR -1 #define EDFLIB_NO_SUCH_FILE_OR_DIRECTORY -2 + +/* when this error occurs, try to open the file with EDFbrowser, + it will give you full details about the cause of the error. */ #define EDFLIB_FILE_CONTAINS_FORMAT_ERRORS -3 + #define EDFLIB_MAXFILES_REACHED -4 #define EDFLIB_FILE_READ_ERROR -5 #define EDFLIB_FILE_ALREADY_OPENED -6 @@ -78,13 +82,14 @@ #define EDFLIB_READ_ANNOTATIONS 1 #define EDFLIB_READ_ALL_ANNOTATIONS 2 -/* the following defines are possible errors returned by edfopen_file_writeonly() */ +/* the following defines are possible errors returned by the first sample write action */ #define EDFLIB_NO_SIGNALS -20 #define EDFLIB_TOO_MANY_SIGNALS -21 #define EDFLIB_NO_SAMPLES_IN_RECORD -22 #define EDFLIB_DIGMIN_IS_DIGMAX -23 #define EDFLIB_DIGMAX_LOWER_THAN_DIGMIN -24 #define EDFLIB_PHYSMIN_IS_PHYSMAX -25 +#define EDFLIB_DATARECORD_SIZE_TOO_BIG -26 @@ -98,6 +103,25 @@ extern "C" { /* For more info about the EDF and EDF+ format, visit: http://edfplus.info/specs/ */ /* For more info about the BDF and BDF+ format, visit: http://www.teuniz.net/edfbrowser/bdfplus%20format%20description.html */ +/* + * note: In EDF, the sensitivity (e.g. uV/bit) and offset are stored using four parameters: + * digital maximum and minimum, and physical maximum and minimum. + * Here, digital means the raw data coming from a sensor or ADC. Physical means the units like uV. + * The sensitivity in units/bit is calculated as follows: + * + * units per bit = (physical max - physical min) / (digital max - digital min) + * + * The digital offset is calculated as follows: + * + * offset = (physical max / units per bit) - digital max + * + * For a better explanation about the relation between digital data and physical data, + * read the document "Coding Schemes Used with Data Converters" (PDF): + * + * http://www.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=sbaa042 + * + */ + struct edf_param_struct{ /* this structure contains all the relevant EDF-signal parameters of one signal */ char label[17]; /* label (name) of the signal, null-terminated string */ @@ -371,7 +395,7 @@ int edf_set_transducer(int handle, int edfsignal, const char *transducer); int edf_set_physical_dimension(int handle, int edfsignal, const char *phys_dim); -/* Sets the physical dimension of signal edfsignal. ("uV", "BPM", "mA", "Degr.", etc.) */ +/* Sets the physical dimension (unit) of signal edfsignal. ("uV", "BPM", "mA", "Degr.", etc.) */ /* phys_dim is a pointer to a NULL-terminated ASCII-string containing the physical dimension of the signal edfsignal */ /* Returns 0 on success, otherwise -1 */ /* This function is recommanded for every signal when you want to write a file */ @@ -600,7 +624,21 @@ int edf_set_datarecord_duration(int handle, int duration); /* which is not an integer. For example, if you want to use a samplerate of 0.5 Hz, */ /* set the samplefrequency to 5 Hz and the datarecord duration to 10 seconds, */ /* or set the samplefrequency to 1 Hz and the datarecord duration to 2 seconds. */ -/* Do not use this function, except when absolutely necessary! */ +/* Do not use this function if not necessary. */ + +int edf_set_micro_datarecord_duration(int handle, int duration); + +/* Sets the datarecord duration to a very small value. */ +/* ATTENTION: the argument "duration" is expressed in units of 1 microSecond! */ +/* This function is optional, normally you don't need to change the default value. */ +/* The datarecord duration must be in the range 1 to 99 micro-seconds. */ +/* Returns 0 on success, otherwise -1 */ +/* This function is NOT REQUIRED but can be called after opening a */ +/* file in writemode and before the first sample write action. */ +/* This function can be used when you want to use a very high samplerate. */ +/* For example, if you want to use a samplerate of 5 GHz, */ +/* set the samplefrequency to 5000 Hz and the datarecord duration to 1 micro-second. */ +/* Do not use this function if not necessary. */ int edf_set_number_of_annotation_signals(int handle, int annot_signals); diff --git a/sine_generator.c b/sine_generator.c index d31c18b..20e00c5 100644 --- a/sine_generator.c +++ b/sine_generator.c @@ -44,7 +44,7 @@ -int main(int argc, char *argv[]) +int main(void) { int i, j, hdl, diff --git a/sweep_generator.c b/sweep_generator.c index 3d27a14..0ad2477 100644 --- a/sweep_generator.c +++ b/sweep_generator.c @@ -51,7 +51,7 @@ void remove_trailing_zeros(char *); -int main(int argc, char *argv[]) +int main(void) { int i, j, hdl, @@ -211,6 +211,16 @@ int main(int argc, char *argv[]) freqspan = stopfreq - startfreq; + if(linear) + { + freq = startfreq + (freqspan * ((double)sampleswritten / (double)samples)); + } + else + { + // freq = expo((((double)sampleswritten / (double)samples)) * log10(stopfreq)); + freq = expo(((((startfreq / stopfreq) * ((stopfreq / freqspan) * samples)) + sampleswritten) / ((stopfreq / freqspan) * samples)) * log10(stopfreq)); + } + for(j=0; j<fileduration; j++) { for(i=0; i<smp_freq; i++) diff --git a/test_generator.c b/test_generator.c index affed86..9041d69 100644 --- a/test_generator.c +++ b/test_generator.c @@ -31,21 +31,21 @@ /* this program generates an EDFplus or BDFplus testfile with the following signals: - signal label/waveform amplitude f sf - --------------------------------------------------- - 1 squarewave 100 uV 0.1Hz 200 Hz - 2 ramp 100 uV 1 Hz 200 Hz - 3 pulse 1 100 uV 1 Hz 200 Hz - 4 pulse 2 100 uV 1 Hz 256 Hz - 5 pulse 3 100 uV 1 Hz 217 Hz - 6 noise 100 uV - Hz 200 Hz - 7 sine 1 Hz 100 uV 1 Hz 200 Hz - 8 sine 8 Hz 100 uV 8 Hz 200 Hz - 9 sine 8.1777 Hz 100 uV 8.25 Hz 200 Hz - 10 sine 8.5 Hz 100 uV 8.5Hz 200 Hz - 11 sine 15 Hz 100 uV 15 Hz 200 Hz - 12 sine 17 Hz 100 uV 17 Hz 200 Hz - 13 sine 50 Hz 100 uV 50 Hz 200 Hz + signal label/waveform amplitude f sf + ------------------------------------------------------ + 1 squarewave 100 uV 0.1Hz 200 Hz + 2 ramp 100 uV 1 Hz 200 Hz + 3 pulse 1 100 uV 1 Hz 200 Hz + 4 pulse 2 100 uV 1 Hz 256 Hz + 5 pulse 3 100 uV 1 Hz 217 Hz + 6 noise 100 uV - Hz 200 Hz + 7 sine 1 Hz 100 uV 1 Hz 200 Hz + 8 sine 8 Hz + DC 100 uV 8 Hz 200 Hz + 9 sine 8.1777 Hz + DC 100 uV 8.25 Hz 200 Hz + 10 sine 8.5 Hz 100 uV 8.5Hz 200 Hz + 11 sine 15 Hz 100 uV 15 Hz 200 Hz + 12 sine 17 Hz 100 uV 17 Hz 200 Hz + 13 sine 50 Hz 100 uV 50 Hz 200 Hz 14 DC event 8-bits code 1 V 100 mS/bit 200 Hz */ @@ -73,7 +73,7 @@ // #define BDF_FORMAT -int main(int argc, char *argv[]) +int main(void) { int i, j, hdl, @@ -323,14 +323,14 @@ int main(int argc, char *argv[]) return(1); } - if(edf_set_label(hdl, i++, "sine 8 Hz")) + if(edf_set_label(hdl, i++, "sine 8 Hz + DC")) { printf("error: edf_set_label()\n"); return(1); } - if(edf_set_label(hdl, i++, "sine 8.1777 Hz")) + if(edf_set_label(hdl, i++, "sine 8.1777 Hz + DC")) { printf("error: edf_set_label()\n"); -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/edflib.git _______________________________________________ debian-med-commit mailing list [email protected] http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/debian-med-commit
