void UI_ExportAnnotationswindow::ExportButtonClicked() { int i, j, n, len, csv_format=0, hdl, annot_cnt, temp, include_duration; char path[MAX_PATH_LENGTH], str[1024], separator; FILE *annotationfile=NULL; struct annotationblock *annot, *annot_list; struct edfhdrblock *hdr; struct date_time_struct tm; if(CSVRadioButton->isChecked() == true) { if(asciiSecondsRadioButton->isChecked() == true) { csv_format = 1; } if(asciiISOtimeRadioButton->isChecked() == true) { csv_format = 2; } if(asciiISOtimedateRadioButton->isChecked() == true) { csv_format = 3; } if(asciiISOtimeFractionRadioButton->isChecked() == true) { csv_format = 4; } if(asciiISOtimedateFractionRadioButton->isChecked() == true) { csv_format = 5; } } if(EDFplusRadioButton->isChecked() == true) { csv_format = 0; } if(XMLRadioButton->isChecked() == true) { csv_format = 8; } mainwindow->export_annotations_var->format = csv_format; if(separatorBox->currentIndex() == 0) { separator = ','; mainwindow->export_annotations_var->separator = 0; } else { separator = '\t'; mainwindow->export_annotations_var->separator = 1; } if(durationCheckBox->checkState() == Qt::Checked) { include_duration = 1; mainwindow->export_annotations_var->duration = 1; } else { include_duration = 0; mainwindow->export_annotations_var->duration = 0; } if(!mainwindow->files_open) { ExportAnnotsDialog->close(); return; } if(filelist->count() < 1) { ExportAnnotsDialog->close(); return; } ExportButton->setEnabled(false); CloseButton->setEnabled(false); for(i=0; i<mainwindow->files_open; i++) { if(!strcmp(mainwindow->edfheaderlist[i]->filename, filelist->item(filelist->currentRow())->text().toLocal8Bit().data())) { break; } } if(i==mainwindow->files_open) { ExportAnnotsDialog->close(); return; } n = i; if(mergeRadioButton->isChecked() == true) { n = mainwindow->sel_viewtime; } hdr = mainwindow->edfheaderlist[n]; path[0] = 0; if(mainwindow->recent_savedir[0]!=0) { strcpy(path, mainwindow->recent_savedir); strcat(path, "/"); } len = strlen(path); get_filename_from_path(path + len, mainwindow->edfheaderlist[n]->filename, MAX_PATH_LENGTH - len); remove_extension_from_filename(path); if((csv_format > 0) && (csv_format < 6)) { strcat(path, "_annotations.txt"); strcpy(path, QFileDialog::getSaveFileName(0, "Output file", QString::fromLocal8Bit(path), "Text files (*.txt *.TXT *.csv *.CSV)").toLocal8Bit().data()); } if(csv_format == 8) { strcat(path, "_annotations.xml"); strcpy(path, QFileDialog::getSaveFileName(0, "Output file", QString::fromLocal8Bit(path), "XML files (*.xml *.XML)").toLocal8Bit().data()); } if(csv_format == 0) { strcat(path, "_annotations.edf"); strcpy(path, QFileDialog::getSaveFileName(0, "Output file", QString::fromLocal8Bit(path), "EDF files (*.edf *.EDF)").toLocal8Bit().data()); } if(!strcmp(path, "")) { ExportAnnotsDialog->close(); return; } get_directory_from_path(mainwindow->recent_savedir, path, MAX_PATH_LENGTH); if(mainwindow->file_is_opened(path)) { QMessageBox messagewindow(QMessageBox::Critical, "Export annotations", "Error, selected file is in use."); messagewindow.exec(); return; } annot_list = edfplus_annotation_copy_list(&mainwindow->annotationlist[n]); if(mergeRadioButton->isChecked() == true) { for(i=0; i < mainwindow->files_open; i++) { if(i != mainwindow->sel_viewtime) { annot_cnt = edfplus_annotation_count(&mainwindow->annotationlist[i]); for(j=0; j < annot_cnt; j++) { edfplus_annotation_add_copy(&annot_list, edfplus_annotation_item(&mainwindow->annotationlist[i], j)); annot = edfplus_annotation_item(&annot_list, edfplus_annotation_count(&annot_list) - 1); annot->onset -= (mainwindow->edfheaderlist[i]->viewtime - mainwindow->edfheaderlist[mainwindow->sel_viewtime]->viewtime); } } } edfplus_annotation_sort(&annot_list); } annot_cnt = edfplus_annotation_count(&annot_list); ///////////////////////////// CSV (text) export ////////////////////////////////////// if((csv_format > 0) && (csv_format < 6)) { annotationfile = fopeno(path, "wb"); if(annotationfile==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open annotationfile for writing."); messagewindow.exec(); ExportAnnotsDialog->close(); edfplus_annotation_delete_list(&annot_list); return; } if(include_duration) { fprintf(annotationfile, "Onset%cDuration%cAnnotation\n", separator, separator); } else { fprintf(annotationfile, "Onset%cAnnotation\n", separator); } for(j=0; j < annot_cnt; j++) { annot = edfplus_annotation_item(&annot_list, j); if(annot == NULL) { break; } strncpy(str, annot->annotation, 1024); str[1023] = 0; utf8_to_latin1(str); len = strlen(str); for(i=0; i<len; i++) { if((((unsigned char *)str)[i] < 32) || (((unsigned char *)str)[i] == ',')) { str[i] = '.'; } } if(csv_format == 1) { if(include_duration) { fprintf(annotationfile, "%+.7f%c%s%c%s\n", (double)(annot->onset - hdr->starttime_offset) / TIME_DIMENSION, separator, annot->duration, separator, str); } else { fprintf(annotationfile, "%+.7f%c%s\n", (double)(annot->onset - hdr->starttime_offset) / TIME_DIMENSION, separator, str); } } if(csv_format == 2) { temp = annot->onset % TIME_DIMENSION; if(temp < 0) { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION) - 1, &tm); } else { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION), &tm); } if(include_duration) { fprintf(annotationfile, "%02i:%02i:%02i%c%s%c%s\n", tm.hour, tm.minute, tm.second, separator, annot->duration, separator, str); } else { fprintf(annotationfile, "%02i:%02i:%02i%c%s\n", tm.hour, tm.minute, tm.second, separator, str); } } if(csv_format == 3) { temp = annot->onset % TIME_DIMENSION; if(temp < 0) { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION) - 1, &tm); } else { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION), &tm); } if(include_duration) { fprintf(annotationfile, "%04i-%02i-%02iT%02i:%02i:%02i%c%s%c%s\n", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second, separator, annot->duration, separator, str); } else { fprintf(annotationfile, "%04i-%02i-%02iT%02i:%02i:%02i%c%s\n", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second, separator, str); } } if(csv_format == 4) { temp = annot->onset % TIME_DIMENSION; if(temp < 0) { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION) - 1, &tm); temp = TIME_DIMENSION + temp; } else { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION), &tm); } if(include_duration) { fprintf(annotationfile, "%02i:%02i:%02i.%07i%c%s%c%s\n", tm.hour, tm.minute, tm.second, temp, separator, annot->duration, separator, str); } else { fprintf(annotationfile, "%02i:%02i:%02i.%07i%c%s\n", tm.hour, tm.minute, tm.second, temp, separator, str); } } if(csv_format == 5) { temp = annot->onset % TIME_DIMENSION; if(temp < 0) { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION) - 1, &tm); temp = TIME_DIMENSION + temp; } else { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION), &tm); } if(include_duration) { fprintf(annotationfile, "%04i-%02i-%02iT%02i:%02i:%02i.%07i%c%s%c%s\n", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second, temp, separator, annot->duration, separator, str); } else { fprintf(annotationfile, "%04i-%02i-%02iT%02i:%02i:%02i.%07i%c%s\n", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second, temp, separator, str); } } } fclose(annotationfile); edfplus_annotation_delete_list(&annot_list); QMessageBox messagewindow(QMessageBox::Information, "Ready", "Done."); messagewindow.setIconPixmap(QPixmap(":/images/ok.png")); messagewindow.exec(); ExportAnnotsDialog->close(); return; } ///////////////////////////// XML export ////////////////////////////////////// if(csv_format == 8) { annotationfile = fopeno(path, "wb"); if(annotationfile==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open annotationfile for writing."); messagewindow.exec(); ExportAnnotsDialog->close(); edfplus_annotation_delete_list(&annot_list); return; } fprintf(annotationfile, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); fprintf(annotationfile, "<!-- Generated by " PROGRAM_NAME " " PROGRAM_VERSION " -->\n"); fprintf(annotationfile, "<annotationlist>\n"); utc_to_date_time(hdr->utc_starttime, &tm); fprintf(annotationfile, " <recording_start_time>%04i-%02i-%02iT%02i:%02i:%02i.%07i</recording_start_time>\n", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second, (int)hdr->starttime_offset); for(j=0; j < annot_cnt; j++) { annot = edfplus_annotation_item(&annot_list, j); if(annot == NULL) { break; } temp = annot->onset % TIME_DIMENSION; if(temp < 0) { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION) - 1, &tm); temp = TIME_DIMENSION + temp; } else { utc_to_date_time(hdr->utc_starttime + (annot->onset / TIME_DIMENSION), &tm); } fprintf(annotationfile, " <annotation>\n" " <onset>%04i-%02i-%02iT%02i:%02i:%02i.%07i</onset>\n" " <duration>%s</duration>\n" " <description>", tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second, temp, annot->duration); xml_fwrite_encode_entity(annotationfile, annot->annotation); fprintf(annotationfile, "</description>\n" " </annotation>\n"); } fprintf(annotationfile, "</annotationlist>\n"); fclose(annotationfile); edfplus_annotation_delete_list(&annot_list); QMessageBox messagewindow(QMessageBox::Information, "Ready", "Done."); messagewindow.setIconPixmap(QPixmap(":/images/ok.png")); messagewindow.exec(); ExportAnnotsDialog->close(); return; } ///////////////////////////// EDFplus export ////////////////////////////////////// if(csv_format == 0) { hdl = edfopen_file_writeonly(path, EDFLIB_FILETYPE_EDFPLUS, 0); if(hdl < 0) { switch(hdl) { case EDFLIB_MALLOC_ERROR : strcpy(str, "EDFlib: malloc error"); break; case EDFLIB_NO_SUCH_FILE_OR_DIRECTORY : strcpy(str, "EDFlib: no such file or directory"); break; case EDFLIB_MAXFILES_REACHED : strcpy(str, "EDFlib: maximum files reached"); break; case EDFLIB_FILE_ALREADY_OPENED : strcpy(str, "EDFlib: file already opened"); break; case EDFLIB_NUMBER_OF_SIGNALS_INVALID : strcpy(str, "EDFlib: number of signals is invalid"); break; default : strcpy(str, "EDFlib: unknown error"); break; } QMessageBox messagewindow(QMessageBox::Critical, "Error", str); messagewindow.exec(); edfplus_annotation_delete_list(&annot_list); ExportAnnotsDialog->close(); return; } utc_to_date_time(hdr->utc_starttime, &tm); edf_set_startdatetime(hdl, tm.year, tm.month, tm.day, tm.hour, tm.minute, tm.second); if((hdr->edfplus) || (hdr->bdfplus)) { edf_set_patientname(hdl, hdr->plus_patient_name); edf_set_patientcode(hdl, hdr->plus_patientcode); if(!(strcmp(hdr->plus_gender, "Male"))) { edf_set_gender(hdl, 1); } if(!(strcmp(hdr->plus_gender, "Female"))) { edf_set_gender(hdl, 0); } if(hdr->plus_birthdate[0] != 0) { if(!(strncmp(hdr->plus_birthdate + 3, "jan", 3))) n = 1; if(!(strncmp(hdr->plus_birthdate + 3, "feb", 3))) n = 2; if(!(strncmp(hdr->plus_birthdate + 3, "mar", 3))) n = 3; if(!(strncmp(hdr->plus_birthdate + 3, "apr", 3))) n = 4; if(!(strncmp(hdr->plus_birthdate + 3, "may", 3))) n = 5; if(!(strncmp(hdr->plus_birthdate + 3, "jun", 3))) n = 6; if(!(strncmp(hdr->plus_birthdate + 3, "jul", 3))) n = 7; if(!(strncmp(hdr->plus_birthdate + 3, "aug", 3))) n = 8; if(!(strncmp(hdr->plus_birthdate + 3, "sep", 3))) n = 9; if(!(strncmp(hdr->plus_birthdate + 3, "oct", 3))) n = 10; if(!(strncmp(hdr->plus_birthdate + 3, "nov", 3))) n = 11; if(!(strncmp(hdr->plus_birthdate + 3, "dec", 3))) n = 12; edf_set_birthdate(hdl, atoi(hdr->plus_birthdate + 7), n, atoi(hdr->plus_birthdate)); } edf_set_patient_additional(hdl, hdr->plus_patient_additional); edf_set_admincode(hdl, hdr->plus_admincode); edf_set_technician(hdl, hdr->plus_technician); edf_set_equipment(hdl, hdr->plus_equipment); edf_set_recording_additional(hdl, hdr->plus_recording_additional); } else { edf_set_patientname(hdl, hdr->patient); edf_set_recording_additional(hdl, hdr->recording); } int hasdot, decimals; for(j=0; j < annot_cnt; j++) { annot = edfplus_annotation_item(&annot_list, j); if(annot == NULL) { break; } if(annot->duration[0] == 0) { edfwrite_annotation_utf8(hdl, annot->onset / 1000LL, -1LL, annot->annotation); } else { strcpy(str, annot->duration); len = strlen(str); hasdot = 0; for(i=0; i<len; i++) { if(str[i] == '.') { hasdot = 1; for(decimals=0; decimals<4; decimals++) { str[i] = str[i+1]; if(str[i] == 0) { for( ; decimals<4; decimals++) { str[i] = '0'; i++; } i--; } i++; } str[i] = 0; break; } } if(!hasdot) { strcat(str, "0000"); } edfwrite_annotation_utf8(hdl, annot->onset / 1000LL, atoi(str), annot->annotation); } } if(edfclose_file(hdl) != 0) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "An error occurred: edfclose_file()"); messagewindow.exec(); } edfplus_annotation_delete_list(&annot_list); QMessageBox messagewindow(QMessageBox::Information, "Ready", "Done."); messagewindow.setIconPixmap(QPixmap(":/images/ok.png")); messagewindow.exec(); ExportAnnotsDialog->close(); } }
int main(int argc, char *argv[]) { int i, j, hdl, chns; double buf[1000], q, sine_1, sine_8, sine_81777, sine_85, sine_15, sine_17, sine_50; struct{ long long samples; long long triggers[512]; int index; int code; int bitposition; int smp_in_bit; } dc_event_stat; memset(&dc_event_stat, 0, sizeof(dc_event_stat)); dc_event_stat.code = 0; dc_event_stat.triggers[0] = 1951; for(i=1; i<512; i++) { dc_event_stat.triggers[i] = (i * 1667) + 1951; } chns = 14; #ifdef BDF_FORMAT hdl = edfopen_file_writeonly("test_generator.bdf", EDFLIB_FILETYPE_BDFPLUS, chns); #else hdl = edfopen_file_writeonly("test_generator.edf", EDFLIB_FILETYPE_EDFPLUS, chns); #endif if(hdl<0) { printf("error: edfopen_file_writeonly()\n"); return(1); } for(i=0; i<chns; i++) { if(edf_set_samplefrequency(hdl, i, SMP_FREQ)) { printf("error: edf_set_samplefrequency()\n"); return(1); } } if(edf_set_samplefrequency(hdl, 3, SMP_FREQ_2)) { printf("error: edf_set_samplefrequency()\n"); return(1); } if(edf_set_samplefrequency(hdl, 4, SMP_FREQ_3)) { printf("error: edf_set_samplefrequency()\n"); return(1); } if(edf_set_samplefrequency(hdl, 13, 1000)) { printf("error: edf_set_samplefrequency()\n"); return(1); } #ifdef BDF_FORMAT for(i=0; i<chns; i++) { if(edf_set_digital_maximum(hdl, i, 8388607)) { printf("error: edf_set_digital_maximum()\n"); return(1); } } for(i=0; i<chns; i++) { if(edf_set_digital_minimum(hdl, i, -8388608)) { printf("error: edf_set_digital_minimum()\n"); return(1); } } if(edf_set_digital_minimum(hdl, 13, 8300000)) { printf("error: edf_set_digital_minimum()\n"); return(1); } #else for(i=0; i<chns; i++) { if(edf_set_digital_maximum(hdl, i, 32767)) { printf("error: edf_set_digital_maximum()\n"); return(1); } } for(i=0; i<chns; i++) { if(edf_set_digital_minimum(hdl, i, -32768)) { printf("error: edf_set_digital_minimum()\n"); return(1); } } #endif for(i=0; i<chns; i++) { if(edf_set_physical_maximum(hdl, i, 1000.0)) { printf("error: edf_set_physical_maximum()\n"); return(1); } } if(edf_set_physical_maximum(hdl, 8, 262143.0)) { printf("error: edf_set_physical_maximum()\n"); return(1); } if(edf_set_physical_maximum(hdl, 13, 10.0)) { printf("error: edf_set_physical_maximum()\n"); return(1); } for(i=0; i<chns; i++) { if(edf_set_physical_minimum(hdl, i, -1000.0)) { printf("error: edf_set_physical_minimum()\n"); return(1); } } if(edf_set_physical_minimum(hdl, 8, -262144.0)) { printf("error: edf_set_physical_minimum()\n"); return(1); } if(edf_set_physical_minimum(hdl, 13, -10.0)) { printf("error: edf_set_physical_minimum()\n"); return(1); } for(i=0; i<chns; i++) { if(edf_set_physical_dimension(hdl, i, "uV")) { printf("error: edf_set_physical_dimension()\n"); return(1); } } if(edf_set_physical_dimension(hdl, 13, "V")) { printf("error: edf_set_physical_dimension()\n"); return(1); } i = 0; if(edf_set_label(hdl, i++, "squarewave")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "ramp")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "pulse 1")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "pulse 2")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "pulse 3")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "noise")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 1 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 8 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 8.1777 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 8.5 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 15 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 17 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "sine 50 Hz")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_label(hdl, i++, "DC 01")) { printf("error: edf_set_label()\n"); return(1); } if(edf_set_equipment(hdl, "test generator")) { printf("edf_set_equipment()\n"); return(1); } edf_set_birthdate(hdl, 1969, 6, 30); sine_1 = 0.0; sine_8 = 0.0; sine_81777 = 0.0; sine_85 = 0.0; sine_15 = 0.0; sine_17 = 0.0; sine_50 = 0.0; for(j=0; j<FILE_DURATION; j++) { if((j%10)<5) /* square */ { for(i=0; i<SMP_FREQ; i++) { buf[i] = 100.0; } } else { for(i=0; i<SMP_FREQ; i++) { buf[i] = -100.0; } } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* ramp */ { buf[i] = -100.0 + (i * (200.0 / SMP_FREQ)); } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* pulse 1 */ { buf[i] = 0.0; } buf[0] = 100.0; buf[SMP_FREQ - 2] = 100.0; if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ_2; i++) /* pulse 2 */ { buf[i] = 0.0; } buf[0] = 100.0; buf[SMP_FREQ_2 - 2] = 100.0; if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ_3; i++) /* pulse 3 */ { buf[i] = 0.0; } buf[0] = 100.0; buf[SMP_FREQ_3 - 2] = 100.0; if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* noise */ { buf[i] = (int)(100.0 * (rand() / (RAND_MAX + 1.0))); } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 1 Hz */ { q = M_PI * 2.0; q /= SMP_FREQ; sine_1 += q; q = sin(sine_1); q *= 100.0; buf[i] = q; } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 8 Hz */ { q = M_PI * 2.0; q /= (SMP_FREQ / 8.0); sine_8 += q; q = sin(sine_8); q *= 100.0; buf[i] = q + 800.0; /* add dc-offset */ } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 8.1777 Hz */ { q = M_PI * 2.0; q /= (SMP_FREQ / 8.1777); sine_81777 += q; q = sin(sine_81777); q *= 100.0; buf[i] = q + 6000.0; /* add dc-offset */ } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 8.5 Hz */ { q = M_PI * 2.0; q /= (SMP_FREQ / 8.5); sine_85 += q; q = sin(sine_85); q *= 100.0; buf[i] = q; } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 15 Hz */ { q = M_PI * 2.0; q /= (SMP_FREQ / 15.0); sine_15 += q; q = sin(sine_15); q *= 100.0; buf[i] = q; } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 17 Hz */ { q = M_PI * 2.0; q /= (SMP_FREQ / 17.0); sine_17 += q; q = sin(sine_17); q *= 100.0; buf[i] = q; } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<SMP_FREQ; i++) /* sine 50 Hz */ { q = M_PI * 2.0; q /= (SMP_FREQ / 50.0); sine_50 += q; q = sin(sine_50); q *= 100.0; buf[i] = q; } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } for(i=0; i<1000; i++) /* DC 01 */ { if(dc_event_stat.bitposition) { if(dc_event_stat.bitposition == 1) { buf[i] = 1.0; } else { if(dc_event_stat.code & (1 << (dc_event_stat.bitposition - 2))) { buf[i] = 1.0; } else { buf[i] = 0.0; } } if(++dc_event_stat.smp_in_bit >= 10) { dc_event_stat.smp_in_bit = 0; dc_event_stat.bitposition++; } if(dc_event_stat.bitposition > 10) { dc_event_stat.bitposition = 0; dc_event_stat.smp_in_bit = 0; dc_event_stat.code++; dc_event_stat.code &= 255; if(++dc_event_stat.index >= 512) { dc_event_stat.index = 0; dc_event_stat.code = 0; } } } else { if(dc_event_stat.samples == dc_event_stat.triggers[dc_event_stat.index]) { /* edfwrite_annotation_latin1(hdl, dc_event_stat.samples * 10LL, -1LL, "Trigger"); */ dc_event_stat.bitposition = 1; dc_event_stat.smp_in_bit = 1; buf[i] = 1.0; } else { buf[i] = 0.0; } } dc_event_stat.samples++; } if(edfwrite_physical_samples(hdl, buf)) { printf("error: edfwrite_physical_samples()\n"); return(1); } } edfwrite_annotation_latin1(hdl, 0LL, -1LL, "Recording starts"); edfwrite_annotation_latin1(hdl, 2980000LL, -1LL, "Test 1"); edfwrite_annotation_latin1(hdl, 2940000LL + (long long)((10000.0 / SMP_FREQ) * (SMP_FREQ - 2)), -1LL, "pulse 1"); edfwrite_annotation_latin1(hdl, 2950000LL + (long long)((10000.0 / SMP_FREQ_2) * (SMP_FREQ_2 - 2)), -1LL, "pulse 2"); edfwrite_annotation_latin1(hdl, 2960000LL + (long long)((10000.0 / SMP_FREQ_3) * (SMP_FREQ_3 - 2)), -1LL, "pulse 3"); edfwrite_annotation_latin1(hdl, FILE_DURATION * 10000LL, -1LL, "Recording ends"); edfclose_file(hdl); return(0); }