Darien Figueroa / Mbed 2 deprecated repo3

Dependencies:   mbed MAX14720 MAX30205 USBDevice

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers Form1.cs Source File

Form1.cs

00001 /*******************************************************************************
00002 * Copyright (C) 2016 Maxim Integrated Products, Inc., All rights Reserved.
00003 * 
00004 * This software is protected by copyright laws of the United States and
00005 * of foreign countries. This material may also be protected by patent laws
00006 * and technology transfer regulations of the United States and of foreign
00007 * countries. This software is furnished under a license agreement and/or a
00008 * nondisclosure agreement and may only be used or reproduced in accordance
00009 * with the terms of those agreements. Dissemination of this information to
00010 * any party or parties not specified in the license agreement and/or
00011 * nondisclosure agreement is expressly prohibited.
00012 *
00013 * The above copyright notice and this permission notice shall be included
00014 * in all copies or substantial portions of the Software.
00015 *
00016 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
00017 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00018 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
00019 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
00020 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
00021 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
00022 * OTHER DEALINGS IN THE SOFTWARE.
00023 *
00024 * Except as contained in this notice, the name of Maxim Integrated
00025 * Products, Inc. shall not be used except as stated in the Maxim Integrated
00026 * Products, Inc. Branding Policy.
00027 *
00028 * The mere transfer of this software does not imply any licenses
00029 * of trade secrets, proprietary technology, copyrights, patents,
00030 * trademarks, maskwork rights, or any other form of intellectual
00031 * property whatsoever. Maxim Integrated Products, Inc. retains all
00032 * ownership rights.
00033 *******************************************************************************
00034 */
00035 
00036 using System;
00037 using System.Collections.Generic;
00038 using System.ComponentModel;
00039 using System.Data;
00040 using System.Drawing;
00041 using System.Linq;
00042 using System.Text;
00043 
00044 using System.Windows.Forms;
00045 using Microsoft.Win32;
00046 using Microsoft.Win32.SafeHandles;
00047 using System.Globalization;
00048 using System.Threading;
00049 using System.Management;
00050 using System.Diagnostics;
00051 using System.IO;
00052 using System.Collections.Specialized;
00053 
00054 using HealthSensorPlatform.DeviceDescriptions;
00055 using HealthSensorPlatform.CustomControls;
00056 using HealthSensorPlatform.View;
00057 using HealthSensorPlatform.Presenter;
00058 using HealthSensorPlatform.Model;
00059 
00060 using MAX30205EVKit.Presenter;
00061 
00062 using Maxim.MAX30101GUI;
00063 using Maxim.Utility;
00064 
00065 using MaximStyle;
00066 
00067 namespace HealthSensorPlatform
00068 {
00069 
00070     public partial class HspForm : Form, IFormView, IHspSetting
00071     {
00072         /* Constants */
00073         //Software Version
00074         internal const int MAJORVERSION = 3;
00075         internal const int MINORVERSION = 0;
00076         internal const int PATCHVERSION = 1;
00077         const string VersionSuffix = "";
00078 
00079         const string PartNumber = "MAXREFDES100";
00080 
00081         const string readVersionCommand = "/System/ReadVer\r\n";
00082         const string readFlashIDCommand = "/S25FS512/ReadId\r\n";
00083         const string firmwareKey = "HSP FW Version"; 
00084 
00085         /* Fields */
00086         SplashScreen splashScreen = new SplashScreen();
00087         FormConnection connectionDialog = new FormConnection();
00088         string port;
00089         bool connected = false;
00090         bool internalUpdate = false; // Used to prevent events from triggering
00091         bool streaming = false; // Disable GUI features while streaming is enabled
00092 
00093         static ManagementEventWatcher watcher; 
00094 
00095         /* // TODO: Do not remember what this is for, can remove
00096         MaximStyle.MaximNumericUpDown[] ud_cmd = new MaximStyle.MaximNumericUpDown[3];
00097         MaximStyle.MaximNumericUpDown[] ud_data = new MaximStyle.MaximNumericUpDown[8];
00098         Panel[] p_cmd = new Panel[3];
00099         Panel[] p_data = new Panel[8];
00100         */
00101 
00102         IDeviceView[] deviceViews;
00103         Maxim.CustomControls.RegisterView[] registerViews;
00104         TabPage[] max30001TabPages;
00105 
00106         RPCSupport.RPCClient rpcClient;
00107         RPCSupport.Devices.I2cDevice i2cDevice;
00108         RPCSupport.Devices.SpiDevice spiDevice;
00109         RPCSupport.Devices.MAX30101 max30101;
00110         RPCSupport.Devices.MAX30205 max30205;
00111         RPCSupport.Devices.LIS2HD lis2hd;
00112         RPCSupport.Devices.MAX30001 max30001;
00113         RPCSupport.DataLogging.DataLogging logging;
00114 
00115         ListDictionary registerViewDict;
00116 
00117         //FileLogPresenter fileLogPresenter;
00118         RawFileLogPresenter rawFileLogPresenter;
00119         OpticalFileLogPresenter opticalFileLogPresenter;
00120         TemperaturePresenter temperaturePresenter;
00121 
00122         Model.MAX30001Model max30001Model;
00123 
00124         public event EventHandler<EnableEventArgs> FileLogEnable;
00125         public event EventHandler<EnableEventArgs> OpticalFileLogEnable;
00126         public event EventHandler<EventArgs> RegisterExport;
00127         public event EventHandler<EventArgs> RegisterImport;
00128 
00129         public event EventHandler<EventArgs> Connected;
00130 
00131         /* Constructor */
00132         /// <summary>
00133         /// 
00134         /// </summary>
00135         public HspForm()
00136         {
00137             InitializeComponent();
00138 
00139             InitSplashScreen();
00140 
00141             //initialize text in status bar
00142             ss_Status.Items[0].Text = "";
00143             ss_Status.Items[1].Text = "";
00144 
00145             deviceViews = new IDeviceView[] { 
00146                 opticalView1, 
00147                 temperatureView1,
00148                 ecgView1,
00149                 dataLoggingView1,
00150                 rvLIS2HD,
00151                 rvMAX14720,
00152                 rvMAX30001,
00153                 rvMAX30101,
00154                 rvMAX30205,
00155                 rvMAX30205_U18
00156             };
00157 
00158             registerViews = new Maxim.CustomControls.RegisterView[] {
00159                 rvMAX30101,
00160                 rvMAX30205,
00161                 rvMAX30205_U18,
00162                 rvLIS2HD,
00163                 rvMAX30001,
00164                 rvMAX14720
00165             };
00166 
00167             max30001TabPages = new TabPage[] { tpMAX30001BioZInputMux, tpBioZChannel, tpMAX30001BioZLoad, tpMAX30001Pace };
00168 
00169             registerViewDict = new ListDictionary();
00170 
00171             InitRpcClient();
00172 
00173             InitRpcDevices();
00174             PrimitivesViewInit();
00175             RegistersTabInit();
00176             LoggingViewInit();
00177             TemperatureViewInit();
00178             OpticalViewInit();
00179 
00180             BlockDiagramsInit();
00181             ECGPlotsViewInit();
00182 
00183             InitalizeUSBDetection();
00184 
00185             FileLoggingInit();
00186 
00187             RegisterExportInit();
00188 
00189             SetupSwitchPictureBoxes();
00190         }
00191 
00192         private void SetupSwitchPictureBoxes()
00193         {
00194             //ECGMux Tab
00195             picECGLeadConfig.Controls.Add(picSw1);
00196             picSw1.Controls.Add(picSw2);
00197             picSw2.Controls.Add(picSw3);
00198             picSw3.Controls.Add(picSw4);
00199             picSw4.Controls.Add(picSw5);
00200             picSw5.Controls.Add(picSw6);
00201             picSw6.Controls.Add(picSw7);
00202             picSw7.Controls.Add(picSw8);
00203             picSw8.Controls.Add(picSw9);
00204             picSw9.Controls.Add(picSw10);
00205             picSw10.Controls.Add(picSw11);
00206             picSw11.Controls.Add(picSw12);
00207             picSw12.Controls.Add(picSw13);
00208             picSw13.Controls.Add(picSw14);
00209 
00210             //BioZMux Tab
00211             pictureBox2.Controls.Add(picLoff1);
00212             picLoff1.Controls.Add(picLoff2);
00213             picLoff2.Controls.Add(picLeadOn);
00214             picLeadOn.Controls.Add(picBioZsw1);
00215             picBioZsw1.Controls.Add(picBioZsw2);
00216             picBioZsw2.Controls.Add(picLeadBias1);
00217             picLeadBias1.Controls.Add(picLeadBias2);
00218             picLeadBias2.Controls.Add(picBioZCal1);
00219             picBioZCal1.Controls.Add(picBioZCal2);
00220 
00221             //BioZLoad Tab
00222             picBioZLoad.Controls.Add(picBioZLresload); 
00223             picBioZLresload.Controls.Add(picBioZLloff1);
00224             picBioZLloff1.Controls.Add(picBioZLloff2);
00225             picBioZLloff2.Controls.Add(picBioZLlon);
00226             picBioZLlon.Controls.Add(picBioZLsw1);
00227             picBioZLsw1.Controls.Add(picBioZLsw2);
00228             picBioZLsw2.Controls.Add(picBioZLlb1);
00229             picBioZLlb1.Controls.Add(picBioZLlb2);
00230             picBioZLlb2.Controls.Add(picBioZLcal1);
00231             picBioZLcal1.Controls.Add(picBioZLcal2);
00232 
00233 
00234         }
00235 
00236         /* Delegates */
00237         delegate void guiDisconnectedCallBack();
00238 
00239         public void MessageInfo(string message)
00240         {
00241             ss_Status.MessagesLabel.Text = message;
00242         }
00243 
00244         public void MessageBoxShow(string message)
00245         {
00246             MessageBox.Show(message);
00247         }
00248 
00249         public void MessageBoxShow(string message, string title)
00250         {
00251             MessageBox.Show(message, title);
00252         }
00253 
00254 
00255         /// <summary>
00256         /// http://stackoverflow.com/questions/286184/how-to-capture-a-serial-port-that-disappears-because-the-usb-cable-gets-unplugge
00257         /// </summary>
00258         private void InitalizeUSBDetection()
00259         {
00260             WqlEventQuery query;
00261             ManagementScope scope;
00262 
00263             scope = new ManagementScope("root\\CIMV2");
00264             scope.Options.EnablePrivileges = true;
00265 
00266             query = new WqlEventQuery();
00267             query.EventClassName = "__InstanceDeletionEvent"; // "__InstanceCreationEvent" can be used for insertion
00268             query.WithinInterval = new TimeSpan(0, 0, 3);
00269             query.Condition = @"TargetInstance ISA 'Win32_USBControllerdevice'";
00270             watcher = new ManagementEventWatcher(scope, query);
00271             watcher.EventArrived += new EventArrivedEventHandler(USBRemovedHandler);
00272             watcher.Start();
00273         }
00274         
00275         /// <summary>
00276         /// http://stackoverflow.com/questions/286184/how-to-capture-a-serial-port-that-disappears-because-the-usb-cable-gets-unplugge
00277         /// </summary>
00278         /// <param name="sender"></param>
00279         /// <param name="e"></param>
00280         private void USBRemovedHandler(object sender, EventArrivedEventArgs e)
00281         {
00282             PropertyData targetInstanceData = e.NewEvent.Properties["TargetInstance"];
00283 
00284             if (targetInstanceData != null)
00285             {
00286                 ManagementBaseObject targetInstanceObject = (ManagementBaseObject)targetInstanceData.Value;
00287                 if (targetInstanceData != null)
00288                 {
00289                     string dependent = targetInstanceObject.Properties["Dependent"].Value.ToString();
00290                     string deviceId = dependent.Substring(dependent.IndexOf("DeviceID=") + 10);
00291 
00292                     if (deviceId.StartsWith("USB\\\\VID_0B6A&PID_003C")  // FW 1.5
00293                         || deviceId.StartsWith("USB\\\\VID_1F00&PID_2012\\\\0123456789")
00294                         || deviceId.StartsWith("USB\\\\VID_0B6A&PID_0100")) // FW 2.0 mbed
00295                     {
00296                         // device is disconnected
00297                         guiDisconnected();
00298                         try
00299                         {
00300                             rpcClient.Disconnect();
00301                         }
00302                         catch (System.IO.IOException)
00303                         {
00304 
00305                         }
00306                         catch (NullReferenceException)
00307                         {
00308                             // Disconnecting when it doesn't exist
00309                             // Occurs when you pull the USB while on the com port selection window
00310                         }
00311                     }
00312                 }
00313 
00314             }
00315             
00316         }
00317 
00318         private void InitSplashScreen()
00319         {
00320             splashScreen.maximSplashScreen1.CopyrightString = "©2016 Maxim Integrated Products, Inc.";
00321             splashScreen.maximSplashScreen1.VersionString = "Version " + MAJORVERSION.ToString() + "." + MINORVERSION.ToString() + "." + PATCHVERSION.ToString() + VersionSuffix;
00322             splashScreen.maximSplashScreen1.ApplicationName = this.Text;
00323             //splashScreen.maximSplashScreen1.Checked = Properties.Settings.Default.DisableSplash;
00324         }
00325 
00326         void comPortConnect()
00327         {
00328             bool tryPreviousComPort = true;
00329 
00330             connectionDialog.Reset();
00331             connectionDialog.ScanPorts();
00332 
00333             while (true)
00334             {
00335                 // Try to connect to the previous port, if we have not tried before 
00336                 // and it the port string is not an empty string ("")
00337                 if (tryPreviousComPort == true
00338                     && String.Compare(Properties.Settings.Default.ComPort, "") != 0)
00339                 {
00340                     tryPreviousComPort = false;
00341                 }
00342                 else
00343                 {
00344                     connectionDialog.ShowDialog();
00345                 }
00346 
00347                 // Break out of loop if user canceled
00348                 if (connectionDialog.Canceled == true)
00349                 {
00350                     guiDisconnected();
00351                     break;
00352                 }
00353 
00354                 // Get the port from the dialog form, returns default property
00355                 // for first use
00356                 port = connectionDialog.Port;
00357                 if (String.Compare(port, "") == 0)
00358                     continue;
00359 
00360 
00361                 // Connect to port
00362                 try
00363                 {
00364                     rpcClient.Connect(port);
00365                     if (rpcClient.IsConnected() == true)
00366                     {
00367                         guiConnected();
00368                         break;
00369                     }
00370                     else // Connected to COM port, but cannot query STM32_HV
00371                     {
00372                         MessageBox.Show("Device not found on selected port", "Connection Issue");
00373                         guiDisconnected();
00374                     }
00375                 }
00376                 catch (TimeoutException)
00377                 {
00378                     guiDisconnected();
00379                     rpcClient.Disconnect();
00380                     MessageBox.Show("Unable to communicate with device, communication timed out.\nVerified selected port is correct.",
00381                         "Connection Issue");
00382                 }
00383                 catch (System.IO.IOException)
00384                 {
00385                     guiDisconnected();
00386                     MessageBox.Show("Select a valid COM port. Unable to connect with device.\n\nVerify the " + PartNumber + " board is plugged in and turned on. Turn on by pressing the button on the board for 3 seconds until the red LED starts blinking.",
00387                         "Connection Issue");
00388                 }
00389                 catch (UnauthorizedAccessException)
00390                 {
00391                     // Port does not exist
00392                 }
00393             }
00394         }
00395 
00396         bool checkFirmware()
00397         {
00398             string reply;
00399 
00400             reply = rpcClient.RawRpcCall(readVersionCommand, true);
00401 
00402             return reply.StartsWith(firmwareKey);
00403         }
00404 
00405         void guiConnected()
00406         {
00407             ss_Status.Items[1].Text = rpcClient.Version();//rpcClient.RawRpcCall(readVersionCommand, true); // TODO this should be moved into the RPCSupport as a virtual system device
00408             ss_Status.Items[2].Text = "Hardware Connected (" + port + ")";
00409 
00410             connected = true;
00411 
00412             //connectionToolStripMenuItem.Enabled = false;
00413             //disconnectToolStripMenuItem.Enabled = true;
00414 
00415             connectionToolStripMenuItem.Checked = true;
00416             disconnectToolStripMenuItem.Checked = false;
00417 
00418             // Enable Communication for each Device View
00419             foreach (IDeviceView device in deviceViews)
00420             {
00421                 device.Connected = true;
00422             }
00423 
00424             // TODO Ask F/W team if this is needed
00425             rpcClient.MAX30001.WriteReg(0x02, 0x3);
00426             rpcClient.MAX30001.WriteReg(0x03, 0x3);
00427 
00428             max30001Model = new Model.MAX30001Model(max30001);
00429             partIDInit();
00430 
00431             dataLoggingView1.Enabled = checkFlashID();
00432 
00433             // Read device registers
00434             UpdateRegisters();
00435 
00436             if (Connected != null)
00437                 Connected(this, new EventArgs());
00438         }
00439 
00440 
00441         void guiDisconnected()
00442         {
00443             if (this.ss_Status.InvokeRequired)
00444             {
00445                 guiDisconnectedCallBack d = new guiDisconnectedCallBack(guiDisconnected);
00446                 this.Invoke(d);
00447             }
00448             else
00449             {
00450                 ss_Status.Items[1].Text = "";
00451                 ss_Status.Items[2].Text = "Hardware Not Connected";
00452                 //UpdateConnection(null, false);;
00453                 connected = false;
00454 
00455                 //connectionToolStripMenuItem.Enabled = true;
00456                 //disconnectToolStripMenuItem.Enabled = false;
00457 
00458                 connectionToolStripMenuItem.Checked = false;
00459                 disconnectToolStripMenuItem.Checked = true;
00460 
00461                 foreach (IDeviceView device in deviceViews)
00462                 {
00463                     device.Connected = false;
00464                 }
00465             }
00466         }
00467 
00468         void InitRpcClient()
00469         {
00470             rpcClient = new RPCSupport.RPCClient(RPCSupport.RPCClient.ePipeline.eSerialWrap);
00471             rpcClient.InitPipeline();
00472         }
00473 
00474         void InitRpcDevices()
00475         {
00476             i2cDevice = rpcClient.Init_I2cDevice();
00477             spiDevice = rpcClient.Init_SpiDevice();
00478             max30101 = rpcClient.Init_MAX30101(0xAE);
00479             max30205 = rpcClient.Init_MAX30205(0x32);
00480             lis2hd = rpcClient.Init_LIS2HD(0x50);
00481             max30001 = rpcClient.Init_MAX30001();
00482             logging = rpcClient.Init_Logging();
00483         }
00484 
00485         private void Form_Load(object sender, EventArgs e)
00486         {
00487           if (splashScreen.SplashDisabled() == false)
00488                 splashScreen.ShowDialog();
00489             
00490             while (splashScreen.Visible == true)
00491                 Thread.Sleep(100);
00492 
00493             comPortConnect();
00494         }
00495 
00496         void PrimitivesViewInit()
00497         {
00498             primitivesView1.rpcClient = rpcClient;
00499             primitivesView1.i2cDevice = i2cDevice;
00500             primitivesView1.spiDevice = spiDevice;
00501             primitivesView1.max30101 = max30101;
00502             primitivesView1.max30205 = max30205;
00503             primitivesView1.max30001 = max30001;
00504             primitivesView1.lis2hd = lis2hd;
00505 
00506             maximTabControl1.HideTab("tpPrimitives");
00507         }
00508 
00509         void OpticalViewInit()
00510         {
00511             opticalView1.RPCClient = rpcClient;
00512             //opticalView1.StreamingStartStop += new OpticalView.StreamingStartStopEventHandler(opticalView_StreamingStartStop);
00513             opticalView1.StreamingStartStop += new EventHandler<StreamingStartStopEventArgs>(opticalView_StreamingStartStop);
00514             dataLoggingView1.LoggingParametersChanged += new DataLoggingView.LoggingParametersHandler(dataLoggingFlashReadEventHandler);
00515 
00516             MaximSKAlgorithmClass algorithm = new MaximSKAlgorithmClass();
00517             OpticalAlgorithmPresenter presenter = new OpticalAlgorithmPresenter(rpcClient, algorithm, opticalView1);
00518         }
00519 
00520         void ECGPlotsViewInit()
00521         {
00522             ecgView1.RPCClient = rpcClient;
00523 
00524             //cboEnRToR.SelectedIndexChanged += new EventHandler(cboStreaming_SelectedIndexChanged);
00525             //cboECGChannelEnable.SelectedIndexChanged += new EventHandler(cboStreaming_SelectedIndexChanged);
00526 
00527             ecgView1.GetEcgInitArgsPointer = new CustomControls.EcgView.GetEcgInitArgs(getEcgArgs); 
00528             ecgView1.GetRToRInitArgsPointer = new CustomControls.EcgView.GetRToRInitArgs(getRToRArgs);
00529             ecgView1.GetBioZInitArgsPointer = new CustomControls.EcgView.GetBioZInitArgs(getBioZArgs);
00530             ecgView1.GetPaceInitArgsPointer = new CustomControls.EcgView.GetPaceInitArgs(getPaceArgs);
00531 
00532             ecgView1.StreamingStartStop += new EventHandler<StreamingStartStopEventArgs>(ecgView_StreamingStartStop);
00533 
00534             ecgView1.HspSetting = this;
00535 
00536             StreamPresenter streamPresenter = new StreamPresenter(rpcClient, ecgView1, this);
00537         }
00538 
00539         void LoggingViewInit()
00540         {
00541             dataLoggingView1.RPCClient = rpcClient;
00542 
00543             dataLoggingView1.GetEcgInitArgsPointer = new CustomControls.DataLoggingView.GetEcgInitArgs(getEcgArgs);
00544             dataLoggingView1.GetRToRInitArgsPointer = new CustomControls.DataLoggingView.GetRToRInitArgs(getRToRArgs);
00545             dataLoggingView1.GetBioZInitArgsPointer = new CustomControls.DataLoggingView.GetBioZInitArgs(getBioZArgs);
00546             dataLoggingView1.GetPaceInitArgsPointer = new CustomControls.DataLoggingView.GetPaceInitArgs(getPaceArgs);
00547             dataLoggingView1.GetFMSTRInitArgsPointer = new CustomControls.DataLoggingView.GetFMSTRInitArgs(getFMSTRArgs);
00548             dataLoggingView1.GetHRModeInitArgsPointer = new CustomControls.DataLoggingView.GetHRModeInitArgs(opticalView1.GetHRModeArgs);
00549             dataLoggingView1.GetSpO2HRModeInitArgsPointer = new CustomControls.DataLoggingView.GetSpO2HRModeInitArgs(opticalView1.GetSpO2HRModeArgs);
00550             dataLoggingView1.GetMultiModeInitArgsPointer = new CustomControls.DataLoggingView.GetMultiModeInitArgs(opticalView1.GetMultiModeArgs);
00551 
00552             Model.DataLogModel dataLogModel = new Model.DataLogModel(rpcClient);
00553             DataLogPresenter dataLogPresenter = new DataLogPresenter(this, ecgView1, opticalView1, dataLogModel, dataLoggingView1, new RawFileLogView(), new RawFileLogView(), new RawFileLogView(), 
00554                 new RawFileLogView(), new RawFileLogView(), new RawFileLogView(), new RawFileLogView(), new RawFileLogView(), new RawFileLogView());
00555         }
00556 
00557         void FileLoggingInit()
00558         {
00559             IRawFileLogView ecgFileLog = new RawFileLogView();
00560             IRawFileLogView bioZFileLog = new RawFileLogView();
00561 
00562             //fileLogPresenter = new FileLogPresenter(ecgFileLog, bioZFileLog, this, rpcClient, ecgView1);
00563             //ecgView1.EcgLog = ecgFileLog;
00564             //ecgView1.BioZLog = bioZFileLog;
00565 
00566             IRawFileLogView ecgRawFileLog = new RawFileLogView();
00567             IRawFileLogView paceRawFileLog = new RawFileLogView();
00568             IRawFileLogView rToRFileLog = new RawFileLogView();
00569             IRawFileLogView bioZRawFileLog = new RawFileLogView();
00570             rawFileLogPresenter = new RawFileLogPresenter(ecgRawFileLog, bioZRawFileLog, rToRFileLog, paceRawFileLog, this, rpcClient, ecgView1, dataLoggingView1);
00571 
00572             IRawFileLogView opticalFileLog = new RawFileLogView();
00573             IRawFileLogView accelFileLog = new RawFileLogView();
00574 
00575             opticalFileLogPresenter = new OpticalFileLogPresenter(rpcClient, this, opticalView1, opticalFileLog, accelFileLog);
00576 
00577         }
00578 
00579         void RegisterExportInit()
00580         {
00581             RegisterExportPresenter registerExportPresenter;
00582             RegisterExportForm exportForm = new RegisterExportForm();
00583             List<Maxim.CustomControls.RegisterView> registerViewList = new List<Maxim.CustomControls.RegisterView>(); 
00584 
00585             registerViewList.AddRange(registerViews);
00586 
00587             registerExportPresenter = new RegisterExportPresenter(this, exportForm, registerViewList);
00588         }
00589         
00590         private void txt_Status_TextChanged(object sender, EventArgs e)
00591         {
00592             //Scroll to the bottom of the textbox when text is added
00593             txt_Status.SelectionStart = txt_Status.Text.Length;
00594             txt_Status.ScrollToCaret();
00595             txt_Status.Refresh();
00596         }
00597 
00598         private void btn_Clear_Click(object sender, EventArgs e)
00599         {
00600             //clear the status box
00601             txt_Status.Text = "";
00602         }
00603 
00604         private void rvLIS2HDInit()
00605         {
00606             Maxim.CustomControls.LIS2DHInfo lis2DHInfo = new Maxim.CustomControls.LIS2DHInfo();
00607             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00608             controller.SetRegisterInfo(lis2DHInfo);
00609             controller.SetInterface(rpcClient);
00610             rvLIS2HD.SetController(controller);
00611             //rvLIS2HD.ReadAll();
00612             rvLIS2HD.DisplayRegisters();
00613             rvLIS2HD.DeviceName = "LIS2DH";
00614 
00615 
00616             //registerInfoData[0] = lis2DHInfo.Info;
00617         }
00618 
00619         private void rvMAX30101Init()
00620         {
00621             Maxim.CustomControls.MAX30101Info max30101Info = new Maxim.CustomControls.MAX30101Info();
00622             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00623             controller.SetRegisterInfo(max30101Info);
00624             controller.SetInterface(rpcClient);
00625             rvMAX30101.SetController(controller);
00626             //rvMAX30101.ReadAll();
00627             rvMAX30101.DisplayRegisters();
00628             rvMAX30101.DeviceName = "MAX30101";
00629 
00630 
00631             //registerInfoData[1] = max30101Info.Info;
00632         }
00633 
00634         private void rvMAX30205Init()
00635         {
00636             Maxim.CustomControls.MAX30205Info max30205Info = new Maxim.CustomControls.MAX30205Info(0x92);
00637             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00638             controller.SetRegisterInfo(max30205Info);
00639             controller.SetInterface(rpcClient);
00640             rvMAX30205.SetController(controller);
00641             //rvMAX30205.ReadAll();
00642             rvMAX30205.DisplayRegisters();
00643             rvMAX30205.DeviceName = "MAX30205 (Top)";
00644 
00645 
00646             //registerInfoData[2] = max30205Info.Info;
00647         }
00648 
00649         private void rvMAX30205_U18Init()
00650         {
00651             Maxim.CustomControls.MAX30205Info max30205Info = new Maxim.CustomControls.MAX30205Info();
00652             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00653             controller.SetRegisterInfo(max30205Info);
00654             controller.SetInterface(rpcClient);
00655             rvMAX30205_U18.SetController(controller);
00656             //rvMAX30205_U18.ReadAll();
00657             rvMAX30205_U18.DisplayRegisters();
00658             rvMAX30205_U18.DeviceName = "MAX30205 (Bottom)";
00659 
00660 
00661             //registerInfoData[3] = max30205Info.Info;
00662         }
00663 
00664         private void rvMAX30001Init()
00665         {
00666             Maxim.CustomControls.MAX30001Info max30001Info = new Maxim.CustomControls.MAX30001Info();
00667             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00668             controller.SetRegisterInfo(max30001Info);
00669             controller.SetInterface(rpcClient);
00670             rvMAX30001.SetController(controller);
00671             //rvMAX30001.ReadAll();
00672             rvMAX30001.DisplayRegisters();
00673             rvMAX30001.DeviceName = "MAX30001";
00674 
00675 
00676             //registerInfoData[4] = max30001Info.Info;
00677         }
00678 
00679         private void rvMAX30003Init()
00680         {
00681             Maxim.CustomControls.MAX30003Info max30003Info = new Maxim.CustomControls.MAX30003Info();
00682             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00683             controller.SetRegisterInfo(max30003Info);
00684             controller.SetInterface(rpcClient);
00685             rvMAX30001.SetController(controller);
00686             //rvMAX30001.ReadAll();
00687             rvMAX30001.DisplayRegisters();
00688             rvMAX30001.DeviceName = "MAX30003";
00689         }
00690 
00691         private void rvMAX14720Init()
00692         {
00693             Maxim.CustomControls.MAX14720Info max14720Info = new Maxim.CustomControls.MAX14720Info();
00694             Maxim.CustomControls.DeviceController controller = new Maxim.CustomControls.DeviceController();
00695             controller.SetRegisterInfo(max14720Info);
00696             controller.SetInterface(rpcClient);
00697             rvMAX14720.SetController(controller);
00698             //rvMAX14720.ReadAll();
00699             rvMAX14720.DisplayRegisters();
00700             rvMAX14720.DeviceName = "MAX14720";
00701 
00702             //registerInfoData[5] = max14720Info.Info;
00703         }
00704 
00705         private void partIDInit()
00706         {
00707             //rvMAX30001.Clear();
00708             tabPageEnable(null, false);
00709             switch (max30001Model.PartID)
00710             {
00711                 case Model.MAX30001Model.Part.MAX30003:
00712                     // General GUI
00713                     bioZMilliohmScaleToolStripMenuItem.Enabled = false;
00714                     registerNamesToolStripMenuItem.Text = "Show MAX30003 Register Names";
00715                     paceFileLogToolStripMenuItem.Enabled = false;
00716                     bioZFileLogToolStripMenuItem.Enabled = false;
00717 
00718                     // Block Diagram
00719                     picBlockDiagram.Image = global::HealthSensorPlatform.Properties.Resources.system_block_diagram_max30003;
00720                     linkBioZChannel.Visible = false;
00721                     linkBioZMux.Visible = false;
00722                     linkBioZLoad.Visible = false;
00723                     linkPaceChannel.Visible = false;
00724                     linkLabelQuickBioimpedance.Visible = false;
00725                     linkLabelQuickRespiration.Visible = false;
00726 
00727                     // Global Panel
00728                     chkEnBioZ.Enabled = false;
00729                     chkEnPace.Enabled = false;
00730                     grpGlobalControls.Text = "MAX30003 Global Controls";
00731 
00732                     // Tabs - not working 
00733                     tabPageEnable(null, true);
00734 
00735                     // Plots
00736                     ecgView1.BioZFunction(false);
00737 
00738                     // Data Logging Tab
00739                     dataLoggingView1.PaceFunction(false);
00740                     dataLoggingView1.BioZFunction(false);
00741 
00742                     //Register Tabs
00743                     for(int i = 0; i < cboRegisterTabDevice.Items.Count; i++)
00744                     {
00745                         if ((string)cboRegisterTabDevice.Items[i] == "MAX30001")
00746                         {
00747                             cboRegisterTabDevice.Items[i] = "MAX30003";
00748                         }
00749 
00750                     }
00751                     rvMAX30003Init();
00752 
00753                     break;
00754                 case Model.MAX30001Model.Part.MAX30001:
00755                     // Defaults
00756                     // General GUI
00757                     bioZMilliohmScaleToolStripMenuItem.Enabled = true;
00758                     registerNamesToolStripMenuItem.Text = "Show MAX30001 Register Names";
00759                     paceFileLogToolStripMenuItem.Enabled = true;
00760                     bioZFileLogToolStripMenuItem.Enabled = true;
00761 
00762                     // Block Diagram
00763                     picBlockDiagram.Image = global::HealthSensorPlatform.Properties.Resources.system_block_diagram;
00764                     linkBioZChannel.Visible = true;
00765                     linkBioZMux.Visible = true;
00766                     linkBioZLoad.Visible = true;
00767                     linkPaceChannel.Visible = true;
00768                     linkLabelQuickBioimpedance.Visible = true;
00769                     linkLabelQuickRespiration.Visible = true;
00770 
00771                     // Global Panel
00772                     grpGlobalControls.Text = "MAX30001 Global Controls";
00773                     chkEnBioZ.Enabled = true;
00774                     chkEnECG.Enabled = true;
00775                     chkEnPace.Enabled = true;
00776                     chkEnRtor.Enabled = true;
00777 
00778                     // Tabs - not working
00779                     tabPageEnable(null, true);
00780 
00781                     // Plots
00782                     ecgView1.BioZFunction(true);
00783 
00784                     // Data Logging Tab
00785                     dataLoggingView1.PaceFunction(true);
00786                     dataLoggingView1.BioZFunction(true);
00787 
00788                     //Register Tabs
00789                     for (int i = 0; i < cboRegisterTabDevice.Items.Count; i++)
00790                     {
00791                         if ((string)cboRegisterTabDevice.Items[i] == "MAX30003")
00792                         {
00793                             cboRegisterTabDevice.Items[i] = "MAX30001";
00794                         }
00795 
00796                     }
00797                     rvMAX30001Init();
00798                     break;
00799             }
00800         }
00801 
00802         private bool checkFlashID()
00803         {
00804             string reply;
00805 
00806             reply = rpcClient.RawRpcCall(readFlashIDCommand, true);
00807 
00808             return (reply.StartsWith("00010219"));
00809         }
00810 
00811         private void tabPageEnable(TabPage exception, bool enable)
00812         {
00813             if (enable)
00814             {
00815                 if (max30001Model.PartID == MAX30001Model.Part.MAX30003)
00816                 {
00817                     foreach (TabPage tp in maximTabControl1.TabPages)
00818                     {
00819                         if (!max30001TabPages.Contains(tp))
00820                             tp.Enabled = true;
00821                     }
00822                 }
00823                 else
00824                 {
00825                     foreach (TabPage tp in maximTabControl1.TabPages)
00826                     {
00827                         tp.Enabled = true;
00828                     }
00829                 }
00830             }
00831             else
00832             {
00833                 foreach (TabPage tp in maximTabControl1.TabPages)
00834                 {
00835                     if (tp != exception)
00836                         tp.Enabled = false;
00837                 }
00838             }
00839 
00840             maximTabControl1.Invalidate();
00841         }
00842 
00843         private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
00844         {
00845             splashScreen = new SplashScreen(120);
00846             InitSplashScreen();
00847             splashScreen.Show();
00848             splashScreen.ShowOKButton();
00849         }
00850 
00851         private void exitToolStripMenuItem_Click(object sender, EventArgs e)
00852         {
00853             Application.Exit();
00854         }
00855 
00856         private void maximTabControl1_SelectedIndexChanged(object sender, EventArgs e)
00857         {
00858 
00859             temperatureView1.TimerState(false);
00860             //ecgView1.Stream = false; // Disconnect plotting event for flash log data loading
00861 
00862             if (maximTabControl1.SelectedTab == tpBlockDiagram)
00863             {
00864                 updateBlockDiagramLayout();
00865             }
00866             else if (maximTabControl1.SelectedTab == tpTemperature)
00867             {
00868                 if (connected)
00869                 {
00870                     // TODO
00871                     /*
00872                     temperatureView1.TimerState(true);
00873                     temperatureView1.UpdateRegisters();
00874                     temperatureView1.ReadTemperature();
00875                     */
00876                     temperatureView1.TimerState(true);
00877                     temperaturePresenter.OnReadAll(this, new EventArgs());
00878                 }
00879             }
00880             else if (maximTabControl1.SelectedTab == tpMAX30001EcgChannel)
00881             {
00882                 if (connected)
00883                 { 
00884                     ECGChannelUpdateRegisters(); // and R to R
00885                     ECGGlobalUpdateRegisters();
00886                 }
00887 
00888                 pnlMAX30001Global.Parent = tpMAX30001EcgChannel;
00889             }
00890             else if (maximTabControl1.SelectedTab == tpMAX30001InputMux)
00891             {
00892                 if (connected)
00893                 {
00894                     ECGInputMuxUpdateRegisters();
00895                     ECGGlobalUpdateRegisters();
00896                 }
00897 
00898                 pnlMAX30001Global.Parent = tpMAX30001InputMux;
00899             }
00900             else if (maximTabControl1.SelectedTab == tpMAX30001Plots)
00901             {
00902                 pnlMAX30001Global.Parent = tpMAX30001Plots;
00903                 //ecgView1.Stream = true;
00904                 //pnlMAX30001Global.BringToFront();
00905                 if (connected)
00906                 {
00907                     ECGGlobalUpdateRegisters();
00908                 }
00909             }
00910             else if (maximTabControl1.SelectedTab == tpBioZChannel)
00911             {
00912                 if (connected)
00913                 {
00914                     BioZChannelUpdateRegisters();
00915                     ECGGlobalUpdateRegisters();
00916                 }
00917                 pnlMAX30001Global.Parent = tpBioZChannel;
00918             }
00919             else if (maximTabControl1.SelectedTab == tpMAX30001BioZInputMux)
00920             {
00921                 if (connected)
00922                 {
00923                     BioZInputMuxUpdateRegisters();
00924                     ECGGlobalUpdateRegisters();
00925                 }
00926                 pnlMAX30001Global.Parent = tpMAX30001BioZInputMux;
00927             }
00928             else if (maximTabControl1.SelectedTab == tpMAX30001BioZLoad)
00929             {
00930                 if (connected)
00931                 {
00932                     BioZLoadUpdateRegisters();
00933                     ECGGlobalUpdateRegisters();
00934                 }
00935                 UpdateBioZLoadSwitches(); 
00936                 pnlMAX30001Global.Parent = tpMAX30001BioZLoad;
00937             }
00938             else if (maximTabControl1.SelectedTab == tpMAX30001Pace)
00939             {
00940                 if (connected)
00941                 {
00942                     PaceChannelUpdateRegisters();
00943                     ECGGlobalUpdateRegisters();
00944                 }
00945                 pnlMAX30001Global.Parent = tpMAX30001Pace;
00946             }
00947             else if (maximTabControl1.SelectedTab == tpFlashLog)
00948             {
00949                 if (connected)
00950                 {
00951                     dataLoggingView1.UpdateArgs();
00952                 }
00953             }
00954             else if (maximTabControl1.SelectedTab == tpRegisters)
00955             {
00956                 if (connected)
00957                 {
00958                     ((Maxim.CustomControls.RegisterView)registerViewDict[(string)(cboRegisterTabDevice.SelectedItem)]).ReadAll(); 
00959                 }
00960             }
00961 
00962             if (maximTabControl1.SelectedTab != null) // Support dynamic adding/removing of tabs
00963                 pnlMAX30001Global.Location = new Point(0, maximTabControl1.SelectedTab.Size.Height - pnlMAX30001Global.Size.Height);
00964 
00965             ss_Status.MessagesLabel.Text = ""; // Clear any message from previous tabs
00966         }
00967 
00968         /// <summary>
00969         /// Read all registers, used for first connect
00970         /// </summary>
00971         public void UpdateRegisters()
00972         {
00973             ECGChannelUpdateRegisters();
00974             ECGInputMuxUpdateRegisters();
00975             ECGGlobalUpdateRegisters();
00976             BioZChannelUpdateRegisters();
00977             BioZInputMuxUpdateRegisters();
00978             BioZLoadUpdateRegisters();
00979             PaceChannelUpdateRegisters();
00980 
00981             //rvLIS2HD.ReadAll();
00982             //rvMAX14720.ReadAll();
00983             //rvMAX30001.ReadAll();
00984             //rvMAX30101.ReadAll();
00985             //rvMAX30205.ReadAll();
00986             //rvMAX30205_U18.ReadAll();
00987         }
00988 
00989         #region Temperature Tab
00990         private void TemperatureViewInit()
00991         {
00992             MAX30205Model max30205_1 = new MAX30205Model(rpcClient.I2cDevice, 0x92);
00993             MAX30205Model max30205_2 = new MAX30205Model(rpcClient.I2cDevice, 0x90);
00994 
00995             temperaturePresenter = new MAX30205EVKit.Presenter.TemperaturePresenter(new MAX30205Model[] { max30205_1, max30205_2 }, temperatureView1, temperatureView1);
00996             //temperatureView1.max30205_1 = max30205;
00997             //temperatureView1.i2cDevice = i2cDevice;
00998         }
00999         #endregion
01000 
01001         #region Register Tab
01002         private void RegistersTabInit()
01003         {
01004             pnlRegMAX30101.Visible = true;
01005             pnlRegMAX30101.Visible = false;
01006             pnlRegMAX30205.Visible = false;
01007             pnlRegMAX14720.Visible = false;
01008 
01009             rvLIS2HDInit();
01010             rvMAX30001Init();
01011             rvMAX30101Init();
01012             rvMAX30205Init();
01013             rvMAX30205_U18Init();
01014             rvMAX14720Init();
01015             registerViewDict.Add(rvLIS2HD.DeviceName, rvLIS2HD);
01016             registerViewDict.Add(rvMAX30001.DeviceName, rvMAX30001);
01017             registerViewDict.Add("MAX30003", rvMAX30001);
01018             registerViewDict.Add(rvMAX30101.DeviceName, rvMAX30101);
01019             registerViewDict.Add(rvMAX30205.DeviceName, rvMAX30205);
01020             registerViewDict.Add(rvMAX30205_U18.DeviceName, rvMAX30205_U18);
01021             registerViewDict.Add(rvMAX14720.DeviceName, rvMAX14720);
01022 
01023             cboRegisterTabDevice.Items.Clear();
01024             foreach (Maxim.CustomControls.RegisterView rv in registerViews)
01025                 cboRegisterTabDevice.Items.Add(rv.DeviceName);
01026 
01027             cboRegisterTabDevice.SelectedIndex = 0;
01028 
01029             // Update status message when write is complete. Clear status message when entering the register data cell
01030             foreach (Maxim.CustomControls.RegisterView rv in registerViews)
01031             {
01032                 rv.CellBeginEdit += new Maxim.CustomControls.RegisterView.CellBeginEditHandler(registerView_CellBeginEdit);
01033                 rv.RegisterWriteComplete += new Maxim.CustomControls.RegisterView.RegisterWriteCompleteHandler(registerView_WriteComplete);
01034             }
01035 
01036         }
01037 
01038         private void cboRegisterTabDevice_SelectedIndexChanged(object sender, EventArgs e)
01039         {
01040             MaximStyle.MaximComboBox cbo = (MaximStyle.MaximComboBox)sender;
01041 
01042             if (cbo.Text.CompareTo(rvMAX30001.DeviceName) == 0)
01043             {
01044                 pnlRegMAX30001.Visible = true;
01045                 pnlRegMAX30101.Visible = false;
01046                 pnlRegMAX30205.Visible = false;
01047                 pnlRegMAX30205_U18.Visible = false;
01048                 pnlRegLIS2HD.Visible = false;
01049                 pnlRegMAX14720.Visible = false;
01050                 rvMAX30001.ReadAll();
01051             }
01052             else if (cbo.Text.CompareTo(rvMAX30101.DeviceName) == 0)
01053             {
01054                 pnlRegMAX30001.Visible = false;
01055                 pnlRegMAX30101.Visible = true;
01056                 pnlRegMAX30205.Visible = false;
01057                 pnlRegMAX30205_U18.Visible = false;
01058                 pnlRegLIS2HD.Visible = false;
01059                 pnlRegMAX14720.Visible = false;
01060                 rvMAX30101.ReadAll();
01061             }
01062             else if (cbo.Text.CompareTo(rvMAX30205.DeviceName) == 0)
01063             {
01064                 pnlRegMAX30001.Visible = false;
01065                 pnlRegMAX30101.Visible = false;
01066                 pnlRegMAX30205.Visible = true;
01067                 pnlRegMAX30205_U18.Visible = false;
01068                 pnlRegLIS2HD.Visible = false;
01069                 pnlRegMAX14720.Visible = false;
01070                 rvMAX30205.ReadAll();
01071             }
01072             else if (cbo.Text.CompareTo(rvMAX30205_U18.DeviceName) == 0)
01073             {
01074                 pnlRegMAX30001.Visible = false;
01075                 pnlRegMAX30101.Visible = false;
01076                 pnlRegMAX30205.Visible = true;
01077                 pnlRegMAX30205_U18.Visible = true;
01078                 pnlRegLIS2HD.Visible = false;
01079                 pnlRegMAX14720.Visible = false;
01080                 rvMAX30205_U18.ReadAll();
01081             }
01082             else if (cbo.Text.CompareTo(rvLIS2HD.DeviceName) == 0)
01083             {
01084                 pnlRegMAX30001.Visible = false;
01085                 pnlRegMAX30101.Visible = false;
01086                 pnlRegMAX30205.Visible = false;
01087                 pnlRegMAX30205_U18.Visible = false;
01088                 pnlRegLIS2HD.Visible = true;
01089                 pnlRegMAX14720.Visible = false;
01090                 rvLIS2HD.ReadAll();
01091             }
01092             else if (cbo.Text.CompareTo(rvMAX14720.DeviceName) == 0)
01093             {
01094                 pnlRegMAX30001.Visible = false;
01095                 pnlRegMAX30101.Visible = false;
01096                 pnlRegMAX30205.Visible = false;
01097                 pnlRegMAX30205_U18.Visible = false;
01098                 pnlRegLIS2HD.Visible = false;
01099                 pnlRegMAX14720.Visible = true;
01100                 rvMAX14720.ReadAll();
01101             }
01102         }
01103         #endregion
01104 
01105         #region Optical Tab
01106         private void opticalView_StreamingStartStop(object sender, StreamingStartStopEventArgs e)
01107         {
01108             /* Disable user selection to Tabs when Streaming is enabled */
01109             streaming = e.state;
01110             if (e.state == true)
01111             {
01112                 tabPageEnable(tpOpticalSensor, false);
01113             }
01114             else
01115             {
01116                 tabPageEnable(tpOpticalSensor, true);
01117             }
01118             maximTabControl1.Invalidate(); // Redraw the tabs
01119         }
01120         #endregion
01121 
01122         #region Block Diagrams
01123         private void BlockDiagramsInit()
01124         {
01125             initalizeECGConfigFields(); 
01126             initalizeECGInputMuxFields();
01127             initalizeRToRFields();
01128             initalizeECGGlobalControls();
01129             initalizeBioZConfigFields();
01130             initalizeBioZInputMuxFields();
01131             initalizeBioZLoadFields();
01132             initalizePaceChannelFields();
01133 
01134             // Set ECG Gain setting for chart Y-scale purposes
01135             cboChannelGain.SelectedIndexChanged += new EventHandler(cboChannelGain_SelectedIndexChanged);
01136 
01137             //cboECGChannelEnable.SelectedIndex = 0; // Default is disabled
01138 
01139             initalizeToolTipEvents(ecgChannelField);
01140             initalizeToolTipEvents(rToRField);
01141             initalizeToolTipEvents(ecgInputMuxField);
01142             initalizeToolTipEvents(ecgGlobalField);
01143             initalizeToolTipEvents(bioZChannelField);
01144             initalizeToolTipEvents(bioZInputMuxField);
01145             initalizeToolTipEvents(bioZLoadField);
01146             initalizeToolTipEvents(paceChannelField);
01147 
01148             // Force panel load for location placement in case of window resize
01149             // on a tab where the panel is not shown otherwise it will show in a strange location
01150             pnlMAX30001Global.Parent = tpMAX30001EcgChannel;
01151         }
01152 
01153         #endregion
01154 
01155         #region Streaming
01156         private void ecgView_StreamingStartStop(object sender, StreamingStartStopEventArgs e)
01157         {
01158             streaming = e.state;
01159             /* Disable user selection to Tabs when Streaming is enabled */
01160             if (e.state == true)
01161             {
01162                 tabPageEnable(tpMAX30001Plots, false);
01163 
01164                 grpChannelPlotEnable.Enabled = false;
01165                 grpGlobalControls.Enabled = false;
01166                 menuStrip1.Enabled = false;
01167             }
01168             else
01169             {
01170                 if (connected)
01171                 {
01172                     // Rewrite enable bits for global controls to allow GUI to maintain consistent state
01173                     foreach (RegisterField field in channelEnableField)
01174                     {
01175                         MaximCheckBox chk = (MaximStyle.MaximCheckBox)field.Control;
01176 
01177                         if (chk.Checked)
01178                             writeCheckBox(chk);
01179                     }
01180 
01181                     if (cboEnRbias.SelectedIndex != 0)
01182                         writeComboBox(cboEnRbias);
01183                     else if (cboBioZEnRbias.SelectedIndex != 0)
01184                         writeComboBox(cboBioZEnRbias);
01185 
01186                     if (cboEnDcloff.SelectedIndex != 0)
01187                         writeComboBox(cboEnDcloff);
01188                     else if (cboBioZEnDcloff.SelectedIndex != 0)
01189                         writeComboBox(cboBioZEnDcloff);
01190 
01191                     if (cboBioZDigitalLeadOffDetectionEnable.SelectedIndex != 0)
01192                         writeComboBox(cboBioZDigitalLeadOffDetectionEnable);
01193 
01194                     if (cboEmuxEnUlpLon.SelectedIndex != 0)
01195                         writeComboBox(cboEmuxEnUlpLon);
01196                     else if (cboBmuxEnUlpLon.SelectedIndex != 0)
01197                         writeComboBox(cboBmuxEnUlpLon);
01198 
01199                 }
01200                 
01201                 tabPageEnable(tpMAX30001Plots, true);
01202 
01203                 grpChannelPlotEnable.Enabled = true;
01204                 grpGlobalControls.Enabled = true;
01205                 menuStrip1.Enabled = true;
01206             }
01207 
01208             maximTabControl1.Invalidate(); // Redraw the tabs
01209         }
01210         #endregion
01211 
01212         #region Data Logging
01213         // When Data Logging reads the flash, update the values on the other tabs to match what is in the flash
01214         // The data logging tab will generate an event and run this method
01215         private void dataLoggingFlashReadEventHandler(object sender, EventArgs e)
01216         {
01217             DataLoggingView dlView = (DataLoggingView)sender;
01218 
01219             if (dlView.EnableOpticalHR)
01220             {
01221                 opticalView1.SetHRModeArgs(dlView.HRModeArgs);
01222             }
01223             else if (dlView.EnableOpticalSpO2)
01224             {
01225                 opticalView1.SetSpO2HRModeArgs(dlView.SpO2HRModeArgs);
01226             }
01227             else if (dlView.EnableOpticalMulti)
01228             {
01229                 opticalView1.SetMultiModeArgs(dlView.MultiModeArgs);
01230             }
01231 
01232             if (dlView.EnableEcg)
01233             {
01234                 setEcgArgs(dlView.EcgArgs);
01235             }
01236 
01237             if (dlView.EnableBioz)
01238             {
01239                 setBioZArgs(dlView.BioZArgs);
01240             }
01241 
01242             if (dlView.EnableRToR)
01243             {
01244                 setRToRArgs(dlView.RToRArgs);
01245             }
01246 
01247             if (dlView.EnablePace)
01248             {
01249                 setPaceArgs(dlView.PaceArgs);
01250             }
01251         }
01252         #endregion
01253 
01254         private void connectionToolStripMenuItem_Click(object sender, EventArgs e)
01255         {
01256             if (connectionToolStripMenuItem.Checked)
01257             {
01258                 connectionToolStripMenuItem.Checked = true;
01259                 return;
01260             }
01261 
01262             if (!connected)
01263             {
01264                 comPortConnect();
01265             }
01266         }
01267 
01268         private void disconnectToolStripMenuItem_Click(object sender, EventArgs e)
01269         {
01270             if (disconnectToolStripMenuItem.Checked)
01271             {
01272                 disconnectToolStripMenuItem.Checked = true;
01273                 return;
01274             }
01275 
01276             if (connected)
01277             {
01278                 guiDisconnected();
01279                 rpcClient.Disconnect();
01280             }
01281         }
01282 
01283         /// <summary>
01284         /// Stop streaming before exiting HSP
01285         /// </summary>
01286         /// <param name="sender"></param>
01287         /// <param name="e"></param>
01288         private void HspForm_FormClosing(object sender, FormClosingEventArgs e)
01289         {
01290             try
01291             {
01292                 if (connected)
01293                 {
01294                     opticalView1.Close(); // Stop streaming
01295                     ecgView1.Close();
01296                 }
01297             }
01298             catch (Exception)
01299             {
01300                 // We are exiting the GUI, we can ignore all exceptions
01301                 // Adding this for the case where the user unplugs HSP and quickly tries to close
01302                 // before the operating system reports USB removed
01303                 // Occurs while streaming ECG because we re-write the interrupt registers on stream stop
01304                 return;
01305             }
01306         }
01307 
01308         private void linkLabel1_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01309         {
01310             maximTabControl1.SelectedTab = tpMAX30001InputMux;
01311         }
01312 
01313         private void linkLabel2_Click(object sender, EventArgs e)
01314         {
01315             maximTabControl1.SelectedTab = tpMAX30001BioZInputMux;
01316         }
01317 
01318         private void linkLabelBioZLoad_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01319         {
01320             maximTabControl1.SelectedTab = tpMAX30001BioZLoad;
01321         }
01322 
01323         private void linkLabelQuickOpticalSpO2_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01324         {
01325             if (connected)
01326             {
01327                 opticalView1.OpticalSensorDefaults();
01328                 maximTabControl1.SelectedTab = tpOpticalSensor;
01329             }
01330         }
01331 
01332         private void linkLabelQuickTemperature_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01333         {
01334             if (connected)
01335             {
01336                 temperaturePresenter.WriteRegister(0, 1, 0);
01337                 temperaturePresenter.WriteRegister(1, 1, 0);
01338                 maximTabControl1.SelectedTab = tpTemperature;
01339             }
01340         }
01341 
01342         private void linkLabelQuickEcg_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01343         {
01344             if (connected)
01345             {
01346                 // SW_RST
01347                 max30001Model.Write(0x08, 1);
01348                 max30001Model.Write(0x08, 0);
01349                 // CNFG_GEN
01350                 max30001Model.Write(0x10, 0x080017);
01351                 // CNFG_EMUX
01352                 max30001Model.Write(0x14, 0x000000);
01353                 // CNFG_RTOR1
01354                 max30001Model.Write(0x1d, 0x3FA300);
01355 
01356                 ECGChannelUpdateRegisters();
01357                 ECGInputMuxUpdateRegisters();
01358 
01359                 maximTabControl1.SelectedTab = tpMAX30001Plots;
01360             }
01361         }
01362 
01363         private void linkLabelQuickBioimpedance_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01364         {
01365             if (connected)
01366             {
01367                 // SW_RST
01368                 max30001Model.Write(0x08, 1);
01369                 max30001Model.Write(0x08, 0);
01370                 // CNFG_GEN
01371                 max30001Model.Write(0x10, 0x040027);
01372                 // CNFG_BMUX
01373                 max30001Model.Write(0x17, 0x000040);
01374                 // CNFG_BIOZ
01375                 max30001Model.Write(0x18, 0x601430);
01376 
01377                 ECGChannelUpdateRegisters();
01378                 ECGInputMuxUpdateRegisters();
01379                 BioZChannelUpdateRegisters();
01380                 BioZInputMuxUpdateRegisters();
01381 
01382                 bioZMilliohmScaleToolStripMenuItem.Checked = false;
01383                 ecgView1.BioZMilliOhmRange = false;
01384 
01385                 maximTabControl1.SelectedTab = tpMAX30001Plots;
01386             }
01387         }
01388 
01389         private void linkLabelQuickRespiration_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01390         {
01391             if (connected)
01392             {
01393                 // SW_RST
01394                 max30001Model.Write(0x08, 1);
01395                 max30001Model.Write(0x08, 0);
01396                 // CNFG_GEN
01397                 max30001Model.Write(0x10, 0x040027);
01398                 // CNFG_BMUX
01399                 max30001Model.Write(0x17, 0x000040);
01400                 // CNFG_BIOZ
01401                 max30001Model.Write(0x18, 0x201050);
01402 
01403                 ECGChannelUpdateRegisters();
01404                 ECGInputMuxUpdateRegisters();
01405                 BioZChannelUpdateRegisters();
01406                 BioZInputMuxUpdateRegisters();
01407 
01408                 bioZMilliohmScaleToolStripMenuItem.Checked = true;
01409                 ecgView1.BioZMilliOhmRange = true;
01410 
01411                 maximTabControl1.SelectedTab = tpMAX30001Plots;
01412             }
01413         }
01414 
01415         private void btnSwRst_Click(object sender, EventArgs e)
01416         {
01417             if (!connected)
01418                 return;
01419 
01420             max30001.WriteReg(0x08, 0x01);
01421             max30001.WriteReg(0x08, 0x00);
01422 
01423             UpdateRegisters();
01424         }
01425 
01426         private void btnSynch_Click(object sender, EventArgs e)
01427         {
01428             if (!connected)
01429                 return;
01430 
01431             max30001.WriteReg(0x09, 0x01);
01432             max30001.WriteReg(0x09, 0x00);
01433         }
01434 
01435         private void btnFifoRst_Click(object sender, EventArgs e)
01436         {
01437             if (!connected)
01438                 return;
01439 
01440             max30001.WriteReg(0x0A, 0x01);
01441             max30001.WriteReg(0x0A, 0x00);
01442         }
01443 
01444         private void registerNamesToolStripMenuItem_Click(object sender, EventArgs e)
01445         {
01446             List<RegisterField>[] fields = new List<RegisterField>[]{ ecgChannelField, ecgInputMuxField, ecgGlobalField, rToRField,  bioZChannelField, bioZInputMuxField, bioZLoadField, paceChannelField };
01447             ToolStripMenuItem tsi = (ToolStripMenuItem)sender;
01448 
01449             if (tsi.Checked == true)
01450             {
01451                 // Combo Boxes
01452                 foreach (List<RegisterField> listRegisterField in fields)
01453                 {
01454                     foreach(RegisterField rf in listRegisterField)
01455                     {
01456                         if (rf.Label != null)
01457                             rf.Label.Text = rf.Name;
01458                     }
01459                 }
01460 
01461                 // Check Boxes
01462                 foreach (RegisterField rf in channelEnableField)
01463                 {
01464                     rf.LabelDescription = rf.Control.Text;
01465                     rf.Control.Text = rf.Name;
01466                 }
01467 
01468                 string calHighRegName = "CAL_THIGH";
01469                 cboCalFifty.Items[0] = calHighRegName;
01470                 cboBioZCalFifty.Items[0] = calHighRegName;
01471                 if (cboCalFifty.SelectedIndex == 0)
01472                 {
01473                     cboCalFifty.SelectedIndex = ecgCalFiftyField.ReadField();
01474                     cboBioZCalFifty.SelectedIndex = biozCalFiftyField.ReadField();
01475                 }
01476 
01477             }
01478             else
01479             {
01480                 // Combo Boxes
01481                 foreach (List<RegisterField> listRegisterField in fields)
01482                 {
01483                     foreach (RegisterField rf in listRegisterField)
01484                     {
01485                         if (rf.Label != null)
01486                             rf.Label.Text = rf.LabelDescription;
01487                     }
01488                 }
01489                 
01490                 // Check Boxes
01491                 foreach (RegisterField rf in channelEnableField)
01492                 {
01493                     rf.Control.Text = rf.LabelDescription;
01494                 }
01495 
01496                 string calHighRegName = "Time High";
01497                 cboCalFifty.Items[0] = calHighRegName;
01498                 cboBioZCalFifty.Items[0] = calHighRegName;
01499                 if (cboCalFifty.SelectedIndex == 0)
01500                 {
01501                     cboCalFifty.SelectedIndex = ecgCalFiftyField.ReadField();
01502                     cboBioZCalFifty.SelectedIndex = biozCalFiftyField.ReadField();
01503                 }
01504             }
01505         }
01506 
01507         /// <summary>
01508         /// Prevent tab changes while streaming
01509         /// </summary>
01510         /// <param name="sender"></param>
01511         /// <param name="e"></param>
01512         private void maximTabControl1_Selecting(object sender, TabControlCancelEventArgs e)
01513         {
01514             if (streaming && connected)
01515                 e.Cancel = true;
01516         }
01517 
01518         private void showAdvancedTabToolStripMenuItem_Click(object sender, EventArgs e)
01519         {
01520             if (showAdvancedTabToolStripMenuItem.Checked)
01521             {
01522                 maximTabControl1.UnhideTab("tpPrimitives");
01523             }
01524             else
01525             {
01526                 maximTabControl1.HideTab("tpPrimitives");
01527             }
01528         }
01529 
01530         private void registerView_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e)
01531         {
01532             ss_Status.MessagesLabel.Text = "";
01533         }
01534 
01535         private void registerView_WriteComplete(object sender, Maxim.CustomControls.RegisterView.RegisterArgs e)
01536         {
01537             ss_Status.MessagesLabel.Text = "Write Reg " + e.Register.ToString("X2") + "h Complete";
01538         }
01539 
01540         private void bioZMilliohmScaleToolStripMenuItem_Click(object sender, EventArgs e)
01541         {
01542             // Set the BioZ chart to be in units of milliohms or ohms
01543             ecgView1.BioZMilliOhmRange = bioZMilliohmScaleToolStripMenuItem.Checked;
01544         }
01545 
01546         public void LogFileItem(StreamType stream, bool state)
01547         {
01548             switch(stream)
01549             {
01550                 case StreamType.Ecg:
01551                     eCGFileLogToolStripMenuItem.Checked = state;
01552                     break;
01553                 case StreamType.RToR:
01554                     rToRFileLogToolStripMenuItem.Checked = state;
01555                     break;
01556                 case StreamType.Pace:
01557                     paceFileLogToolStripMenuItem.Checked = state;
01558                     break;
01559                 case StreamType.BioZ:
01560                     bioZFileLogToolStripMenuItem.Checked = state;
01561                     break;
01562                 case StreamType.Optical:
01563                     opticalAccelerometerFileLogToolStripMenuItem.Checked = state;
01564                     break;
01565                 
01566                 // TODO other stream types
01567             }
01568         }
01569 
01570         public void OpticalLogFileItem(bool state)
01571         {
01572             opticalAccelerometerFileLogToolStripMenuItem.Checked = state;
01573         }
01574 
01575         public void EcgLogFileItem(bool state)
01576         {
01577             eCGFileLogToolStripMenuItem.Checked = state;
01578         }
01579 
01580         public void BioZLogFileItem(bool state)
01581         {
01582             bioZFileLogToolStripMenuItem.Checked = state;
01583         }
01584 
01585         public void RtoRLogFileItem(bool state)
01586         {
01587             rToRFileLogToolStripMenuItem.Checked = state;
01588         }
01589 
01590         public void PaceLogFileItem(bool state)
01591         {
01592             paceFileLogToolStripMenuItem.Checked = state;
01593         }
01594 
01595         private void eCGBioZFileLogToolStripMenuItem_Click(object sender, EventArgs e)
01596         {
01597             if (FileLogEnable != null)
01598                 FileLogEnable(this, new EnableEventArgs(StreamType.Ecg, !eCGBioZFileLogToolStripMenuItem.Checked));
01599         }
01600 
01601         private void eCGFileLogToolStripMenuItem_Click(object sender, EventArgs e)
01602         {
01603             if (FileLogEnable != null)
01604                 FileLogEnable(this, new EnableEventArgs(StreamType.Ecg, !eCGFileLogToolStripMenuItem.Checked));
01605         }
01606 
01607         private void rToRFileLogToolStripMenuItem_Click(object sender, EventArgs e)
01608         {
01609             if (FileLogEnable != null)
01610                 FileLogEnable(this, new EnableEventArgs(StreamType.RToR, !rToRFileLogToolStripMenuItem.Checked));
01611         }
01612 
01613         private void paceFileLogToolStripMenuItem_Click(object sender, EventArgs e)
01614         {
01615             if (FileLogEnable != null)
01616                 FileLogEnable(this, new EnableEventArgs(StreamType.Pace, !paceFileLogToolStripMenuItem.Checked));
01617         }
01618 
01619         private void bioZFileLogToolStripMenuItem_Click(object sender, EventArgs e)
01620         {
01621             if (FileLogEnable != null)
01622                 FileLogEnable(this, new EnableEventArgs(StreamType.BioZ, !bioZFileLogToolStripMenuItem.Checked));
01623         }
01624 
01625         private void opticalAccelerometerFileLogToolStripMenuItem_Click(object sender, EventArgs e)
01626         {
01627             if (OpticalFileLogEnable != null)
01628                 OpticalFileLogEnable(this, new EnableEventArgs(StreamType.Optical,!opticalAccelerometerFileLogToolStripMenuItem.Checked));
01629         }
01630 
01631         private void registerExportToolStripMenuItem_Click(object sender, EventArgs e)
01632         {
01633             if (RegisterExport != null)
01634                 RegisterExport(this, e);
01635         }
01636 
01637         private void loadAllRegisterSettingsToolStripMenuItem_Click(object sender, EventArgs e)
01638         {
01639             if (RegisterImport != null)
01640                 RegisterImport(this, e);
01641         }
01642 
01643 
01644         #region Home Tab
01645         private void linkTempSensor_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01646         {
01647             maximTabControl1.SelectedTab = tpTemperature;
01648         }
01649 
01650         private void linkOpticalSensor_Click(object sender, LinkLabelLinkClickedEventArgs e)
01651         {
01652             maximTabControl1.SelectedTab = tpOpticalSensor;
01653         }
01654 
01655         private void linkEcgChannel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01656         {
01657             maximTabControl1.SelectedTab = tpMAX30001EcgChannel;
01658         }
01659 
01660         private void linkEcgMux_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01661         {
01662             maximTabControl1.SelectedTab = tpMAX30001InputMux;
01663         }
01664 
01665         private void linkPaceChannel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01666         {
01667             maximTabControl1.SelectedTab = tpMAX30001Pace;
01668         }
01669 
01670         private void linkBioZChannel_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01671         {
01672             maximTabControl1.SelectedTab = tpBioZChannel;
01673         }
01674 
01675         private void linkBioZMux_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01676         {
01677             maximTabControl1.SelectedTab = tpMAX30001BioZInputMux;
01678         }
01679 
01680         private void linkBioZLoad_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
01681         {
01682             maximTabControl1.SelectedTab = tpMAX30001BioZLoad;
01683         } 
01684         #endregion
01685 
01686         private void updateBlockDiagramLayout()
01687         {
01688             //Stopwatch stopWatch = new Stopwatch();
01689             double scale;
01690             int scaledWidth, scaledHeight;
01691             int widthOffset;
01692             int blockWidth = pnlBlockDiagram.Width;
01693             int blockHeight = pnlBlockDiagram.Height;
01694 
01695             int height = maximTabControl1.TabPages[0].Height;
01696             int width = maximTabControl1.TabPages[0].Width;
01697 
01698             //stopWatch.Start();
01699 
01700             if (height < width)
01701             {
01702                 scale = (double)height / blockHeight;
01703             }
01704             else
01705             {
01706                 scale = (double)width / blockWidth;
01707             }
01708 
01709             scaledWidth = (int)(scale * blockWidth + 0.5);
01710             scaledHeight = (int)(scale * blockHeight + 0.5);
01711             widthOffset = (int)((width - scaledWidth + 0.5) / 2.0);
01712 
01713             pnlBlockDiagram.Width = scaledWidth;
01714             pnlBlockDiagram.Height = scaledHeight;
01715             pnlBlockDiagram.Location = new Point(widthOffset, 0);
01716 
01717             //System.Diagnostics.Debug.Print(" X: " + linkTempSensor.Location.X + " Y: " + linkTempSensor.Location.Y);
01718             scaleControlCenter(linkTempSensor, scale);
01719             scaleControlCenter(linkOpticalSensor, scale);
01720             scaleControlCenter(linkEcgChannel, scale);
01721             scaleControlCenter(linkEcgMux, scale);
01722             scaleControlCenter(linkBioZChannel, scale);
01723             scaleControlCenter(linkBioZMux, scale);
01724             scaleControlCenter(linkBioZLoad, scale);
01725             scaleControlCenter(linkPaceChannel, scale);
01726 
01727             // Quick Start Location
01728             tlbQuickStart.Location = new Point(pnlBlockDiagram.Location.X + pnlBlockDiagram.Size.Width + 5, pnlBlockDiagram.Location.Y + 50);
01729             //System.Diagnostics.Debug.Print("Scale: " + scale + " X: " + linkTempSensor.Location.X + " Y: " + linkTempSensor.Location.Y);
01730 
01731             if (maximTabControl1.SelectedTab.Name != "tpBlockDiagram")
01732             {
01733                 maximTabControl1.Refresh();
01734             }
01735 
01736             //stopWatch.Stop();
01737 
01738             //TimeSpan ts = stopWatch.Elapsed;
01739 
01740             //string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
01741             //System.Diagnostics.Debug.Print("Run time " + elapsedTime);
01742         }
01743 
01744         private void updateOT90DiagramLayout(Panel panel)
01745         {
01746             updateOT90DiagramLayout(panel, 0);
01747         }
01748 
01749         private void updateOT90DiagramLayout(Panel panel, int heightOffset)
01750         {
01751             Stopwatch stopWatch = new Stopwatch();
01752             double scale, scaleWidth, scaleHeight;
01753             int scaledWidth, scaledHeight;
01754             int widthOffset;
01755             int blockWidth = panel.Width;
01756             int blockHeight = panel.Height;
01757 
01758             int height = maximTabControl1.SelectedTab.Height - pnlMAX30001Global.Height - heightOffset;
01759             int width = maximTabControl1.SelectedTab.Width;
01760 
01761             stopWatch.Start();
01762 
01763             // Scale to the smaller dimension, the smaller side dominates the scaling factor
01764             scaleWidth = (double)(width - 40) / blockWidth;
01765             scaleHeight = (double)height / blockHeight;
01766             if (scaleWidth < scaleHeight)
01767                 scale = scaleWidth;
01768             else
01769                 scale = scaleHeight;
01770 
01771             scaledWidth = (int)(scale * blockWidth + 0.5);
01772             scaledHeight = (int)(scale * blockHeight + 0.5);
01773             widthOffset = (int)((width - scaledWidth + 0.5) / 2.0);
01774 
01775             panel.Width = scaledWidth;
01776             panel.Height = scaledHeight;
01777             panel.Location = new Point(widthOffset, 10);
01778 
01779             foreach (Control cntl in panel.Controls)
01780             {
01781                 scaleControl(cntl, scale);
01782             }
01783 
01784             //maximTabControl1.Refresh();
01785 
01786             stopWatch.Stop();
01787 
01788             TimeSpan ts = stopWatch.Elapsed;
01789 
01790             string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds / 10);
01791             System.Diagnostics.Debug.Print("Run time " + elapsedTime);
01792         }
01793 
01794         void scaleControl(Control c, double scale)
01795         {
01796             int x = c.Location.X;
01797             int y = c.Location.Y;
01798 
01799             double newX, newY;
01800 
01801             newX = ((x) * scale + 0.5);
01802             newY = ((y + c.Size.Height / 2) * scale + 0.5) - c.Size.Height / 2;
01803 
01804             c.Location = new Point((int)(newX), (int)(newY));
01805         }
01806 
01807         void scaleControlCenter(Control c, double scale)
01808         {
01809             int x = c.Location.X;
01810             int y = c.Location.Y;
01811 
01812             double newX, newY;
01813 
01814             newX = ((x + c.Size.Width / 2) * scale + 0.5) - c.Size.Width / 2;
01815             newY = ((y + c.Size.Height / 2) * scale + 0.5) - c.Size.Height / 2;
01816 
01817             c.Location = new Point((int)newX, (int)newY);
01818         }
01819 
01820         void scaleControlRight(Control c, double scale)
01821         {
01822             double AlignX = 590.0/636;
01823             int x = c.Location.X;
01824             int y = c.Location.Y;
01825 
01826             double newX, newY;
01827 
01828             newX = ((x + c.Size.Width) * scale + 0.5) - c.Size.Width;
01829             newY = ((y + c.Size.Height / 2) * scale + 0.5) - c.Size.Height / 2;
01830 
01831             c.Location = new Point((int)(AlignX * picBlockDiagram.Width - c.Size.Width), (int)(newY));
01832 
01833         }
01834 
01835         private void updateAllBlockDiagrams()
01836         {
01837             //this.SuspendLayout();
01838             updateBlockDiagramLayout();
01839             updateOT90DiagramLayout(pnlEcgChannel, grpRToR.Height + 20);
01840             updateOT90DiagramLayout(pnlEcgMux);
01841             updateOT90DiagramLayout(pnlBioZChannel);
01842             updateOT90DiagramLayout(pnlBioZMux);
01843             updateOT90DiagramLayout(pnlBioZLoad);
01844             updateOT90DiagramLayout(pnlPace);
01845             //this.ResumeLayout();
01846         }
01847 
01848         private void HspForm_ResizeEnd(object sender, EventArgs e)
01849         {
01850             updateAllBlockDiagrams();
01851         }
01852 
01853         protected override void WndProc(ref Message m)
01854         {
01855             if (m.Msg == /*WM_SIZE*/ 0x0005)
01856             {
01857                 if (this.WindowState == FormWindowState.Maximized || this.WindowState == FormWindowState.Normal)
01858                 {
01859                     updateAllBlockDiagrams();
01860                 }
01861             }
01862 
01863             base.WndProc(ref m);
01864         }
01865 
01866         public class DebugTextWriter : StreamWriter
01867         {
01868             public DebugTextWriter()
01869                 : base(new DebugOutStream(), Encoding.Unicode, 1024)
01870             {
01871                 this.AutoFlush = true;
01872             }
01873 
01874             class DebugOutStream : Stream
01875             {
01876                 public override void Write(byte[] buffer, int offset, int count)
01877                 {
01878                     Debug.Write(Encoding.Unicode.GetString(buffer, offset, count));
01879                 }
01880 
01881                 public override bool CanRead { get { return false; } }
01882                 public override bool CanSeek { get { return false; } }
01883                 public override bool CanWrite { get { return true; } }
01884                 public override void Flush() { Debug.Flush(); }
01885                 public override long Length { get { throw new InvalidOperationException(); } }
01886                 public override int Read(byte[] buffer, int offset, int count) { throw new InvalidOperationException(); }
01887                 public override long Seek(long offset, SeekOrigin origin) { throw new InvalidOperationException(); }
01888                 public override void SetLength(long value) { throw new InvalidOperationException(); }
01889                 public override long Position
01890                 {
01891                     get { throw new InvalidOperationException(); }
01892                     set { throw new InvalidOperationException(); }
01893                 }
01894             };
01895         }
01896 
01897         private void onlineDocumentationToolStripMenuItem_Click(object sender, EventArgs e)
01898         {
01899             Process.Start("http://www.maximintegrated.com/MAXREFDES100");
01900         }
01901     }
01902 }