/// <summary> /// save to file, each block is 512 bytes /// </summary> /// <param name="path">path to file</param> /// <param name="seek">position of block</param> /// <param name="blocks">blocks to save</param> public static void save(string path, long seek, long blocks) { if (seek > blocksCount()) { return; } BinaryWriter bw = new BinaryWriter(new FileStream(path, FileMode.Create)); long cnt = 0; if (seek < 0) { setPosition(0); cnt = blocks + seek; } else { setPosition(seek); cnt = blocks; } for (int i = 0; i < cnt; i++) { bw.Write(readBlock()); if (remainingBlocks() < 1) { bw.Close(); return; } } bw.Close(); EcgStatistic ecg = new EcgStatistic(); ecg.id = id.id; ecg.age = id.age; ecg.name = id.name; ecg.starttimeSec = id.starttimeSec + (int)((float)seek * 56.0f / FileHandler.readSampleRate()); XmlClass <EcgStatistic> .Save(ecg, path + ".xml", SerializedFormat.Document); }
/// <summary> /// Initialize self streaming system /// </summary> /// <param name="path">path to file</param> public static void begin(string path) { p = path; end(); if (File.Exists(path)) { // load and save statistic file if (!File.Exists(path + ".xml")) { formStatistic sttc = new formStatistic(); if (sttc.ShowDialog() == DialogResult.OK) { EcgStatistic ecg = new EcgStatistic(); ecg.id = sttc.mId.Text; ecg.name = sttc.mName.Text; ecg.age = sttc.mAge.Text; string[] tm = sttc.mTime.Text.Split(':'); int hh = int.Parse(tm[0]); int mm = int.Parse(tm[1]); int ss = int.Parse(tm[2]); ecg.starttimeSec = ss + mm * 60 + hh * 60 * 60; id = ecg; } else { id = new EcgStatistic(); } XmlClass <EcgStatistic> .Save(id, path + ".xml", SerializedFormat.Document); } else { id = XmlClass <EcgStatistic> .Load(path + ".xml", SerializedFormat.Document); } // load file to stream io = new BinaryReader(new FileStream(path, FileMode.Open)); } }
protected override void OnLoad(EventArgs e) { base.OnLoad(e); this.listBox1.Items.Clear(); EcgStatistic set = FileHandler.id; if (set.critical != null) { foreach (var l in set.critical) { time t = new time(); t.block = l; t.sampleRate = main.graph1.sampleRate; t.s2 = FileHandler.id.starttimeSec; listBox1.Items.Add(t); } } }
public formMain() { InitializeComponent(); ribon1.add("Open", box.folder, true, () => { // open ecg file OpenFileDialog op = new OpenFileDialog(); op.Filter = "ECG Files (*.bin)|*.bin"; if (op.ShowDialog() == DialogResult.OK) { // store path to config Settings set = Settings.instance(); set.path = op.FileName; set.commit(); // load file FileHandler.begin(set.path); this.OnLoad(null); } }); ribon1.add("Print", box.mail, true, () => { // skip if file not loaded if (!FileHandler.available()) { return; } // open print form formPrint frm = new formPrint(this); frm.ShowDialog(); }); ribon1.add("Edit", box.edit, true, () => { // skip if file not loaded if (!FileHandler.available()) { return; } Settings set = Settings.instance(); // edit file information formStatistic sttc = new formStatistic(); sttc.mId.Text = FileHandler.id.id; sttc.mName.Text = FileHandler.id.name; sttc.mAge.Text = FileHandler.id.age; TimeSpan ts = TimeSpan.FromSeconds(FileHandler.id.starttimeSec); sttc.mTime.Text = zero(ts.Hours) + ":" + zero(ts.Minutes) + ":" + zero(ts.Seconds); if (sttc.ShowDialog() == DialogResult.OK) { // load ecg information data EcgStatistic ecg = new EcgStatistic(); ecg.id = sttc.mId.Text; ecg.name = sttc.mName.Text; ecg.age = sttc.mAge.Text; ecg.critical = FileHandler.id.critical; string[] tm = sttc.mTime.Text.Split(':'); int hh = int.Parse(tm[0]); int mm = int.Parse(tm[1]); int ss = int.Parse(tm[2]); ecg.starttimeSec = ss + mm * 60 + hh * 60 * 60; FileHandler.id = ecg; // save file information XmlClass <EcgStatistic> .Save(ecg, set.path + ".xml", SerializedFormat.Document); // refresh graph data graph1.ecgid = ecg; slider1.s2 = graph1.ecgid.starttimeSec; graph1.s2 = graph1.ecgid.starttimeSec + slider1.seek * 56.0f / sampleRate; graph1.Refresh(); slider1.Refresh(); } }); ribon1.add("Save", box.save, true, () => { // skip if file not loaded if (!FileHandler.available()) { return; } // save data SaveFileDialog op = new SaveFileDialog(); op.Filter = "ECG Files (*.bin)|*.bin"; if (op.ShowDialog() == DialogResult.OK) { FileHandler.save(op.FileName, slider1.seek, slider1.blocks); } }); ribon1.add("Analyses", box.heart, true, () => { if (!FileHandler.available()) { return; } // open analyse form formAnalyse frm = new formAnalyse(); frm.ShowDialog(); }); ribon1.add("Goto", box.ff, true, () => { // skip if file not loaded if (!FileHandler.available()) { return; } // goto time formTime tme = new formTime(); TimeSpan ts = TimeSpan.FromSeconds(FileHandler.id.starttimeSec + slider1.seek * 56.0f / slider1.sampleRate); tme.mDays.Value = ts.Days; tme.mTime.Text = zero(ts.Hours) + ":" + zero(ts.Minutes) + ":" + zero(ts.Seconds); if (tme.ShowDialog() == DialogResult.OK) { int days = (int)(tme.mDays.Value); string[] tm = tme.mTime.Text.Split(':'); int hh = int.Parse(tm[0]); int mm = int.Parse(tm[1]); int ss = int.Parse(tm[2]); // calculate seek seconds long sc = days * 24 * 60 * 60 + hh * 60 * 60 + mm * 60 + ss; // conver seconds to block number slider1.seek = (long)((float)(sc - FileHandler.id.starttimeSec) * (float)slider1.sampleRate / 56.0f) + 1; if (slider1.seek < 0) { slider1.seek = 0; } slider1.page = (long)((float)slider1.seek / (float)slider1.perPage); // refresh slider1.reload(); } }); ribon1.add("Process Button Presses", box.analyse, true, () => { // skip if file not loaded if (!FileHandler.available()) { return; } // open signal for analysing button presses formProcess frm = new formProcess(this); if (frm.ShowDialog() == DialogResult.OK) { if (frm.listBox1.SelectedIndex >= 0) { var aa = (formProcess.time)(frm.listBox1.Items[frm.listBox1.SelectedIndex]); slider1.seek = aa.block; slider1.reload(); } } }); ribon1.add("Settings", box.settings, false, () => { formSettings frm = new formSettings(this); frm.ShowDialog(); }); ribon1.add("About", box.i, false, () => { }); }
void run() { progressBar1.Minimum = 0; progressBar1.Maximum = 100; if (!FileHandler.available()) { return; } EcgStatistic set = FileHandler.id; if (set.critical == null) { set.critical = new List <long>(); } long len = FileHandler.blocksCount(); long i0 = 0; if (set.critical.Count > 2) { i0 = set.critical[set.critical.Count - 1] + 1; } for (long i = i0; i < len; i++) { FileHandler.setPosition(i); if (FileHandler.remainingBlocks() < 2) { break; } int sdm = FileHandler.io.ReadByte(); if (sdm == 170) { set.critical.Add(i); } progressBar1.Value = (int)((float)i / (float)len * 100.0f); progressBar1.Refresh(); } XmlClass <EcgStatistic> .Save(set, FileHandler.p + ".xml", SerializedFormat.Document); listBox1.Items.Clear(); if (set.critical != null) { foreach (var l in set.critical) { time t = new time(); t.block = l; t.sampleRate = main.graph1.sampleRate; t.s2 = FileHandler.id.starttimeSec; listBox1.Items.Add(t); } } progressBar1.Value = 0; progressBar1.Refresh(); MessageBox.Show("finish!"); }
/// <summary> /// load and filter signal /// </summary> /// <param name="slider">slider</param> /// <returns></returns> public static SignalSamples load(Slider slider) { // skip if file not exist if (!FileHandler.available()) { return(null); } // load samples Settings set = Settings.instance(); int sampleRate = FileHandler.readSampleRate(); SignalSamples samples = FileHandler.readBlocks(slider.seek, slider.blocks); samples = samples.Normalize(); samples.sampleRate = sampleRate; // find signal amplitude Signal deltaGreat = samples.FindMax() - samples.FindMin(); // 2x 12 hz filter if (set.noise12Hz) { samples.Filter(12, sampleRate / 2, 1.3f); samples.Filter(12, sampleRate / 2, 1.3f); } // 20 hz filter if (set.noise20Hz) { samples.Filter(20, sampleRate / 2, 1.3f); samples.Filter(20, sampleRate / 2, 1.3f); } // 45 hz filter if (set.noise45Hz) { samples.Filter(45, sampleRate / 2, 1.3f); } // 50hz or 60hz noise if (set.noiseCustom > 0) { samples.Filter(set.noiseCustom, sampleRate / 2, 1); } // notch filter if (set.noiseNotch) { samples = FilterNotch.Process(samples, 400, 0.1f); } // find signal loss enerrgy amplitude Signal deltaLess = samples.FindMax() - samples.FindMin(); // amplify loosed amplitude samples.Amplify(deltaGreat, deltaLess); // load file description FileHandler.id = XmlClass <EcgStatistic> .Load(FileHandler.p + ".xml", SerializedFormat.Document); return(samples); }