void UI_BI98002EDFwindow::SelectFileButton() { int i, j, n, tmp, end_of_file, samplefreq=0, chns = 3, hdl, samplesize=1, bufsize, *buf2, datablocks, blocks_written, checked_modelnumber=0, checked_samplerate=0, checked_recordhours=0, checked_recorddate=0, checked_recordtime=0, startdate_year=0, startdate_month=0, startdate_day=0, starttime_hour=0, starttime_minute=0, starttime_second=0, progress_steps; char path[MAX_PATH_LENGTH], outputfilename[MAX_PATH_LENGTH], str[2048], str2[128], *buf1, tmp2, modelnumber_str[32]; FILE *dcmfile, *evtfile; strcpy(path, QFileDialog::getOpenFileName(0, "Select inputfile", QString::fromLocal8Bit(recent_opendir), "DCM files (*.dcm *.DCM)").toLocal8Bit().data()); if(!strcmp(path, "")) { return; } get_directory_from_path(recent_opendir, path, MAX_PATH_LENGTH); get_filename_from_path(outputfilename, path, MAX_PATH_LENGTH); dcmfile = fopeno(path, "rb"); if(dcmfile==NULL) { snprintf(str, 2048, "Can not open file %s for reading.", path); QMessageBox messagewindow(QMessageBox::Critical, "Error", QString::fromLocal8Bit(str)); messagewindow.exec(); return; } remove_extension_from_filename(path); strcat(path, ".EVT"); evtfile = fopeno(path, "rb"); if(evtfile==NULL) { remove_extension_from_filename(path); strcat(path, ".evt"); evtfile = fopeno(path, "rb"); if(evtfile==NULL) { snprintf(str, 2048, "Can not open file %s for reading.", path); QMessageBox messagewindow(QMessageBox::Critical, "Error", str); messagewindow.exec(); fclose(dcmfile); return; } } /***************** check if the file is valid ******************************/ for(end_of_file=0; end_of_file == 0; ) { for(i=0; i<256; i++) { tmp = fgetc(evtfile); if(tmp == '\n') { break; } if(tmp == EOF) { end_of_file = 1; break; } str[i] = tmp; } str[i] = 0; if(!(strncmp(str, "Sampling Rate=", 14))) { samplefreq = atoi(str + 14); switch(samplefreq) { case 128 : break; case 256 : break; case 512 : break; case 1024 : break; default : QMessageBox messagewindow(QMessageBox::Critical, "Error", "Unknown samplerate."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } checked_samplerate = 1; } if(!(strncmp(str, "Model number=", 13))) { strncpy(modelnumber_str, str + 13, 8); modelnumber_str[8] = 0; if(strcmp(modelnumber_str, "TM SD01G") && strcmp(modelnumber_str, "SD SD02G")) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Wrong modelnumber."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } checked_modelnumber = 1; } if(!(strncmp(str, "Record Date=", 12))) { strncpy(str2, str + 12, 10); str2[10] = 0; startdate_year = atoi(str2); startdate_month = atoi(str2 + 5); startdate_day = atoi(str2 + 8); if((startdate_year < 1970) || (startdate_year > 3000) || (startdate_month < 1) || (startdate_month > 12) || (startdate_day < 1) || (startdate_day > 31)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Wrong record date."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } checked_recorddate = 1; } if(!(strncmp(str, "Record Time=", 12))) { strncpy(str2, str + 12, 10); str2[8] = 0; starttime_hour = atoi(str2); starttime_minute = atoi(str2 + 3); starttime_second = atoi(str2 + 6); if((starttime_hour < 0) || (starttime_hour > 23) || (starttime_minute < 0) || (starttime_minute > 59) || (starttime_second < 0) || (starttime_second > 59)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Wrong recordtime."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } checked_recordtime = 1; } if(!(strncmp(str, "Record Hours=", 13))) { strncpy(str2, str + 13, 10); str2[2] = 0; if((atoi(str2) != 24) && (atoi(str2) != 48)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Wrong record hours."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } checked_recordhours = 1; } } if(!checked_modelnumber || !checked_samplerate || !checked_recordhours || !checked_recorddate || !checked_recordtime) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Missing line."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } /////////////////////////////////////////////////////////////////////////////////// bufsize = chns * samplesize * samplefreq; buf1 = (char *)malloc(bufsize); if(buf1 == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Malloc error."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); return; } buf2 = (int *)malloc(bufsize * sizeof(int)); if(buf2 == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Malloc error."); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); free(buf1); return; } /////////////////////////////////////////////////////////////////////////////////// path[0] = 0; if(recent_savedir[0]!=0) { strcpy(path, recent_savedir); strcat(path, "/"); } strcat(path, outputfilename); remove_extension_from_filename(path); strcat(path, ".edf"); strcpy(path, QFileDialog::getSaveFileName(0, "Select outputfile", QString::fromLocal8Bit(path), "EDF files (*.edf *.EDF)").toLocal8Bit().data()); if(!strcmp(path, "")) { fclose(dcmfile); fclose(evtfile); free(buf1); free(buf2); return; } get_directory_from_path(recent_savedir, path, MAX_PATH_LENGTH); hdl = edfopen_file_writeonly(path, EDFLIB_FILETYPE_EDFPLUS, chns); if(hdl<0) { snprintf(str, 2048, "Can not open file %s for writing.", path); QMessageBox messagewindow(QMessageBox::Critical, "Error", str); messagewindow.exec(); fclose(dcmfile); fclose(evtfile); free(buf1); free(buf2); return; } for(i=0; i<chns; i++) { edf_set_samplefrequency(hdl, i, samplefreq); } for(i=0; i<chns; i++) { edf_set_digital_maximum(hdl, i, 127); } for(i=0; i<chns; i++) { edf_set_digital_minimum(hdl, i, -128); } for(i=0; i<chns; i++) { edf_set_physical_maximum(hdl, i, 2442.307692); } for(i=0; i<chns; i++) { edf_set_physical_minimum(hdl, i, -2461.538462); } for(i=0; i<chns; i++) { edf_set_physical_dimension(hdl, i, "uV"); } edf_set_label(hdl, 0, "channel 1"); edf_set_label(hdl, 1, "channel 2"); edf_set_label(hdl, 2, "channel 3"); edf_set_equipment(hdl, modelnumber_str); edf_set_patientname(hdl, "BI9800"); edf_set_startdatetime(hdl, startdate_year, startdate_month, startdate_day, starttime_hour, starttime_minute, starttime_second); fseeko(dcmfile, 0LL, SEEK_END); datablocks = ftello(dcmfile) / bufsize; fseeko(dcmfile, 0LL, SEEK_SET); QProgressDialog progress("Converting...", "Cancel", 0, datablocks, myobjectDialog); progress.setWindowModality(Qt::WindowModal); progress.setMinimumDuration(200); progress_steps = datablocks / 100; if(progress_steps < 1) { progress_steps = 1; } for(blocks_written=0; ; blocks_written++) { if(!(blocks_written % progress_steps)) { progress.setValue(blocks_written); qApp->processEvents(); if(progress.wasCanceled() == true) { break; } } n = fread(buf1, bufsize, 1, dcmfile); if(n != 1) { break; } for(i=0; i<samplefreq; i++) { for(j=0; j<chns; j++) { tmp2 = buf1[(i * chns) + j] + 128; buf2[(j * samplefreq) + i] = tmp2; } } edf_blockwrite_digital_samples(hdl, buf2); } progress.reset(); edfwrite_annotation_latin1(hdl, 0LL, -1LL, "Recording starts"); fseeko(evtfile, 0LL, SEEK_SET); for(end_of_file=0; end_of_file == 0; ) { for(i=0; i<256; i++) { tmp = fgetc(evtfile); if((tmp == '\n') || (tmp == '\r')) { break; } if(tmp == EOF) { end_of_file = 1; break; } str[i] = tmp; } str[i] = 0; if((isdigit(str[0])) && (isdigit(str[1]))) { starttime_hour = atoi(str); starttime_minute = atoi(str + 3); starttime_second = atoi(str + 6); if((starttime_hour < 0) || (starttime_hour > 23) || (starttime_minute < 0) || (starttime_minute > 59) || (starttime_second < 0) || (starttime_second > 59)) { } else { if(strlen(str) > 9) { edfwrite_annotation_latin1(hdl, (starttime_second + (starttime_minute * 60) + (starttime_hour * 3600)) * 10000, -1, str + 9); } } } } edfwrite_annotation_latin1(hdl, blocks_written * 10000LL, -1LL, "Recording ends"); edfclose_file(hdl); fclose(dcmfile); fclose(evtfile); free(buf1); free(buf2); }
void UI_MIT2EDFwindow::SelectFileButton() { FILE *header_inputfile=NULL, *data_inputfile=NULL, *annot_inputfile=NULL; int i, j, p, len, hdl, *buf; char header_filename[MAX_PATH_LENGTH], txt_string[2048], edf_filename[MAX_PATH_LENGTH], data_filename[MAX_PATH_LENGTH], annot_filename[MAX_PATH_LENGTH], filename_x[MAX_PATH_LENGTH], scratchpad[4096], *charpntr; unsigned char a_buf[128]; long long filesize; pushButton1->setEnabled(false); strcpy(header_filename, QFileDialog::getOpenFileName(0, "Select inputfile", QString::fromLocal8Bit(recent_opendir), "MIT header files (*.hea *.HEA)").toLocal8Bit().data()); if(!strcmp(header_filename, "")) { pushButton1->setEnabled(true); return; } get_directory_from_path(recent_opendir, header_filename, MAX_PATH_LENGTH); header_inputfile = fopeno(header_filename, "rb"); if(header_inputfile==NULL) { snprintf(txt_string, 2048, "Can not open file %s for reading.\n", header_filename); textEdit1->append(QString::fromLocal8Bit(txt_string)); pushButton1->setEnabled(true); return; } get_filename_from_path(filename_x, header_filename, MAX_PATH_LENGTH); snprintf(txt_string, 2048, "Read file: %s", filename_x); textEdit1->append(QString::fromLocal8Bit(txt_string)); remove_extension_from_filename(filename_x); charpntr = fgets(scratchpad, 4095, header_inputfile); if(charpntr == NULL) { textEdit1->append("Can not read header file. (error 1)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } len = strlen(charpntr); if(len < 6) { textEdit1->append("Can not read header file. (error 2)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } for(i=0; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == len) { textEdit1->append("Can not read header file. (error 3)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } if(strcmp(charpntr, filename_x)) { textEdit1->append("Can not read header file. (error 4)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { textEdit1->append("Can not read header file. (error 5)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } mit_hdr.chns = atoi(charpntr + p); if(mit_hdr.chns < 1) { textEdit1->append("Error, number of signals is less than one. (error 6)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } if(mit_hdr.chns > MAXSIGNALS) { textEdit1->append("Error, Too many signals in header. (error 7)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { textEdit1->append("Can not read header file. (error 8)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } mit_hdr.sf = atoi(charpntr + p); if(mit_hdr.sf < 1) { textEdit1->append("Error, samplefrequency is less than 1 Hz. (error 9)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } if(mit_hdr.sf > 100000) { textEdit1->append("Error, samplefrequency is more than 100000 Hz. (error 10)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } mit_hdr.smp_period = 1000000000LL / mit_hdr.sf; strcat(filename_x, ".dat"); for(j=0; j<mit_hdr.chns; j++) { mit_hdr.adc_gain[j] = 200.0; mit_hdr.adc_resolution[j] = 12; mit_hdr.adc_zero[j] = 0; mit_hdr.init_val[j] = 0; sprintf(mit_hdr.label[j], "chan. %i", j + 1); charpntr = fgets(scratchpad, 4095, header_inputfile); if(charpntr == NULL) { textEdit1->append("Can not read header file. (error 11)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } len = strlen(charpntr); if(len < 6) { textEdit1->append("Can not read header file. (error 12)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } for(i=0; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == len) { textEdit1->append("Can not read header file. (error 13)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } if(strcmp(charpntr, filename_x)) { textEdit1->append("Error, filenames are different. (error 14)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == len) { textEdit1->append("Can not read header file. (error 15)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } mit_hdr.format[j] = atoi(charpntr + p); if((mit_hdr.format[j] != 212) && (mit_hdr.format[j] != 16)) { snprintf(txt_string, 2048, "Error, unsupported format: %i (error 16)\n", mit_hdr.format[j]); textEdit1->append(txt_string); fclose(header_inputfile); pushButton1->setEnabled(true); return; } if(j>0) { if(mit_hdr.format[j] != mit_hdr.format[0]) { textEdit1->append("Error, different formats in the same file. (error 17)\n"); fclose(header_inputfile); pushButton1->setEnabled(true); return; } } p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { continue; } mit_hdr.adc_gain[j] = atoi(charpntr + p); p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { continue; } mit_hdr.adc_resolution[j] = atoi(charpntr + p); p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { continue; } mit_hdr.adc_zero[j] = atoi(charpntr + p); p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { continue; } mit_hdr.init_val[j] = atoi(charpntr + p); p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { continue; } // skip p = ++i; for(; i<len; i++) { if(charpntr[i] == ' ') { charpntr[i] = 0; break; } } if(i == p) { continue; } // skip p = ++i; for(; i<len; i++) { if((charpntr[i] == '\n') || (charpntr[i] == '\r')) { charpntr[i] = 0; break; } } if(i == p) { continue; } strncpy(mit_hdr.label[j], charpntr + p, 16); mit_hdr.label[j][16] = 0; } fclose(header_inputfile); strcpy(data_filename, header_filename); remove_extension_from_filename(data_filename); strcpy(edf_filename, data_filename); strcpy(annot_filename, data_filename); strcat(data_filename, ".dat"); strcat(edf_filename, ".edf"); strcat(annot_filename, ".atr"); data_inputfile = fopeno(data_filename, "rb"); if(data_inputfile==NULL) { snprintf(txt_string, 2048, "Can not open file %s for reading.\n", data_filename); textEdit1->append(QString::fromLocal8Bit(txt_string)); pushButton1->setEnabled(true); return; } fseeko(data_inputfile, 0LL, SEEK_END); filesize = ftello(data_inputfile); if(filesize < (mit_hdr.chns * mit_hdr.sf * 45 / 10)) { textEdit1->append("Error, .dat filesize is too small.\n"); fclose(data_inputfile); pushButton1->setEnabled(true); return; } mit_hdr.sf_div = 1; mit_hdr.sf_block = mit_hdr.sf; if(!(mit_hdr.sf % 10)) { mit_hdr.sf_div = 10; mit_hdr.sf_block /= mit_hdr.sf_div; } else if(!(mit_hdr.sf % 8)) { mit_hdr.sf_div = 8; mit_hdr.sf_block /= mit_hdr.sf_div; } else if(!(mit_hdr.sf % 4)) { mit_hdr.sf_div = 4; mit_hdr.sf_block /= mit_hdr.sf_div; } else if(!(mit_hdr.sf % 2)) { mit_hdr.sf_div = 2; mit_hdr.sf_block /= mit_hdr.sf_div; } hdl = edfopen_file_writeonly(edf_filename, EDFLIB_FILETYPE_EDFPLUS, mit_hdr.chns); if(hdl<0) { snprintf(txt_string, 2048, "Can not open file %s for writing.\n", edf_filename); textEdit1->append(QString::fromLocal8Bit(txt_string)); fclose(data_inputfile); pushButton1->setEnabled(true); return; } for(i=0; i<mit_hdr.chns; i++) { if(edf_set_samplefrequency(hdl, i, mit_hdr.sf_block)) { textEdit1->append("Error: edf_set_samplefrequency()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } } for(i=0; i<mit_hdr.chns; i++) { if(edf_set_digital_minimum(hdl, i, -32768)) { textEdit1->append("Error: edf_set_digital_minimum()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } } for(i=0; i<mit_hdr.chns; i++) { if(edf_set_digital_maximum(hdl, i, 32767)) { textEdit1->append("Error: edf_set_digital_maximum()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } } for(i=0; i<mit_hdr.chns; i++) { if(edf_set_label(hdl, i, mit_hdr.label[i])) { textEdit1->append("Error: edf_set_label()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } } for(i=0; i<mit_hdr.chns; i++) { if(edf_set_physical_dimension(hdl, i, "uV")) { textEdit1->append("Error: edf_set_physical_dimension()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } if(edf_set_physical_maximum(hdl, i, (double)((32767 - mit_hdr.adc_zero[i]) * 1000) / mit_hdr.adc_gain[i])) { textEdit1->append("Error: edf_set_physical_maximum()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } if(edf_set_physical_minimum(hdl, i, (double)((-32768 - mit_hdr.adc_zero[i]) * 1000) / mit_hdr.adc_gain[i])) { textEdit1->append("Error: edf_set_physical_minimum()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } } if(edf_set_datarecord_duration(hdl, 100000 / mit_hdr.sf_div)) { textEdit1->append("Error: edf_set_datarecord_duration()\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } buf = (int *)malloc(mit_hdr.sf_block * mit_hdr.chns * sizeof(int)); if(buf == NULL) { textEdit1->append("Malloc() error (buf)\n"); fclose(data_inputfile); edfclose_file(hdl); pushButton1->setEnabled(true); return; } /////////////////// Start conversion ////////////////////////////////////////// int k, blocks, tmp1, tmp2; fseeko(data_inputfile, 0LL, SEEK_SET); blocks = filesize / (mit_hdr.sf_block * mit_hdr.chns); QProgressDialog progress("Converting digitized signals ...", "Abort", 0, blocks); progress.setWindowModality(Qt::WindowModal); progress.setMinimumDuration(200); if(mit_hdr.format[0] == 212) { blocks *= 10; blocks /= 15; progress.setMaximum(blocks); for(k=0; k<blocks; k++) { if(!(k % 100)) { progress.setValue(k); qApp->processEvents(); if(progress.wasCanceled() == true) { textEdit1->append("Conversion aborted by user.\n"); fclose(data_inputfile); edfclose_file(hdl); free(buf); pushButton1->setEnabled(true); return; } } for(i=0; i<mit_hdr.sf_block; i++) { for(j=0; j<mit_hdr.chns; j++) { if(j % 2) { tmp1 = fgetc(data_inputfile); tmp2 = fgetc(data_inputfile); if(tmp2 == EOF) { goto OUT; } buf[j * mit_hdr.sf_block + i] = (tmp1 & 0xf0) << 4; buf[j * mit_hdr.sf_block + i] += tmp2; if(buf[j * mit_hdr.sf_block + i] & 0x800) { buf[j * mit_hdr.sf_block + i] |= 0xfffff000; } } else { tmp1 = fgetc(data_inputfile); tmp2 = fgetc(data_inputfile); buf[j * mit_hdr.sf_block + i] = (tmp2 & 0x0f) << 8; buf[j * mit_hdr.sf_block + i] += tmp1; if(buf[j * mit_hdr.sf_block + i] & 0x800) { buf[j * mit_hdr.sf_block + i] |= 0xfffff000; } fseeko(data_inputfile, -1LL, SEEK_CUR); } } } if(edf_blockwrite_digital_samples(hdl, buf)) { progress.reset(); textEdit1->append("A write error occurred during conversion.\n"); fclose(data_inputfile); edfclose_file(hdl); free(buf); pushButton1->setEnabled(true); return; } } } if(mit_hdr.format[0] == 16) { blocks /= 2; progress.setMaximum(blocks); for(k=0; k<blocks; k++) { if(!(k % 100)) { progress.setValue(k); qApp->processEvents(); if(progress.wasCanceled() == true) { textEdit1->append("Conversion aborted by user.\n"); fclose(data_inputfile); edfclose_file(hdl); free(buf); pushButton1->setEnabled(true); return; } } for(i=0; i<mit_hdr.sf_block; i++) { for(j=0; j<mit_hdr.chns; j++) { tmp1 = fgetc(data_inputfile); if(tmp1 == EOF) { goto OUT; } tmp1 += (fgetc(data_inputfile) << 8); if(tmp1 & 0x8000) { tmp1 |= 0xffff0000; } buf[j * mit_hdr.sf_block + i] = tmp1; } } if(edf_blockwrite_digital_samples(hdl, buf)) { progress.reset(); textEdit1->append("A write error occurred during conversion.\n"); fclose(data_inputfile); edfclose_file(hdl); free(buf); pushButton1->setEnabled(true); return; } } } OUT: progress.reset(); qApp->processEvents(); /////////////////// End conversion ////////////////////////////////////////// fclose(data_inputfile); free(buf); int annot_code, tc=0, skip; long long bytes_read; get_filename_from_path(filename_x, annot_filename, MAX_PATH_LENGTH); annot_inputfile = fopeno(annot_filename, "rb"); if(annot_inputfile==NULL) { remove_extension_from_filename(annot_filename); strcat(annot_filename, ".ari"); annot_inputfile = fopeno(annot_filename, "rb"); } if(annot_inputfile==NULL) { remove_extension_from_filename(annot_filename); strcat(annot_filename, ".ecg"); annot_inputfile = fopeno(annot_filename, "rb"); } if(annot_inputfile==NULL) { snprintf(txt_string, 2048, "Can not open file %s for reading.\n" "Annotations can not be included.", filename_x); textEdit1->append(QString::fromLocal8Bit(txt_string)); } else { snprintf(txt_string, 2048, "Read file: %s", filename_x); textEdit1->append(QString::fromLocal8Bit(txt_string)); fseeko(annot_inputfile, 0LL, SEEK_END); filesize = ftello(annot_inputfile); progress.setLabelText("Converting annotations ..."); progress.setMinimum(0); progress.setMaximum(filesize); fseeko(annot_inputfile, 0LL, SEEK_SET); for(bytes_read=0LL; bytes_read < filesize; bytes_read += 2LL) { if(!(bytes_read % 100)) { progress.setValue(bytes_read); qApp->processEvents(); if(progress.wasCanceled() == true) { textEdit1->append("Conversion aborted by user.\n"); break; } } skip = 0; if(fread(a_buf, 2, 1, annot_inputfile) != 1) { break; } #pragma GCC diagnostic ignored "-Wstrict-aliasing" if(*((unsigned short *)a_buf) == 0) // end of file { break; } annot_code = a_buf[1] >> 2; if(annot_code == 59) { if(fread(a_buf, 4, 1, annot_inputfile) != 1) { break; } tc += (*((unsigned short *)a_buf) << 16); tc += *((unsigned short *)(a_buf + 2)); } else if(annot_code == 63) { skip = *((unsigned short *)a_buf) & 0x3ff; if(skip % 2) skip++; } else if((annot_code >= 0) && (annot_code <= ACMAX)) { tc += *((unsigned short *)a_buf) & 0x3ff; #pragma GCC diagnostic warning "-Wstrict-aliasing" if(annot_code < 42) { edfwrite_annotation_latin1(hdl, ((long long)tc * mit_hdr.smp_period) / 100000LL, -1, annotdescrlist[annot_code]); } else { edfwrite_annotation_latin1(hdl, ((long long)tc * mit_hdr.smp_period) / 100000LL, -1, "user-defined"); } } if(skip) { if(fseek(annot_inputfile, skip, SEEK_CUR) < 0) { break; } bytes_read += skip; } } fclose(annot_inputfile); } progress.reset(); edfclose_file(hdl); textEdit1->append("Ready.\n"); pushButton1->setEnabled(true); }
void UI_RAW2EDFapp::gobuttonpressed() { int i, j, k, r, hdl, chns, sf, *buf, datarecords, tmp, straightbinary, samplesize, skipblocksize, skipbytes, skipblockcntr, bytecntr; char str[256], path[MAX_PATH_LENGTH]; double phys_max; long long d_offset; FILE *inputfile; sf = SamplefreqSpinbox->value(); raw2edf_var->sf = sf; chns = SignalsSpinbox->value(); raw2edf_var->chns = chns; phys_max = PhysicalMaximumSpinbox->value(); raw2edf_var->phys_max = phys_max; straightbinary = EncodingCombobox->currentIndex(); raw2edf_var->straightbinary = straightbinary; samplesize = SampleSizeSpinbox->value(); raw2edf_var->samplesize = samplesize; d_offset = OffsetSpinbox->value(); raw2edf_var->offset = d_offset; skipblocksize = skipblocksizeSpinbox->value(); raw2edf_var->skipblocksize = skipblocksize; skipbytes = skipbytesSpinbox->value(); raw2edf_var->skipbytes = skipbytes; strcpy(raw2edf_var->phys_dim, PhysicalDimensionLineEdit->text().toLatin1().data()); remove_leading_spaces(raw2edf_var->phys_dim); remove_trailing_spaces(raw2edf_var->phys_dim); if(!(strlen(PatientnameLineEdit->text().toLatin1().data()))) { QMessageBox messagewindow(QMessageBox::Critical, "Invalid input", "Please enter a subjectname."); messagewindow.exec(); return; } if(!(strlen(RecordingLineEdit->text().toLatin1().data()))) { QMessageBox messagewindow(QMessageBox::Critical, "Invalid input", "Please enter a recording description."); messagewindow.exec(); return; } strcpy(path, QFileDialog::getOpenFileName(0, "Open data file", QString::fromLocal8Bit(recent_opendir), "All files (*)").toLocal8Bit().data()); if(!strcmp(path, "")) { return; } get_directory_from_path(recent_opendir, path, MAX_PATH_LENGTH); inputfile = fopeno(path, "rb"); if(inputfile==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open file for reading."); messagewindow.exec(); return; } remove_extension_from_filename(path); strcat(path, ".edf"); hdl = edfopen_file_writeonly(path, EDFLIB_FILETYPE_EDFPLUS, chns); if(hdl<0) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open file for writing.\nedfopen_file_writeonly()"); messagewindow.exec(); fclose(inputfile); return; } for(i=0; i<chns; i++) { if(edf_set_samplefrequency(hdl, i, sf)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_samplefrequency()"); messagewindow.exec(); fclose(inputfile); return; } } if(samplesize == 2) { for(i=0; i<chns; i++) { if(edf_set_digital_maximum(hdl, i, 32767)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_digital_maximum()"); messagewindow.exec(); fclose(inputfile); return; } } for(i=0; i<chns; i++) { if(edf_set_digital_minimum(hdl, i, -32768)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_digital_minimum()"); messagewindow.exec(); fclose(inputfile); return; } } } if(samplesize == 1) { for(i=0; i<chns; i++) { if(edf_set_digital_maximum(hdl, i, 255)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_digital_maximum()"); messagewindow.exec(); fclose(inputfile); return; } } for(i=0; i<chns; i++) { if(edf_set_digital_minimum(hdl, i, -256)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_digital_minimum()"); messagewindow.exec(); fclose(inputfile); return; } } } for(i=0; i<chns; i++) { if(edf_set_physical_maximum(hdl, i, phys_max)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_physical_maximum()"); messagewindow.exec(); fclose(inputfile); return; } } for(i=0; i<chns; i++) { if(edf_set_physical_minimum(hdl, i, -phys_max)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_physical_minimum()"); messagewindow.exec(); fclose(inputfile); return; } } for(i=0; i<chns; i++) { if(edf_set_physical_dimension(hdl, i, raw2edf_var->phys_dim)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_physical_dimension()"); messagewindow.exec(); fclose(inputfile); return; } } for(i=0; i<chns; i++) { sprintf(str, "ch. %i", i + 1); if(edf_set_label(hdl, i, str)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_label()"); messagewindow.exec(); fclose(inputfile); return; } } if(edf_set_startdatetime(hdl, StartDatetimeedit->date().year(), StartDatetimeedit->date().month(), StartDatetimeedit->date().day(), StartDatetimeedit->time().hour(), StartDatetimeedit->time().minute(), StartDatetimeedit->time().second())) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "edf_set_startdatetime()"); messagewindow.exec(); fclose(inputfile); edfclose_file(hdl); return; } buf = (int *)malloc(sizeof(int) * sf * chns); if(buf == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "malloc()"); messagewindow.exec(); fclose(inputfile); edfclose_file(hdl); return; } // printf("samplefrequency: %14i Hz\n" // "channels: %14i\n" // "physical maximum: %14.6f uV\n" // "straightbinary: %14i\n" // "samplesize: %14i byte(s)\n" // "offset: %14lli bytes\n" // "skip blocksize: %14i bytes\n" // "skip bytes: %14i bytes\n\n", // sf, // chns, // phys_max, // straightbinary, // samplesize, // d_offset, // skipblocksize, // skipbytes); fseeko(inputfile, d_offset, SEEK_SET); datarecords = 0; union{ int one[1]; signed short two[2]; char four[4]; } var; skipblockcntr = 0; bytecntr = 0; while(1) { for(j=0; j<sf; j++) { for(k=0; k<chns; k++) { // tmp = fgetc(inputfile); // if(tmp == EOF) // { // edfclose_file(hdl); // fclose(inputfile); // free(buf); // return; // } // // tmp += (fgetc(inputfile) * 256); // // buf[j + (k * sf)] = tmp - 32768; if(samplesize == 2) { tmp = fgetc(inputfile); if(tmp == EOF) { edfclose_file(hdl); fclose(inputfile); free(buf); return; } bytecntr++; // printf("1: skipblockcntr is %i tmp is %02X bytecntr is %i\n", skipblockcntr, tmp, bytecntr); if(skipblocksize) { if(++skipblockcntr > skipblocksize) { for(r=0; r<skipbytes; r++) { tmp = fgetc(inputfile); if(tmp == EOF) { edfclose_file(hdl); fclose(inputfile); free(buf); return; } // bytecntr++; // printf("2: skipblockcntr is %i tmp is %02X bytecntr is %i\n", skipblockcntr, tmp, bytecntr); } skipblockcntr = 1; } } var.four[0] = tmp; } if(samplesize == 1) { var.four[0] = 0; } tmp = fgetc(inputfile); if(tmp == EOF) { edfclose_file(hdl); fclose(inputfile); free(buf); return; } // bytecntr++; // printf("3: skipblockcntr is %i tmp is %02X bytecntr is %i\n", skipblockcntr, tmp, bytecntr); if(skipblocksize) { if(++skipblockcntr > skipblocksize) { for(r=0; r<skipbytes; r++) { tmp = fgetc(inputfile); if(tmp == EOF) { edfclose_file(hdl); fclose(inputfile); free(buf); return; } bytecntr++; // printf("4: skipblockcntr is %i tmp is %02X bytecntr is %i\n", skipblockcntr, tmp, bytecntr); } skipblockcntr = 1; } } var.four[1] = tmp; if(straightbinary) { var.two[0] -= 32768; } if(samplesize == 1) { var.two[0] >>= 8; } buf[j + (k * sf)] = var.two[0]; } } if(edf_blockwrite_digital_samples(hdl, buf)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Write error during conversion.\nedf_blockwrite_digital_samples()"); messagewindow.exec(); edfclose_file(hdl); fclose(inputfile); free(buf); return; } datarecords++; // if(datarecords == 1) break; }
void UI_WAV2EDFwindow::SelectFileButton() { FILE *inputfile=NULL; int i, j, edfsignals, sf, resolution, edf_hdl, readbufsize, *writebuf, bytes_per_sample, sf_divider; unsigned int fmt_chunk_offset, data_chunk_offset, tmp; char path[MAX_PATH_LENGTH], outputfilename[MAX_PATH_LENGTH], scratchpad[512], *readbuf; long long blocks, leftover, progress_steps, k; union { unsigned int one; signed int one_signed; unsigned short two[2]; signed short two_signed[2]; unsigned char four[4]; } var; enable_widgets(false); if(!(strlen(PatientnameLineEdit->text().toLatin1().data()))) { QMessageBox messagewindow(QMessageBox::Critical, "Invalid input", "Please enter a subject name."); messagewindow.exec(); enable_widgets(true); return; } if(!(strlen(RecordingLineEdit->text().toLatin1().data()))) { QMessageBox messagewindow(QMessageBox::Critical, "Invalid input", "Please enter a recording description."); messagewindow.exec(); enable_widgets(true); return; } strcpy(path, QFileDialog::getOpenFileName(0, "Select inputfile", QString::fromLocal8Bit(recent_opendir), "Text files (*.wav *.WAV)").toLocal8Bit().data()); if(!strcmp(path, "")) { enable_widgets(true); return; } get_directory_from_path(recent_opendir, path, MAX_PATH_LENGTH); inputfile = fopeno(path, "rb"); if(inputfile==NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open file for reading."); messagewindow.exec(); enable_widgets(true); return; } /***************** check if the wavefile is valid ******************************/ rewind(inputfile); if(fread(scratchpad, 256, 1, inputfile)!=1) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "An error occurred while reading from inputfile."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if((strncmp(scratchpad, "RIFF", 4)) || (strncmp(scratchpad + 8, "WAVE", 4))) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "File is not a Wave file."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } fmt_chunk_offset = 12; while(1) { fseeko(inputfile, (long long)fmt_chunk_offset, SEEK_SET); if(fread(scratchpad, 256, 1, inputfile)!=1) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not find fmt chunk."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(strncmp(scratchpad, "fmt ", 4) == 0) { break; } tmp = *((unsigned int *)(scratchpad + 4)); if(tmp < 2) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not find fmt chunk."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(tmp & 1) { tmp++; } fmt_chunk_offset += (tmp + 8); } if(*((signed short *)(scratchpad + 8)) != 1) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "File contains compressed data.\nCan not convert compressed data."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } edfsignals = *((unsigned short *)(scratchpad + 10)); if(edfsignals < 1) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Channels < 1"); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(edfsignals > MAXSIGNALS) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Channels > MAXSIGNALS"); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } sf = *((unsigned int *)(scratchpad + 12)); if(sf < 1) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Samplefrequency < 1"); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(sf > 500000) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Samplefrequency > 500000"); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } resolution = *((unsigned short *)(scratchpad + 22)); if(resolution < 8) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Resolution < 8 bit"); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(resolution > 24) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Resolution > 24"); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if((resolution != 8) && (resolution != 16) && (resolution != 24)) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Resolution (bitdepth) must be 8, 16 or 24 bit."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } bytes_per_sample = 2; if(resolution > 16) { bytes_per_sample = 3; } if(resolution < 9) { bytes_per_sample = 1; } /////////////////////////////////////////////////////////////////////////////// data_chunk_offset = 12; while(1) { fseeko(inputfile, (long long)data_chunk_offset, SEEK_SET); if(fread(scratchpad, 256, 1, inputfile)!=1) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not find data chunk."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(strncmp(scratchpad, "data", 4) == 0) { break; } tmp = *((unsigned int *)(scratchpad + 4)); if(tmp < 2) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not find data chunk."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } if(tmp & 1) { tmp++; } data_chunk_offset += (tmp + 8); } /////////////////////////////////////////////////////////////////////////////// sf_divider = 1; if((sf % 10) == 0) { sf_divider = 10; sf /= 10; } blocks = (long long)(*((int *)(scratchpad + 4))); blocks /= (sf * edfsignals * bytes_per_sample); fseeko(inputfile, 0LL, SEEK_END); leftover = ftello(inputfile) - (long long)data_chunk_offset - 8LL; leftover /= (sf * edfsignals * bytes_per_sample); if(blocks > leftover) { blocks = leftover; } if(blocks < 1LL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Not enough data in file."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } readbufsize = bytes_per_sample * sf * edfsignals; readbuf = (char *)malloc(readbufsize); if(readbuf == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "A memory allocation error occurred. (readbuf)."); messagewindow.exec(); fclose(inputfile); enable_widgets(true); return; } writebuf = (int *)malloc(sf * edfsignals * sizeof(int)); if(writebuf == NULL) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "A memory allocation error occurred. (writebuf)."); messagewindow.exec(); free(readbuf); fclose(inputfile); enable_widgets(true); return; } // printf("resolution is %i edfsignals is %i sf is %i blocks is %lli\n", resolution, edfsignals, sf, blocks); /***************** create a new EDF file *****************************************/ get_filename_from_path(outputfilename, path, MAX_PATH_LENGTH); remove_extension_from_filename(outputfilename); if(resolution > 16) { strcat(outputfilename, ".bdf"); } else { strcat(outputfilename, ".edf"); } path[0] = 0; if(recent_savedir[0]!=0) { strcpy(path, recent_savedir); strcat(path, "/"); } strcat(path, outputfilename); if(resolution > 16) { strcpy(path, QFileDialog::getSaveFileName(0, "Output file", QString::fromLocal8Bit(path), "BDF files (*.bdf *.BDF)").toLocal8Bit().data()); } else { strcpy(path, QFileDialog::getSaveFileName(0, "Output file", QString::fromLocal8Bit(path), "EDF files (*.edf *.EDF)").toLocal8Bit().data()); } if(!strcmp(path, "")) { enable_widgets(true); fclose(inputfile); return; } get_directory_from_path(recent_savedir, path, MAX_PATH_LENGTH); if(resolution > 16) { edf_hdl = edfopen_file_writeonly(path, EDFLIB_FILETYPE_BDFPLUS, edfsignals); } else { edf_hdl = edfopen_file_writeonly(path, EDFLIB_FILETYPE_EDFPLUS, edfsignals); } if(edf_hdl < 0) { QMessageBox messagewindow(QMessageBox::Critical, "Error", "Can not open output file for writing."); messagewindow.exec(); fclose(inputfile); free(readbuf); free(writebuf); enable_widgets(true); return; } for(i=0; i<edfsignals; i++) { edf_set_samplefrequency(edf_hdl, i, sf); } if(sf_divider != 1) { edf_set_datarecord_duration(edf_hdl, 100000 / sf_divider); } for(i=0; i<edfsignals; i++) { if(resolution > 16) { edf_set_digital_maximum(edf_hdl, i, 8388607); } else { if(resolution < 9) { edf_set_digital_maximum(edf_hdl, i, 127); } else { edf_set_digital_maximum(edf_hdl, i, 32767); } } } for(i=0; i<edfsignals; i++) { if(resolution > 16) { edf_set_digital_minimum(edf_hdl, i, -8388608); } else { if(resolution < 9) { edf_set_digital_minimum(edf_hdl, i, -128); } else { edf_set_digital_minimum(edf_hdl, i, -32768); } } } for(i=0; i<edfsignals; i++) { edf_set_physical_maximum(edf_hdl, i, PhysMaxSpinBox->value()); } for(i=0; i<edfsignals; i++) { edf_set_physical_minimum(edf_hdl, i, PhysMaxSpinBox->value() * -1.0); } for(i=0; i<edfsignals; i++) { edf_set_physical_dimension(edf_hdl, i, PhysDimLineEdit->text().toLatin1().data()); } for(i=0; i<edfsignals; i++) { sprintf(scratchpad, "channel %i", i + 1); edf_set_label(edf_hdl, i, scratchpad); } edf_set_patientname(edf_hdl, PatientnameLineEdit->text().toLatin1().data()); edf_set_recording_additional(edf_hdl, RecordingLineEdit->text().toLatin1().data()); edf_set_startdatetime(edf_hdl, StartDatetimeedit->date().year(), StartDatetimeedit->date().month(), StartDatetimeedit->date().day(), StartDatetimeedit->time().hour(), StartDatetimeedit->time().minute(), StartDatetimeedit->time().second()); edfwrite_annotation_latin1(edf_hdl, 0LL, -1, "Recording starts"); /***************** start conversion **************************************/ fseeko(inputfile, (long long)data_chunk_offset + 8LL, SEEK_SET); QProgressDialog progress("Converting a Wave file ...", "Abort", 0, (int)blocks, myobjectDialog); progress.setWindowModality(Qt::WindowModal); progress.setMinimumDuration(200); progress_steps = blocks / 100LL; if(progress_steps < 1LL) { progress_steps = 1LL; } for(k=0LL; k<blocks; k++) { if(!(k%progress_steps)) { progress.setValue((int)k); qApp->processEvents(); if(progress.wasCanceled() == true) { edfclose_file(edf_hdl); fclose(inputfile); free(readbuf); free(writebuf); enable_widgets(true); return; } } if(fread(readbuf, readbufsize, 1, inputfile)!=1) { progress.reset(); QMessageBox messagewindow(QMessageBox::Critical, "Error", "A read error occurred during conversion."); messagewindow.exec(); edfclose_file(edf_hdl); fclose(inputfile); free(readbuf); free(writebuf); enable_widgets(true); return; } if(bytes_per_sample == 1) { for(i=0; i<sf; i++) { for(j=0; j<edfsignals; j++) { writebuf[i + (j * sf)] = (signed char)(*(readbuf + (i * edfsignals) + j) + 128); } } } if(bytes_per_sample == 2) { for(i=0; i<sf; i++) { for(j=0; j<edfsignals; j++) { writebuf[i + (j * sf)] = *(((signed short *)readbuf) + (i * edfsignals) + j); } } } if(bytes_per_sample == 3) { for(i=0; i<sf; i++) { for(j=0; j<edfsignals; j++) { var.two[0] = *((unsigned short *)(readbuf + (i * edfsignals) + (j * 3))); var.four[2] = *((unsigned char *)(readbuf + (i * edfsignals * 3) + (j * 3) + 2)); if(var.four[2]&0x80) { var.four[3] = 0xff; } else { var.four[3] = 0x00; } writebuf[i + (j * sf)] = var.one_signed; } } } if(edf_blockwrite_digital_samples(edf_hdl, writebuf)) { progress.reset(); QMessageBox messagewindow(QMessageBox::Critical, "Error", "A write error occurred during conversion."); messagewindow.exec(); edfclose_file(edf_hdl); fclose(inputfile); free(readbuf); free(writebuf); enable_widgets(true); return; } } progress.reset(); edfwrite_annotation_latin1(edf_hdl, (blocks * 10000LL) / sf_divider, -1, "Recording ends"); edfclose_file(edf_hdl); fclose(inputfile); QMessageBox messagewindow(QMessageBox::Information, "Ready", "Done."); messagewindow.setIconPixmap(QPixmap(":/images/ok.png")); messagewindow.exec(); free(readbuf); free(writebuf); enable_widgets(true); }