改变高复杂度、简化健康和安全的解决方案设计
扫描二维码
随时随地手机看文章
介绍
本文重点介绍利用微软® .NET微架构来设计家用医疗器械,并介绍如何按照客户需求设计终端产品的观感。这可以通过设计吸引人的图形接口,集成各种通信接口(串口、I2C、SPI、以太网、USB、WiFi等)以及利用i.MX微处理器的优异性能来实现。其结果可能是一个高端的监测解决方案,例如血糖计,或其他一些满足特定客户需求的健康及安全设备。这些应用在价格、功能、易用性、外观及感受上有着显著区别。
在慢性疾病例如糖尿病影响年轻人的同时,医生也在让患者协作进行数据采集(疾病监测)以更好控制疾病方面面临更大挑战。例如,青少年糖尿病患者往往会关闭用以监测血糖的葡萄糖监测系统的警报器,这可能导致长时间的血糖控制被中断(见表1)。然而,集成多媒体功能的监测系统可能会让患者易于接受且更好地使用该仪器,包括对警报的回应。
表1:来自美国糖尿病学会(ADA)美国临床内分泌医师协会
(ACCE)及国际糖尿病联盟(IDF)的血糖控制目标
个人医疗设备除用于慢性病外也可以用于通常的健康和健身应用。集成先进软件和硬件的高智能设计是成功创造未来健康及安全应用的关键。这些应用将供数百万计的人使用。本文介绍一种通过.NET微架构以及i.MX微处理器系列来开发小型低成本解决方案的方法。
表2:葡萄糖监测系统(CGMS)监测的血糖过高,过低及正常的几种状态
(CGMS对17位I型糖尿病的孩子和青少年的监测)
i.MX应用处理器和.NET微架构
飞思卡尔的i.MX系列应用处理器是基于ARM®内核技术并针对多媒体应用进行了优化设计。.NET微架构可以移植到这些处理器中,以应用这些软件所带的各种功能。
.NET微架构是微软提供的.NET架构中最紧凑的系统架构,且可以配置到最小的内存空间(64KB内存,256KB闪存)。这个架构为嵌入式设备优化设计,充分提供了最常用的嵌入式开发任务,同时裁减了一些.NET完整架构中不必要的任务。它使得开发人员可以使用通信接口(以太网、WiFi、USB、串口、SPI、I2C)、LCD(直接在显示器上显示或通过视频元件)、触摸屏和存储器(闪存、内存、SD/MMC记忆卡)。由于其结构限制,.NET微架构限于运行一个应用,但它可以支持多任务运行。.NET架构的库具有最常用的对象和功能,使用它们需要从微软获得授权许可证。
飞思卡尔提供的i.MXS应用 处理器可以用于.NET微架构的应用。处理器的特点有:
• ARM920T®内核,主频100MHz
• 彩色LCD控制器
• 直接内存访问控制器DMAC
• 外设接口EIM
• SDRAM控制器
• 多种外设接口(SPI,USB和UART)
• 低功耗模式让系统在降低成本和功耗预算的同时还可以获得额外性能
移植.NET微架构可以让用户使用微软的Visual C#来开发嵌入式应用,使高端编程人员在开发嵌入式应用时获得优势。
采用.NET微架构来开发i.MXS嵌入式健康与安全应用的工具包包括:
• 微软Visual Studio 2008
• 微软Visual C#
• .NET微架构
• USB数据线
• i.MXS开发板
要获得关于.NET微架构更多的信息,请访问www.microsoft.com/netmf.
设计技巧及考虑因素
下面是在设计图形用户界面(GUIs)和数据监测功能时的一些技巧和考虑因素。具有C#编程经验的开发者能够为特殊的健康和安全嵌入式应用需求来配置硬件。
通用输入输出(GPIO)
几乎所有的健康和安全设备都使用GPIO来配置LED灯(用来显示一些特定的设备状态)、特殊的按键(复位、测试模式及校准)以及信号(用以检测准确的传感器读操作的额外中断)。根据不同的应用需求,.NET微架构可以通过3种方法来配置GPIO:
1.作为输入引脚
InputPort inputPin = new InputPort(Pins.GPIO_PORT_C_5, true, Port.ResistorMode.PullUp);
if (inputPin.Read()) runInputAction();
2.作为中断引脚
InterruptPort interruptPin = new
InterruptPort(Pins.GPIO_PORT_C_6, true, Port.
ResistorMode.PullUp, Port.InterruptMode.
InterruptEdgeHigh);
interruptPin.OnInterrupt += new GPIOInterruptEvent
Handler(inputPinInterrupt_onInterrupt);
3.作为输出引脚
OutputPort outputPin = new OutputPort(Pins.GPIO_
PORT_C_7, true);
outputPin.Write(true);
配置线程如下:
Thread t1 = new Thread(new ThreadStart(thread1));
t1.Priority = ThreadPriority.Highest;
t1.Start();
在存储器中保存数据
嵌入式开发中另外一个常用的任务是将数据保存在闪存中。数据会被保存在诸如血压计、血糖计等多种不同种类的医疗设备中。利用.NET微架构把数据存储到闪存中,需要以下几步:
1.建立序列类(serializable class)
[Serializable]
public class Device
{
private String name;
private byte value;
public String Name
{
set { name = value; }
get { return name; }
}
public byte Value
{
set { value = value; }
get { return value; }
}
public Device(byte Value, String Name)
{
value = Value; name = Name;
}
}
2.建立序列类日志
[Serializable]
class DeviceLog
{
private ArrayList log = new ArrayList();
public ArrayList Log
{
get { return log; }
}
public void AddToLog(Device device)
{
log.Insert(0, device);
}
public void RemoveFromLog(Device device)
{
log.Remove(device);
}
public void ClearLog()
{
log.Clear();
}
}
3.建立并使用闪存参考
ExtendedWeakReference flashReference;
uint id = 0;
public Object load()
{
flashReference = ExtendedWeakReference.
RecoverOrCreate(
typeof(Program), //
marker class
id,
// id number in the marker class
ExtendedWeakReference.c_
SurvivePowerdown);// flags
flashReference.Priority = (Int32)
ExtendedWeakReference.PriorityLevel.Important;
Object data = flashReference.Target; //
recovering data
return data;
}
public void save(Object data)
{
flashReference.Target = data;
}
图形用户接口GUI
.NET微架构还可以帮助程序员开发更具吸引力的界面,从而可以为终端客户提供与众不同的选择,也影响开发者选择芯片供应商的决策。
运行在i.MXS处理器的.NET微架构提供两种开发用户界面的方法。一种是使用.NET提供的用户界面元素,另外一种是使用位图类来直接刷新屏幕。
表3:NET 微架构提供的用户接口元素
表中所列所有的元素都可以通过类似的方法编程,程序如下:
// Create a panel
StackPanel _panel = new StackPanel();
_panel.Height = _mainWindow.ActualHeight;
_panel.Width= _mainWindow.ActualWidth;
// Create and configure user interface elements
Text textTitle = new Text();
textTitle.Font = Resources.GetFont(Resources.
FontResources.small);
textTitle.TextContent = “Title Text”;
textTitle.HorizontalAlignment = Microsoft.SPOT.
Presentation.HorizontalAlignment.Center;
textTitle.ForeColor = (Microsoft.SPOT.Presentation.
Media.Color)0xFF0000;
// Add the user interface elements to the panel
_panel.Children.Add(textTitle);
上面的代码首先创建一个面板对象,定义它的尺寸,然后建立好文字对象并定义好字体、大小及颜色属性。再将文字对象加入到面板子类堆中。
一旦用户接口元素被加入到显示面板中,更新元素内容的唯一方法就是异步更新,代码如下:
delegate void UpdateTitleTextDelegate(String hint);
private void UpdateTitleText(String text)
{
if (textTitle != null) textTitle.TextContent =
text;
}
// When the update of the textTitle is required,
use the following code
_mainWindow.Dispatcher.Invoke(
new TimeSpan(0, 0, 1),
new UpdateTitleTextDelegate(UpdateTitleText),
new object[] { “New Title Text” });
当使用位图来更新屏幕时,项目的坐标和画面刷新则不是自动的。开发者需要通过代码函数,状态变量,计时器和线程来进行目标定位和画面刷新。下面是一个简单的例子:
Bitmap _back = new Bitmap(240, 320); // bitmap
used for flush
Bitmap _screen = new Bitmap(240, 320); // based
bitmap to be updated
Font font = Resources.GetFont(Resources.
FontResources.small);
_back.DrawImage(35, 10, Resources.
GetBitmap(Resources.BitmapResources.freescale), 0,
0, 170, 57);
_back.DrawRectangle(Color.White, 1, 35, 10, 170,
57, 2, 2, Color.White, 0, 0, Color.White, 240,
320, 0);
_screen.DrawImage(0, 0, _back, 0, 0, 240, 320);
_screen.DrawTextInRect(“State: Background”, 10,
300, 220, 20, Bitmap.DT_AlignmentCenter |
Bitmap.DT_TrimmingCharacterEllipsis,
(Color)0xFFFFFF, font);
_screen.Flush();
图表提供了检验历史数据以及进行分析的方法。个人健康和安全设备通常使用图形,例如柱状图和点图来显示,采用统一格式来比较多个变量。下面介绍两种图形处理的方法。
第一是使用用户接口元素中的图像元素,开发者可以通过位图的属性从象素级别来控制显示的信息。
图1
表4:可以通过下面的位图类方法来操作图像中的象素
第二种方法,采用用户接口元素中的帆布元素,开发者可以操作坐标和在指定的区域显示用户接口元素,如下例所示:
Canvas _canvas = new Canvas();
_canvas.Height = SystemMetrics.ScreenHeight;
_canvas.Width = SystemMetrics.ScreenWidth;
Shape shape = new Rectangle();
// Getting random numbers for width and height,
fixing the max number to the canvas size
shape.Width = Math.Random(_canvas.Width);
shape.Height = Math.Random(_canvas.Height);
shape.Stroke = new Pen(color);
shape.Fill = new SolidColorBrush(color);
// Setting the location in the canvas for the
element, these functions are static
Canvas.SetTop(shape, Math.Random(_canvas.Height -
shape.Height));
Canvas.SetLeft(shape, Math.Random(_canvas.Width -
shape.Width));
// Adding the shape to the canvas
_canvas.Children.Add(shape);
在上面的代码中,我们建立了一个帆布对象并定义了宽和高,然后建立一个矩形对象并定义其类型,填充色以及材质。最后,定义好矩形对象在帆布中的坐标,将其添加到帆布中。创建图形比以往任何时候都更加容易,而这都是基于支持.NET微架构用户接口元素的i.MXS微处理器。
通信接口
串口通信是所有健康和安全应用中最主要的通信手段。它用来将设备中的数据传输给个人电脑供医生和患者分析。
使用例如UART、SPI、I2C、USB、Ethernet和Wi-Fi的接口常用的发送数据给PC的手段。在下面的例子中,代码采用UART来进行通信:
SerialPort serialPort;
// The configuration is through the SerialPort.
Configuration class
SerialPort.Configuration serialConfig=new
SerialPort.Configuration(SerialPort.Serial.COM1,
SerialPort.BaudRate.Baud115200, false);
serialPort = new SerialPort(serialConfig);
// The read is through the Read function that
returns the number of bytes read numberOfBytesRead
= serialPort.Read(strBuffer, 0, READ_NUMOFCHARS,
READ_TIMEOUT);
// The write is through the Write function
serialPort.Write(strBuffer, 0, strBuffer.Length);
遗憾的是,串口不使用中断方式来提醒应用层收到数据或串口准备好发送数据。常用的检查收到字节数的方法是监测Read的返回值。尽管如此,.NET 微架构使得开发者可以采用线程和事件的方式建立一个更加完整的类,其中可以采用带有无限循环的线程来检查收到的字节数。
图2是一个基于i.MXS应用处理器的卫生保健系统框图范例。
图2 基于i.MXS应用处理器的卫生保健系统框图
结论
i.MXS处理器和.NET微架构是专门针对时钟、手表、遥控器、血糖计、胆固醇计等应用进行优化设计的。采用i.MXS处理器和.NET微架构,开发者不需要成为微处理器的专家就可以迅速的设计有视觉吸引力的用户界面。高级的C#编程使得程序员可以采用类似个人电脑编程的方式来开发高端程序。
总之,微软和飞思卡尔使得设计者可以开发出引人入胜的应用(外观和感观良好并为终端用户提供增值)迅速推向市场。更重要的是,持续不断的监测疾病可以减少病痛和被病毒感染,从而帮助提高医疗救护的反应速度.