EcgSoft. Software Developer s Guide to EcgViewer. Innovative ECG Software www.ecg-soft.com - e-mail: info@ecg-soft.com



Similar documents
EcgSoft. Software Developer s Guide to RestEcg. Innovative ECG Software info@ecg-soft.com

A Brief Introduction to MySQL

CS506 Web Design and Development Solved Online Quiz No. 01

VitalJacket SDK v Technical Specifications

VitalJacket SDK v Technical Specifications

13 File Output and Input

Using SQL Server Management Studio

Applications & Tools. Configuration of Messages and Alarms in WinCC (TIA Portal) WinCC (TIA Portal) Application description December 2012

Illustration 1: Diagram of program function and data flow

Data Management and Analysis for Successful Clinical Research. Lily Wang, PhD Department of Biostatistics Vanderbilt University

PIC 10A. Lecture 7: Graphics II and intro to the if statement

MATLAB Instrument Driver

3.5. cmsg Developer s Guide. Data Acquisition Group JEFFERSON LAB. Version

Code Estimation Tools Directions for a Services Engagement

MedDream SendToPACS USER S MANUAL (version 1.15)

Getting Started with the Internet Communications Engine

Specifications of Paradox for Windows

Embedded Systems Design Course Applying the mbed microcontroller

Creating Form Rendering ASP.NET Applications

Lab 9 Access PreLab Copy the prelab folder, Lab09 PreLab9_Access_intro

java.util.scanner Here are some of the many features of Scanner objects. Some Features of java.util.scanner

Importing and Exporting With SPSS for Windows 17 TUT 117

1 Introduction. 2 An Interpreter. 2.1 Handling Source Code

C++ Wrapper Library for Firebird Embedded SQL

Schema Classes. Polyhedra Ltd

SQL Server An Overview

Introduction to Java Applications Pearson Education, Inc. All rights reserved.

Moving from CS 61A Scheme to CS 61B Java

The full setup includes the server itself, the server control panel, Firebird Database Server, and three sample applications with source code.

Cross-platform event logging in Object Pascal

El poder de la Programación de Excel y Visual Basic User Review --->>> Enter Here More Details => VISIT HERE

Java Programming Language

Export of audit trail events from Salto software. Version 2.0

TZWorks Windows Event Log Viewer (evtx_view) Users Guide

HTTPS hg clone plugin library SSH hg clone plugin library

Micro800 Programmable Controllers: Getting Started with CIP Client Messaging

Building a Simulink model for real-time analysis V Copyright g.tec medical engineering GmbH

UniFinger Engine SDK Manual (sample) Version 3.0.0

ODBC Client Driver Help Kepware, Inc.

Technical Publications

Microsoft SQL connection to Sysmac NJ Quick Start Guide

Innovative Techniques and Tools to Detect Data Quality Problems

Computing Concepts with Java Essentials

Visual Basic. murach's TRAINING & REFERENCE

Fast Arithmetic Coding (FastAC) Implementations

Creating Carbon Menus. (Legacy)

University of Pennsylvania. Electrical & Systems Engineering Undergraduate Laboratories. ESE 112: Introduction to Electrical & Systems Engineering

Prescribed Specialised Services 2015/16 Shadow Monitoring Tool

FTP Client Engine Library for Visual dbase. Programmer's Manual

MS Active Sync: Sync with External Memory Files

Sources: On the Web: Slides will be available on:

Java Application Developer Certificate Program Competencies

INTEGRATING MICROSOFT DYNAMICS CRM WITH SIMEGO DS3

MS Access Lab 2. Topic: Tables

Critical Care EEG Database Public Edition. User Manual

The Clean programming language. Group 25, Jingui Li, Daren Tuzi

Classes and Objects. Agenda. Quiz 7/1/2008. The Background of the Object-Oriented Approach. Class. Object. Package and import

Scicos is a Scilab toolbox included in the Scilab package. The Scicos editor can be opened by the scicos command

Install Java Development Kit (JDK) 1.8

VoIP Recorder V2 Setup Guide

Implementing and testing tftp

Architecting the Future of Big Data

Chulalongkorn University International School of Engineering Department of Computer Engineering Computer Programming Lab.

D06 PROGRAMMING with JAVA

National Child Measurement Programme 2015/16. IT System User Guide Part 3. Pupil Data Management

Intel Retail Client Manager Audience Analytics

EC-12R EC-12RM EC-12R/S EC-12SResting and Stress ECG Family. Technical specification

Scatter Chart. Segmented Bar Chart. Overlay Chart

Java Interview Questions and Answers

SonicWALL GMS Custom Reports

LDAP Server Configuration Example

PART-A Questions. 2. How does an enumerated statement differ from a typedef statement?

Facebook Twitter YouTube Google Plus Website

A generic framework for game development

DAS202Tools v1.0.0 for DAS202 Operating Manual

sqlite driver manual

An Overview of Java. overview-1

Java 7 Recipes. Freddy Guime. vk» (,\['«** g!p#« Carl Dea. Josh Juneau. John O'Conner

Microsoft Dynamics CRM Security Provider Module

csce4313 Programming Languages Scanner (pass/fail)

File Transfer Protocol (FTP) Chuan-Ming Liu Computer Science and Information Engineering National Taipei University of Technology Fall 2007, TAIWAN

TMA Management Suite. For EAD and TDM products. ABOUT OneAccess. Value-Adding Software Licenses TMA

C++ INTERVIEW QUESTIONS

Smooks Dev Tools Reference Guide. Version: GA

Freescale Semiconductor, I

Settings 1 September 2015

Ohio University Computer Services Center August, 2002 Crystal Reports Introduction Quick Reference Guide

LatticeECP2/M S-Series Configuration Encryption Usage Guide

Embedded Systems. Review of ANSI C Topics. A Review of ANSI C and Considerations for Embedded C Programming. Basic features of C

UNICORN 6.4. Administration and Technical Manual

MarshallSoft AES. (Advanced Encryption Standard) Reference Manual

Getting Started with IntelleView POS Administrator Software

v1.1.0 SimpleSQL SQLite manager for Unity3D echo17.com

Troubleshooting Tools to Diagnose or Report a Problem February 23, 2012

CAPIX Job Scheduler User Guide

Programming Autodesk PLM 360 Using REST. Doug Redmond Software Engineer, Autodesk

Basic File Recording

Crash Course in Java

Python for Series 60 Platform

Transcription:

EcgSoft Software Developer s Guide to EcgViewer Innovative ECG Software www.ecg-soft.com - e-mail: info@ecg-soft.com

This page is intentionally left blank Page 2

Contents 1. Introduction...4 2. About the Guide...4 3. EcgViewer Open Interface Block Diagram...5 4. Creating an OEMLib.dll for binary ECG data format...6 5. IEcgAccess Open Interface Version 1.2...12 6. How to call EcgViewer (Embeddable Version) from your application...17 Page 3

1. Introduction EcgViewer application provides you with a graphical interface to display, review, edit and print ECG files in SCP-ECG format and also in other standard or non-standard proprietary formats. Open Interface Access is the key to the universal usage of the EcgViewer with various standard and non-standard ECG data formats. Thanks to the Open Interface Access of the EcgViewer, proprietary ECG data can be viewed if a suitable plug in DLL (Dynamically Linked Library) is available or created conforming to Open Interface Access. 2. About the Guide This guide will help you create a suitable DLL software for your proprietary ECG data with minimal effort and time on your side. Depending on the complexity of the proprietary ECG data format, software development time of a few hours to utmost a few days is sufficient for a programmer familiar with his proprietary ECG data format. At present, EcgViewer supports SCP-ECG, Binary, MIT-BIH Arrhythmia Data Base formats as well as other proprietary formats of various ECG Manufacturers. Page 4

3. EcgViewer Open Interface Block Diagram As illustrated in the diagram below, all data transfer to and from EcgViewer is realized over the IEcgAccess Interface. For each ECG data format to be supported, one Reader/Writer DLL of the name OEMLib.dll needs to be created. The following example demonstrates the implementation of IEcgAccess interface to create an OEMLib.dll DLL for reading and viewing a binary ECG file. Page 5

4. Creating an OEMLib.dll for binary ECG data format Let us assume that we have a proprietary binary ECG file where pure raw ECG data is stored in 2 bytes signed integer format. Also assume that data storage format is declared in C# language syntax as follows: // first sample of 12 leads short int I; // 2 bytes signed integer short int II; // 2 bytes signed integer short int III; // 2 bytes signed integer short int avr; // 2 bytes signed integer short int avl; // 2 bytes signed integer short int avf; // 2 bytes signed integer short int V1; // 2 bytes signed integer short int V2; // 2 bytes signed integer short int V3; // 2 bytes signed integer short int V4; // 2 bytes signed integer short int V5; // 2 bytes signed integer short int V6; // 2 bytes signed integer // Second sample of 12 leads short int I; // 2 bytes signed integer short int II; // 2 bytes signed integer short int III; // 2 bytes signed integer short int avr; // 2 bytes signed integer short int avl; // 2 bytes signed integer short int avf; // 2 bytes signed integer short int V1; // 2 bytes signed integer short int V2; // 2 bytes signed integer short int V3; // 2 bytes signed integer short int V4; // 2 bytes signed integer short int V5; // 2 bytes signed integer short int V6; // 2 bytes signed integer // Nth sample 12 leads... Page 6

This format is straightforward where each lead data for the particular sample is written consecutively in 2 bytes signed integer format. And then next sample is stored similarly. Note that there is no patient info, diagnostic info or ECG signal info (i.e. sampling rate, number of leads, etc) stored in the binary file. As illustrated in the following C# code pages, you need to implement these steps: 1. Create a new class library solution and name the solution as OemLib. 2. Let the OemEcg class implement the IEcgAccess interface as: public class OemEcg :IEcgAccess 3. Implement the methods of IEcgAccess as related to your ECG data format 4. Compile the solution and copy the OemLib.dll into the application folder of EcgViewer at..\programfiles\ecgsoft\ecgviewer 5. Finally, select from Setupmenu, General->ECG Formats->Use OemLib.dll option so that EcgViewer would use your implementation as default. You may also download and modify this solution from www.ecg-soft.com web site. There is also another solution available at the same site for reading MIT-BIH Database Arrhythmia recordings. Page 7

IEcgAccess interface comprises Patient Info, Diagnostic Info, ECG Signal Info and ECG data. Of particular importance are the ECG SignalInfo structure and its members: 1. public string Leads Define your lead names here. Do not put extra spaces or characters in between. Example: Leads = "I,II,III,aVR,aVL,aVF,V1,V2,V3,V4,V5,V6"; 2. public double SRATE Sampling rate in samples per second 3. public double ADU Number (Analog/Digital ConversionValue) corresponding to 1 mv ECG signal /// OemEcg Class example for read/write of 12 leads ECG data stored in a /// binary extension file (*.bin). IEcgAccess interface is implemented. /// Use this example to implement your own data format class as OemEcg. /// Then create OemLib.dll and copy it to the application folder of viewer. /// Next from Setupmenu, select General->ECG Formats->Use OemLib.dll option /// so that viewer would use your implementation as default. /// <remarks> /// All 12 leads are assumed to be simultaneously recorded. Each sample is /// 2 byte long samples are saved as: /// [Sample1:(I,I,II,aVR,aVL,aVF,V1,V2,V3,V4,V5,V6), Sample2:(..), /// Sample3:(..),...] /// Only pure ECG data is saved in this example /// </remarks> /// public class OemEcg : IEcgAccess // string for file extension filtering in Open file dialog box // of the EcgViewer public static string filefilter = "Binary-Ecg (*.bin) *.bin"; Person mypatient; SignalInfo myecginfo; ArrayList ecgdatalist; Diagnostic mydiagnoseinfo; // Default constructor public OemEcg() mypatient = new Person(); //create a new patient info structure myecginfo = new SignalInfo(); //create a new ecg info structure mydiagnoseinfo = new Diagnostic(); ecgdatalist = new ArrayList(); // fill patient data with some dummy patient info. (i.e no patient // info is stored in the binary file) Page 8

mypatient.id = "Demo Patient"; mypatient.firstname = "John"; mypatient.lastname = "Begg"; mypatient.height = 180; mypatient.weight = 75; mypatient.weightunit = 0; mypatient.sex = 1; // some dummy remarks mydiagnoseinfo.freetext = " This is a demo record to represent a.bin type ecg record where 2 bytes x 12 channel Ecg data is stored without any patient info"; // fill Ecg info myecginfo.acq.year = 1962; myecginfo.acq.month = 16; myecginfo.acq.day = 11; myecginfo.acq.hour = 13; myecginfo.acq.minute = 25; myecginfo.acq.second = 46; myecginfo.adu = 5464.48; //number representing 1 mv of ECG signal myecginfo.srate = 1000; //sampling rate in samples per second myecginfo.devicesn = "Demo Device"; myecginfo.leads = "I,II,III,aVR,aVL,aVF,V1,V2,V3,V4,V5,V6"; /*----------- Implement IEcgAccess interface methods ----------------*/ // gets or sets Patient Information as specified by IEcgAccess // interface and Person Structure public Person PatientInfo get return mypatient; set mypatient = value; // gets or sets pyhsician remarks as specified by IEcgAccess interface public Diagnostic DiagnoseInfo get return mydiagnoseinfo; set mydiagnoseinfo = value; // gets or sets Ecg related data as specified by IEcgAccess interface // and SignalInfo structure public SignalInfo EcgInfo get return myecginfo; set myecginfo = value; // gets or sets Ecg data as specified by IEcgAccess interface public ArrayList EcgData get return ecgdatalist; set ecgdatalist = value; Page 9

/// read the entire ECG data of the given filename /// <param name="filename"> name of Binary (*.bin) file </param> /// <returns>true if successful </returns> /// public bool Read(string filename) // Open a file stream and a Binary Reader associated with this // stream FileStream mystream = new FileStream(fileName, FileMode.Open, FileAccess.Read); BinaryReader myreader = new BinaryReader(myStream); // First clear the collection ecgdatalist.clear(); short[] ecgarray; mystream.position = 0; // each block is 12 channels by 2 bytes) long length = mystream.length / (12 * 2); // Now read the ECG data for (int j = 0; j < length; j++) ecgdatalist.add(new short[12]); ecgarray = (short[])ecgdatalist[j]; ecgarray[0] = myreader.readint16(); ecgarray[1] = myreader.readint16(); ecgarray[2] = myreader.readint16(); ecgarray[3] = myreader.readint16(); ecgarray[4] = myreader.readint16(); ecgarray[5] = myreader.readint16(); ecgarray[6] = myreader.readint16(); ecgarray[7] = myreader.readint16(); ecgarray[8] = myreader.readint16(); ecgarray[9] = myreader.readint16(); ecgarray[10] = myreader.readint16(); ecgarray[11] = myreader.readint16(); // Close the file stream and associated binary reader myreader.close(); mystream.close(); return true; write the entire Ecg data into the binary file with specified file name </summary> /// <param name="filename"> name of Binary (*.bin) file </param> /// <returns>true if successful </returns> /// public bool Write(string filename) // Open a file stream and a Binary Reader associated with this // stream Page 10

FileStream mystream = new FileStream(fileName, FileMode.Create); BinaryWriter mywriter = new BinaryWriter(myStream); // Write the 12 channel raw ECG data short[] ecgarray; for (int i = 0; i < ecgdatalist.count; i++) ecgarray = (short[])ecgdatalist[i]; for (int j = 0; j < ecgarray.length; j++) mywriter.write(ecgarray[j]); // Close the file stream and associated binary writer mywriter.close(); mystream.close(); return true; Page 11

5. IEcgAccess Open Interface Version 1.2 Implementing the open interface enables a proprietary or standard based ECG data to be viewed by the EcgViewer. Below is the C# code for the open interface IEcgAccess: /// IEcgAccess Interface to implement read/write API public interface IEcgAccess /// Reads entire record at the given path and returns true if /// successfull bool Read(string filename); /// Writes entire record to the given path and returns true if /// successfull bool Write(string filename); /// Patient related info is grouped here Person PatientInfo get; set; /// ECG related info, excluding ecg data, is grouped here SignalInfo EcgInfo get; set; /// Diagnose related info is grouped here Diagnostic DiagnoseInfo get; set; gets or sets ECG data as specified by IEcgAccess /// interface ArrayList EcgData get; set; Page 12

/// Simple DateTime structure public struct DateAndTime public int Year; public int Month; public int Day; public int Hour; public int Minute; public int Second; /// Personal Details of the patient. public struct Person Patient Identification Number, reasonable length /// 40 characters public string ID; First Name </summary> public string FirstName; Second Last Name </summary> public string SecondLastName; Last Name </summary> public string LastName; /// 0.Not known 1.Male, 2.Female, 9.Unspecified public int Sex; /// 0.Unspecified, 1.Caucasian, 2.Black, 3.Oriental public byte Race; Weight in specified units </summary> public int Weight; /// 0.Unspecified, 1.Kilogram, 2.Gram, 3.Pound, 4.Ounce public byte WeightUnit; Height in specified units </summary> public int Height; /// 0.Unspecified, 1.Centimeters, 2.Inches, 3.Millimeters public byte HeightUnit; Page 13

/// Date of birth specified in DateAndTime structure public DateAndTime Birth; Age in years </summary> public int Age; /// Details related to ECG signal characteristics and data /// acquisition public struct SignalInfo /// Enter Lead names EXACTLY as decribed in Lead /// Identification Codes table. /// Do not put extra spaces or characters in between. /// Example: "I,II,III,aVR,aVL,aVF,V1,V2,V3,V4,V5,V6" public string Leads; /// If all lead recording lengths are not same, create and /// set this array to specify lead lengths in samples. /// If same, no need to use this field. public uint[] LeadLengths; /// A/D value corresponding to 1 mv at the input public double ADU; Sampling rate in samples per second </summary> public double SRATE; Date and Time of Acquisition in DateAndTime /// structure public DateAndTime Acq; /// "cut-off" frequency (-3 db) of the high pass baseline /// filter in Hz public double BaseLineFilter /// "cut-off" frequency (-3db) of the low pass filter in Hz public double LowPassFilter; Page 14

/// if other filters, which were not defined above, indicated /// here. /// Bit 0:60 Hertz notch filter, Bit 1:50 Hertz notch filter /// Bit 2:Artifact filter Bit 3:Baseline filter (e.g. /// adaptive filter or spline filter) public byte FilterBitMap; /// Text model description. Up to 5 bytes of text public string TextModel; /// Language Support Code (one byte). This bit map indicates /// the supported character sets. /// Refer to SCP-ECG standart for the explanation of codes public byte LanguageCode; /// Capabilities of the ECG Device (one byte bit map). /// Bit 0-3 reserved, 4 printing, 5 analysis, 6 storage, 7 /// acquisition public byte CapabilitiesBitMap; /// Specifies frequency of the AC Mains /// 0: unspecified, 1: 50Hz, 2: 60Hz public byte ACMainsFrequency; Serial Number of Acquisition Device </summary> public string DeviceSN; Acquisition device SCP implementation software /// identifier (maximum 24 characters) </summary> public string DeviceSCP; Manufacturer of Acquisition Device </summary> public string DeviceMF; /// Details related to Diagnosis and Medical history public struct Diagnostic Systolic blood pressure in mmhg </summary> public ushort Systolic; Diastolic blood pressure in mmhg </summary> public ushort Diastolic; Acquiring Institution Description </summary> Page 15

public string AcquiringInstitute; Referring Physician </summary> public string ReferringPhysician; Diagnosis or the referral indication</summary> public string Diagnosis; Medical History</summary> public string MedicalHistory; Remarks and free text</summary> public string FreeText; Page 16

6. How to call EcgViewer (Embeddable Version) from your application In some applications, it may be desirable to automatically launch the EcgViewer and view a specific ECG file without user interruption. For example, you may have an ECG database application where you may need to view an ECG file by running the EcgViewer within your application. Embeddable version of EcgViewer lets you input an ECG file name as a command line parameter and run it in the syntax: EcgViewer.exe FileName Page 17

Following C# example illustrates this by using System.Diagnostics name space of.net Framework: using System.Diagnostics;.. // ECG file to be viewed (just an example) string fullfilepath = "C:\\myECGDataFolder\\mySampleEcg.scp"; // Keep the string intact including spaces, otherwise each space results in // creation of a new argument fullfilepath = string.format("\"0\"", fullfilepath); // path of the ProgramFiles folder string pathprogramfiles = Environment.GetFolderPath( Environment.SpecialFolder.ProgramFiles); // path of the EcgViewer.exe application string exepath = pathprogramfiles + "\\EcgSoft\\EcgViewer"; Process p = new Process(); p.startinfo.useshellexecute = false; p.startinfo.filename = exepath + "\\EcgViewer.exe"; p.startinfo.createnowindow = true; // do not display ms-dos window p.startinfo.arguments = fullfilepath // ECG file to be viewed p.enableraisingevents = false; // warn user if EcgViewer editor does not exist or can not be run try catch p.start(); p.waitforexit(); // wait until EcgViewer is closed MessageBox.Show("Can not run EcgViewer! ); Page 18