目录
介绍
定义
适用范围
- 下载演示项目 - 16.6 KB
前段时间,我开发了一个用于医疗监控的原型实时监控控制台。这个技巧解释了我的工作。
定义- ECG意为心电图,表示心脏组织电活动的图表。
- SPO2表示氧合血红蛋白饱和度,或简称为血液中氧气的百分比。对于一个正常休息的成年人来说,这可能是95到99左右。
- 呼吸意味着一次吸气和一次呼气。对于一个正常休息的成年人来说,这可能是每分钟16到20次。
生物医学监测器用于重症监护应用,在这些应用中,患者的重要器官功能会受到持续监测。如果这样的监控器将数据流式传输到Windows Mobile手机等手持设备,我们就可以实现随时随地的监控设备。这可以帮助医学专家在不离开座位的情况下立即监测任何患者。
当前的演示从静态整数数组中获取值。但是,我很快会将其移至蓝牙以绘制真正的实时数据。我自己在运行Windows Mobile 5.0的i-mate K-JAM设备上测试了代码。但是,此代码应在任何PPC 2003兼容设备上运行。
该应用程序的工作非常简单,如下所述:
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};
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, 10, 10 };
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 };
现在,使用计时器让图形移动:
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 - 10)
{
x = 0;
pp = 0;
pq = 0;
pr = 0;
px = 0;
}
x += 1;
//draw ECG
p = 70 - (ECGArray[i] / 6 + 50);
g.DrawLine(yelgpen, px, pp, x, p);
g.DrawLine(yelgpen, px, pp + 60, x, p + 60);
g.DrawLine(yelgpen, px, pp + 120, x, p + 120);
//draw SPO2
q = ((SPO2Array[i] * -1) / 2 + 200);
g.DrawLine(graypen, px, pq, x, q);
//draw respiration
r = (respArray[i] / 2 + 220);
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;
}
}
不要忘记启用计时器。我已将定时器间隔设置为1ms以获得良好的扫描速度。
https://www.codeproject.com/Tips/14327/Drawing-Medical-Waveforms-using-a-Windows-Mobile-D