改變高復(fù)雜度、簡(jiǎn)化健康和安全的解決方案設(shè)計(jì)
掃描二維碼
隨時(shí)隨地手機(jī)看文章
介紹
本文重點(diǎn)介紹利用微軟® .NET微架構(gòu)來(lái)設(shè)計(jì)家用醫(yī)療器械,并介紹如何按照客戶需求設(shè)計(jì)終端產(chǎn)品的觀感。這可以通過(guò)設(shè)計(jì)吸引人的圖形接口,集成各種通信接口(串口、I2C、SPI、以太網(wǎng)、USB、WiFi等)以及利用i.MX微處理器的優(yōu)異性能來(lái)實(shí)現(xiàn)。其結(jié)果可能是一個(gè)高端的監(jiān)測(cè)解決方案,例如血糖計(jì),或其他一些滿足特定客戶需求的健康及安全設(shè)備。這些應(yīng)用在價(jià)格、功能、易用性、外觀及感受上有著顯著區(qū)別。
在慢性疾病例如糖尿病影響年輕人的同時(shí),醫(yī)生也在讓患者協(xié)作進(jìn)行數(shù)據(jù)采集(疾病監(jiān)測(cè))以更好控制疾病方面面臨更大挑戰(zhàn)。例如,青少年糖尿病患者往往會(huì)關(guān)閉用以監(jiān)測(cè)血糖的葡萄糖監(jiān)測(cè)系統(tǒng)的警報(bào)器,這可能導(dǎo)致長(zhǎng)時(shí)間的血糖控制被中斷(見(jiàn)表1)。然而,集成多媒體功能的監(jiān)測(cè)系統(tǒng)可能會(huì)讓患者易于接受且更好地使用該儀器,包括對(duì)警報(bào)的回應(yīng)。
表1:來(lái)自美國(guó)糖尿病學(xué)會(huì)(ADA)美國(guó)臨床內(nèi)分泌醫(yī)師協(xié)會(huì)
(ACCE)及國(guó)際糖尿病聯(lián)盟(IDF)的血糖控制目標(biāo)
個(gè)人醫(yī)療設(shè)備除用于慢性病外也可以用于通常的健康和健身應(yīng)用。集成先進(jìn)軟件和硬件的高智能設(shè)計(jì)是成功創(chuàng)造未來(lái)健康及安全應(yīng)用的關(guān)鍵。這些應(yīng)用將供數(shù)百萬(wàn)計(jì)的人使用。本文介紹一種通過(guò).NET微架構(gòu)以及i.MX微處理器系列來(lái)開(kāi)發(fā)小型低成本解決方案的方法。
表2:葡萄糖監(jiān)測(cè)系統(tǒng)(CGMS)監(jiān)測(cè)的血糖過(guò)高,過(guò)低及正常的幾種狀態(tài)
(CGMS對(duì)17位I型糖尿病的孩子和青少年的監(jiān)測(cè))
i.MX應(yīng)用處理器和.NET微架構(gòu)
飛思卡爾的i.MX系列應(yīng)用處理器是基于ARM®內(nèi)核技術(shù)并針對(duì)多媒體應(yīng)用進(jìn)行了優(yōu)化設(shè)計(jì)。.NET微架構(gòu)可以移植到這些處理器中,以應(yīng)用這些軟件所帶的各種功能。
.NET微架構(gòu)是微軟提供的.NET架構(gòu)中最緊湊的系統(tǒng)架構(gòu),且可以配置到最小的內(nèi)存空間(64KB內(nèi)存,256KB閃存)。這個(gè)架構(gòu)為嵌入式設(shè)備優(yōu)化設(shè)計(jì),充分提供了最常用的嵌入式開(kāi)發(fā)任務(wù),同時(shí)裁減了一些.NET完整架構(gòu)中不必要的任務(wù)。它使得開(kāi)發(fā)人員可以使用通信接口(以太網(wǎng)、WiFi、USB、串口、SPI、I2C)、LCD(直接在顯示器上顯示或通過(guò)視頻元件)、觸摸屏和存儲(chǔ)器(閃存、內(nèi)存、SD/MMC記憶卡)。由于其結(jié)構(gòu)限制,.NET微架構(gòu)限于運(yùn)行一個(gè)應(yīng)用,但它可以支持多任務(wù)運(yùn)行。.NET架構(gòu)的庫(kù)具有最常用的對(duì)象和功能,使用它們需要從微軟獲得授權(quán)許可證。
飛思卡爾提供的i.MXS應(yīng)用 處理器可以用于.NET微架構(gòu)的應(yīng)用。處理器的特點(diǎn)有:
• ARM920T®內(nèi)核,主頻100MHz
• 彩色LCD控制器
• 直接內(nèi)存訪問(wèn)控制器DMAC
• 外設(shè)接口EIM
• SDRAM控制器
• 多種外設(shè)接口(SPI,USB和UART)
• 低功耗模式讓系統(tǒng)在降低成本和功耗預(yù)算的同時(shí)還可以獲得額外性能
移植.NET微架構(gòu)可以讓用戶使用微軟的Visual C#來(lái)開(kāi)發(fā)嵌入式應(yīng)用,使高端編程人員在開(kāi)發(fā)嵌入式應(yīng)用時(shí)獲得優(yōu)勢(shì)。
采用.NET微架構(gòu)來(lái)開(kāi)發(fā)i.MXS嵌入式健康與安全應(yīng)用的工具包包括:
• 微軟Visual Studio 2008
• 微軟Visual C#
• .NET微架構(gòu)
• USB數(shù)據(jù)線
• i.MXS開(kāi)發(fā)板
要獲得關(guān)于.NET微架構(gòu)更多的信息,請(qǐng)?jiān)L問(wèn)www.microsoft.com/netmf.
設(shè)計(jì)技巧及考慮因素
下面是在設(shè)計(jì)圖形用戶界面(GUIs)和數(shù)據(jù)監(jiān)測(cè)功能時(shí)的一些技巧和考慮因素。具有C#編程經(jīng)驗(yàn)的開(kāi)發(fā)者能夠?yàn)樘厥獾慕】岛桶踩度胧綉?yīng)用需求來(lái)配置硬件。
通用輸入輸出(GPIO)
幾乎所有的健康和安全設(shè)備都使用GPIO來(lái)配置LED燈(用來(lái)顯示一些特定的設(shè)備狀態(tài))、特殊的按鍵(復(fù)位、測(cè)試模式及校準(zhǔn))以及信號(hào)(用以檢測(cè)準(zhǔn)確的傳感器讀操作的額外中斷)。根據(jù)不同的應(yīng)用需求,.NET微架構(gòu)可以通過(guò)3種方法來(lái)配置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();
在存儲(chǔ)器中保存數(shù)據(jù)
嵌入式開(kāi)發(fā)中另外一個(gè)常用的任務(wù)是將數(shù)據(jù)保存在閃存中。數(shù)據(jù)會(huì)被保存在諸如血壓計(jì)、血糖計(jì)等多種不同種類(lèi)的醫(yī)療設(shè)備中。利用.NET微架構(gòu)把數(shù)據(jù)存儲(chǔ)到閃存中,需要以下幾步:
1.建立序列類(lèi)(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.建立序列類(lèi)日志
[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微架構(gòu)還可以幫助程序員開(kāi)發(fā)更具吸引力的界面,從而可以為終端客戶提供與眾不同的選擇,也影響開(kāi)發(fā)者選擇芯片供應(yīng)商的決策。
運(yùn)行在i.MXS處理器的.NET微架構(gòu)提供兩種開(kāi)發(fā)用戶界面的方法。一種是使用.NET提供的用戶界面元素,另外一種是使用位圖類(lèi)來(lái)直接刷新屏幕。
表3:NET 微架構(gòu)提供的用戶接口元素
表中所列所有的元素都可以通過(guò)類(lèi)似的方法編程,程序如下:
// 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);
上面的代碼首先創(chuàng)建一個(gè)面板對(duì)象,定義它的尺寸,然后建立好文字對(duì)象并定義好字體、大小及顏色屬性。再將文字對(duì)象加入到面板子類(lèi)堆中。
一旦用戶接口元素被加入到顯示面板中,更新元素內(nèi)容的唯一方法就是異步更新,代碼如下:
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” });
當(dāng)使用位圖來(lái)更新屏幕時(shí),項(xiàng)目的坐標(biāo)和畫(huà)面刷新則不是自動(dòng)的。開(kāi)發(fā)者需要通過(guò)代碼函數(shù),狀態(tài)變量,計(jì)時(shí)器和線程來(lái)進(jìn)行目標(biāo)定位和畫(huà)面刷新。下面是一個(gè)簡(jiǎn)單的例子:
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();
圖表提供了檢驗(yàn)歷史數(shù)據(jù)以及進(jìn)行分析的方法。個(gè)人健康和安全設(shè)備通常使用圖形,例如柱狀圖和點(diǎn)圖來(lái)顯示,采用統(tǒng)一格式來(lái)比較多個(gè)變量。下面介紹兩種圖形處理的方法。
第一是使用用戶接口元素中的圖像元素,開(kāi)發(fā)者可以通過(guò)位圖的屬性從象素級(jí)別來(lái)控制顯示的信息。
圖1
表4:可以通過(guò)下面的位圖類(lèi)方法來(lái)操作圖像中的象素
第二種方法,采用用戶接口元素中的帆布元素,開(kāi)發(fā)者可以操作坐標(biāo)和在指定的區(qū)域顯示用戶接口元素,如下例所示:
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);
在上面的代碼中,我們建立了一個(gè)帆布對(duì)象并定義了寬和高,然后建立一個(gè)矩形對(duì)象并定義其類(lèi)型,填充色以及材質(zhì)。最后,定義好矩形對(duì)象在帆布中的坐標(biāo),將其添加到帆布中。創(chuàng)建圖形比以往任何時(shí)候都更加容易,而這都是基于支持.NET微架構(gòu)用戶接口元素的i.MXS微處理器。
通信接口
串口通信是所有健康和安全應(yīng)用中最主要的通信手段。它用來(lái)將設(shè)備中的數(shù)據(jù)傳輸給個(gè)人電腦供醫(yī)生和患者分析。
使用例如UART、SPI、I2C、USB、Ethernet和Wi-Fi的接口常用的發(fā)送數(shù)據(jù)給PC的手段。在下面的例子中,代碼采用UART來(lái)進(jìn)行通信:
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);
遺憾的是,串口不使用中斷方式來(lái)提醒應(yīng)用層收到數(shù)據(jù)或串口準(zhǔn)備好發(fā)送數(shù)據(jù)。常用的檢查收到字節(jié)數(shù)的方法是監(jiān)測(cè)Read的返回值。盡管如此,.NET 微架構(gòu)使得開(kāi)發(fā)者可以采用線程和事件的方式建立一個(gè)更加完整的類(lèi),其中可以采用帶有無(wú)限循環(huán)的線程來(lái)檢查收到的字節(jié)數(shù)。
圖2是一個(gè)基于i.MXS應(yīng)用處理器的衛(wèi)生保健系統(tǒng)框圖范例。
圖2 基于i.MXS應(yīng)用處理器的衛(wèi)生保健系統(tǒng)框圖
結(jié)論
i.MXS處理器和.NET微架構(gòu)是專(zhuān)門(mén)針對(duì)時(shí)鐘、手表、遙控器、血糖計(jì)、膽固醇計(jì)等應(yīng)用進(jìn)行優(yōu)化設(shè)計(jì)的。采用i.MXS處理器和.NET微架構(gòu),開(kāi)發(fā)者不需要成為微處理器的專(zhuān)家就可以迅速的設(shè)計(jì)有視覺(jué)吸引力的用戶界面。高級(jí)的C#編程使得程序員可以采用類(lèi)似個(gè)人電腦編程的方式來(lái)開(kāi)發(fā)高端程序。
總之,微軟和飛思卡爾使得設(shè)計(jì)者可以開(kāi)發(fā)出引人入勝的應(yīng)用(外觀和感觀良好并為終端用戶提供增值)迅速推向市場(chǎng)。更重要的是,持續(xù)不斷的監(jiān)測(cè)疾病可以減少病痛和被病毒感染,從而幫助提高醫(yī)療救護(hù)的反應(yīng)速度.