ecgMonitor – 修訂: 軟體、硬體、固件和機械設計
軟體修訂
心電監視器 – 軟體修訂、硬體修訂、韌體修訂和機械設計修訂/研究與研究發展
//================================================ == =========
// 狀態格式
// S0000、S0001、S0010、S0011
// 最後兩位是 LOD+ 和 LOD- 的狀態
//================================================ == =========
// 資料捕獲
// 註解:嘗試以十六進位格式儲存資料。讀起來並不容易。
// Final : 使用雙精確度格式儲存資料。
//================================================ == =========
// 修改時間:2016 年 8 月 31 日上午 8:35:00
//(描述1.0.0.2)
// 將所有藍牙模組放入uChatManager.pas中並建立兩個線程
//(TReadThread 和 TWriteThread)用於處理讀取/寫入過程
// Android 主機與 ECG 用戶端之間的通訊。
// =================================
// 藍牙模組修改
// =================================
// 使用下列內容建立 uChatManager.pas 單元:-
// 1) TChatManager
// 2) TReadThread
// 3) 寫入線程
//
// 評論:
// 使用System.Bluetooth單元,出現I/O異常,
// android嘗試連接藍牙時發生錯誤
// HC-06。套接字已關閉或逾時。
//“java.io.ioException讀取失敗套接字可能已關閉或讀取逾時 ret -1”
//
// LServerSocket.Accept(60000);
// LReadSocket.Connect;
// LWriteSocket.Connect;
//
// 上面的套接字不起作用。巴吉!
//
// 解決方案:
// 使用 AndroidApi 代替。見下文。
//================================================ == =========
// 修改時間:2016 年 10 月 20 日下午 3:00:00
//(描述1.0.0.3)
// ECGBTMain v26aworking.rar <<< 這個應用程式可以工作,但有錯誤! !
//
// 讀取執行緒自動讀取時發生錯誤。
// 讀取執行緒自動讀取時發生錯誤。
//
// 使用uAndroidChatManager.pas並建立兩個執行緒
//(TReadThread 和 TWriteThread)用於處理讀取/寫入過程
// Android 主機與 ECG 用戶端之間的通訊。
// =================================
// 藍牙模組修改
// =================================
// 使用下列內容建立 uAndroidChatManager.pas 單元:-
// 1) TAndroidChatManager
// 2) TReadThread
// 3) 寫入線程
// 註解:uChatManager 無法在 Android 和藍牙模組之間通訊。
// 建立 uAndroidChatManager 來完成這項工作。單位正在使用
// AndroidApi 呼叫藍牙模組。
//================================================ == =========
// 修改時間:2016 年 10 月 26 日上午 10:00:00
//(描述1.0.0.4)
//
// 使用uAndroidChatManager.pas並建立一個計時器來讀取接收文本
// Android 主機與 ECG 用戶端之間進行通訊。
// =================================
// 藍牙模組修改
// =================================
// 使用下列內容建立 uAndroidChatManager.pas 單元:-
// 1) TAndroidChatManager
// 2) receiveThd : TReceiveThread;
// 註解:uAndroidChatManager 可以在 Android 和藍牙模組之間進行通訊。
// 使用receiveThd: TReceiveThread 自動接收傳入的文字。
//================================================ == =========
// 修改時間:2016 年 12 月 3 日上午 10:43:00
//(描述1.0.0.5)
//
// 使用BluetoothLE單元與藍牙4.0版本進行通信
// 使用 uBT4ChatManager.pas 並建立來讀取接收文本
// 在 Android、MAC OSX 和 iOS、主機和 ECG 用戶端之間進行通訊。
// =================================
// 藍牙模組修改
// =================================
// 使用以下內容建立 uBT4ChatManager.pas 單元:-
// 1) TBT4Chat類
// 2) fbGetServiceAndCharacteristics
// 3) fbBTCCharacteristicWrite
// 4) fbBTCCharacteristicRead
// 註:uBT4ChatManager 可以在 Android、MAC OSX & iOS 和藍牙 4.0 模組之間進行通訊。
//
// =============================
// =============================
// =============================
//
// 結果:測試藍牙 4 版本 3.0.6
// **********************************************
// 程式
// {$Define BT4} ECGctrl.inc 中的更改
// BT4 模組正在工作,但速度非常慢。
// BT4每次都需要將特徵字串與資料變數一起傳輸。
// 傳輸「特徵字串」和「資料變數」將花費大量時間。
// 進一步發展
// ******************
// 波特率增加到一定值來推導出特徵字串。會有這樣的改進。
// =============================
// =============================
// =============================
//================================================ == =========
// 32 位元 Windows 和 64 位元 Windows 僅用於偵錯。
// 他們沒有藍牙無線啟用!
//================================================ == =========
// 評論:
// pcrParserBytes 計算 heartTimer.Interval 時發生問題。
// pcrParserBytes 是一個執行緒。計時器和 pcrParserBytes 執行緒之間存在衝突。
// 這裡設定heartTimer.Interval比那個更穩定的聲音脈衝
// 在 pcrParserBytes 處
//
// 這是放置fbBeepSound和重置計時器的最佳位置。
// 當間隔改變時,每次 fbBeepSound 之後重設 heartTimer。
//
// 建立:TTimeThread.pas
// 該單元使用一個執行緒來控制時間間隔(eRate)。
// 時間間隔比系統定時器更精確。
//================================================ == =========
// 在 pcrParserBytes 處擷取 HexDec 格式的數據
// 或者
// 在fbSetUpOneBTData處擷取浮點格式的數據
//================================================ == =========
// 修改時間:2016 年 12 月 20 日 11:43:00
//(描述1.0.0.6)
// 額外功能:
// 1) 自動電話撥號器 – 監控心電圖 如果太高或太低,它將撥打預設的電話號碼。
// 2) 電子郵件訊息 – 透過電子郵件傳送心電圖訊息、位置到預設的電子郵件地址
// 3) 目前位置 – 從 GPS 取得目前位置
// 4) SMS-傳送心電訊息、位置到預設的簡訊號碼
//================================================ == =========
// 研究論文 – “InTech-A_mobile_device_based_ecg_analysis_system.pdf”
// 澳洲皇家墨爾本理工大學電機與電腦工程學院
//
// “過程 pcrMonitor” 的描述
// 下面的程式碼是計算
// 1)一階導數
// 2)二階導數
// 3)檢查或監控FDBT
// 4)檢查或監控SDBT
//
// 參數:
// eFrequency(每秒脈衝)用於計算 SDBT
//================================================ == =========
// 研究論文 – “Aleksei Loos 的動態時間扭曲視覺化工具”
// 研究論文 – “Quim Llimona Torras 的動態時間扭曲 / Jounal Club 2011. MTG-UPF”
//
// 描述
// 在時間序列分析中,動態時間規則(DTW)是
// 測量兩個時間序列之間相似性的演算法
// 速度可能會有所不同。例如,走路時的相似之處
// 即使一個人在走路,也可以使用 DTW 進行偵測
// 比另一個快,或是否有加速和減速
// 在觀察過程中。
// DTW 已應用於視訊、音訊和圖形資料的時間序列
// — 事實上,任何可以轉換為線性序列的資料都可以
// 使用 DTW 進行分析。
// 一個眾所周知的應用程式是自動語音識別,
// 應對不同的語速。
// 其他應用程式包括說話者識別和線上簽名識別。
// 也可以看出它可以用於部分形狀匹配應用。
//
//================================================ == =========
// 用法: function TPlotClass.fbCalculateDistance(aObsChartValues: TChartValues; //obs
// aExpChartValues: TChartValues; //exp 或標準
// var dDisDataSet: dMultiArray): Boolean;
// fbCalculateDistance 用於計算動態時間規則(DTW)。
// 輸入:有兩個 ChartValues 資料集(aObsChartValues 和 aExpChartValues)。
// 輸出:函數將產生 dDisDataSet。
//================================================ == =========
// 用法: function TPlotClass.fbCalculatePath(dDisDataSet: dMultiArray;
// var dPathDataSet: dArray): Boolean;
// fbCalculatePath 用於計算最短距離。
// 常數:giDTWConstant & gdDTWCoefficient
// 調整兩個常數,輸出會產生對應變化的結果。
// 輸出:dPathDataSet 將由 fbCalculatePath 產生。
//================================================ == =========
//================================================ == =========
// 43) 在 fbSetUpOneBTData 和 fbZeroCrossFreq 上新增 LogAppErr
//================================================ == =========
// 44) 新增FLAG_KEEP_SCREEN_ON以保持螢幕喚醒
//================================================ == =========
// 45) 初始化
// TFastLineSeries(ecgChart[0]).DrawAllPoints := False;
// TFastLineSeries(ecgChart[0]).FastPen := True;
// ecgChart.Axes.FastCalc := True;
// ecgFastLine.AutoRepaint := False;
// ecgChart.AutoRepaint := False;
//================================================ == =========
// 修改時間:2018 年 7 月 2 日 11:53:00 PM
//(描述:1.0.0.12)
// 46) 將 giDefaultFreq 和 giDefaultAmp 改為值 10。
// 無效頻率時的蜂鳴聲將為每秒 600 脈衝。
// 它更能理解 bpm 或 bps 上的無效頻率。
// lblPulseMin 將為「888 bpm」或「88 bpm」。
// lblPulseSec 將為「8.88 bps」。
//
// 驗證 fbDCAC 和 fbHRT 功能。
// fbDCAC 和 fbHRT 取決於 eFrequency。
// 任何時候都可以使用「ZeroCross離散頻率」來取得頻率
// fbZeroCrossFreq 提供有效頻率。
//================================================ == =========
// 修改時間:2018 年 7 月 5 日 07:13:00
//(描述:1.0.0.15)
// 47) 在 ECGctrl.inc 新增指令
//
// 對於 IOS 裝置 – 32 位,AnsiChar 上沒有問題。
// 對於 IOS 設備 – 64 位,有一個例外
// ‘目標多位元組代碼頁中不存在 Unicode 字元的對應’
//
// 更改以下程式碼。
// {$HIGHCHARUNICODE 開啟}
// {$EXCESSPRECISION 關閉}
// sValue := ACharacteristic.GetValueAsString(0, True);
//================================================ == =========
// 修改時間:2018 年 7 月 23 日 09:26:00 PM
//(描述:1.0.0.19)
// 48) 低電量操作:
// 如果電池運作在3.3v以下,波形會有很大的失真。
// 心電波上會疊加一個0.2Hz-0.5Hz的波,
// 應該可以重新為電池充電!
//
// 當電池電量充足時,BLE 也能收到更好的訊號。
//
//================================================ == =========
// 修改時間:2018 年 8 月 26 日 12:00:00
//(參見說明1.0.0.24)
// 在 Delphi 10.2.3 上重新安裝
// 在Delphi 10.2.3上重新編譯項目
//================================================ == =========
// 修改時間:2018 年 8 月 27 日 08:38:00
//(參見說明1.0.0.25)
//
// ecgMain 的程式碼沒有變化。
//
// 1) 三星S9問題
// Delphi可以看到三星。但它仍然無法與調試器連結。
// 問題與10.2.1和10.2.3相同。
// 偵錯器無法與 Delphi 連結。問題出在Google方面。
// Android Oreo 作業系統在 Nexus 上進行了測試。這個問題將會得到解決。
// 三星 S9 正在等待更新…
//
// 2) IOS 模擬器 – OS 11 或更高版本。
// 對於OS 11或更高版本,模擬器也無法編譯。
// Delphi表示新版本10.3將有64位元作業系統。問題將會解決。
// 10.2.3 上的目前模擬器仍可在 32 位元作業系統上運作。
// 模擬器正在等待更新…
//
// 3) 三星 Galaxy Note Edge
// 應用程式在 10.2.1 中運行不穩定。
// 運行約1天后,應用程式會突然關閉。
// 應用程式在 10.2.3 中運作更加穩定。
// 運行約2天后,應用程式仍在運行,未關閉。
//
// 4) 10.2.3 中的 Nexus 7
// 應用程式正在以更快的反應速度運行。即時捕獲沒有延遲。
// iPhone 和 iPad 上沒有問題。
//================================================ == =========
// 修改時間:2018 年 9 月 9 日 10:20:00 PM
//(參見說明1.0.0.27)
// 新增 ‘D.P.F.將 IOS 元件加入庫中。 DPF 元件是本機 IOS 元件。
//
// 1) 此 DPF 元件 IOS 函式庫主要用於「電子郵件和 iMessage 撰寫」。
// dpfMailCompose 和 dpfMessageCompose 元件在 IOS 中使用
// 將電子郵件和 iMessage 傳送到另一台行動裝置。
//
// 先前的應用程式僅針對 Android 進行了增強。有了這個 DPF 元件 IOS,
// 該應用程式可用於 IOS 裝置。
//
// 註解:IOS 有一個 XML 格式的「root.PList」。
// 這個「root.PList」用來保存資訊:-
// – 應用程式、開發人員或版本訊息
// – 簡訊、電子郵件、位置和電話的偏好/布林值。
// 一些庫元件加入到$(SDKROOT)/System/Library/Frameworks
//================================================ == =========
// 修改時間:2018 年 9 月 17 日 03:30:00 PM
//(參見說明1.0.0.28)
// 將「KastriFree-master」加入到庫中。 KastriFree-master 是 Android 元件
//================================================ == =========
// 修改時間:2018 年 9 月 25 日 01:10:00
//(參見說明1.0.0.29)
// 使用 rectPageControl 取代 Delphi PageControl 元件。
// 圖形介面比PageControl看起來更豐富多彩。
//
// 我們正在使用以下 rectPageControl 元件。
// 矩形頁面控制項 : TRectangle;
// 矩形頁關於 : TRectangle;
// 矩形頁面BTCat : TRectangle;
// rectPageBT4Chat : TRectangle;
// 矩形頁 ECGMonitor : TRectangle;
// 矩形頁面設定 : TRectangle;
// 矩形頁面檔 : TRectangle;
// 矩形頁面主題 : TRectangle;
// rectPageMemo : TRectangle;
// 矩形頁面位置 : TRectangle;
//
// 評論:
// 1) pcrUpdateKBBounds 已從 FormFocusChanged 中刪除。
// 2) ecgChart.Height 的 pcrSetLabelsCooperative 有錯誤。
// ecgChart.Height 正在變化,在呼叫 pcrSetLabelsCooperative 之前無法驗證
//================================================ == =========
// 修改時間:2018 年 9 月 29 日晚上 10:00:00
//(參見說明1.0.0.31)
// 刪除 TPlotClass 中的公用變數。模組化過程和函數呼叫。
//================================================ == =========
// 修改時間:2018 年 10 月 4 日晚上 10:00:00
//(參見說明1.0.0.32)
// 功能:fbPeakBin、fbQuadratic 和 fbStirling 用於估計 PeakBin 頻率和振幅。
// 函數:fbLogPeakBin,fbExpQuadratic 用於估計 PeakBin 頻率和振幅。
//
// 註:-dResolution <= dp <= dResolution,其中 dResolution = VFreq 間隔的一半
// 結果幾乎相同:(fbLogPeakBin & fbExpQuadratic) 和 (fbPeakBin & fbQuadratic)!
// 結果幾乎相同:(fbLogPeakBin & fbExpQuadratic) 和 (fbPeakBin & fbQuadratic)!
// 結果幾乎相同:(fbLogPeakBin & fbExpQuadratic) 和 (fbPeakBin & fbQuadratic)!
//
// vFreqs[i] 頻率解析度:-
// eFreq := i*iSampleRate/iNBRPoints/32;
// vFreqs[i] := eFreq*iTimeBase/iTimeBaseConstant;
// vFreqs[i] := i*iSampleRate/iNBRPoints/32 * iTimeBase/iTimeBaseConstant;
//
// vFreqs[i] 頻率解析度由上式給出。
// 範例:eFreqs := 8192/2048/32 = 1/8;
// vFreqs[i] := 1/8 * 256 / 256 = 1/8;
// 使用fbPeakBin & fbStirling 可以提高解析度。
// 它們是二階和三階迭代。
// 結果vFreqs[i]頻率解析度提高了很多。
//
// dx[0] := 0.75;
// dx[1] := 0.875;
// dx[2] := 1;
// dx[3] := 1.125;
// dx[4] := 1.25;
// dfx[0] := 0;
// dfx[1] := 0.0;
// dfx[2] := 8.0;
// dfx[3] := 0.0000005; //<<< 這是錯誤項!
// dfx[4] := 0.0;
// //原始頻率 = 60 bpm
// //估計頻率 = 60.00000100 bpm //<<< 這是估計值!
//
// fbPeakBin、fbQuadratic 和 fbStirling 已測試!
//
// 1) fbPeakBin 被轉換
// applsci-06-00306.pdf
// www.mdpi.com/2076-3417/6/10/306/pdf
//
// 2) fbStirling 從 C++ 轉換為 pascal
// https://www.geeksforgeeks.org/program-stirling-interpolation-formula/
//
// 我們用 PeakBin (fbPeakBin) 和 Stirling Interpolation (fbStirling) 來
// 計算頻率和幅度。
// 斯特林是三階迭代。 PeakBin 是二階迭代。
//
// 3) 我們使用 fbQuadratic 從 PeakBin 頻率估計振幅
// https://ccrma.stanford.edu/~jos/parshl/Peak_Detection_Steps_3.html
// y(x) 應用程式。 = a (x – p) * (x – p) + b
//
// p = 0.25 * (alpha – gamma) / (alpha – 2beta + gamma)
// 由 fbPeakBin 的 dResult 給出
//
// y(p) = beta – 0.25 * (alpha – gamma) * p
//
// 在哪裡:-
// 阿爾法 := dfx[1];
// 測試版:= dfx[2];
// 伽瑪:= dfx[3];
// p := 0.25 * (alpha – gamma) / (alpha – 2beta + gamma)
//
// 評論:-
// fbStirling 比較準確,但速度較慢。
// fbQuadratic 不太準確,但速度更快。
//================================================ == =========
// 修改時間:2018 年 10 月 4 日晚上 10:00:00
//(參見說明1.0.0.32)
// 1) 修改陣列:ecgStd、ECG_Wave 與 ECGReal_wave
// 2) 重新定義lbxMultiView的lbxGpHeader和lbxItem並重新定義margin、Font、Size和Family
// 3) 新增 DSP 解析度開關以選擇斯特林或二次插值
// 4) 為 rectPageSetup 上的按鈕新增顏色
//================================================ == =========
// 修改時間:2018 年 10 月 11 日晚上 10:50:00
//(參見說明1.0.0.34)
// 1) 修改:bt4ECGCharacteristicRead、bt4ECGDiscoverLEDevice 和 bt4ECGEndDiscoverDevices
// 2) 僅過濾所有「ecgMon」裝置並在下拉清單中列出。
// 它不會顯示沒有「ecgMon」字元的其他 BLE 裝置。
// 3) 在 bt4ECGEndDiscoverDevices 之後它會或不會自動啟動 pcrBTEndDevice。
//================================================ == =========
// 修改時間:2019 年 3 月 16 日晚上 10:00:00
//(參見說明1.0.0.37)
// 安卓版本
// 經過一定時間後,應用程式將被 Android 作業系統殺死,
// 如果使用者在一段時間後關閉螢幕。
// 殺死應用程式的時間取決於設置,大約 5-10 分鐘。
//
// Android OS 8 Oreo 之後,Google 新增了電源管理器來優化電池壽命。
//
// ================================================== == ====================================
// 當應用程式運行時,我們希望透過「FLAG_KEEP_SCREEN_ON」保持螢幕開啟。
// 或者
// 若在螢幕和鍵盤關閉的情況下按下「關機」按鈕,
// 我們仍然想要讓 CPU 保持在運作模式。
// ================================================== == ====================================
// 但是,用戶按下電源按鈕後,如果螢幕關閉,Android 將殺死應用程式
// 在特定時間。
//
// iOS版本
// IOS中沒有這個問題。
//
// 注意:喚醒鎖在偵錯模式下不起作用。
// 僅在發布模式下有效。
// ================================================== == ====================================
// PowerViewer 的 Delphi-Emotiv-EPOC-master.zip 的穩定版本
//
// TApplicationEvent 使用原始事件處理程序 !
// TApplicationEvent.FinishedLaunching : fbAcquireWakeLock(jprWakeLock);
// TApplicationEvent.BecameActive : fbAcquireWakeLock(jprWakeLock);
// TApplicationEvent.WillBecomeInactive : pcrReleaseWakeLock(jprWakeLock);
// TApplicationEvent.EnteredBackground : pcrReleaseWakeLock(jprWakeLock);
// TApplicationEvent.WillBecomeForeground: fbAcquireWakeLock(jprWakeLock);
// TApplicationEvent.WillTerminate : pcrReleaseWakeLock(jprWakeLock);
//
// 評論:ScreenCtrl:關閉(始終關閉螢幕)並不總是有效!
// ================================================== == ====================================
// 參考:[如何防止 FireMonkey 應用程式/服務在背景停止運作? ]
// https://stackoverflow.com/questions/52504808/how-to-prevent-firemonkey-app-service-stop-working-while-in-background
//
// 【後台處理指南】
// https://developer.android.com/guide/background#js
//
// [如何在螢幕關閉時保持應用程式運作? ]
// https://stackoverflow.com/questions/44743265/how-to-keep-app-running-when-screen-off-or-open-another-app
//
// [德爾福 XE5 Android.如何使用PowerManager.WakeLock? ]
// https://stackoverflow.com/questions/19021647/delphi-xe5-android-how-to-use-powermanager-wakelock
//
// [如何在螢幕關閉時保持 Activity 運作?
// https://stackoverflow.com/questions/11978742/how-to-keep-an-activity-running-while-screen-off
//
// [電源管理器]
// https://developer.android.com/reference/android/os/PowerManager
//================================================ == =========
// 修改時間:2019 年 5 月 4 日 05:00:00
//(參見說明1.0.0.42)
// 舊函式庫 U_FFT.pas 和 U_FFT2.pas 被新的 U_FFT.pas 取代。
// 來自 fourier.pas 的 fbFourierTransform – Don Cross <dcross@intersrv.com>;
//
// 來自 Delphiworld/Dave Nottage 的 Kastri 函式庫的更新版本與 DW.Android.Helpers 一起使用。
// TAndroidHelperEx.RestartIfNotIgnoringBatteryOptimizations 是為了確保應用程式
// 在「IgnoringBatteryOptimization」模式下運作。
//
// 在 iPad 和 iPhone 中,「Keep_Screen_ON」不存在此問題。
// 在 IOS 中後台運行是可以的。
//================================================ == =========
// 修改時間:2019 年 5 月 10 日 10:00:00 PM
//(參見說明1.0.0.43)
//
// 介紹下面Android的“效能模式”
// 1) 高效能 – 螢幕打開
// 2) 正常模式 – 螢幕關閉/背景模式
// 3) 低電量模式 – 螢幕關閉
//
// “效能模式”的描述
// 1) 高效能 – Screen On 是 CPU 始終運作且 Screen 始終開啟的模式。
// 使用者可以進行任何活動,例如打電話、瀏覽、遊戲、
// 視訊和音訊…等在一起。這些應用程式始終有效。
// 「高效能模式」是為了效能而消耗電池。
// 2) 低電量模式 – 螢幕關閉/後台模式是CPU始終在背景運行並且
// 螢幕在打瞌睡模式下自動關閉。
// 使用者可以進行任何活動,例如打電話、瀏覽、遊戲、
// 視訊和音訊…等在一起。 CPU可以在背景保持運行
// 1 小時到 8 小時。當用戶沒有任何權限時,應用程式將被系統殺死
// 活動。
//================================================ == =========
//
// 帶錯誤回報的 ALPHA 測試
//
//================================================ == =========
//
//
//================================================ == =========
//
// 錯誤回報! !
//
//================================================ == =========
// 錯誤#001
// 固定的
// 時間到時停用該功能(Start Event)
//
//================================================ == =========
// Bug#002 已修復
// 固定的
// 這裡為 giWaveType > gi捕捉模式
// 再進行一次設定圖表比例
// 變更軸時間刻度
// 程式碼被刪除。
//
//================================================ == =========
// 錯誤#003
// 固定的
// 僅在時間未到時啟用此功能(Pause Event)
//
// 錯誤#004
// 固定的
// 僅在啟用擷取時儲存擷取資料。
//
//================================================ == =========
// 錯誤#005
// 固定的
// 與 Bug#004 相同。僅在啟用擷取時儲存擷取資料。
//
//================================================ == =========
// 錯誤#006
// 固定的
// 確保在第一頁之後呼叫 pcrMonitor。嘗試5次!
// 如果沒有延遲,則會引發存取衝突。
//
//================================================ == =========
// 錯誤#007
// 固定的
// 此錯誤是由於 tmrECG 執行緒仍在背景運行所致。
// fbCalculatePath 未完成計算並退出 exe。
// 將會出現異常。
// 等待2s結束fbCalculatePath計算、Threads、Timers
//
//================================================ == =========
// 錯誤#008
// 固定的
// 退出應用程式需要等到fbCalculatePath完成!
// 它無法釋放數組或等待這些計算完成。
// 檢查 fbCalculatePath 是否仍然完成?
//
//================================================ == =========
// 錯誤#009
// 固定的
// 當 bpuMonStatus 執行時
// 開始
// 做某事
// 結尾;
//
// ================================================== == ===============================
// 錯誤#010
// 固定的。請參閱錯誤#022
// Android 作業系統 4.4.2
// 註:不同的iResolution會給予不同的NumBufPoints。
// 這是因為相位和擷取資料不同。
// 解:Result := Trunc(iScbTrigger+iTimeBase*XXX) > 3072,必須大於3072。
// ================================================== == ===============================
// iWaveType = giReadMode, 不同的i解析度將給出不同的藍點
// 請參閱函數缺陷的描述
// 如果擷取資料大小不是256的倍數,就會出現
// 循環播放記錄時圖的連接。
// 結果 := Trunk(outrigger+Sebastian*XXX) > 3072,必須大於3072。
//
//================================================ == =========
// 錯誤#011
// 固定的
// 將擴充格式或雙精度型轉換為單精度型。
//
//================================================ == =========
// 錯誤#012
// 固定的
// 確保在第一頁之後呼叫 pcrMonitor(不是 bpu1stPlot)
//
//================================================ == =========
// 錯誤#013
// 這裡,vXReal 的長度 & vXImag 必須是兩個倍數相同
//
//================================================ == =========
// 錯誤#024
// 檢查藍牙是否連接
// 如果藍牙連線斷開,則重新連接
//================================================ == =========
// 漏洞!錯誤#025
// 固定的
// 註解掉pcrcbxResolution0to1
// 讓演示的解析度為 128sps
//================================================ == =========
// 漏洞!錯誤#026
// 修復了小錯誤
// sSend := edtBT4NewText.Text;
// sSend := edtNewText.Text;
//================================================ == =========
// 漏洞!錯誤#027
// 修復了小錯誤
// 註解掉下面的程式碼。底部螢幕對焦有問題
// pcrUpdateKBBounds;
//================================================ == =========
// 漏洞!錯誤#028
// 固定的
// 這是必須的 (vFreqs[i] < iBPMHighLimit/60)!!! // 這是必須的 (vFreqs[i] > iBPMLowLimit/60)!
// 如果 (vFreqs[i] <= iBPMHighLimit/60) 且 (vFreqs[i] > iBPMLowLimit/60) 那麼
// 追蹤 2 個最高振幅。
//================================================ == =========
// 漏洞!錯誤#029
// 如果 frmECG.epuFrequency = 0,則 fbTimerOnTime 不行。
// 我們需要檢查 dFreqThreshold 頻率。
//================================================ == =========
// 漏洞!錯誤#030
// 如果 frmECG.epuFrequency = 0,則 fdOptimizeFrequency 不起作用。
// 我們需要檢查 dFreqThreshold 頻率。
//================================================ == =========
// 漏洞!錯誤#031
// 新增以下程式碼以最佳化頻率低於 0.01 dAmplitudeThreshold
// 如果 eFrequency >= 2,我們將使用 fdOptimizeFrequency 來獲得更好的頻率。
//
// 如果 efMax1 和 efMax2 都 >= 2,則 eFrequency 將大於 2!
// 客戶端會出現bpm異常!
//================================================ == =========
// 漏洞!錯誤#036
// 頻率 = 786, 1152
// 調整 giWavetype = giReadMode 的 eFrequency
// 註:因為沒有時脈來運行讀取訊號。
// 基於CPU時鐘,心電圖的讀取是與CPU時鐘一起運作的。
// 它將隨系統時鐘而變化。
// 解決方案:透過 Bug#037,透過 fbPrnFrame 讀取 (TimeBase 每秒資料數。
// FFT計算更穩定、更準確。
//================================================ == =========
// 漏洞!錯誤#037
// 在該方法只是每秒讀取任何資料並計算 FFT 之前。
// 結果非常非常不穩定且不準確。
//
// 固定的。
// 現在 fbPrnFrame 每秒讀取 (TimeBase) 資料數。
// 這個fbPrnFrame是tmeECG每秒操作的。
// 當tmeECG時間準時時,就會到這裡準備一格。
// 假設 iTimeBase = 384。
// 準備列印圖表。
//================================================ == =========
// 漏洞!錯誤#038
// fbMakeSpectrum 新增此條件(iWaveType <> iCaptureMode)
//================================================ == =========
// 漏洞!錯誤#039
// 將檔案結尾號「1」和「-1」加入 slData 的 EOF 中。
//================================================ == =========
// 漏洞!錯誤#040
// 請勿將 fbDoConnection 放入應用程式日誌中
// LogAppErr(‘TAndroidChatManager.fbDoConnection: ‘ + E.classname, ‘general’, E.message);
//================================================ == =========
// 漏洞!錯誤#041
// 註:Num Point 使用 16384 而不是 2048
// 頻率和幅度更加準確精確!
// 頻率和幅度更加準確精確!
// 頻率和幅度更加準確精確!
// bpm 更加精確和準確。
// giNumPoints : 整數 = 16384; //而不是2048,圖表值的點數
// giObsNumPoints : 整數 = 8192; //代替 1024,圖表值點的一半
// giNumBufPoints : 整數 = 16384; //不是3072,是定義Plot圖形寬度。
//================================================ == =========
// 漏洞!錯誤#042
// giNumPoints : 整數 = 8192;
// 圖表值的點數。預設 = 8192。
// 如果使用 16384 作為 giNumPoints,音調輸出將會失真
//================================================ == =========
// 漏洞!錯誤#043
// 檢查Android版本低於4.4.x
// 設定 giNumPoints = 2048
// 如果Android版本在5.0或之後
// 設定 giNumPoints = 4096
// 如果你想設定giNumPoints = 8192或16384,聲音頻率就會失真!
// 如果你想設定giNumPoints = 8192或16384,聲音頻率就會失真!
// 如果要設定giNumPoints = 8192或16384,聲音頻率就會失真!
//================================================ == =========
// 漏洞!錯誤#044
// 將緩衝區的 iSTBufPoints 加 1。 4.4.2 有一個例外
//================================================ == =========
// 漏洞!錯誤#045
// 需要加入以下程式碼來控制 lblTWA 在 fbTAnaanalysis 中可見
// frmECG.lblTWA.Visible := frmECG.cbxZeroCross.IsChecked 和 frmECG.cbxMonitor.IsChecked;
//================================================ == =========
// 我們可以嘗試將 ‘app.log and ecgFile.ini’ 改為 ‘apps.log and ecgFile.ini’
// 我們可以使用「com.pqrst.$(ModuleName)」或其他名稱「com.PQRST.ca」(區分大小寫)。問題將會解決。
// Android 偵錯版本套件名稱 = ‘com.pqrst.$(ModuleName).debug’ 或 ‘com.PQRST.ca’ …
// Android 發佈版本套件名稱 = ‘com.pqrst.$(ModuleName)’ 或 ‘com.pqrst.ca’ …
//================================================ == =========
// 漏洞!錯誤#091
// swZeroCrossClick 的小錯誤修復。將 pcrSetupHRMonitor 新增至事件點擊。
//================================================ == =========
// 漏洞!錯誤#092
// IOS無法自動啟動BT連線!
// Abdroid 啟動 BT 連線 – OK。
// 最好讓使用者從下拉清單中啟動!
//================================================ == =========
// 漏洞!錯誤#093
// 如果該位置藍牙發射源過多,BT5 無法搜尋藍牙裝置。
//================================================ == =========
// 漏洞!錯誤#094
// 對於 RIO1030:-
// ecgWebBrowser/TWebBrowser 將引發 TForm 例外。
// frmECG.BorderStyle := TFmxFormBorderStyle.None 會與 TForm 一起崩潰!
// 解決方案:frmECG.BorderStyle := TFmxFormBorderStyle.Sizeable; <<<<這個必須在MSWINDOWS下運作!
// 解決方案:frmECG.BorderStyle := TFmxFormBorderStyle.NONE; <<<<這個必須適用於其他作業系統!
// 對於 Toyko1023:-
// 解決方案:frmECG.BorderStyle := TFmxFormBorderStyle.NONE; <<<<這個必須適用於所有作業系統!
//================================================ == =========
// 漏洞!錯誤#095
// 1023-v1-AndroidSDK25.2.5_32bit.sdk正在delphi 1023工作sdk!
// C:UsersPublicDocumentsEmbarcaderoStudio20.0PlatformSDKsandroid-sdk-windows 20.0 正在運作!
// C:UsersPublicDocumentsEmbarcaderoStudio17.0PlatformSDKsandroid-ndk-r9c 其中 17.0 正在運作!
// C:Program FilesJavajdk1.7.0_71binkeytool.exe 正在運作!
//
// 評論:C:UsersPublicDocumentsEmbarcaderoStudio20.0PlatformSDKsandroid-ndk-r17b 無法正常運作!
// 它僅適用於 Delphi 10.3!它在 10.2.3 中不起作用!
//
// 1030-AndroidSDK25.2.5_32bit.sdk正在delphi 1030工作sdk!
// C:UsersPublicDocumentsEmbarcaderoStudio20.0PlatformSDKsandroid-sdk-windows 20.0 正在運作!
// C:UsersPublicDocumentsEmbarcaderoStudio20.0PlatformSDKsandroid-ndk-r17b 其中 20.0 正在運作!
// C:Program FilesJavajdk1.7.0_71binkeytool.exe 正在運作!
//================================================ == =========
// 漏洞!錯誤#096
// TWebBrowser 有一個錯誤!
// 狀態:錯誤已修復
// RIO1030 uLocation.pas/TWebBrowser/ecgWebBrowser 在 RIO1030 中不起作用!
// Toyko1023 uLocation.pas/TWebBrowser/ecgWebBrowser 在 Toyko1023 中工作!
//================================================ == =========
// 漏洞!錯誤#097
// 解決方案:來自 DelphiWorlds Dave N 的工作
// 狀態:錯誤已修復
//
// TWebBrowser 在 RIO1030 中存在錯誤!
// Tokyo1023沒有問題!
// 對齊:三星 S9 中的客戶端在最小化後無法運作!
//
// 註:在 Samsung S8 上偵測S9製作Align:FitLeft
//================================================ == =========
// 漏洞!錯誤#098
// 安卓版本
// 一段時間後應用程式將被Android作業系統殺死,
// 如果使用者在一段時間後關閉螢幕。
// 殺死應用程式的時間取決於設置,大約 5-10 分鐘。
// =================================
// 注意:PARTIAL_WAKE_LOCK
// 這不起作用!與 IgnoringBatteryOptimization 的任意組合。
// Android 將在 API 26 之後殺死後台應用程式。
// 我們只使用 JavaClass.FLAG_KEEP_SCREEN_ON 來啟用 CPU 和 Screen。
// =================================
//
// iOS 版本
// 不存在應用程式會被IOS殺死的問題。
//
// 模式:PARTIAL_WAKE_LOCK
//
// 參考:[如何防止 FireMonkey 應用程式/服務在背景停止運作? ]
// https://stackoverflow.com/questions/52504808/how-to-prevent-firemonkey-app-service-stop-working-while-in-background
//
// 【後台處理指南】
// https://developer.android.com/guide/background#js
//
// [如何在螢幕關閉時保持應用程式運作? ]
// https://stackoverflow.com/questions/44743265/how-to-keep-app-running-when-screen-off-or-open-another-app
//
// [德爾福 XE5 Android.如何使用PowerManager.WakeLock? ]
// https://stackoverflow.com/questions/19021647/delphi-xe5-android-how-to-use-powermanager-wakelock
//
// [如何在螢幕關閉時保持 Activity 運作?
// https://stackoverflow.com/questions/11978742/how-to-keep-an-activity-running-while-screen-off
//
// [電源管理器]
// https://developer.android.com/reference/android/os/PowerManager
//
// [Embarcardero 的 GlassLevel 範例]
// 正在使用喚醒鎖定來保持應用程式在背景繼續運行
//
// [針對打瞌睡和應用程式待機進行最佳化]
// https://developer.android.com/training/monitoring-device-state/doze-standby
//
// 評論:
// 透過「後台處理」來解決這個問題的解決方案很少。
// DownloadManager、同步適配器、JobScheduler、Firebase 雲端訊息傳遞和喚醒鎖定。
// 請參閱“修改:2019 年 3 月 16 日晚上 10:00:00”
//================================================ == =========
// 漏洞!錯誤#099
// 安卓版本
// 在 frmCreate 中取得喚醒鎖定時有錯誤。
// 一旦使用者喚醒系統,系統就會執行下面的語句並釋放喚醒鎖定。
// TApplicationEvent.WillBecomeInactive : pcrRelease_WakeLock(jprWakeLock);
// 如果使用者保持開啟/關閉電源按鈕,應用程式將通過 WillBecomeInactive。
// Release_WakeLock 將會被釋放。
//
// 因此,應用程式有時會工作,有時不工作,尤其是喚醒鎖
// 在長時間的睡眠中!當後台運行時,應用程式將被系統殺死。
//
// Comment: 我們嘗試在應用程式仍在執行時刪除 pcrRelease_WakeLock
// 長時間並由使用者按下電源按鈕喚醒。
// 解決方案:終於可以運行了!測試了大約5小時的睡眠時間,有效!
//================================================ == =========
// 漏洞!錯誤#100
// iPhone 的 IOS
// 有一個錯誤「無法開始渲染『TContextIOS』場景」。
// 當 TForm 變更時,將引發異常。
//
// 評論:
// 1) 嘗試在專案中包含 FMX.Context.GLES.IOS.pas。
// 2) rectPageAbout, rectPageBT4Chat, rectPageBTChat, rectTabECGMonitorClick &矩形頁面位置
// 會有 pcrSetLandscapeOrientation,但沒有 pcrSetALLOrientation。
// 3) rectPageSetup, rectPageFile &矩形頁面主題
// 將會有 pcrSetALLOrientation 代替。
//================================================ == =========
// 漏洞!錯誤#101
// 解決方案:來自 DelphiWorlds Dave N 的工作
// 狀態:錯誤已修復
//
// 對於三星 S9,更改方向在位置頁面上不起作用!
// 對於 Android,所有方向都可以。但橫向和倒轉橫向不起作用。
// 漏洞!錯誤#097
//
// TWebBrowser 在 RIO1030 中存在錯誤!
// Tokyo1023沒有問題!
//
// 解決方案:來自 DelphiWorlds Dave N 的工作
//================================
// 東京1023
// 未新增 FMX.FORMS。
// RIO1030
// FMX.FORMS 被加入到專案資料夾「ECG Bluetooth App」中。
// 當專案在 RIO1030 中編譯時,將 ‘1030FMX.Forms.pas’ 重新命名為 ‘FMX.Forms.pas’。
//================================
//
// 評論:
// 1) 嘗試在專案中包含 FMX.Context.GLES.IOS.pas。
// 2) rectPageAbout, rectPageBT4Chat, rectPageBTChat, rectTabECGMonitorClick &矩形頁面位置
// 會有 pcrSetLandscapeOrientation,但沒有 pcrSetALLOrientation。
// 3) rectPageSetup, rectPageFile &矩形頁面主題
// 將會有 pcrSetALLOrientation 代替。
//================================================ == =========
// 漏洞!錯誤#102
// Pascal 的 U_FFT.pas 舊函式庫在 REALFFT2 上有錯誤。
// 在 Android 8.0 或更高版本中,它會在「Doze」模式下崩潰。
// 必須是 Keep_Screen_ON 才能讓應用程式運作。
// 問題:客戶端讓 Android 休眠或進入「打瞌睡」模式,
// 長時間休眠不活動,再次開機會卡頓。
// 該錯誤位於 REALFFT2 庫中。
//
// 解決方案:使用 fourier.pas 中的 fbFourierTransform – Don Cross <dcross@intersrv.com>
// http://www.intersrv.com/~dcross/fft.html#pascal
// 或者
// https://github.com/neurolabusc/MRIcron
//
// 函數fbFourierTransform被重寫以取代REALFFT2。
// 使用fbFourierTransform計算daAmps[i]幅度數組時發生錯誤。
// daAmps[i] := eAmplitude/sqrt(iNBRPoints); //<<<<<使用fbFourierTransform後,這裡需要除以sqrt(iNBRPoints);
//================================================ == =========
// 漏洞!錯誤#103
// lblBatOpt.Text:= FormatDateTime(‘hh:nn:ss’, tmrBatOpt.Tag / SecsPerDay);
//================================================ == =========
// 重要提示:-
// 使用新版本重新安裝應用程式:-
// 1) 前往儲存空間以清除資料和/或清除快取資料。
//
// 2) 對於“發布版本”
// 所有系統資料夾:Android,
// IOSDevice32,
// IOS設備64,
// IOS模擬器,
// OSX32,
// Win32,
//Win64
// 我們需要刪除以上所有資料夾並重建一個乾淨的應用程式!
// 我們需要刪除以上所有資料夾並重建一個乾淨的應用程式!
// 我們需要刪除以上所有資料夾並重建一個乾淨的應用程式!
//
// 評論:iPad Mini 2 測試運行:本機不支援「UIBackgroundModes」。
// 當iPad關閉時,系統將殺死所有正在運行的應用程式
// 在後台。返回後應用程式將重新啟動。
//================================================ == =========
// Alpha測試
// 註:所有 TApplicationEvent 均為原創。 PARTIAL_WAKE_LOCK 和預設畫面開啟
//
// v1.0.0.A – 應用 DelphiWorld RestartIfNotIgnoringBatteryOptimizations。
// 優化fbMakeSpectrum和fbQuadratic中的程式碼
// v1.0.0.F – FFT Don Cross – 快速傅立葉變換 / Fourier.pas
// 必須重置安卓!
// v1.0.0.2 – kastri 更新了庫,移至 H:ProjectECG Bluetooth ProjectECG Bluetooth AppAndroidManifest.template.xml
// v1.0.0.3 – 刪除並清理專案資料夾中不必要的檔案。
// 驗證 Kastri 函式庫
// AndroidManifest.template.xml //
//
//
// v1.0.0.4 – AndroidManifest.template.xml //
// android:allowTaskReparenting=”true”
// android:launchMode=”標準”
// v1.0.0.5 – 在(快速傅立葉變換)fbFourierTransform 之後應用帶通濾波器以使迭代更快。
// 套用帶通濾波器,頻率 = 0.5Hz 至 360Hz = 30 bpm 至 360 bpm
// AndroidManifest.template.xml //
// android:allowTaskReparenting=”true” //去掉這條語句
// android:launchMode=”standard” //將此語句改回“singleTask”
// 打瞌睡模式的錯誤可能就在下面!
// 這裡沒有必要檢查這個語句。 For循環是一個帶通濾波器!
// if ((daFreqs[i] <= iBPMHighLimit*cdDiv60) and (daFreqs[i] >= iBPMLowLimit*cdDiv60)) then
// v1.0.0.6 – 刪除 AndroidManifest.Template.xml 中的 READ_PHONE_STATUS
// 修改標籤 lblScreenCtrl 為 gsHighPerformanceMode、gsLowBatteryMode1 & gs低電量模式2
// v1.0.0.7 – 修改:2019 年 5 月 17 日 01:00:00 AM
// 停用以下功能:適用於 Android 和 IOS!
// 它們不是主要函數。否則,谷歌和蘋果將禁止或不允許發布該應用程式。
// 1) READ_SMS 和 SEND_SMS
// 2) 呼叫電話
// 3) 電子郵件
// 4) REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 和 WAKE_LOCK
// Google Play 不會批准上述功能。他們將禁止或暫停該帳戶!
// 相應地更改啟動畫面。
// 對於 Android,螢幕 Ctrl – 保持螢幕開啟/允許執行任何活動,直到按下「電源」按鈕。
// – 保持螢幕關閉/單一應用程式/可以持續超過 4 小時
// 對於 IOS,螢幕 Ctrl – 保持螢幕開啟/允許執行任何活動/沒有此類問題!
// – 保持螢幕關閉/允許任何活動/沒有這樣的問題!
// 預設值:KEEP_SCREEN_OFF。保持螢幕開啟會消耗大量電池!
// v1.0.7.1 – 修改: 2019 年 6 月 7 日 07:00:00 AM
// lblBatOpt 格式 hh:nn:ss 的小錯誤修復
//================================================ == =========
// 測試:Apps ecgMonitor v1.0.0.5.apk
//
// 模型選項 打瞌睡模式/睡眠解析度結果狀態
// Samsung S9 FFT+ZeroCross+ScreenON 總是喚醒 256sps 任何活動正常
//
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 1 小時+無活動 256sps ?
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 2 小時+無活動 256sps ?
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 3 小時+無活動 256sps ?
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 4 小時+無活動+無電源 256sps XXX
//
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 1 小時+無活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 2 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 3 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 4 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 5 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 6 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 7 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 8 小時+有活動+無電源 128sps 正常
// 三星 S9 FFT+ZeroCross+ScreenAutoOFF 9 小時+有活動+無電源 128sps 正常
//
// 評論:
// with Activity = 背景有兩個或更多遊戲、wifi電話、瀏覽、相機拍照活動…等。
// 無電源 = USB 電源線已拔出。
//================================================ == =========
硬體修訂
//================================================ == =========
// 硬體修訂
//================================================ == =========
// 心電圖監視器的第一個原型
// ADS8866 ADC 轉換器被刪除。
// BT2用於與Android通訊。
//================================================ == =========
// 心電監視器的第二個原型
// BT2用於與Android通訊。
// 加入 50Hz/60Hz 陷波濾波器以濾除交流雜訊。
// MAX4624用於控制,刪除。
//================================================ == =========
// 心電圖監視器的第三個原型
// BT4用於與Android通訊。
//================================================ == =========
// 心電圖監視器的第四個原型
// BT4用於與Android和iPhone通信
// 新增USB電源充電單元。
// 重新設計硬體佈局。
//================================================ == =========
// 心電圖監視器的第五個原型
// 重新設計硬體佈局並最小化機箱尺寸。
// 使用0.6mm PCB 進行製造。
// 檢查表面貼裝技術的佈局。
//================================================ == =========
固件修訂
//================================================ == =========
// 心率監測器的三種模式
//================================================ == =========
// 說明:
// 心率監測共有三種模式。
//
// 功能:
// 模式1:心電波形監測
// 模式 2:靠近心臟的心率測量
// 模式 3:手動心率測量(試用模式)
//
//================================================ == =========
// 模式1:心電波形監測
//================================================ == =========
// 這個配置是為了監控形狀而設計的
// 心電圖波形。假設患者仍然存在
// 測量期間相對靜止,因此,
// 運動偽影不是什麼問題。
//
// 為了得到失真最小的心電圖波形,
// AD8232配置有0.5 Hz兩極高通
// 濾波器後面接著一個兩極、40 Hz、低通濾波器。
// 驅動第三個電極以達到最佳共模
// 拒絕。
//
// 除了 40 Hz 濾波之外,運算放大器級
// 配置增益為 11,結果是
// 系統總增益為 1100。
//================================================ == =========
// 模式 2:緊鄰心臟的心率測量
//================================================ == =========
// 對於穿戴式運動設備,AD8232 通常是
// 放置在心臟附近的豆莢中。兩個感應電極
// 放置在胸肌下方;無驅動
// 使用電極。因為心的距離
// AD8232小,心臟訊號強
// 肌肉偽影幹擾較少。
//
// 為了得到失真最小的心電圖波形,
// AD8232配置有0.5 Hz兩極高通
// 濾波器後面接著一個兩極、40 Hz、低通濾波器。
// 輸出運算放大器不使用增益。
// 系統總增益為 100。
//================================================ == =========
// 模式 3:手動心率測量(試用模式)
//================================================ == =========
// 心率訊號是在手上測量的
// 不銹鋼電極。使用者的手臂和上半身
// 運動會產生較大的運動偽影和較長的導程
// 長度使系統容易受到共模的影響
// 干涉。
//
// 為了得到失真最小的心電圖波形,
// AD8232配置有0.5 Hz兩極高通
// 濾波器後面接著一個兩極、40 Hz、低通濾波器。
//
// 除了 40 Hz 濾波之外,運算放大器級
// 配置增益為 11,結果是
// 系統總增益為 1100。
//================================================ == =========
//================================================ == =========
// 心臟模式
// 裝置下方有兩個電極。使用者可以將裝置放置在心臟旁邊
// 執行心電圖監測功能。
// 但是沒有偵測到與使用者身體心臟連接或斷開的兩個電極。
//
// 與心臟模式比較。
// 偵測兩個電極與使用者身體的心臟連接或斷開。
// 會有與使用者主體連接的指示。
//================================================ == =========
//================================================ == =========
//================================================ == =========
// 註解:心臟模式和心模式
// 心臟模式和心臟模式之間沒有顯著差異硬體中的心臟模式。
// 刪除兩台 MAX4626 開關。現在,心臟模式和心臟模式的韌體心模式是一樣的。
// 儘管指令CMD指令?a和?b是改變PD3和PD7邏輯。其實,有
// AD8232的硬體沒有改變。它僅配置為增益 = 1100 的心臟模式。
//
// LO+和LO-連接到CPU連接埠PD5和PD6。軟體檢測演算法用於檢測LO+和LO-。
// 在心臟模式下,它將檢測 LA 和 RA 電極與身體的連接性。
// 在 Heart 模式下,LO+ 和 LO- 由軟體停用。兩個電極直接連接到身體
// 靠近心臟。
//================================================ == =========
機械設計修訂
//================================================ == =========
// 機械設計修改
//================================================ == =========
// 說明:CAD設計
//================================================ == =========
// 心電圖監視器的第一個原型
// 使用 18650 6000mAh 鋰離子 3.7v 電池。
// 使用外部 USB 電源充電裝置。
// 產生用於 3D 列印的 STL 檔案。
//================================================ == =========
// 心電監視器的第二個原型
// 使用 PN523450 1000mAh 鋰離子 3.7v 電池。
// 重建 USB 電源充電單元。
// 產生用於 3D 列印的 STL 檔案。
//================================================ == =========
// 心電圖監視器的第三個原型
// 重新設計 0.6mm PCB 以進行製造。
// 為心電圖監視器建立韌體程式設計器。
// 產生用於 3D 列印的 STL 檔案。
//================================================ == =========
// 心電圖監視器的第四個原型
// 重新設計鬆緊帶和夾子以固定心電監視器。
// 重新設計心電圖監視器外殼。
// 產生用於 3D 列印的 STL 檔案。
//================================================ == =========
// 心電圖監視器的第五個原型
// 重新設計鬆緊帶和夾子以固定心電監視器。
// 重新設計心電圖監視器外殼。
// 產生用於 3D 列印的 STL 檔案。
//================================================ == =========
// 心電監視器的第六個原型
// 重新設計鬆緊帶和夾子以固定心電監視器。
// 重新設計心電圖監視器外殼。
// 產生用於 3D 列印的 STL 檔案。
//================================================ == =========