Click here to Skip to main content
6,295,667 members and growing! (9,710 online)
Email Password   helpLost your password?
Platforms, Frameworks & Libraries » Mobile Development » Graphics and Multimedia     Intermediate License: The Code Project Open License (CPOL)

Drawing medical waveforms using a Windows Mobile 5.0 device

By Radhakrishna Banavalikar

This project gives a basic idea of how to develop patient monitoring systems based on a Windows Mobile device.
C#, Windows, Win Mobile, .NET CF, .NET, Visual Studio, Dev
Posted:2 Jun 2006
Updated:3 Jan 2008
Views:42,991
Bookmarked:43 times
Announcements
Loading...
 
Search    
Advanced Search
printPrint   Broken Article?Report       add Share
  Discuss Discuss   Recommend Article Email
28 votes for this article.
Popularity: 6.11 Rating: 4.22 out of 5
3 votes, 10.7%
1

2

3
4 votes, 14.3%
4
21 votes, 75.0%
5

Sample Image - imate ECG.JPG

Introduction

Sometime back, I developed a prototype real-time monitoring console for medical monitoring. This article explains my work.

Definitions

  • ECG means electrocardiograph, a graph that indicates electrical activity of heart tissues.
  • SPO2 means Oxyhemoglobin saturation, or simply the percentage of Oxygen in blood. For a normal adult at rest, this could be around 95 to 99.
  • Respiration means one inspiration and one expiration. For a normal adult at rest, this could be around 16 and 20 per minute.

Application and scope

Biomedical monitors are used in critical care applications where patients are continuously monitored for any changes in the function of their vital organs. If such a monitor streams data to handheld devices like Windows Mobile phone, we can implement an anywhere, anytime monitoring device. This can help medical specialists to monitor any patient instantly, without leaving their seat.

The current demo takes values from static integer arrays. But, I will soon move it to Bluetooth to plot really real-time data. I have tested the code myself on an i-mate K-JAM device that runs Windows Mobile 5.0. However, this code should run on any PPC 2003 compatible device.

The application's working is quite simple, as described below:

public partial class Form1 : Form
{   
    //create variables for storing current and previous points
    int x, p, q, r, y, px, pp, pq, pr, py = 0; 

     //create colored pens for drawing 
 
    Pen yelgpen = new Pen(Color.YellowGreen);
    Pen redpen = new Pen(Color.Red);
    Pen graypen = new Pen(Color.Gray);
    Pen blackpen = new Pen(Color.Black);
 

    //fill the points to be plotted in integer arrays 
 
    int[] ECGArray = new int[]   
    { -5, -14, -10, -8, -9, -7, 0, 121, 108, -24, -34, -18, -19, -16, -19, -17, 
    -11, -11, -10, -1, 13, 33, 45, 47, 46, 37, 12, -12, -24, -23, -25, -21, -20, 
    -17, -19, -14, -12, -13, -12, -13, -8, -9, -5, -8, 10, 21, 19, 4, -10, 
    -11, -11, -12, -8, -12, 0, 121, 108, -24, -23, -18, -21, -16, -15, -14,  
    -10, -12, -7, 5, 26, 43, 46, 46, 41, 21, -1, -18, -24, -19, -22, -21,  
    -18, -18, -16, -13, -10, -12, -11, -8, -10, -8, -7, 0, 18, 24, 9, -7,  
    -13, -11, -9, -8, -10, 0, 121, 108, -24, -33, -17, -20, -19, -17, -14, 
    -13, -11, -8, 2, 19, 35, 47, 50, 43, 29, 7, -15, -29, -22, -25, -20,  
    -16, -19, -17, -16, -12, -11, -11, -10, -11, -9, -6, 0, 13, 23, 15, -2,  
    -11, -10, -10, -8, -7, -15, 0, 121, 108, -24, -20, -19, -20, -16, -12,  
    -14, -15, -11, -2, 12, 30, 41, 48, 44, 34, 16, -5, -21, -22, -21, -20,  
    -20, -13, -15, -15, -17, -14, -13, -9, -10, -10, -11, -8, 5, 23, 22, 4,  
    -9, -10, -12, -10, -10, -11, 0, 121, 108, -24, -28, -18, -19, -16, -16,  
    -16, -15, -13, -8, 4, 21, 39, 44, 46, 38, 45, 24, -1, -23, -28, -27, -25,  
    -20, -21, -18, -18, -14, -14, -13, -8, -9, -11, -9, 0, 16, 21, 11, -9,  
    -11, -9, -8, -9, -9, 0, 121, 108, -24, -32, -17, -21, -19, -16, -18, -13,  
    -10, -12 };
 
    int[] SPO2Array = new int[]  
    { 10, 9, 9, 9, 9, 9, 9, 10, 12, 16, 20, 25, 31, 37, 41, 45, 47, 47,  
    46, 42, 38, 33, 27, 23, 20, 17, 15, 15, 16, 16, 18, 18, 19, 19, 18, 18, 17,  
    16, 15, 13, 13, 11, 11, 11, 10, 10, 9, 9, 9, 9, 9, 9, 10, 12, 16, 20, 25,  
    31, 37, 41, 45, 47, 47, 46, 42, 38, 33, 27, 23, 20, 17, 15, 15, 16, 16, 18,  
    18, 19, 19, 18, 18, 17, 16, 15, 13, 13, 11, 11, 11, 10, 10, 9, 9, 9, 9, 9,  
    9, 10, 12, 16, 20, 25, 31, 37, 41, 45, 47, 47, 46, 42, 38, 33, 27, 23, 20,  
    17, 15, 15, 16, 16, 18, 18, 19, 19, 18, 18, 17, 16, 15, 13, 13, 11, 11, 11,  
    10, 10, 9, 9, 9, 9, 9, 9, 10, 12, 16, 20, 25, 31, 37, 41, 45, 47, 47, 46,  
    42, 38, 33, 27, 23, 20, 17, 15, 15, 16, 16, 18, 18, 19, 19, 18, 18, 17, 16,  
    15, 13, 13, 11, 11, 11, 10, 10, 9, 9, 9, 9, 9, 9, 10, 12, 16, 20, 25, 31,  
    37, 41, 45, 47, 47, 46, 42, 38, 33, 27, 23, 20, 17, 15, 15, 16, 16, 18, 18,  
    19, 19, 18, 18, 17, 16, 15, 13, 13, 11, 11, 11, 10, 10, 9, 9, 9, 9, 9, 9,  
    10, 12, 16, 20, 25, 31, 37, 41, 45, 47, 47, 46, 42, 38, 33, 27, 23, 20, 17,  
    15, 15, 16, 16, 16};
 
    int[] respArray = new int[] { 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52,  
    53, 53, 53, 54, 54, 54, 54, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56,  
    56, 56, 56, 56, 56, 56, 56, 57, 57, 57, 57, 57, 57, 58, 58, 58, 58,  
    58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 57,  
    57, 57, 57, 57, 57, 57, 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 55,  
    54, 54, 54, 54, 54, 53, 53, 53, 52, 52, 51, 51, 51, 50, 50, 50, 49,  
    49, 49, 48, 48, 47, 47, 47, 46, 46, 46, 45, 45, 45, 45, 44, 44, 44,  
    43, 43, 42, 42, 41, 41, 41, 40, 40, 39, 39, 38, 38, 38, 37, 37, 37,  
    36, 36, 36, 36, 35, 35, 35, 35, 34, 34, 34, 34, 34, 33, 33, 33, 33,  
    33, 32, 32, 32, 32, 32, 32, 32, 32, 31, 31, 31, 31, 31, 31, 31, 31,  
    31, 31, 31, 31, 32, 32, 32, 32, 32, 32, 32, 33, 33, 33, 33, 33, 34,  
    34, 34, 35, 35, 35, 36, 36, 36, 37, 37, 37, 38, 38, 39, 39, 40, 40,  
    40, 41, 41, 42, 42, 42, 43, 43, 44, 44, 45, 45, 45, 45, 46, 46, 46,  
    46, 47, 47, 47, 47, 48, 48, 49, 49, 49, 49, 49, 49, 48, 48, 47, 47,  
    47, 46, 46, 46, 45, 45, 45, 45, 44, 44, 44, 43, 43, 42, 42, 41, 41,  
    41, 40, 40, 39, 39, 38, 38 };

Now, use a timer to get the graph moving:

private void timer1_Tick(object sender, EventArgs e)
{ 
    
    //we are drawing on the form itself
    Graphics g = this.CreateGraphics();

    //traverse through the points one by one to get moving graphs
    for (int i = 0; i < ECGArray.Length; i++)
    {
        //e.Graphics.DrawLine(pen, 10, 10, 100, 100);
        if (x > this.Width - 100) x = 0;
        x += 1;
               
        //draw ECG
        p = 70 - (ECGArray[i] / 6 + 50);
        g.DrawLine(yelgpen, px, pp, x, p);
        g.DrawLine(yelgpen, px, pp + 30, x, p + 30);
        g.DrawLine(yelgpen, px, pp + 60, x, p + 60);
        //draw SPO2
        q = ((SPO2Array[i] * -1) / 2 + 120);
        g.DrawLine(graypen, px, pq, x, q);
        //draw respiration
        r = (respArray[i] / 2 + 120);
        g.DrawLine(redpen, px, pr, x, r);
        //draw erasebar to erase previous content at current location
        g.DrawRectangle(blackpen, 0, 0, x+1, this.Height);
        //store current point as previous point
        pp = p;
        pq = q;
        pr = r;
        px = x;
    }

Do not forget to keep the timer enabled. I have set the timer interval to around 800ms to get a good sweep speed. Lesser the timer interval, faster will be the sweep speed.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Radhakrishna Banavalikar


Member
Radhakrishna is a Microsoft Certified Technology Specialist and works as a software contractor across the United Kingdom. Converting ideas into real-world applications is his passion. He has worked on a mixed brew of technologies from Microsoft with recent concentration on .Net based architecture designs using Windows Mobile, Entity framework, AJAX, Webservices, JSON and JQuery. He is an ardent answerer on Microsoft asp.net forums. Especially the Ajax networking and web services chapter.

When not working, Radhakrishna likes listening to music, going places and photography.
Occupation: Architect
Location: United Kingdom United Kingdom

Other popular Mobile Development articles:

  • Writing Your Own GPS Applications: Part 2
    In part two of the series, the author of "GPS.NET" teaches developers how to write GPS applications suitable for the real world by mastering GPS precision concepts. Source code includes a working NMEA interpreter and sample high-precision application in C# and VB.NET.
  • Writing Your Own GPS Applications: Part I
    What is it that GPS applications need to be good enough to use for in-car navigation? Also, how does the process of interpreting GPS data actually work? In this three-part series, I will cover both topics and give you the skills you need to write a commercial-grade GPS application.
  • Learn How to Find GPS Location on Any SmartPhone, and Then Make it Relevant
    A step by step tutorial for getting GPS from any SmartPhone, even without GPS built in, and then making location useful.
  • Pocket 1945 - A C# .NET CF Shooter
    An article on Pocket PC game development
  • iPhone UI in Windows Mobile
    It's an interface that works with transparency effects. As a sample I used an interface just like the iPhone one. In this tutorial I am explaining how simple is working with transparency on Windows Mobile.
Article Top
You must Sign In to use this message board.
FAQ FAQ 
 
Noise Tolerance  Layout  Per page   
 Msgs 1 to 25 of 33 (Total in Forum: 33) (Refresh)FirstPrevNext
GeneralAnalog Frontend PinmemberEdumotion0:41 18 Mar '09  
GeneralRe: Analog Frontend PinmemberRadhakrishna Banavalikar1:01 18 Mar '09  
GeneralRe: Analog Frontend PinmemberEdumotion4:39 18 Mar '09  
GeneralRe: Analog Frontend PinmemberRadhakrishna Banavalikar4:50 18 Mar '09  
GeneralRe: Analog Frontend PinmemberEdumotion4:59 18 Mar '09  
GeneralRegarding algorithm Pinmemberboris1116:01 15 Feb '09  
GeneralRe: Regarding algorithm PinmemberRadhakrishna Banavalikar23:04 15 Feb '09  
GeneralRe: Regarding algorithm Pinmemberboris1116:58 16 Feb '09  
GeneralRe: Regarding algorithm [modified] PinmemberRadhakrishna Banavalikar2:37 16 Mar '09  
GeneralMedical Devices with Windows Mobile 5 Pinmemberimaginaryplaymate1:11 16 Dec '08  
GeneralRe: Medical Devices with Windows Mobile 5 PinmemberRadhakrishna Banavalikar1:43 16 Dec '08  
GeneralRe: Medical Devices with Windows Mobile 5 Pinmemberimaginaryplaymate2:29 18 Dec '08  
GeneralDevice PinmemberStefano_Busolin6:59 3 Sep '08  
GeneralRe: Device PinmemberRadhakrishna Banavalikar10:36 3 Sep '08  
GeneralRe: Device PinmemberStefano_Busolin11:47 3 Sep '08  
GeneralRe: Device PinmemberRadhakrishna Banavalikar6:14 4 Sep '08  
GeneralRe: Device PinmemberStefano_Busolin6:31 29 Sep '08  
GeneralRe: Device PinmemberRadhakrishna Banavalikar7:57 29 Sep '08  
GeneralRe: Device PinmemberStefano_Busolin23:56 13 Oct '08  
GeneralRe: Device PinmemberEdumotion0:31 18 Mar '09  
QuestionAbout ECG data Pinmemberjayesch19:44 8 Oct '07  
AnswerRe: About ECG data PinmemberRadhakrishna Banavalikar21:37 8 Oct '07  
Questionhelp me, please ! PinmemberAli Moein4:03 9 Feb '07  
GeneralThreading VS Timer PinmemberEmanuele Zambrano2:29 19 Jun '06  
GeneralRe: Threading VS Timer PinmemberRadhakrishna Banavalikar4:50 19 Jun '06  

General General    News News    Question Question    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

PermaLink | Privacy | Terms of Use
Last Updated: 3 Jan 2008
Editor: Smitha Vijayan
Copyright 2006 by Radhakrishna Banavalikar
Everything else Copyright © CodeProject, 1999-2009
Web18 | Advertise on the Code Project