/// <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);
                }
            }
        }
Example #4
0
        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);
        }