ZOLL Software Development Kit (SDK) Getting Started Guide JULY 2016

© 2016 ZOLL. All rights reserved. ZOLL is a registered trademark of ZOLL Medical Corporation. Other product and company names may be the trademarks of their respective owners. ZOLL Medical Corporation 269 Mill Road Chelmsford, MA USA 01824-4105

ZOLL International Holding B.V. Newtonweg 18 6662 PV ELST The Netherlands

Contact information: [email protected]

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Z O L L

D o c u m e n t a t i o n

Table of Contents About this Guide

1

Overview

1

E and X Series Device Differences

1

Required Hardware and Software

1

E Series

2

X Series

2

Communications and Data Retrieval

2

E Series

2

X Series

3

Supported File Types

4

E Series

4

X Series

4

Propaq

4

Audio

5

Date/Time Sync

5

E Series

5

X Series

5

Selecting and Uploading Cases

5

Parsing of Recorded Data

6

Rendering

6

Near Real-Time Data

7

Get Smaller Sets of Data More Frequently

7

Snapshots

7

Parsing and Rendering ECG to Create Waveforms:

8

Cloud to Cloud (C2C) Integration

11

Why Change to C2C?

11

C2C Frequently Asked Questions

12

TIP/TRICK

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

12

13

Appendix A: 12-Lead Rendering Sample

20

Appendix B: Case File Parsing Sample

21

Appendix C: 32 Feet Utilities for Bluetooth

22

Appendix D: Bluetooth Communication Panasonic Toughbooks and ZOLL E Series...... 23 Symptoms of Problem

23

Environment

23

Solution

23

Appendix E: X Series Discovery

24

Appendix F: Sample Code Requesting a List of Available Cases on CaseReview for Specific Customer 26

Z O L L

D o c u m e n t a t i o n

Frequently Asked Questions

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801-0000 Fax: (303) 801-0001 www.zoll.com

Page 1

Z O L L

D o c u m e n t a t i o n

About this Guide This document was intended for use by new ZOLL Development Partners or for existing partners that are trying to optimize integration with ZOLL devices. It supports partners’ integration into the ZOLL E Series, X Series, and Propaq MD defibrillators by providing a high level overview of the components and functions of the SDK. This document should be used in conjunction with the more detailed help files that accompany the SDK itself. Note: For the purposes of this document, X Series and Propaq MD devices are considered the same. This document will not define characteristics for the older E, M, or R Series devices or various ZOLL AEDs.

Overview The electronic patient care record (ePCR) market is crowded and very fragmented with dozens of ePCR vendors in North America alone. Every Patient Care Reporting/Charting application is slightly different, but most ePCR vendors in the ZOLL Development Partner Program (ZDPP) want to accomplish the same basic things in their integration with ZOLL monitors/defibrillators. This document focuses on the communications/discovery, data retrieval, parsing, and rendering tasks that are common among most of the ZDPP partners. It will take you through these goals and provide context in the form of sample code, FAQ’s, and tips/tricks to support your integration efforts.

E and X Series Device Differences From a SDK standpoint, E and X Series monitor/defibrillators are fundamentally different in the way they are managed. These differences influence how ZOLL development partners use the SDK to interact with these devices from their applications. The following section identifies some of these differences. In some cases, counter-intuitive is referenced in this document with a ‘◊’ symbol to provide explicit direction to development partners. For configuration details about specific defibrillators/monitors, refer to the ZOLL Configuration Guide.

Required Hardware and Software

The SDK requires Microsoft .NET 4.0 (or greater) and the Microsoft Visual C++ Redistributable Packages for Visual Studio 2013 (https://www.microsoft.com/enus/download/details.aspx?id=40784). If you are installing the SDK via its EXE-based installer, both will be installed automatically. However, if you are installing the SDK via its MSI-based installer, you must install them separately.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 2

While the SDK does not play audio files in and of itself, it does offer audio access at the file level (i.e. it returns .WAV and .OGG files). Because there is no WMP requirement, clients can use any audio playing technology.

Z O L L

D o c u m e n t a t i o n

E Series

Data storage: The E Series stores all acquired data to a flash card and offers real-time vital trends and 12-Leads. The flash card contents can be read post-case via a physical card reader or transferred via serial or Bluetooth. It requires a PCMCIA data card to record case data. Data cards may be 8mb, 16mb, or 32mb. The data card must be inserted at the time the case occurs. There is no post-case data transfer to the card.

X Series

Data storage: The X Series has internal memory to store all data types: case files, vital trends, snapshots, and 12-Leads. It uses a FIFO methodology. For more details on memory capacity, see the X Series Operator’s Guide. Two hardware platforms for the X Series:

CP1: Does not support audio/voice recording or Case Push to the Cloud. CP2: Does support audio/voice recording and Case Push to the Cloud. All new hardware and firmware releases from ZOLL after January 2013 are on the CP2 platform.

Communications and Data Retrieval E Series •

The E Series defibrillator uses a Bluetooth serial port protocol (SPP) or serial cable to pull data off the device. Optionally, users can remove the PCMCIA card and upload data via a PCMCIA card reader to a computer. The E Series does not have Wi-Fi, BT-PAN, USB, or infrared.



Users can configure Bluetooth via a manual pairing of the defibrillator to the computer to create a com port, but this is not ideal. Instead, the idea of auto-pairing allows the end-user to mix and match the defibrillator/monitor to a computer.



If you are using Bluetooth for transmissions: o You must install the Microsoft Bluetooth stack, which is part of the Microsoft Windows 7 & 8 operating systems. o You must configure the baud rate on the E Series. The baud rate on the PC must match the baud rate you configured on the E Series. o The Pairing code ‘0’ needs to be configured when connecting between Bluetooth and E Series.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 3



Serial communications: The E Series can transmit data via a 9-pin serial cable or the Ositech serial to USB cable. You must configure the baud rate on the E Series and the PC, and the speed must match.



For use models involving reading the PCMCIA card, the E Series requires a PCMCIA card reader on the laptop or the use of an OmniDrive reader.



The SDK includes a built in [utility] that creates the virtual com port and performs the autopairing. However, this technology is old and has the following limitations: o It only works with the Microsoft stack. o Not all BT radios on the market work well with the MS stack at least not with our autopairing solution. o Outside of the SDK, ZOLL recommends that you create a virtual serial port (using 32feet 1 or other 3rd party) and use the SDK to do the transfer. Then outside the SDK, tear down the virtual port.

X Series • • • •

Z O L L

D o c u m e n t a t i o n

Note: ZOLL has seen frequent issues with the Microsoft Bluetooth stack on Panasonic Toughbooks due to limitations of the internal Toshiba Bluetooth radio. It is recommended that you use an external USB Bluetooth dongle on these devices. If this solution poses a problem, see Appendix D: Bluetooth Communication between Panasonic Toughbooks and the ZOLL E Series.

• •

1

Uses a USB to Ethernet LAN (cable), Wi-Fi, Bluetooth personal area network (PAN) 2, USB stick◊ 3 for communications. Presents a set of web services through the APIs exposed in the SDK. Does not support infrared or PCMCIA communications methods. Requires the use of physical access point (AP) or cellular modem for Wi-Fi communications from the PC to the Cloud. A virtual AP is not recommended for connectivity. Bluetooth: Requires some configuration of the Bluetooth PAN. Because this method is complex to configure, it is not recommended◊ at this time. Once a pairing is set up for the Bluetooth PAN between the computer and the X Series, the X Series appears as an IP address on the PAN network interface and can be communicated the same way as with Wi-Fi communications.

For more information on the 32 Feet utilities, please refer to Appendix C: 32 Feet Utilities for Bluetooth.

SDK cannot programmatically setup Bluetooth connection so this requires user intervention each/every time a transfer is attempted.

2

3

USB cable does not work properly.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Z O L L

D o c u m e n t a t i o n

Page 4



USB 2.0 is supported while USB 3.0 is not fully supported.



Memory sticks over 4GB might be problematic and therefore are not recommended.



Use of Apple iOS mobile devices such as phones and tablets as hotspots are not recommended◊. Each X Series has a default/static IP address. This allows you to skip discovery when using an Ethernet cable. The 3rd party application needs to have a place to store this static IP address before attempting a data transfer. Can communicate with the cloud or a PC in a bi-directional communication model. Applications such as ZOLL Data Retriever or an ePCR application use a “pull” model to get the device data. A “push” model is used when sending the device data to the Cloud.





• •

ZOLL recommends that you disable the Wi-Fi “power management” configuration feature on the X Series device. For information on the X Series discovery, refer to Appendix E: X Series Discovery.

Supported File Types E Series The E Series outputs a .crd file in binary form. This single file can include multiple patient cases/records and needs to be parsed with the SDK to separate the records. Note: There are some other non- .crd file types (TWL, VTR, and VTH) that represent just the 12-Lead or vital trends that occurred during the case. The SDK can parse these and supports a special transfer mode for these cases.

X Series The X Series outputs a .json file. One or more .json files are received by the partner application via the SDK. Each .json file contains a single patient data/case/ record 4.

Propaq The original Propaq outputs a .tdp file. This single .tdp file can include multiple patient cases/records. The incident/case files should be split and then parsed with the SDK. The SDK uses a TDP converter to convert the .tdp to XML behind the scenes.

4

If a TDP file is uploaded and converted to XML, there will not be a separate file for every incident.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 5

Audio

Z O L L

D o c u m e n t a t i o n

The SDK does not offer its own playback support or play the audio files natively so it requires a media player. The SDK parses out WAV, OGG (X Series audio), SPX (AED3 audio), and AUD (E Series audio) – and provides some conversion. For instance, the SDK converts SPX to WAV prior to being returned. In short, the SDK offers audio as OGG (for X) and WAV (for everything else).

Date/Time Sync E Series With the E Series, the SDK automatically syncs the case start time with the PC for Bluetooth SPP.

X Series The Clock Synchronization feature on the X Series allows you to synchronize the X Series unit’s internal real-time clock to an external reference time source using Simple Network Time Protocol (SNTP). In order to convert this standard time to the local time, the X Series allows you to configure a time zone offset 5. For locations that observe Daylight Saving Time, the X Series provides a setting that, when set to ‘On’, immediately applies an additional one-hour positive offset from UTC. When Clock Sync is enabled and a network connection is available, the X Series automatically acquires a reference time from the SNTP server and converts the reference time to local time. The X-Series acquires a reference time from the SNTP server if no reference time has been acquired since the unit was powered on or the Clock Sync configuration settings have been changed. To ensure that the real-time clock never changes during patient treatments, the X Series makes adjustments to its clock, if necessary, after the device has been off for at least two minutes and prior to the start of a new case. When Clock Sync is enabled, you can see the time of the last synchronization on the Set Date and Time screen. The X Series also provides the message “Clock Synchronization Failed” when a synchronization attempt fails after the SNTP server settings have changed or if there has been no successful synchronization for 1 week or more.

Selecting and Uploading Cases TIP/TRICK: If your upload process is going too slow due to a large file size, especially when using Bluetooth for wireless transfer, transfer only vital trends and snapshots as outlined in Parsing of Recorded Data rather than full case from the ZOLL Device.

A timezone offset is the difference in hours and quarter-hours from UTC time for a particular locale. The timezone offset is a positive number if the local timezone is ahead of UTC and a negative number if it is behind. 5

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 6

Parsing of Recorded Data E Series constant as readings occur.

Z O L L

D o c u m e n t a t i o n

X Series records vitals every 30 seconds to create a trend. The X Series continuously stores information in a full disclosure case log for the monitored patient. The X Series can maintain up to 150 full disclosure cases that contain treatment events, trends, ECG and other continuous waveforms, monitoring and event snapshots, and 12-Leads with analysis. The X Series unit can, at a minimum, concurrently store the following information: • • •

32 monitor snapshots 500 non-ECG events 24 hours of continuous ECG (4 waveforms), Capnography, IBP (3 channels), and Pads Impedance Note: When Continuous waveform recording is disabled, no waveforms are recorded.

The X Series continuously stores information in a full disclosure case log for monitored patients. The disclosure logs contain treatment events, trends, ECG and other continuous waveforms, monitoring and event snapshots, 12-Leads, and analysis. The X Series stores a maximum of 32 12-Leads in a separate log. Once 32 12-Lead snapshots are stored, the oldest snapshot in the log is overwritten by subsequent snapshots. Note: When a patient data log is full, you will not be able to store 12-Leads. The 12-Lead snapshots are erased when you clear the log. On the X Series, up to four ECG waveforms can be recorded. If the expected waveform is not being displayed in your ePCR application, see Frequently Asked Questions for more information.

Rendering Both the E and the X Series can produce a Full Disclosure report. This report renders recorded waveforms from case start to case end. Optionally a time segment may be used to print a portion of the full disclosure, or events can be used to create an event-centric report. In the event-based report, a number of seconds are rendered before and after the event to create an event summary as opposed to the full report.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 7

Near Real-Time Data Get Smaller Sets of Data More Frequently

Z O L L

D o c u m e n t a t i o n





ZOLL does not always recommend pulling entire case files when you attempt to get near real-time data, especially over a wireless connection such as Bluetooth or Wi-Fi. In cases where smaller datasets are desired, ZOLL recommends collecting vitals and snapshots. The X Series records vital trends periodically (every 30 seconds) along with snapshots and 12-Leads. With the E Series, you get real-time vital trends. o Vitals: The SDK does not currently support the transfer of real-time vitals from the X Series. These fields are populated from the trend report (see below) in what ZOLL considers near real-time data. o Trend report: A collection of vital values (if enabled on the defibrillator) read every 30 seconds. This is one of the more useful datasets for ZOLL development partners. Partners use SDK parser and rendering tools to display trend reports in their ePCR app. o Snapshots: Ten event-driven reports in JSON format provide vital values, including the data that make up the waveform. See Snapshots for the report types. Each snapshot contains waveform and vital trend data. The amount of waveform data available before and after an event varies by snapshot type, but is typically between 0 and 12 seconds 6. These are particularly useful because the device captures reports and their associated waveforms around key events. o 12-Lead Data: The device records 12-Lead ECG waveform data, measurements, and analysis. This data is only captured at the time of the 12-Lead event.

Snapshots The X Series introduced a term called snapshot which is an auto-generated recording of waveforms triggered by an event. A snapshot can include up to four waveforms and will always have a list of vitals with values at the time of the event. Snapshots can be manual generated or auto- generated: Manual generated: Initiated by pressing the camera button on the X Series and is known as a “monitor snapshot.” The user generates a monitor snapshot when they press a camera button for “strip” on the device.

6

This can vary depending on the type of Snapshot report

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 8

Auto- generated snapshots:

Z O L L

D o c u m e n t a t i o n

• • • •

Defibrillator snapshots—Shock events Pacer snapshots Alarm snapshots—alarms on vitals o stores up to four waveforms with six second pre and nine second post acquire time Life Threatening Alarm (LTA) snapshots o Asystole o VF/VT o Extreme Bradycardia o Extreme Tachycardia

All of the following vitals are available for each snapshot referenced above: • • • • • • • •

Respiration/Breath Rate Heart/Pulse rate SPO2, SpMET & SpCO saturation ETCO2 FiCO2 IBP1, IBP2 & IBP3 Temp 1 & 2; Delta temperatures NIBP

For sample code related to parsing a case file, see Appendix A: 12-Lead Rendering Sample and Appendix B: Case File Parsing Sample.

Parsing and Rendering ECG to Create Waveforms: SDK functionality allows the entire ECG to be parsed and rendered. It then creates a waveform graph control that you can snapshot to the appropriate location for a new display without the need to reparse the case data. The pattern can be used for case data from any ZOLL monitor. There are a few controls ZOLL offers for strips and snapshots: • •

CombinedWaveformGraph: Creates ECG strips images, i.e. it depicts the full disclosure waveforms at a given point in time. SnapshotWaveformGraph: Creates snapshot waveform images.

These two controls don’t interact with each other at all. For instance, you won’t see snapshot waveforms in the CombinedWaveformGraph.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 9

The basic idea is to create an instance of the CombinedWaveformGraph and tell it to plot the parsed data (just once, using the Plot method). Then the Second property would be set to the desired number of second(s), and the image would be accessed by using the snapshot property.

D o c u m e n t a t i o n

For full disclosure or event summary strips, the system renders the following waveforms in “strips”: ECG1-4, EtCO2, SpO2 and IBP1-3. For snapshots, the system renders ECG1-4 and IBP1-3 7. In the March 2016 release of the SDK, ZOLL added a way to use the existing IReportGenerator interface to get a set of strips based on a given set of seconds, rather than calling it once for each desired second. This enabled IReportGenerator users to get a set of strips without a performance hit. The Plot method has the following signature: [

public void Plot (

Z O L L

))

IDefigConfig defibConfig, List events, List selectedEventTypes, List vitals, List waveformEcg, List waveformEcg2, List waveformEcg3, List waveformEcg4, List waveformEtco2, List waveformSpo2, List waveformIbp1, List waveformIbp2, List waveformIbp3, bool supressEventTyext = false

7

IBP 1-3 will be added in the February 2016 release of the ZOLL SDK

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 10

Example usage: var caseLoader = new ZOLL.CodeData.SDK.Case(); caseLoader.Load(@"my_zol_file.zol", ""); var graph = new ZOLL.CodeData.Rendering.CombinedWaveformGraph(); graph.Plot

Z O L L

D o c u m e n t a t i o n

(

defibConfig: caseLoader.DefibConfig, events: caseLoader.Events, selectedEventTypes: null, vitals: caseLoader.Vitals, waveformEcg: caseLoader.DataSamplesEcg, waveformEcg2: caseLoader.DataSamplesEcg2, waveformEcg3: caseLoader.DataSamplesEcg3, waveformEcg4: caseLoader.DataSamplesEcg4, waveformEtco2: caseLoader.DataSamplesEtco2, waveformSpo2: caseLoader.DataSamplesSpo2, waveformIbp1: caseLoader.DataSamplesIbp1, waveformIbp2: caseLoader.DataSamplesIbp2, waveformIbp3: caseLoader.DataSamplesIbp3

);

The Second property would be set to the elapsed second to show at the centerline of the graph: graph.Second = second;

This will cause the control to display the specified second. The snapshot property can be used to get a System.Drawing.Image that represents the image displayed by the control, which could be copied to a file, or whatever is desired. A viewer application would likely just show the control on a form. A web app could get the image and save it as a PNG, as below: graph.SnapShot.Save(@"image.png");

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 11

In 2015, ZOLL released a new form of integration with the X Series monitor. This new method for accessing data from the defibrillator involves pushing cases from the device to CaseReview in ZOLL Online. ZOLL Development Partners can use WebAPI to retrieve data from ZOLL Online. WebAPI is distributed alongside the SDK with associated documentation and sample code.

Why Change to C2C? ZOLL believes the use of the C2C method is an improvement in the integration with our Development Partners in two major ways: • •

Makes it simpler to integrate (which means development goes faster) Makes integrations more stable.

The traditional method of integrating with ZOLL devices required that ZOLL partners keep ZOLL SDK installed on every mobile unit that interacts with the device. That meant that every release of the X Series could potentially require development, release, and upgrade to all those computers in the field in order to maintain integration. With C2C, that connection is made between two cloud servers and does not require the same level of maintenance to sustain integration. To provide customer access to the Basic version of CaseReview simply send an email to [email protected] with the following information: • •

The agency’s name as it appears exactly in ZOLL Online. The customer’s contact information.

Z O L L

D o c u m e n t a t i o n

Cloud to Cloud (C2C) Integration

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 12

C2C Frequently Asked Questions

Z O L L

D o c u m e n t a t i o n

My customer is already using RescueNet 12-Lead. Can that same customer ID and Password be used to configure the X Series for Case Push to CaseReview? No. RescueNet 12-Lead and CaseReview have different authentication methods. CaseReview uses a Data Access Key (DAK) and password. The ePCR application my customer currently uses is iOS based and only runs on the iPad/iPhone. Is there any way to upload X Series data to the iPad/iPhone? Currently, ZOLL does not have a SDK or application that can be installed on the iPhone/iPad that directly transfers data from the X Series. However, if the vendor has a cloud based option the X Series data can be pulled down from CaseReview. Have the vendor contact [email protected] to get more information on a future version of an iOS SDK. Once my Customer has CaseReview setup and they have pushed cases to the cloud, how does their ePCR vendor get access to the cases? Just as CaseReview uses a DAK and a password to connect with the X Series, your customer will need to create a second DAK for use in the partner’s ePCR software. See the Case Push User’s Guide available on ZOLL Online for more information on how to create a DAK. The importance of using a DAK cannot be stressed enough for C2C implementations! What does it mean for my current integration? Can I use anything I’ve already built? Your current integration with ZOLL X Series just got a lot easier! Your end-user customer uploads their case files to CaseReview on the Web and you (the ZOLL Development Partner) use the CaseReview Web Interface (AKA WebAPI) to enable data and case retrieval from the CaseReview Case File Repository. The interface offers a subset of repository functionality, to include retrieval of a lightweight and filterable case catalog, the ability to query the repository for previously uploaded files, and the ability to upload and download specific cases for cloud-based use in your server or client applications. What are the major differences between the old SDK and Web API, and how do I get started? The old SDK is a collections of interfaces used for discovery/communications with ZOLL devices along with parsing and rendering tools for the data from these devices. The new C2C interface is a .NET Web API meant to facilitate the data retrieval from CaseReview into your ePCR applications. The WebAPI is located on the FTP site for ZOLL development partners alongside the other SDK artifacts with a specification in MS Word format.

TIP/TRICK See Appendix F: Sample Code for Requesting a List of Case Available on CaseReview to a Specific Customer for embedded C# code snippets that are used to request a list of cases available on CaseReview to a particular customer (customer mapping is intrinsic to the DAK). The other methods documented in the interface use very similar syntax. 11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 13

Frequently Asked Questions How can we generate images from the waveform data contained within a snapshot?

var parser = new ParserFactory().CreateParser("myfile.json") as IDefibParserExtended; Debug.Assert(parser != null); var parseResults = new ParseResults { Snapshots = new List() }; parser.Parse(file, start, length, ref parseResults);

if (parseResults.Snapshots.Any()) { using (var graph = new SnapshotWaveformGraph()) { foreach (var snapshot in parseResults.Snapshots) { graph.Plot(parseResults.DefibConfig, snapshot); graph.SnapShot.Save(string.Format("Snapshot {0}.png",

snapshot.Id)); } } }

Z O L L

D o c u m e n t a t i o n

For an example of how to generate images from the waveform data, see the following lines of example code.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 14

What are the step-by-step instructions for the PropaqMD and the X-Series for recording 3Lead and 12-Lead data that the SDK can convert into images?

Z O L L

D o c u m e n t a t i o n

The ZOLL X Series User Guide contains step-by-step instructions. The following information is an excerpt from the guide:

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 15

Z O L L

D o c u m e n t a t i o n

What are the step-by-step instructions for an X-Series monitor to configure Case Push?

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 16

The following sample API website appears not to work. Can someone take a look at it?

https://boundarysvc.ZOLLonline.com/GemstoneWebAPI/

D o c u m e n t a t i o n

This is the endpoint for our C2C WebAPI. This is a RESTful webservice, not a website. It is active and uses the same URI, but you cannot interact through this endpoint via a browser. You must write code or use an interactive API tool to make requests. Any interaction with this endpoint will fail unless you have valid DAK credentials to access the data. What is the difference between snapshot and non-snapshot waveforms? • •

Snapshots: Contain their own waveform data, independent of the “continuous” waveform data that is available for any time during the case. ReportGenerator: operates on the continuous waveform data, not the snapshot waveform data.

The two waveforms might not necessarily match. In other words, the snapshot may contain a certain set of waveforms, which may or may not match those available from the continuous data that is recorded contemporaneously. In practice these may align, but there is no guarantee, so no assumptions should be made (i.e. you can’t assume that because a snapshot contains ECG3, that ECG3 would also be available from ReportGenerator). How can I generate “strips of interest”? What I want are waveforms corresponding exclusively to desired events. The following example code will give you all strips that contain any of the selected event types and only require one parse operation, so it would be more performant. However, the selected event types of interest would need to be determined.

string GenerateReportEcgStrips(ReportType reportType,

Z O L L

string fileName, string destinationFolder, int? startSecond, int? endSecond, List selectedEventTypes, bool suppressEventText);

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 17

What is the difference between vitals and trends: IVital and ITrend? •

IVital is a discrete reading every time there are changes. For the types of data collected, see the disclosure log.

Z O L L

D o c u m e n t a t i o n

For more accurate detail: o Check the ITrend Members in the SDK help file (part of the CodeData Parser) o See ZOLL.CodeData.Parser.ITrend in the SDK help document •

ITrend=collection of all vitals at a point in time. o The ZOLL defib provides capacity of storing at a maximum of 24 hours of trend events. The 24 hour capacity is defined as 3800 trend events. When full capacity is reached, older trends will be removed.  The X Series collects every 30 seconds  M & E Series takes constant as readings occur and populate trend data

We don't have a .NET backend. Do you have an SDK for Ruby, C, Java, or something that is platform independent? ZOLL supports C# Windows/.NET only at this time. No Java, Ruby, etc. The SDK requires a .NET development environment. Do you have a schema or documentation that explains what each element of the JSON object is? ZOLL’s parser serves as the sole interpreter of JSON data recorded by the defibrillator and hides the details of it. I am getting dashed lines instead of four waveforms, what am I doing wrong? Continuous waveform recording allows you to record continuous waveforms to a full disclosure case log for the monitored patient. A supervisor can enable this feature by pressing the Setup quick access key ( ) and selecting Supervisor>Log>Waveform Recording. In this menu, a supervisor can customize the following settings: • •

Record Displayed Waveforms – Record only the top displayed waveform or record all displayed waveforms. Record Additional Waveforms – Always record the CO2 waveform or always record the IBP and the CO2 waveforms.

The X Series is capable of recording up to four ECG waveform channels. They are known as ECG1, ECG2, ECG3, and ECG4. ECG1 is also known as the top waveform. Each channel will have a label depending on which lead it is monitoring. For example, Lead II or Pads. If there is no ECG recorded for a channel, it will not be present in the parsed data (i.e. display as dashes). If there is ECG recorded for a channel, it is available in the parsed data. There is not a different function to call to get to the other ECG waveform channels, they are simply listed consecutively. You will see the data for ECG1 followed by the data for ECG2 etc. In the attached customer case, you can see 11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 18

Z O L L

D o c u m e n t a t i o n

Pads data in the ECG1 channel and Lead III data in the ECG2 channel. The screenshot below the parsed text shows the data for ECG1 (Pads) ending and the data for ECG2 (Lead III) beginning.

There seem to be dozens of DLLs! Which ones do I use? What is the difference between the .msi and the .exe? Regardless of which defibrillator you integrating with, you must have the entire SDK installed. It is not possible to use the .dll’s in an a la carte fashion. The setup.exe includes the Microsoft prerequisites required to run the SDK. This includes .Net 4.0 and Visual C++ 2013 redistributables. If you already have these prerequisites in your development environment, you can install only the SDK to get the SDK. If I upgrade to the latest SDK, do I need to upgrade the firmware on my defibrillator? No. The SDK will always be backwards compatible and will support old monitor/defibrillator firmware. This allows you to continue to be able to view your cases from the past whether they be months or years old. Can I have a mismatch of firmware across my fleet of monitor/defibrillators? It is possible that some of your customer’s monitor/defibrillators are on the latest firmware, either because they have just added to their existing fleet or they have a service loaner. AS ZOLL a development partner, ZOLL recommends that you verify that your most recent ePCR/SDK software will work with the latest monitor/defibrillator firmware as a best practice.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Z O L L

D o c u m e n t a t i o n

Page 19

Will my existing SDK be forward compatible with new monitor/defibrillator firmware? How current do I need to stay with the ongoing versions of the SDK? There have been occasions where changes made to the firmware required changes to the SDK in order to be compatible. Without upgrading the SDK, the ability to upload cases was broken. ZOLL strives to make the SDK as forward compatible as possible, but there are situations where this is simply not possible. Please refer to the table below for historical instances where SDK upgrades have been required. ZOLL makes every effort to notify partners when upgrades are required via the SDK release notes. Release Date 5/20/2012 7/14/2012 9/11/2012 12/18/2012 1/25/2013 4/16/2013 8/16/2013 9/5/2013 12/2/2013 3/24/2014 5/20/2014 11/3/2014 3/20/2015 4/20/2015 12/15/2015

Hardware CP version /MP version File format Required Minimum SDK version Code Review CP1 .1980/2.01.25 tdp, json 6.1.1 5.3 Propaq ???/2.01.27 tdp 6.1.3 5.53 CP1 .2120/2.03.06 tdp, json 6.1.3 5.5 New SDK Required to be compatible with the latest firmware release to date CP1 .2642/2.06.07 json 6.1.7 5.53 CP2 .2875/2.06.08 json 6.1.7 5.53 CP2 .3508/2.09.04 json 6.1.7 5.53 New SDK Required to be compatible with the latest firmware release to date CP2 .3770/2.10.02 json 6.1.8 5.54 CP1 .3796/2.09.06 json 6.1.8 5.54 CP1 .3906/2.09.06 json 6.1.8 5.54 CP2 .4084/2.18.03 json 6.1.8 5.54 CP2/PPM/MD .4217/2.19.03 and 2.19.04 json 6.1.8 5.54 New SDK Required to be compatible with the latest firmware release to date CP2/PPM/MD .4386/2.22.07 json 6.20.21 5.7 CP2/PPM/MD .4507/3.00.06 json 6.21.5 5.71 CP2/PPM/MD .4570/2.28.03 json 6.21.5 5.71 CP2/PPM/MD .4937/2.29.05 json 6.30.5 5.72

How often is a new SDK released? A major release of the SDK is issued about once a year and is in conjunction with a Code Review release. The SDK has minor release 2-4 times a year depending on circumstances. To install the SDK, you can install Code Review or you can request the SDK installer only. Do I need to recompile my ePCR software to work with the latest SDK? Your software should not be dependent on a certain version of the SDK being installed. Since the end-user may need to upgrade the SDK immediately to support a new monitor/defibrillator firmware, ZOLL wants to ensure they can continue to be up and running and not have to wait for future integration of the ePCR software. When ZOLL builds the SDK, measures are made to ensure that changes to existing methods do not break integration. As ZOLL adds new things, new methods may be added that you can pick-up in a future release cycle. If we choose to deprecate a method (that would break integration), ZOLL provides our partners advance notice that the method is going away so you have time to modify things on your end.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 20

Appendix A: 12-Lead Rendering Sample

namespace DocumentationSample {

class Program {

// For this example, the destination directory must exist public const string Target = @"D:\\Test Reports"; static void Main(string[] args) {

new License().Key = @"myLicense"; Console.WriteLine(@"12-Lead Rendering Sample"); // Source filepath may be any file containing a 12-Lead record. // If the file doesn't contain a 12-Lead record, a blank report // will be generated indicating so. Console.WriteLine(@"Enter path to source file: "); var filename = Console.ReadLine(); var report = new ReportGenerator().GenerateReportTwelveLead(filename, Target); Console.WriteLine(string.Format("Generated 12-Lead report: {0}", report)); Console.WriteLine(@"Hit to quit:"); Console.ReadLine();

} } }

Z O L L

D o c u m e n t a t i o n

using System; using ZOLL.CodeData.License; using ZOLL.CodeData.Rendering;

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 21

Appendix B: Case File Parsing Sample System; System.Linq; ZOLL.CodeData.License; ZOLL.CodeData.Parser;

namespace JsonParsingSample { class Program { public const string Target = @"D:\\Test Cases"; static void Main(string[] args) { new License().Key = @"myLicense";

parsed: ");

Console.WriteLine(@" Case File Parsing Sample"); Console.WriteLine(@" Enter the path of the case file (.JSON/.CRD/etc.) to be var fileName = Console.ReadLine(); Console.WriteLine(@" Identifying individual cases..."); var parser = new ParserFactory().CreateParser(fileName); var caseFiles = parser.ImageToFiles(fileName, Target); if (caseFiles == null || !caseFiles.Any()) { Console.WriteLine(@" No cases found in the file."); return; } var index = 0; Console.WriteLine(" Found {0} case(s):", caseFiles.Count()); foreach (var currentCase in caseFiles) { Console.WriteLine("\t Case {0}: {1}", index++, currentCase); } Console.Write(@" Select a case to parse: "); var input = Console.ReadLine(); index = int.Parse(input);

Z O L L

D o c u m e n t a t i o n

using using using using

Console.WriteLine(@" Parsing..."); var extendedParser = parser as IDefibParserExtended; var parseResults = ParseResults.All; extendedParser.Parse(caseFiles[index], ref parseResults); Console.WriteLine(@" Parsing completed.");

EventType.Shock);

Console.WriteLine(@" Find number of Shock Events as an example: "); var totalEventCount = parseResults.Events.Count(); var shockEventCount = parseResults.Events.Count(i => i.Type ==

Console.WriteLine("\t Parsed {0} Shock Events of {1} Total Events", shockEventCount, totalEventCount); Console.WriteLine(@" Hit to quit:"); Console.ReadLine(); } } }

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 22

Appendix C: 32 Feet Utilities for Bluetooth 32feet.NET is a shared-source project to make personal area networking technologies such as Bluetooth, Infrared (IrDA) and more, easily accessible from .NET code. Supports desktop, mobile or embedded systems. 32feet.NET is free for commercial or non-commercial use. If you use the binaries you can just use the library as-is, if you make modifications to the source you need to include the 32feet.NET License.txt document and ensure the file headers are not modified/removed. The project currently consists of the following libraries:• • •

Bluetooth IrDA Object Exchange

Bluetooth support requires a device with the Microsoft, Widcomm, BlueSoleil, or Stonestreet One Bluetopia Bluetooth stack. Requires .NET Compact Framework v3.5 or above and Windows CE.NET 4.2 or above, or .NET Framework v3.5 for desktop Windows XP, Vista, 7 and 8. A subset of functionality is available for Windows Phone 8 and Windows Embedded Handheld 8 in the InTheHand.Phone.Bluetooth.dll library. Note that partner application must open a port on the device and then “push” files to the application with a Series of button presses requiring user intervention.

Z O L L

D o c u m e n t a t i o n

Here is a description of 32feet from the Bluetooth website. Note that it supports a variety of BT stacks.

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 23

Appendix D: Bluetooth Communication Panasonic Toughbooks and ZOLL E Series Customers using TPCR and the E Series, who are uploading cases via Bluetooth on Panasonic Toughbooks receive Bluetooth port creation errors, hanging or no error, or incrementing com ports during each transmission.

Environment The latest model Toughbook from Panasonic has a built-in Bluetooth module and comes with the Toshiba stack enabled. The workaround has always been to remove the Toshiba stack and install the Microsoft stack. It has been determined that the internal BT hardware is incompatible with the MS stack in Windows 7.

Solution ZOLL recommends an external Bluetooth dongle and configuration of the new Toughbooks. Use a Bluetooth 3.0 dongle, like the “Kinivo BTD-300 Bluetooth USB adapter.” It’s available on Amazon. 1. Uninstall the Toshiba Bluetooth Driver. 2. Enter the BIOS and disable Bluetooth under Wireless Connectivity. 3. Insert the 3.0 Bluetooth dongle and the MS stack will automatically install.

Z O L L

D o c u m e n t a t i o n

Symptoms of Problem

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 24

Z O L L

D o c u m e n t a t i o n

Appendix E: X Series Discovery using using using using using using

System; System.Collections.Generic; System.Linq; System.Threading; System.Threading.Tasks; ZOLL.CodeData.Transfer;

namespace DiscoverySample { class Program { private static IDiscovery _discovery; private static readonly List NewVisibleAddresses = new List(); private static bool Finished { get; set; } static void Main(string[] args) { Console.WriteLine(" Discovery Sample\n"); Task.Run(async () => await Discover()); // Wait for discovery to complete while (!Finished) { Task.Run(() => Thread.SpinWait(100)); } // Found devices are written to a list for output foreach (var item in NewVisibleAddresses) { Console.WriteLine(" Discovered: " + item); Console.WriteLine(" IP/Port: " + item.AddressAsString); } Console.WriteLine("\n Press to quit..."); Console.ReadLine(); } /// /// Instantiates a new X Series Discovery Service and discovers available X Series devices /// public static async Task Discover() { const int seconds = 5; _discovery = DiscoveryFactory.Create(DiscoveryTargetService.XCaseService); _discovery.MaximumDuration = seconds; await Task.Run(() => _discovery.Starting += DiscoveryStarting); await Task.Run(() => _discovery.Finished += DiscoveryFinished);

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 25

Z O L L

D o c u m e n t a t i o n

// Start new thread to do background work in the SDK. await Task.Factory.StartNew((Action)(() => _discovery.DiscoverNow())); } /// /// Discovery Starting Event Handling /// private static void DiscoveryStarting(object sender, EventArgs e) { if (_discovery.VisibleAddresses.Any() || NewVisibleAddresses.Any()) { NewVisibleAddresses.Clear(); _discovery.VisibleAddresses.Clear(); } } /// /// Discovery Finished Event Handling /// private static void DiscoveryFinished(object sender, EventArgs e) { UpdateVisibleDevices(); Finished = true; } /// /// Converts visible devices to a list /// private static void UpdateVisibleDevices() { if (_discovery.VisibleAddresses.Any()) { foreach (var visibleAddress in _discovery.VisibleAddresses) { NewVisibleAddresses.Add(visibleAddress); } } } } }

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 26

D o c u m e n t a t i o n

Appendix F: Sample Code Requesting a List of Available Cases on CaseReview for Specific Customer ( note that customer mapping is intrinsic to the DAK) // Http request for retrieving the case catalog using (var client = new HttpClient()) { client.BaseAddress = new Uri(“https://boundarysvc.zollonline.com/GemstoneWebAPI/”); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String( Encoding.ASCII.GetBytes(string.Format("{0}:{1}", DataAccessKeyOrAlternateId, DataAccessKeyOrAlternateIdPassword)))); var response = await client.PostAsJsonAsync("case/filters", SearchCriteriaObject); response.EnsureSuccessStatusCode();

Z O L L

var caseData = await response.Content.ReadAsAsync(); } // An object defining search criteria for which the result set will match. public class SearchCriteriaObject { // The name of the parsed case as recorded in the repository string Filename; // Device SN string SerialNumber;

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com

Page 27

// Device ID if specified string DeviceId

DateTime CaseStartMaximumDate; DateTime UploadMinimumDate; //Must be in UTC. Conversion is the responsibility of the client. DateTime UploadMaximumDate; //Must be in UTC. Conversion is the responsibility of the client. // Collection of tag keys which may be used to filter the results set List TagKeys; // A unique ID associated with a case. Not all cases have this. Guid UniqueCaseId; } // The result set will consist of a collection of these objects. public class CaseDataObject { // The name of the file is the Case Review system. string Filename; // A key for which the case may be referenced in the Case Review system. Guid Key;

Z O L L

D o c u m e n t a t i o n

DateTime CaseStartMinimumDate;

// Start time of the case as recorded by the defib. Distinct from case upload time. DateTime CaseStartTime; string DeviceSerialNumber; // Valued assigned to identify the patient. This is set by the defib and may/may not be present. string PatientIdentifier List Tags; // See pg. 6 of the documentation for Tag definitions }

11802 Ridge Parkway, Suite 400 Broomfield, CO 80021 U.S.A Tel: (303) 801- 0000 Fax: (303) 801- 0001 Latest docs: www.zolldata.com