Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
hspguisourcev301/HspGuiSourceV301/HSPGui/Presenter/DataLogPresenter.cs@3:36de8b9e4b1a, 2021-04-10 (annotated)
- Committer:
- darienf
- Date:
- Sat Apr 10 03:05:42 2021 +0000
- Revision:
- 3:36de8b9e4b1a
ayoooo
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
darienf | 3:36de8b9e4b1a | 1 | /******************************************************************************* |
darienf | 3:36de8b9e4b1a | 2 | * Copyright (C) 2016 Maxim Integrated Products, Inc., All rights Reserved. |
darienf | 3:36de8b9e4b1a | 3 | * |
darienf | 3:36de8b9e4b1a | 4 | * This software is protected by copyright laws of the United States and |
darienf | 3:36de8b9e4b1a | 5 | * of foreign countries. This material may also be protected by patent laws |
darienf | 3:36de8b9e4b1a | 6 | * and technology transfer regulations of the United States and of foreign |
darienf | 3:36de8b9e4b1a | 7 | * countries. This software is furnished under a license agreement and/or a |
darienf | 3:36de8b9e4b1a | 8 | * nondisclosure agreement and may only be used or reproduced in accordance |
darienf | 3:36de8b9e4b1a | 9 | * with the terms of those agreements. Dissemination of this information to |
darienf | 3:36de8b9e4b1a | 10 | * any party or parties not specified in the license agreement and/or |
darienf | 3:36de8b9e4b1a | 11 | * nondisclosure agreement is expressly prohibited. |
darienf | 3:36de8b9e4b1a | 12 | * |
darienf | 3:36de8b9e4b1a | 13 | * The above copyright notice and this permission notice shall be included |
darienf | 3:36de8b9e4b1a | 14 | * in all copies or substantial portions of the Software. |
darienf | 3:36de8b9e4b1a | 15 | * |
darienf | 3:36de8b9e4b1a | 16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
darienf | 3:36de8b9e4b1a | 17 | * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
darienf | 3:36de8b9e4b1a | 18 | * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
darienf | 3:36de8b9e4b1a | 19 | * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES |
darienf | 3:36de8b9e4b1a | 20 | * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
darienf | 3:36de8b9e4b1a | 21 | * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
darienf | 3:36de8b9e4b1a | 22 | * OTHER DEALINGS IN THE SOFTWARE. |
darienf | 3:36de8b9e4b1a | 23 | * |
darienf | 3:36de8b9e4b1a | 24 | * Except as contained in this notice, the name of Maxim Integrated |
darienf | 3:36de8b9e4b1a | 25 | * Products, Inc. shall not be used except as stated in the Maxim Integrated |
darienf | 3:36de8b9e4b1a | 26 | * Products, Inc. Branding Policy. |
darienf | 3:36de8b9e4b1a | 27 | * |
darienf | 3:36de8b9e4b1a | 28 | * The mere transfer of this software does not imply any licenses |
darienf | 3:36de8b9e4b1a | 29 | * of trade secrets, proprietary technology, copyrights, patents, |
darienf | 3:36de8b9e4b1a | 30 | * trademarks, maskwork rights, or any other form of intellectual |
darienf | 3:36de8b9e4b1a | 31 | * property whatsoever. Maxim Integrated Products, Inc. retains all |
darienf | 3:36de8b9e4b1a | 32 | * ownership rights. |
darienf | 3:36de8b9e4b1a | 33 | ******************************************************************************* |
darienf | 3:36de8b9e4b1a | 34 | */ |
darienf | 3:36de8b9e4b1a | 35 | |
darienf | 3:36de8b9e4b1a | 36 | using System; |
darienf | 3:36de8b9e4b1a | 37 | using System.Collections.Generic; |
darienf | 3:36de8b9e4b1a | 38 | using System.Linq; |
darienf | 3:36de8b9e4b1a | 39 | using System.Text; |
darienf | 3:36de8b9e4b1a | 40 | |
darienf | 3:36de8b9e4b1a | 41 | using RPCSupport.Streaming; |
darienf | 3:36de8b9e4b1a | 42 | using HealthSensorPlatform.Model; |
darienf | 3:36de8b9e4b1a | 43 | using HealthSensorPlatform.View; |
darienf | 3:36de8b9e4b1a | 44 | using HealthSensorPlatform.CustomControls; |
darienf | 3:36de8b9e4b1a | 45 | |
darienf | 3:36de8b9e4b1a | 46 | namespace HealthSensorPlatform.Presenter |
darienf | 3:36de8b9e4b1a | 47 | { |
darienf | 3:36de8b9e4b1a | 48 | class DataLogPresenter |
darienf | 3:36de8b9e4b1a | 49 | { |
darienf | 3:36de8b9e4b1a | 50 | IDataLogModel model; |
darienf | 3:36de8b9e4b1a | 51 | DataLoggingView view; |
darienf | 3:36de8b9e4b1a | 52 | IRawFileLogView temperatureLog1; |
darienf | 3:36de8b9e4b1a | 53 | IRawFileLogView temperatureLog2; |
darienf | 3:36de8b9e4b1a | 54 | IRawFileLogView pressureLog; |
darienf | 3:36de8b9e4b1a | 55 | |
darienf | 3:36de8b9e4b1a | 56 | IRawFileLogView accelerometerLog; |
darienf | 3:36de8b9e4b1a | 57 | IRawFileLogView opticalLog; |
darienf | 3:36de8b9e4b1a | 58 | |
darienf | 3:36de8b9e4b1a | 59 | IRawFileLogView ecgLog; |
darienf | 3:36de8b9e4b1a | 60 | IRawFileLogView bioZLog; |
darienf | 3:36de8b9e4b1a | 61 | IRawFileLogView paceLog; |
darienf | 3:36de8b9e4b1a | 62 | IRawFileLogView rToRLog; |
darienf | 3:36de8b9e4b1a | 63 | |
darienf | 3:36de8b9e4b1a | 64 | IFormView formView; |
darienf | 3:36de8b9e4b1a | 65 | |
darienf | 3:36de8b9e4b1a | 66 | StatusForm statusForm; |
darienf | 3:36de8b9e4b1a | 67 | |
darienf | 3:36de8b9e4b1a | 68 | EcgView ecgView; // Needed to obtain some state information, should be decoupled later and use from data log model |
darienf | 3:36de8b9e4b1a | 69 | OpticalView opticalView; |
darienf | 3:36de8b9e4b1a | 70 | |
darienf | 3:36de8b9e4b1a | 71 | int count = 0; |
darienf | 3:36de8b9e4b1a | 72 | int bioZCount = 0; |
darienf | 3:36de8b9e4b1a | 73 | int ppgCount = 0; |
darienf | 3:36de8b9e4b1a | 74 | int accelCount = 0; |
darienf | 3:36de8b9e4b1a | 75 | PaceData paceData; |
darienf | 3:36de8b9e4b1a | 76 | RToRCalculator rToRCalculator; |
darienf | 3:36de8b9e4b1a | 77 | bool rToRFirst = true; |
darienf | 3:36de8b9e4b1a | 78 | |
darienf | 3:36de8b9e4b1a | 79 | string logFileDirectory = null; |
darienf | 3:36de8b9e4b1a | 80 | |
darienf | 3:36de8b9e4b1a | 81 | View.FileLogView.FileLogHeader fileLogHeader = new View.FileLogView.FileLogHeader(); |
darienf | 3:36de8b9e4b1a | 82 | |
darienf | 3:36de8b9e4b1a | 83 | public DataLogPresenter(IFormView formView, EcgView ecgView, OpticalView opticalView, IDataLogModel model, DataLoggingView view, |
darienf | 3:36de8b9e4b1a | 84 | IRawFileLogView temperatureLog1, IRawFileLogView temperatureLog2, IRawFileLogView pressureLog, |
darienf | 3:36de8b9e4b1a | 85 | IRawFileLogView accelerometerLog, IRawFileLogView opticalLog, |
darienf | 3:36de8b9e4b1a | 86 | IRawFileLogView ecgLog, IRawFileLogView bioZLog, IRawFileLogView paceLog, IRawFileLogView rToRLog) |
darienf | 3:36de8b9e4b1a | 87 | { |
darienf | 3:36de8b9e4b1a | 88 | this.model = model; |
darienf | 3:36de8b9e4b1a | 89 | this.view = view; |
darienf | 3:36de8b9e4b1a | 90 | |
darienf | 3:36de8b9e4b1a | 91 | this.formView = formView; |
darienf | 3:36de8b9e4b1a | 92 | this.ecgView = ecgView; |
darienf | 3:36de8b9e4b1a | 93 | this.opticalView = opticalView; |
darienf | 3:36de8b9e4b1a | 94 | |
darienf | 3:36de8b9e4b1a | 95 | this.temperatureLog1 = temperatureLog1; |
darienf | 3:36de8b9e4b1a | 96 | this.temperatureLog2 = temperatureLog2; |
darienf | 3:36de8b9e4b1a | 97 | this.pressureLog = pressureLog; |
darienf | 3:36de8b9e4b1a | 98 | |
darienf | 3:36de8b9e4b1a | 99 | this.accelerometerLog = accelerometerLog; |
darienf | 3:36de8b9e4b1a | 100 | this.opticalLog = opticalLog; |
darienf | 3:36de8b9e4b1a | 101 | |
darienf | 3:36de8b9e4b1a | 102 | this.ecgLog = ecgLog; |
darienf | 3:36de8b9e4b1a | 103 | this.bioZLog = bioZLog; |
darienf | 3:36de8b9e4b1a | 104 | this.paceLog = paceLog; |
darienf | 3:36de8b9e4b1a | 105 | this.rToRLog = rToRLog; |
darienf | 3:36de8b9e4b1a | 106 | |
darienf | 3:36de8b9e4b1a | 107 | view.LogDownloadStart += new EventHandler<EventArgs>(OnLogDownloadStart); |
darienf | 3:36de8b9e4b1a | 108 | view.MissionWrite += new EventHandler<EventArgs>(OnMissionWrite); |
darienf | 3:36de8b9e4b1a | 109 | view.MissionRead += new EventHandler<EventArgs>(OnMissionRead); |
darienf | 3:36de8b9e4b1a | 110 | view.MissionErase += new EventHandler<EventArgs>(OnMissionErase); |
darienf | 3:36de8b9e4b1a | 111 | model.LogData += new EventHandler<PartialArrayIntAvailableEventArgs>(OnLogData); |
darienf | 3:36de8b9e4b1a | 112 | } |
darienf | 3:36de8b9e4b1a | 113 | |
darienf | 3:36de8b9e4b1a | 114 | public void ProcessTemperature1(int[] data) |
darienf | 3:36de8b9e4b1a | 115 | { |
darienf | 3:36de8b9e4b1a | 116 | double[] calcTemp; |
darienf | 3:36de8b9e4b1a | 117 | |
darienf | 3:36de8b9e4b1a | 118 | calcTemp = CalculateTemperature(data); |
darienf | 3:36de8b9e4b1a | 119 | temperatureLog1.DisplayTemperature(data, calcTemp); |
darienf | 3:36de8b9e4b1a | 120 | } |
darienf | 3:36de8b9e4b1a | 121 | |
darienf | 3:36de8b9e4b1a | 122 | public void ProcessTemperature2(int[] data) |
darienf | 3:36de8b9e4b1a | 123 | { |
darienf | 3:36de8b9e4b1a | 124 | double[] calcTemp; |
darienf | 3:36de8b9e4b1a | 125 | |
darienf | 3:36de8b9e4b1a | 126 | calcTemp = CalculateTemperature(data); |
darienf | 3:36de8b9e4b1a | 127 | temperatureLog2.DisplayTemperature(data, calcTemp); |
darienf | 3:36de8b9e4b1a | 128 | } |
darienf | 3:36de8b9e4b1a | 129 | |
darienf | 3:36de8b9e4b1a | 130 | public double[] CalculateTemperature(int[] data) |
darienf | 3:36de8b9e4b1a | 131 | { |
darienf | 3:36de8b9e4b1a | 132 | double[] calcTemp = new double[data.Length]; |
darienf | 3:36de8b9e4b1a | 133 | int rawCode; |
darienf | 3:36de8b9e4b1a | 134 | |
darienf | 3:36de8b9e4b1a | 135 | for (int i = 0; i < data.Length; i++ ) |
darienf | 3:36de8b9e4b1a | 136 | { |
darienf | 3:36de8b9e4b1a | 137 | rawCode = data[i]; |
darienf | 3:36de8b9e4b1a | 138 | |
darienf | 3:36de8b9e4b1a | 139 | if (rawCode > 0x7fff) |
darienf | 3:36de8b9e4b1a | 140 | rawCode -= 0x10000; |
darienf | 3:36de8b9e4b1a | 141 | |
darienf | 3:36de8b9e4b1a | 142 | calcTemp[i] = rawCode / Math.Pow(2, 8); |
darienf | 3:36de8b9e4b1a | 143 | } |
darienf | 3:36de8b9e4b1a | 144 | |
darienf | 3:36de8b9e4b1a | 145 | return calcTemp; |
darienf | 3:36de8b9e4b1a | 146 | } |
darienf | 3:36de8b9e4b1a | 147 | |
darienf | 3:36de8b9e4b1a | 148 | public void ProcessPressure(int[] data) |
darienf | 3:36de8b9e4b1a | 149 | { |
darienf | 3:36de8b9e4b1a | 150 | int[] rawTemp = new int[data.Length/2]; |
darienf | 3:36de8b9e4b1a | 151 | int[] rawPress = new int[data.Length/2]; |
darienf | 3:36de8b9e4b1a | 152 | double[] calcTemp, calcPress; |
darienf | 3:36de8b9e4b1a | 153 | |
darienf | 3:36de8b9e4b1a | 154 | for (int i = 0, j = 0; i < data.Length; i = i + 2, j++) |
darienf | 3:36de8b9e4b1a | 155 | { |
darienf | 3:36de8b9e4b1a | 156 | rawTemp[j] = data[i]; |
darienf | 3:36de8b9e4b1a | 157 | rawPress[j] = data[i + 1]; |
darienf | 3:36de8b9e4b1a | 158 | } |
darienf | 3:36de8b9e4b1a | 159 | |
darienf | 3:36de8b9e4b1a | 160 | var result = CalculatePressure(rawTemp, rawPress); |
darienf | 3:36de8b9e4b1a | 161 | calcTemp = result.Item1; |
darienf | 3:36de8b9e4b1a | 162 | calcPress = result.Item2; |
darienf | 3:36de8b9e4b1a | 163 | |
darienf | 3:36de8b9e4b1a | 164 | pressureLog.DisplayPressure(rawTemp, calcTemp, rawPress, calcPress); |
darienf | 3:36de8b9e4b1a | 165 | } |
darienf | 3:36de8b9e4b1a | 166 | |
darienf | 3:36de8b9e4b1a | 167 | public Tuple<double[], double[]> CalculatePressure(int[] temperature, int[] pressure) |
darienf | 3:36de8b9e4b1a | 168 | { |
darienf | 3:36de8b9e4b1a | 169 | double[] calcTemp = new double[temperature.Length]; |
darienf | 3:36de8b9e4b1a | 170 | double[] calcPress = new double[pressure.Length]; |
darienf | 3:36de8b9e4b1a | 171 | |
darienf | 3:36de8b9e4b1a | 172 | for (int i = 0; i < temperature.Length; i++ ) |
darienf | 3:36de8b9e4b1a | 173 | { |
darienf | 3:36de8b9e4b1a | 174 | calcTemp[i] = temperature[i] / 10.0; |
darienf | 3:36de8b9e4b1a | 175 | } |
darienf | 3:36de8b9e4b1a | 176 | |
darienf | 3:36de8b9e4b1a | 177 | for (int i = 0; i < pressure.Length; i++ ) |
darienf | 3:36de8b9e4b1a | 178 | { |
darienf | 3:36de8b9e4b1a | 179 | calcPress[i] = pressure[i] / 10; |
darienf | 3:36de8b9e4b1a | 180 | } |
darienf | 3:36de8b9e4b1a | 181 | |
darienf | 3:36de8b9e4b1a | 182 | return new Tuple<double[],double[]>(calcTemp, calcPress); |
darienf | 3:36de8b9e4b1a | 183 | } |
darienf | 3:36de8b9e4b1a | 184 | |
darienf | 3:36de8b9e4b1a | 185 | private void OnLogDownloadStart(object sender, EventArgs e) |
darienf | 3:36de8b9e4b1a | 186 | { |
darienf | 3:36de8b9e4b1a | 187 | |
darienf | 3:36de8b9e4b1a | 188 | if (view.Connected) |
darienf | 3:36de8b9e4b1a | 189 | { |
darienf | 3:36de8b9e4b1a | 190 | count = 0; |
darienf | 3:36de8b9e4b1a | 191 | bioZCount = 0; |
darienf | 3:36de8b9e4b1a | 192 | ppgCount = 0; |
darienf | 3:36de8b9e4b1a | 193 | accelCount = 0; |
darienf | 3:36de8b9e4b1a | 194 | |
darienf | 3:36de8b9e4b1a | 195 | missionRead(); |
darienf | 3:36de8b9e4b1a | 196 | |
darienf | 3:36de8b9e4b1a | 197 | if (model.MissionSettings.Enable) |
darienf | 3:36de8b9e4b1a | 198 | { |
darienf | 3:36de8b9e4b1a | 199 | |
darienf | 3:36de8b9e4b1a | 200 | if (selectFile()) |
darienf | 3:36de8b9e4b1a | 201 | { |
darienf | 3:36de8b9e4b1a | 202 | string missionString; |
darienf | 3:36de8b9e4b1a | 203 | StringBuilder sb = new StringBuilder(); |
darienf | 3:36de8b9e4b1a | 204 | foreach (string str in model.MissionString()) |
darienf | 3:36de8b9e4b1a | 205 | { |
darienf | 3:36de8b9e4b1a | 206 | sb.Append("% "); |
darienf | 3:36de8b9e4b1a | 207 | sb.Append(str); |
darienf | 3:36de8b9e4b1a | 208 | sb.Append(Environment.NewLine); |
darienf | 3:36de8b9e4b1a | 209 | } |
darienf | 3:36de8b9e4b1a | 210 | missionString = sb.ToString().Trim(Environment.NewLine.ToCharArray()); |
darienf | 3:36de8b9e4b1a | 211 | |
darienf | 3:36de8b9e4b1a | 212 | |
darienf | 3:36de8b9e4b1a | 213 | if (temperatureLog1 != null && temperatureLog1.Enable) |
darienf | 3:36de8b9e4b1a | 214 | { |
darienf | 3:36de8b9e4b1a | 215 | temperatureLog1.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 216 | temperatureLog1.WriteLine(fileLogHeader.Temperature1); |
darienf | 3:36de8b9e4b1a | 217 | } |
darienf | 3:36de8b9e4b1a | 218 | |
darienf | 3:36de8b9e4b1a | 219 | if (temperatureLog2 != null && temperatureLog2.Enable) |
darienf | 3:36de8b9e4b1a | 220 | { |
darienf | 3:36de8b9e4b1a | 221 | temperatureLog2.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 222 | temperatureLog2.WriteLine(fileLogHeader.Temperature2); |
darienf | 3:36de8b9e4b1a | 223 | } |
darienf | 3:36de8b9e4b1a | 224 | |
darienf | 3:36de8b9e4b1a | 225 | if (pressureLog != null && pressureLog.Enable) |
darienf | 3:36de8b9e4b1a | 226 | { |
darienf | 3:36de8b9e4b1a | 227 | pressureLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 228 | pressureLog.WriteLine(fileLogHeader.Pressure); |
darienf | 3:36de8b9e4b1a | 229 | } |
darienf | 3:36de8b9e4b1a | 230 | |
darienf | 3:36de8b9e4b1a | 231 | if (accelerometerLog != null && accelerometerLog.Enable) |
darienf | 3:36de8b9e4b1a | 232 | { |
darienf | 3:36de8b9e4b1a | 233 | accelerometerLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 234 | accelerometerLog.WriteLine(fileLogHeader.Accelerometer); |
darienf | 3:36de8b9e4b1a | 235 | } |
darienf | 3:36de8b9e4b1a | 236 | |
darienf | 3:36de8b9e4b1a | 237 | if (opticalLog != null && opticalLog.Enable) |
darienf | 3:36de8b9e4b1a | 238 | { |
darienf | 3:36de8b9e4b1a | 239 | opticalLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 240 | opticalLog.WriteLine(fileLogHeader.Optical); |
darienf | 3:36de8b9e4b1a | 241 | } |
darienf | 3:36de8b9e4b1a | 242 | |
darienf | 3:36de8b9e4b1a | 243 | if (ecgLog != null && ecgLog.Enable) |
darienf | 3:36de8b9e4b1a | 244 | { |
darienf | 3:36de8b9e4b1a | 245 | ecgLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 246 | ecgLog.WriteLine(fileLogHeader.Ecg); |
darienf | 3:36de8b9e4b1a | 247 | } |
darienf | 3:36de8b9e4b1a | 248 | |
darienf | 3:36de8b9e4b1a | 249 | if (bioZLog != null && bioZLog.Enable) |
darienf | 3:36de8b9e4b1a | 250 | { |
darienf | 3:36de8b9e4b1a | 251 | bioZLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 252 | bioZLog.WriteLine(fileLogHeader.BioZ); |
darienf | 3:36de8b9e4b1a | 253 | } |
darienf | 3:36de8b9e4b1a | 254 | |
darienf | 3:36de8b9e4b1a | 255 | if (rToRLog != null && rToRLog.Enable && ecgLog.Enable) |
darienf | 3:36de8b9e4b1a | 256 | { |
darienf | 3:36de8b9e4b1a | 257 | rToRLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 258 | rToRCalculator = new RToRCalculator(ecgView.MasterClockField, view.EcgArgs.Rate, view.EcgArgs.Dlpf, view.RToRArgs.Wndw); |
darienf | 3:36de8b9e4b1a | 259 | rToRLog.WriteLine(fileLogHeader.RToR); |
darienf | 3:36de8b9e4b1a | 260 | } |
darienf | 3:36de8b9e4b1a | 261 | else if (rToRLog != null && rToRLog.Enable) |
darienf | 3:36de8b9e4b1a | 262 | { |
darienf | 3:36de8b9e4b1a | 263 | rToRLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 264 | rToRCalculator = null; |
darienf | 3:36de8b9e4b1a | 265 | rToRLog.WriteLine(fileLogHeader.RToR); |
darienf | 3:36de8b9e4b1a | 266 | } |
darienf | 3:36de8b9e4b1a | 267 | |
darienf | 3:36de8b9e4b1a | 268 | if (paceLog != null && paceLog.Enable) |
darienf | 3:36de8b9e4b1a | 269 | { |
darienf | 3:36de8b9e4b1a | 270 | paceLog.WriteLine(missionString); |
darienf | 3:36de8b9e4b1a | 271 | paceLog.WriteLine(fileLogHeader.Pace); |
darienf | 3:36de8b9e4b1a | 272 | } |
darienf | 3:36de8b9e4b1a | 273 | |
darienf | 3:36de8b9e4b1a | 274 | statusForm = new StatusForm(); |
darienf | 3:36de8b9e4b1a | 275 | statusForm.Text = "Flash Download"; |
darienf | 3:36de8b9e4b1a | 276 | statusForm.Message = "Please wait while your data is saved to your file."; |
darienf | 3:36de8b9e4b1a | 277 | statusForm.Show(); |
darienf | 3:36de8b9e4b1a | 278 | |
darienf | 3:36de8b9e4b1a | 279 | model.Start(); |
darienf | 3:36de8b9e4b1a | 280 | } |
darienf | 3:36de8b9e4b1a | 281 | } |
darienf | 3:36de8b9e4b1a | 282 | } |
darienf | 3:36de8b9e4b1a | 283 | } |
darienf | 3:36de8b9e4b1a | 284 | |
darienf | 3:36de8b9e4b1a | 285 | private void LogDownloadStop() |
darienf | 3:36de8b9e4b1a | 286 | { |
darienf | 3:36de8b9e4b1a | 287 | if (temperatureLog1 != null && temperatureLog1.Enable) |
darienf | 3:36de8b9e4b1a | 288 | temperatureLog1.Enable = false; |
darienf | 3:36de8b9e4b1a | 289 | |
darienf | 3:36de8b9e4b1a | 290 | if (temperatureLog2 != null && temperatureLog2.Enable) |
darienf | 3:36de8b9e4b1a | 291 | temperatureLog2.Enable = false; |
darienf | 3:36de8b9e4b1a | 292 | |
darienf | 3:36de8b9e4b1a | 293 | if (pressureLog != null && pressureLog.Enable) |
darienf | 3:36de8b9e4b1a | 294 | pressureLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 295 | |
darienf | 3:36de8b9e4b1a | 296 | if (accelerometerLog != null && accelerometerLog.Enable) |
darienf | 3:36de8b9e4b1a | 297 | accelerometerLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 298 | |
darienf | 3:36de8b9e4b1a | 299 | if (opticalLog != null && opticalLog.Enable) |
darienf | 3:36de8b9e4b1a | 300 | opticalLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 301 | |
darienf | 3:36de8b9e4b1a | 302 | if (ecgLog != null && ecgLog.Enable) |
darienf | 3:36de8b9e4b1a | 303 | ecgLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 304 | |
darienf | 3:36de8b9e4b1a | 305 | if (bioZLog != null && bioZLog.Enable) |
darienf | 3:36de8b9e4b1a | 306 | bioZLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 307 | |
darienf | 3:36de8b9e4b1a | 308 | if (rToRLog != null && rToRLog.Enable) |
darienf | 3:36de8b9e4b1a | 309 | rToRLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 310 | |
darienf | 3:36de8b9e4b1a | 311 | if (paceLog != null && paceLog.Enable) |
darienf | 3:36de8b9e4b1a | 312 | paceLog.Enable = false; |
darienf | 3:36de8b9e4b1a | 313 | |
darienf | 3:36de8b9e4b1a | 314 | formView.MessageInfo("File save complete"); |
darienf | 3:36de8b9e4b1a | 315 | statusForm.Hide(); |
darienf | 3:36de8b9e4b1a | 316 | } |
darienf | 3:36de8b9e4b1a | 317 | |
darienf | 3:36de8b9e4b1a | 318 | private void OnLogData(object sender, PartialArrayIntAvailableEventArgs e) |
darienf | 3:36de8b9e4b1a | 319 | { |
darienf | 3:36de8b9e4b1a | 320 | switch(e.reportID) |
darienf | 3:36de8b9e4b1a | 321 | { |
darienf | 3:36de8b9e4b1a | 322 | case PartialArrayIntAvailableEventArgs.PACKET_BMP280_PRESSURE: |
darienf | 3:36de8b9e4b1a | 323 | if (pressureLog != null && pressureLog.Enable) |
darienf | 3:36de8b9e4b1a | 324 | ProcessPressure(e.array1); |
darienf | 3:36de8b9e4b1a | 325 | break; |
darienf | 3:36de8b9e4b1a | 326 | case PartialArrayIntAvailableEventArgs.PACKET_MAX31725_TEMP1: |
darienf | 3:36de8b9e4b1a | 327 | if (temperatureLog1 != null && temperatureLog1.Enable) |
darienf | 3:36de8b9e4b1a | 328 | ProcessTemperature1(e.array1); |
darienf | 3:36de8b9e4b1a | 329 | break; |
darienf | 3:36de8b9e4b1a | 330 | case PartialArrayIntAvailableEventArgs.PACKET_MAX31725_TEMP2: |
darienf | 3:36de8b9e4b1a | 331 | if (temperatureLog2 != null && temperatureLog2.Enable) |
darienf | 3:36de8b9e4b1a | 332 | ProcessTemperature2(e.array1); |
darienf | 3:36de8b9e4b1a | 333 | break; |
darienf | 3:36de8b9e4b1a | 334 | |
darienf | 3:36de8b9e4b1a | 335 | case PartialArrayIntAvailableEventArgs.PACKET_MAX30001_ECG: |
darienf | 3:36de8b9e4b1a | 336 | if (ecgLog != null && ecgLog.Enable) |
darienf | 3:36de8b9e4b1a | 337 | ProcessEcg(e.array1); |
darienf | 3:36de8b9e4b1a | 338 | break; |
darienf | 3:36de8b9e4b1a | 339 | case PartialArrayIntAvailableEventArgs.PACKET_MAX30001_BIOZ: |
darienf | 3:36de8b9e4b1a | 340 | if (bioZLog != null && bioZLog.Enable) |
darienf | 3:36de8b9e4b1a | 341 | ProcessBioZ(e.array1); |
darienf | 3:36de8b9e4b1a | 342 | break; |
darienf | 3:36de8b9e4b1a | 343 | case PartialArrayIntAvailableEventArgs.PACKET_MAX30001_PACE: |
darienf | 3:36de8b9e4b1a | 344 | if (paceLog != null && paceLog.Enable) |
darienf | 3:36de8b9e4b1a | 345 | paceData = new PaceData(e.array1); |
darienf | 3:36de8b9e4b1a | 346 | break; |
darienf | 3:36de8b9e4b1a | 347 | case PartialArrayIntAvailableEventArgs.PACKET_MAX30001_RTOR: |
darienf | 3:36de8b9e4b1a | 348 | if (rToRLog != null && rToRLog.Enable) |
darienf | 3:36de8b9e4b1a | 349 | ProcessRToR(e.array1[0]); |
darienf | 3:36de8b9e4b1a | 350 | break; |
darienf | 3:36de8b9e4b1a | 351 | |
darienf | 3:36de8b9e4b1a | 352 | case PartialArrayIntAvailableEventArgs.PACKET_LIS2DH: |
darienf | 3:36de8b9e4b1a | 353 | case PartialArrayIntAvailableEventArgs.PACKET_LSM6DS3_ACCEL: |
darienf | 3:36de8b9e4b1a | 354 | if (accelerometerLog != null && accelerometerLog.Enable) |
darienf | 3:36de8b9e4b1a | 355 | ProcessAccelerometer(e.array1, e.array2, e.array3); |
darienf | 3:36de8b9e4b1a | 356 | break; |
darienf | 3:36de8b9e4b1a | 357 | case PartialArrayIntAvailableEventArgs.PACKET_END_OF_STREAM: |
darienf | 3:36de8b9e4b1a | 358 | LogDownloadStop(); |
darienf | 3:36de8b9e4b1a | 359 | break; |
darienf | 3:36de8b9e4b1a | 360 | } |
darienf | 3:36de8b9e4b1a | 361 | |
darienf | 3:36de8b9e4b1a | 362 | if ((e.reportID & 0xF0) == PartialArrayIntAvailableEventArgs.PACKET_MAX30101) |
darienf | 3:36de8b9e4b1a | 363 | { |
darienf | 3:36de8b9e4b1a | 364 | if (opticalLog != null && opticalLog.Enable) |
darienf | 3:36de8b9e4b1a | 365 | ProcessOptical(e.array1, e.array2, e.array3); |
darienf | 3:36de8b9e4b1a | 366 | |
darienf | 3:36de8b9e4b1a | 367 | } |
darienf | 3:36de8b9e4b1a | 368 | } |
darienf | 3:36de8b9e4b1a | 369 | |
darienf | 3:36de8b9e4b1a | 370 | private void OnMissionWrite(object sender, EventArgs e) |
darienf | 3:36de8b9e4b1a | 371 | { |
darienf | 3:36de8b9e4b1a | 372 | if (view.Connected) |
darienf | 3:36de8b9e4b1a | 373 | { |
darienf | 3:36de8b9e4b1a | 374 | if (view.EnableAccelerometer || view.EnableBioz || view.EnableEcg || view.EnableOpticalHR |
darienf | 3:36de8b9e4b1a | 375 | || view.EnableOpticalMulti || view.EnableOpticalSpO2 || view.EnablePace |
darienf | 3:36de8b9e4b1a | 376 | || view.EnablePressure || view.EnableRToR || view.EnableTemperature1 || view.EnableTemperature2) |
darienf | 3:36de8b9e4b1a | 377 | { |
darienf | 3:36de8b9e4b1a | 378 | if (view.ValidateGuiElements()) |
darienf | 3:36de8b9e4b1a | 379 | { |
darienf | 3:36de8b9e4b1a | 380 | statusForm = new StatusForm(); |
darienf | 3:36de8b9e4b1a | 381 | statusForm.Message = "Please wait while your flash log is cleared and new parameters are written. Do not unplug the USB connection or press start button on the board until write is complete."; |
darienf | 3:36de8b9e4b1a | 382 | statusForm.Show(); |
darienf | 3:36de8b9e4b1a | 383 | formView.MessageInfo("Writing in progress..."); |
darienf | 3:36de8b9e4b1a | 384 | model.MissionErase(); |
darienf | 3:36de8b9e4b1a | 385 | model.EraseWrittenSectors(); |
darienf | 3:36de8b9e4b1a | 386 | model.MissionStartDefinition(); |
darienf | 3:36de8b9e4b1a | 387 | view.ProcessGuiElements(); |
darienf | 3:36de8b9e4b1a | 388 | //rpcClient.DataLogging.Test(); |
darienf | 3:36de8b9e4b1a | 389 | model.MissionWrite(); |
darienf | 3:36de8b9e4b1a | 390 | statusForm.Hide(); |
darienf | 3:36de8b9e4b1a | 391 | formView.MessageInfo("Write parameters complete"); |
darienf | 3:36de8b9e4b1a | 392 | } |
darienf | 3:36de8b9e4b1a | 393 | else |
darienf | 3:36de8b9e4b1a | 394 | formView.MessageInfo("Incorrect logging parameters"); |
darienf | 3:36de8b9e4b1a | 395 | } |
darienf | 3:36de8b9e4b1a | 396 | else |
darienf | 3:36de8b9e4b1a | 397 | { |
darienf | 3:36de8b9e4b1a | 398 | formView.MessageInfo("No devices selected"); |
darienf | 3:36de8b9e4b1a | 399 | } |
darienf | 3:36de8b9e4b1a | 400 | } |
darienf | 3:36de8b9e4b1a | 401 | } |
darienf | 3:36de8b9e4b1a | 402 | |
darienf | 3:36de8b9e4b1a | 403 | private void OnMissionRead(object sender, EventArgs e) |
darienf | 3:36de8b9e4b1a | 404 | { |
darienf | 3:36de8b9e4b1a | 405 | if (view.Connected) |
darienf | 3:36de8b9e4b1a | 406 | { |
darienf | 3:36de8b9e4b1a | 407 | missionRead(); |
darienf | 3:36de8b9e4b1a | 408 | } |
darienf | 3:36de8b9e4b1a | 409 | } |
darienf | 3:36de8b9e4b1a | 410 | |
darienf | 3:36de8b9e4b1a | 411 | private void OnMissionErase(object sender, EventArgs e) |
darienf | 3:36de8b9e4b1a | 412 | { |
darienf | 3:36de8b9e4b1a | 413 | if (view.Connected) |
darienf | 3:36de8b9e4b1a | 414 | { |
darienf | 3:36de8b9e4b1a | 415 | model.MissionErase(); |
darienf | 3:36de8b9e4b1a | 416 | |
darienf | 3:36de8b9e4b1a | 417 | formView.MessageInfo("Erase parameters complete"); |
darienf | 3:36de8b9e4b1a | 418 | } |
darienf | 3:36de8b9e4b1a | 419 | } |
darienf | 3:36de8b9e4b1a | 420 | |
darienf | 3:36de8b9e4b1a | 421 | private void OnLogFileEnable(object sender, EnableEventArgs e) |
darienf | 3:36de8b9e4b1a | 422 | { |
darienf | 3:36de8b9e4b1a | 423 | // Not used |
darienf | 3:36de8b9e4b1a | 424 | } |
darienf | 3:36de8b9e4b1a | 425 | |
darienf | 3:36de8b9e4b1a | 426 | private bool selectFile() |
darienf | 3:36de8b9e4b1a | 427 | { |
darienf | 3:36de8b9e4b1a | 428 | bool result = false; |
darienf | 3:36de8b9e4b1a | 429 | |
darienf | 3:36de8b9e4b1a | 430 | Mission settings = model.MissionSettings; |
darienf | 3:36de8b9e4b1a | 431 | |
darienf | 3:36de8b9e4b1a | 432 | if (settings.EnableEcg) |
darienf | 3:36de8b9e4b1a | 433 | result |= selectLogFileName(ecgLog, "hsp-log-ecg"); |
darienf | 3:36de8b9e4b1a | 434 | |
darienf | 3:36de8b9e4b1a | 435 | if (settings.EnablePace) |
darienf | 3:36de8b9e4b1a | 436 | result |= selectLogFileName(paceLog, "hsp-log-pace"); |
darienf | 3:36de8b9e4b1a | 437 | |
darienf | 3:36de8b9e4b1a | 438 | if (settings.EnableBioZ) |
darienf | 3:36de8b9e4b1a | 439 | result |= selectLogFileName(bioZLog, "hsp-log-bioz"); |
darienf | 3:36de8b9e4b1a | 440 | |
darienf | 3:36de8b9e4b1a | 441 | if (settings.EnableRToR) |
darienf | 3:36de8b9e4b1a | 442 | result |= selectLogFileName(rToRLog, "hsp-log-rtor"); |
darienf | 3:36de8b9e4b1a | 443 | |
darienf | 3:36de8b9e4b1a | 444 | if (settings.EnableOpticalHR || settings.EnableOpticalMulti || settings.EnableOpticalSpO2) |
darienf | 3:36de8b9e4b1a | 445 | result |= selectLogFileName(opticalLog, "hsp-log-optical"); |
darienf | 3:36de8b9e4b1a | 446 | |
darienf | 3:36de8b9e4b1a | 447 | if (settings.EnableTemperature1) |
darienf | 3:36de8b9e4b1a | 448 | result |= selectLogFileName(temperatureLog1, "hsp-log-temperature1"); |
darienf | 3:36de8b9e4b1a | 449 | |
darienf | 3:36de8b9e4b1a | 450 | if (settings.EnableTemperature2) |
darienf | 3:36de8b9e4b1a | 451 | result |= selectLogFileName(temperatureLog2, "hsp-log-temperature2"); |
darienf | 3:36de8b9e4b1a | 452 | |
darienf | 3:36de8b9e4b1a | 453 | if (settings.EnablePressure) |
darienf | 3:36de8b9e4b1a | 454 | result |= selectLogFileName(pressureLog, "hsp-log-barometer"); |
darienf | 3:36de8b9e4b1a | 455 | |
darienf | 3:36de8b9e4b1a | 456 | if (settings.EnableAccelerometer) |
darienf | 3:36de8b9e4b1a | 457 | result |= selectLogFileName(accelerometerLog, "hsp-log-accelerometer"); |
darienf | 3:36de8b9e4b1a | 458 | |
darienf | 3:36de8b9e4b1a | 459 | return result; |
darienf | 3:36de8b9e4b1a | 460 | } |
darienf | 3:36de8b9e4b1a | 461 | |
darienf | 3:36de8b9e4b1a | 462 | bool selectLogFileName(IRawFileLogView log, string name) |
darienf | 3:36de8b9e4b1a | 463 | { |
darienf | 3:36de8b9e4b1a | 464 | bool result; |
darienf | 3:36de8b9e4b1a | 465 | |
darienf | 3:36de8b9e4b1a | 466 | if (logFileDirectory != null) |
darienf | 3:36de8b9e4b1a | 467 | log.FileDirectory = logFileDirectory; |
darienf | 3:36de8b9e4b1a | 468 | |
darienf | 3:36de8b9e4b1a | 469 | result = log.SelectCSVFile(name); |
darienf | 3:36de8b9e4b1a | 470 | log.Enable = result; |
darienf | 3:36de8b9e4b1a | 471 | |
darienf | 3:36de8b9e4b1a | 472 | if (result) |
darienf | 3:36de8b9e4b1a | 473 | logFileDirectory = log.FileDirectory; |
darienf | 3:36de8b9e4b1a | 474 | |
darienf | 3:36de8b9e4b1a | 475 | return result; |
darienf | 3:36de8b9e4b1a | 476 | } |
darienf | 3:36de8b9e4b1a | 477 | |
darienf | 3:36de8b9e4b1a | 478 | private void missionRead() |
darienf | 3:36de8b9e4b1a | 479 | { |
darienf | 3:36de8b9e4b1a | 480 | model.MissionRead(); |
darienf | 3:36de8b9e4b1a | 481 | view.UpdateGuiElements(model.MissionSettings); |
darienf | 3:36de8b9e4b1a | 482 | if (model.MissionSettings.Enable) |
darienf | 3:36de8b9e4b1a | 483 | formView.MessageInfo("Read complete"); |
darienf | 3:36de8b9e4b1a | 484 | else |
darienf | 3:36de8b9e4b1a | 485 | formView.MessageInfo("No parameters defined"); |
darienf | 3:36de8b9e4b1a | 486 | } |
darienf | 3:36de8b9e4b1a | 487 | |
darienf | 3:36de8b9e4b1a | 488 | void ProcessBioZ(int[] rawData) |
darienf | 3:36de8b9e4b1a | 489 | { |
darienf | 3:36de8b9e4b1a | 490 | BioZFifo[] bioZFifo; |
darienf | 3:36de8b9e4b1a | 491 | double[] time = new double[rawData.Length]; |
darienf | 3:36de8b9e4b1a | 492 | double sampleRate = ecgView.SampleRateBioZ; |
darienf | 3:36de8b9e4b1a | 493 | |
darienf | 3:36de8b9e4b1a | 494 | bioZFifo = ConvertBioZ(rawData); |
darienf | 3:36de8b9e4b1a | 495 | |
darienf | 3:36de8b9e4b1a | 496 | for (int i = 0; i < time.Length; i++ ) |
darienf | 3:36de8b9e4b1a | 497 | { |
darienf | 3:36de8b9e4b1a | 498 | time[i] = bioZCount / (double)sampleRate; |
darienf | 3:36de8b9e4b1a | 499 | bioZCount++; |
darienf | 3:36de8b9e4b1a | 500 | } |
darienf | 3:36de8b9e4b1a | 501 | |
darienf | 3:36de8b9e4b1a | 502 | bioZLog.DisplayBioZ(time, bioZFifo); |
darienf | 3:36de8b9e4b1a | 503 | } |
darienf | 3:36de8b9e4b1a | 504 | |
darienf | 3:36de8b9e4b1a | 505 | public BioZFifo[] ConvertBioZ(int[] data) |
darienf | 3:36de8b9e4b1a | 506 | { |
darienf | 3:36de8b9e4b1a | 507 | BioZFifo[] impedance = new BioZFifo[data.Length]; |
darienf | 3:36de8b9e4b1a | 508 | //EcgView.ChartInfo chartInfo = BioZInfo(); |
darienf | 3:36de8b9e4b1a | 509 | EcgView.ChartInfo chartInfo = ecgView.BioZInfo; |
darienf | 3:36de8b9e4b1a | 510 | |
darienf | 3:36de8b9e4b1a | 511 | int dataShift; |
darienf | 3:36de8b9e4b1a | 512 | |
darienf | 3:36de8b9e4b1a | 513 | for (int i = 0; i < data.Length; i++) |
darienf | 3:36de8b9e4b1a | 514 | { |
darienf | 3:36de8b9e4b1a | 515 | dataShift = data[i] >> chartInfo.Shift; |
darienf | 3:36de8b9e4b1a | 516 | |
darienf | 3:36de8b9e4b1a | 517 | // Two's Complement Conversions |
darienf | 3:36de8b9e4b1a | 518 | if (dataShift > chartInfo.Threshold) |
darienf | 3:36de8b9e4b1a | 519 | { |
darienf | 3:36de8b9e4b1a | 520 | dataShift -= chartInfo.Offset; |
darienf | 3:36de8b9e4b1a | 521 | } |
darienf | 3:36de8b9e4b1a | 522 | |
darienf | 3:36de8b9e4b1a | 523 | // 1.9734 = 1/2^19 * 1e-6 |
darienf | 3:36de8b9e4b1a | 524 | impedance[i].Data = dataShift * 1.9073486328125 / |
darienf | 3:36de8b9e4b1a | 525 | (chartInfo.Gain * ((chartInfo.CurrentGenerator == 0) ? 1 : chartInfo.CurrentGenerator)); |
darienf | 3:36de8b9e4b1a | 526 | impedance[i].Code = data[i]; |
darienf | 3:36de8b9e4b1a | 527 | impedance[i].BioZData = dataShift; |
darienf | 3:36de8b9e4b1a | 528 | impedance[i].BTag = data[i] & 0x07; |
darienf | 3:36de8b9e4b1a | 529 | } |
darienf | 3:36de8b9e4b1a | 530 | |
darienf | 3:36de8b9e4b1a | 531 | return impedance; |
darienf | 3:36de8b9e4b1a | 532 | } |
darienf | 3:36de8b9e4b1a | 533 | |
darienf | 3:36de8b9e4b1a | 534 | public EcgView.ChartInfo BioZInfo() |
darienf | 3:36de8b9e4b1a | 535 | { |
darienf | 3:36de8b9e4b1a | 536 | EcgView.ChartInfo info = new EcgView.ChartInfo(); |
darienf | 3:36de8b9e4b1a | 537 | int[] currentGen = new int[] {1, 8, 16, 32, 48, 64, 80, 96}; |
darienf | 3:36de8b9e4b1a | 538 | int[] gain = new int[] {20, 40, 80, 160}; |
darienf | 3:36de8b9e4b1a | 539 | |
darienf | 3:36de8b9e4b1a | 540 | info.Shift = 4; |
darienf | 3:36de8b9e4b1a | 541 | info.Offset = 0x100000; |
darienf | 3:36de8b9e4b1a | 542 | info.Threshold = 0x100000; |
darienf | 3:36de8b9e4b1a | 543 | info.Gain = gain[model.MissionSettings.BioZArgs[10]]; |
darienf | 3:36de8b9e4b1a | 544 | info.CurrentGenerator = currentGen[model.MissionSettings.BioZArgs[15]]; |
darienf | 3:36de8b9e4b1a | 545 | |
darienf | 3:36de8b9e4b1a | 546 | return info; |
darienf | 3:36de8b9e4b1a | 547 | } |
darienf | 3:36de8b9e4b1a | 548 | |
darienf | 3:36de8b9e4b1a | 549 | void ProcessEcg(int[] rawData) |
darienf | 3:36de8b9e4b1a | 550 | { |
darienf | 3:36de8b9e4b1a | 551 | EcgFifo[] ecgFifo; |
darienf | 3:36de8b9e4b1a | 552 | double[] ecgVoltage = new double[rawData.Length]; |
darienf | 3:36de8b9e4b1a | 553 | double[] timeSecond = new double[rawData.Length]; |
darienf | 3:36de8b9e4b1a | 554 | double ecgRate = ecgView.SampleRateEcg; |
darienf | 3:36de8b9e4b1a | 555 | |
darienf | 3:36de8b9e4b1a | 556 | ecgFifo = ConvertEcg(rawData); |
darienf | 3:36de8b9e4b1a | 557 | |
darienf | 3:36de8b9e4b1a | 558 | for (int i = 0; i < ecgFifo.Length; i++) |
darienf | 3:36de8b9e4b1a | 559 | { |
darienf | 3:36de8b9e4b1a | 560 | timeSecond[i] = count / ecgRate; |
darienf | 3:36de8b9e4b1a | 561 | |
darienf | 3:36de8b9e4b1a | 562 | // Look for Pace Events |
darienf | 3:36de8b9e4b1a | 563 | if (paceLog.Enable) |
darienf | 3:36de8b9e4b1a | 564 | { |
darienf | 3:36de8b9e4b1a | 565 | //for (int j = 0; j < ecgFifo.Length; j++) |
darienf | 3:36de8b9e4b1a | 566 | //{ |
darienf | 3:36de8b9e4b1a | 567 | if (ecgFifo[i].PTag != 7) |
darienf | 3:36de8b9e4b1a | 568 | { |
darienf | 3:36de8b9e4b1a | 569 | PaceData.PaceRegister paceRegister = paceData.PaceGroup(ecgFifo[i].PTag); |
darienf | 3:36de8b9e4b1a | 570 | List<double> timeMillsecondPace = new List<double>(); |
darienf | 3:36de8b9e4b1a | 571 | List<PaceData.PaceEdge> paceEdges = new List<PaceData.PaceEdge>(); |
darienf | 3:36de8b9e4b1a | 572 | |
darienf | 3:36de8b9e4b1a | 573 | for (int k = 0; k < 6; k++) |
darienf | 3:36de8b9e4b1a | 574 | { |
darienf | 3:36de8b9e4b1a | 575 | PaceData.PaceEdge edge = paceRegister.Edge[k]; |
darienf | 3:36de8b9e4b1a | 576 | |
darienf | 3:36de8b9e4b1a | 577 | timeMillsecondPace.Add(count / ecgRate + ConvertPace(edge.Data)); |
darienf | 3:36de8b9e4b1a | 578 | paceEdges.Add(edge); |
darienf | 3:36de8b9e4b1a | 579 | |
darienf | 3:36de8b9e4b1a | 580 | if (edge.Last == true) |
darienf | 3:36de8b9e4b1a | 581 | break; |
darienf | 3:36de8b9e4b1a | 582 | } |
darienf | 3:36de8b9e4b1a | 583 | |
darienf | 3:36de8b9e4b1a | 584 | paceLog.DisplayPace(timeMillsecondPace.ToArray(), paceEdges.ToArray()); |
darienf | 3:36de8b9e4b1a | 585 | System.Diagnostics.Debug.Print("ECG PTag = " + ecgFifo[i].PTag); |
darienf | 3:36de8b9e4b1a | 586 | } |
darienf | 3:36de8b9e4b1a | 587 | //} |
darienf | 3:36de8b9e4b1a | 588 | } |
darienf | 3:36de8b9e4b1a | 589 | |
darienf | 3:36de8b9e4b1a | 590 | count++; |
darienf | 3:36de8b9e4b1a | 591 | } |
darienf | 3:36de8b9e4b1a | 592 | |
darienf | 3:36de8b9e4b1a | 593 | ecgLog.DisplayEcg(timeSecond, ecgFifo); |
darienf | 3:36de8b9e4b1a | 594 | |
darienf | 3:36de8b9e4b1a | 595 | } |
darienf | 3:36de8b9e4b1a | 596 | |
darienf | 3:36de8b9e4b1a | 597 | public EcgFifo[] ConvertEcg(int[] data) |
darienf | 3:36de8b9e4b1a | 598 | { |
darienf | 3:36de8b9e4b1a | 599 | EcgFifo[] voltage = new EcgFifo[data.Length]; |
darienf | 3:36de8b9e4b1a | 600 | //EcgView.ChartInfo chartInfo = EcgInfo(); |
darienf | 3:36de8b9e4b1a | 601 | EcgView.ChartInfo chartInfo = ecgView.EcgInfo; |
darienf | 3:36de8b9e4b1a | 602 | |
darienf | 3:36de8b9e4b1a | 603 | int dataShift; |
darienf | 3:36de8b9e4b1a | 604 | |
darienf | 3:36de8b9e4b1a | 605 | for (int i = 0; i < data.Length; i++) |
darienf | 3:36de8b9e4b1a | 606 | { |
darienf | 3:36de8b9e4b1a | 607 | dataShift = data[i] >> chartInfo.Shift; |
darienf | 3:36de8b9e4b1a | 608 | |
darienf | 3:36de8b9e4b1a | 609 | // Two's Complement Conversions |
darienf | 3:36de8b9e4b1a | 610 | if (dataShift > chartInfo.Threshold) |
darienf | 3:36de8b9e4b1a | 611 | { |
darienf | 3:36de8b9e4b1a | 612 | dataShift -= chartInfo.Offset; |
darienf | 3:36de8b9e4b1a | 613 | } |
darienf | 3:36de8b9e4b1a | 614 | |
darienf | 3:36de8b9e4b1a | 615 | voltage[i].Data = 1000 * 7.62939453125e-6 * dataShift / chartInfo.Gain; |
darienf | 3:36de8b9e4b1a | 616 | voltage[i].EcgData = dataShift; |
darienf | 3:36de8b9e4b1a | 617 | voltage[i].Code = data[i]; |
darienf | 3:36de8b9e4b1a | 618 | voltage[i].PTag = data[i] & 0x07; |
darienf | 3:36de8b9e4b1a | 619 | voltage[i].ETag = (data[i] >> 3) & 0x07; |
darienf | 3:36de8b9e4b1a | 620 | } |
darienf | 3:36de8b9e4b1a | 621 | |
darienf | 3:36de8b9e4b1a | 622 | return voltage; |
darienf | 3:36de8b9e4b1a | 623 | } |
darienf | 3:36de8b9e4b1a | 624 | |
darienf | 3:36de8b9e4b1a | 625 | public EcgView.ChartInfo EcgInfo() |
darienf | 3:36de8b9e4b1a | 626 | { |
darienf | 3:36de8b9e4b1a | 627 | EcgView.ChartInfo info = new EcgView.ChartInfo(); |
darienf | 3:36de8b9e4b1a | 628 | int[] gain = new int[] {20, 40, 80, 160}; |
darienf | 3:36de8b9e4b1a | 629 | |
darienf | 3:36de8b9e4b1a | 630 | info.Shift = 6; |
darienf | 3:36de8b9e4b1a | 631 | info.Threshold = 0x1ffff; |
darienf | 3:36de8b9e4b1a | 632 | info.Offset = 0x40000; |
darienf | 3:36de8b9e4b1a | 633 | |
darienf | 3:36de8b9e4b1a | 634 | info.Gain = gain[model.MissionSettings.EcgArgs[10]]; |
darienf | 3:36de8b9e4b1a | 635 | |
darienf | 3:36de8b9e4b1a | 636 | return info; |
darienf | 3:36de8b9e4b1a | 637 | } |
darienf | 3:36de8b9e4b1a | 638 | |
darienf | 3:36de8b9e4b1a | 639 | public double ConvertRToR(int data) |
darienf | 3:36de8b9e4b1a | 640 | { |
darienf | 3:36de8b9e4b1a | 641 | return ecgView.TimeResolution * 1000 * data * 512; |
darienf | 3:36de8b9e4b1a | 642 | } |
darienf | 3:36de8b9e4b1a | 643 | |
darienf | 3:36de8b9e4b1a | 644 | public double ConvertPace(int data) |
darienf | 3:36de8b9e4b1a | 645 | { |
darienf | 3:36de8b9e4b1a | 646 | return data * ecgView.TimeResolution; |
darienf | 3:36de8b9e4b1a | 647 | } |
darienf | 3:36de8b9e4b1a | 648 | |
darienf | 3:36de8b9e4b1a | 649 | public string PaceRegisterGroupToString(PaceData.PaceRegister paceRegister) |
darienf | 3:36de8b9e4b1a | 650 | { |
darienf | 3:36de8b9e4b1a | 651 | StringBuilder paceRegisterLogBuilder = new StringBuilder(); |
darienf | 3:36de8b9e4b1a | 652 | for (int j = 0; j < 6; j++) |
darienf | 3:36de8b9e4b1a | 653 | { |
darienf | 3:36de8b9e4b1a | 654 | paceRegisterLogBuilder.Append(paceRegister.Edge[j].Data / (2 * ecgView.MasterClockFrequency)); |
darienf | 3:36de8b9e4b1a | 655 | paceRegisterLogBuilder.Append(", "); |
darienf | 3:36de8b9e4b1a | 656 | paceRegisterLogBuilder.Append(paceRegister.Edge[j].Polarity ? 'R' : 'F'); |
darienf | 3:36de8b9e4b1a | 657 | paceRegisterLogBuilder.Append(", "); |
darienf | 3:36de8b9e4b1a | 658 | paceRegisterLogBuilder.Append(paceRegister.Edge[j].Last ? 'Y' : 'N'); |
darienf | 3:36de8b9e4b1a | 659 | paceRegisterLogBuilder.Append(", "); |
darienf | 3:36de8b9e4b1a | 660 | } |
darienf | 3:36de8b9e4b1a | 661 | |
darienf | 3:36de8b9e4b1a | 662 | return paceRegisterLogBuilder.ToString(); |
darienf | 3:36de8b9e4b1a | 663 | } |
darienf | 3:36de8b9e4b1a | 664 | |
darienf | 3:36de8b9e4b1a | 665 | void ProcessRToR(int data) |
darienf | 3:36de8b9e4b1a | 666 | { |
darienf | 3:36de8b9e4b1a | 667 | if (rToRCalculator != null) |
darienf | 3:36de8b9e4b1a | 668 | { |
darienf | 3:36de8b9e4b1a | 669 | if (rToRFirst) |
darienf | 3:36de8b9e4b1a | 670 | { |
darienf | 3:36de8b9e4b1a | 671 | rToRLog.DisplayRToR(data, rToRCalculator.Corrected(data, true) / 1000); |
darienf | 3:36de8b9e4b1a | 672 | rToRFirst = false; |
darienf | 3:36de8b9e4b1a | 673 | } |
darienf | 3:36de8b9e4b1a | 674 | else |
darienf | 3:36de8b9e4b1a | 675 | rToRLog.DisplayRToR(data, rToRCalculator.Corrected(data, false) / 1000); |
darienf | 3:36de8b9e4b1a | 676 | } |
darienf | 3:36de8b9e4b1a | 677 | else |
darienf | 3:36de8b9e4b1a | 678 | { |
darienf | 3:36de8b9e4b1a | 679 | rToRLog.DisplayRToR(data, 0); |
darienf | 3:36de8b9e4b1a | 680 | } |
darienf | 3:36de8b9e4b1a | 681 | } |
darienf | 3:36de8b9e4b1a | 682 | |
darienf | 3:36de8b9e4b1a | 683 | public void ProcessOptical(int[] red, int[] ir, int[] green) |
darienf | 3:36de8b9e4b1a | 684 | { |
darienf | 3:36de8b9e4b1a | 685 | int sampleRate = opticalView.OpticalSampleRate; |
darienf | 3:36de8b9e4b1a | 686 | double[] time = new double[red.Length]; |
darienf | 3:36de8b9e4b1a | 687 | |
darienf | 3:36de8b9e4b1a | 688 | for (int i = 0; i < time.Length; i++ ) |
darienf | 3:36de8b9e4b1a | 689 | { |
darienf | 3:36de8b9e4b1a | 690 | time[i] = ppgCount / (double)sampleRate; |
darienf | 3:36de8b9e4b1a | 691 | ppgCount++; |
darienf | 3:36de8b9e4b1a | 692 | } |
darienf | 3:36de8b9e4b1a | 693 | |
darienf | 3:36de8b9e4b1a | 694 | opticalLog.DisplayPpg(time, new int[][] { red, ir, green }); |
darienf | 3:36de8b9e4b1a | 695 | } |
darienf | 3:36de8b9e4b1a | 696 | |
darienf | 3:36de8b9e4b1a | 697 | public void ProcessAccelerometer(int[] x, int[] y, int[] z) |
darienf | 3:36de8b9e4b1a | 698 | { |
darienf | 3:36de8b9e4b1a | 699 | int sampleRate = view.AccelSampleRate; |
darienf | 3:36de8b9e4b1a | 700 | double[] time = new double[x.Length]; |
darienf | 3:36de8b9e4b1a | 701 | |
darienf | 3:36de8b9e4b1a | 702 | for (int i = 0; i < time.Length; i++) |
darienf | 3:36de8b9e4b1a | 703 | { |
darienf | 3:36de8b9e4b1a | 704 | time[i] = accelCount / (double)sampleRate; |
darienf | 3:36de8b9e4b1a | 705 | accelCount++; |
darienf | 3:36de8b9e4b1a | 706 | } |
darienf | 3:36de8b9e4b1a | 707 | |
darienf | 3:36de8b9e4b1a | 708 | accelerometerLog.DisplayXYZ(time, new int[][] { x, y, z }); |
darienf | 3:36de8b9e4b1a | 709 | } |
darienf | 3:36de8b9e4b1a | 710 | } |
darienf | 3:36de8b9e4b1a | 711 | } |