using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Windows.Forms; using nsoftware.IPWorksBLE; using System.Diagnostics; using System.IO; using static System.Net.WebRequestMethods; namespace nsoftware.Demos { public class bleclientDemo : Form { private const int FLAG_BROADCAST = 0x00000001; private const int FLAG_READ = 0x00000002; private const int FLAG_WRITE_NO_RESPONSE = 0x00000004; private const int FLAG_WRITE = 0x00000008; private const int FLAG_NOTIFY = 0x00000010; private const int FLAG_INDICATE = 0x00000020; private const int FLAG_AUTH_SIGNED_WRITE = 0x00000040; private const int FLAG_RELIABLE_WRITE = 0x00000080; private const int FLAG_WRITABLE_AUXILIARIES = 0x00000100; private static readonly Color CHILD_SVC_COLOR = Color.DodgerBlue; private static readonly Color PARENT_SVC_COLOR = Color.Firebrick; internal const int TYPE_SERVER = 0; internal const int TYPE_SERVICE = 1; internal const int TYPE_CHARACTERISTIC = 2; internal const int TYPE_DESCRIPTOR = 3; #region Designer Variables /// /// Required designer variable. /// private IContainer components = null; private Label lblInstructions; private TabControl tabCtrlMain; private TabPage tabScanConnect; private Bleclient bleclient1; private TabPage tabLog; private CheckBox cbLogAdvertisements; private ComboBox cbbLogLevel; private Label lblLogLevel; private Button btnClearLog; private TextBox tbLog; private ListView lvwDevices; private ColumnHeader colServerId; private ColumnHeader colName; private ColumnHeader colRssi; private ColumnHeader colTxPower; private ColumnHeader colServiceUuids; private ColumnHeader colServicesWithData; private ColumnHeader colSolicitedServiceUuids; private ColumnHeader colManufacturerCompanyId; private ColumnHeader colManufacturerData; private ColumnHeader colConnectable; private GroupBox gbScanCtrls; private Button btnScan; private Label lblScanFilter; private CheckBox cbActiveScanning; private GroupBox gbConnectCtrls; private ToolTip ToolTip1; private Label lblBrowseOverlay; private Button btnConnect; private TextBox tbSelectedServerId; private Label lblSelectedServerId; private Button btnDisconnect; private Label lblCurrentlyConnectedTo; private TextBox tbConnectedServerId; private SplitContainer splitBrowse; private SplitContainer splitData; private TreeView treeGattObjects; private TabControlWithoutHeader tabCtrlGattData; private TabPage tabGattServer; private TabPage tabGattService; private TabPage tabGattCharacteristic; private TabPage tabGattDescriptor; private TextBox tbServerName; private Label lblServerName; private Label lblServerId; private TextBox tbServerId; private TabPage tabBrowse; private Button btnChooseScanUuids; private ListBox lbScanFilter; private GroupBox gbSrvDiscovery; private Label lblSrvDiscovery; private Button btnSrvChooseServiceUuids; private Button btnSrvDiscoverServices; private ListBox lbSrvServiceUuids; private Label lblSrvServiceUuids; private TabPage tabSubscribed; private TextBox tbServiceName; private Label lblServiceName; private TextBox tbServiceId; private Label lblServiceId; private Label lblServiceUuid; private TextBox tbServiceUuid; private Label lblServiceColorsNote; private TabControl tabCtrlSvcDiscovery; private TabPage tabSvcDiscoverCharacteristics; private Button btnSvcChooseCharacteristics; private Button btnSvcDiscoverCharacteristics; private ListBox lbSvcCharacteristicUuids; private Label lblSvcCharacteristicUuids; private Label lblSrvDiscoverCharacteristics; private TabPage tabSvcDiscoverInclServices; private Button btnSvcChooseInclServices; private Button btnSvcDiscoverInclServices; private ListBox lbSvcInclServiceUuids; private Label lblSvcInclServiceUuids; private Label lblSvcDiscoverInclServices; private GroupBox gbCharaDiscoverDescriptors; private Label lblCharaDiscoverDescriptors; private Button btnCharaDiscoverDescriptors; private TextBox tbCharacteristicUserDescription; private Label lblCharacteristicUserDescription; private TextBox tbCharacteristicId; private Label lblCharacteristicId; private Label lblCharacteristicUuid; private TextBox tbCharacteristicUuid; private TextBox tbCharacteristicName; private Label lblCharacteristicName; private TextBox tbCharacteristicFlags; private Label lblCharacteristicFlags; private Label lblCharacteristicValueFormatExponent; private Label lblCharacteristicValueFormatUnit; private TextBox tbCharacteristicValueFormatExponent; private TextBox tbCharacteristicValueFormatUnit; private TextBox tbCharacteristicValueFormatType; private Label lblCharacteristicValueFormats; private NumericUpDown numCharacteristicValueFormatIdx; private GroupBox gbCharacteristicValue; private Label lblCharacteristicValue; private GroupBox gbCharaDisplayValueAs; private RadioButton rbCharaNumber; private RadioButton rbCharaBoolean; private Button btnCustomizeCharaFormat; private RadioButton rbCharaHexBytes; private RadioButton rbCharaUTF16; private RadioButton rbCharaUTF8; private ComboBox cboCharaNumberType; private RadioButton rbCharaCustom; private Button btnCharaReadValue; private TextBox tbCharacteristicValue; private Button btnCharaWriteValue; private Button btnToggleSubscribe; private GroupBox gbDescriptorValue; private Button btnDescWriteValue; private Button btnDescReadValue; private TextBox tbDescriptorValue; private GroupBox gbDescDisplayValueAs; private RadioButton rbDescUTF16; private RadioButton rbDescUTF8; private ComboBox cboDescNumberType; private RadioButton rbDescNumber; private RadioButton rbDescBoolean; private RadioButton rbDescHexBytes; private Label lblDescriptorValue; private TextBox tbDescriptorId; private Label lblDescriptorId; private Label lblDescriptorUuid; private TextBox tbDescriptorUuid; private TextBox tbDescriptorName; private Label lblDescriptorName; private Button btnUpdateCharacteristicUserDescription; private Button btnCharaPostValue; private SplitContainer splitSubscribed; private Label lblSubscribedOverlay; private FlowLayoutPanel flowSubscribedCharacteristics; private RadioButton rbDescCustom; private Button btnCustomizeDescFormat; private Button btnPrintGattObjTree; private ContextMenuStrip contextMenuStrip1; private ToolStripMenuItem toolStripMenuItemCopyValue; private Label lblGattObjectsTree; private GroupBox gbSrvDiscoverEverything; private Label lblSrvDiscoverAll; private Button btnSrvDiscoverEverything; #endregion private byte[] currValue = new byte[0]; private bool suppressEvents = false; private Dictionary uuidDisplayTypes = new Dictionary(); private SortedDictionary uuidCustomFormats = null; private List subscribedCharacteristics = new List(); /// /// The main entry point for the application. /// [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new bleclientDemo()); } public bleclientDemo() { nsoftware.IPWorksBLE.Bleclient tempBleclient1 = new nsoftware.IPWorksBLE.Bleclient(this.components); Console.WriteLine(tempBleclient1.RuntimeLicense); // prints 31314E42414431535542323031393130313052413153554241414A39313634310000000000000000343858565831385A00005745544E59413533523238470000 InitializeComponent(); uuidCustomFormats = ValueFormatter.LoadCustomFormats(); ResetBrowseTab(); ResetSubscribedCharacteristicsTab(); bleclient1.RuntimeLicense = "31314E42414431535542323031393130313052413153554241414A39313634310000000000000000343858565831385A00005745544E59413533523238470000"; bleclient1.Config("LogLevel=" + cbbLogLevel.SelectedIndex); // Double buffer the ListView used for scanning since it flickers badly otherwise. var doubleBufferedPropInfo = lvwDevices.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic); doubleBufferedPropInfo.SetValue(lvwDevices, true, null); object sender = null; EventArgs e = null; btnScan_Click(sender, e); } /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.components = new System.ComponentModel.Container(); System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(bleclientDemo)); System.Windows.Forms.TreeNode treeNode1 = new System.Windows.Forms.TreeNode("[Server]"); this.lblInstructions = new System.Windows.Forms.Label(); this.tabCtrlMain = new System.Windows.Forms.TabControl(); this.tabScanConnect = new System.Windows.Forms.TabPage(); this.gbConnectCtrls = new System.Windows.Forms.GroupBox(); this.btnDisconnect = new System.Windows.Forms.Button(); this.lblCurrentlyConnectedTo = new System.Windows.Forms.Label(); this.tbConnectedServerId = new System.Windows.Forms.TextBox(); this.btnConnect = new System.Windows.Forms.Button(); this.tbSelectedServerId = new System.Windows.Forms.TextBox(); this.lblSelectedServerId = new System.Windows.Forms.Label(); this.gbScanCtrls = new System.Windows.Forms.GroupBox(); this.lbScanFilter = new System.Windows.Forms.ListBox(); this.btnChooseScanUuids = new System.Windows.Forms.Button(); this.lblScanFilter = new System.Windows.Forms.Label(); this.cbActiveScanning = new System.Windows.Forms.CheckBox(); this.btnScan = new System.Windows.Forms.Button(); this.lvwDevices = new System.Windows.Forms.ListView(); this.colServerId = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colName = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colRssi = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colTxPower = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colConnectable = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colServiceUuids = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colServicesWithData = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colManufacturerCompanyId = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colManufacturerData = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.colSolicitedServiceUuids = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader())); this.tabBrowse = new System.Windows.Forms.TabPage(); this.splitBrowse = new System.Windows.Forms.SplitContainer(); this.splitData = new System.Windows.Forms.SplitContainer(); this.lblGattObjectsTree = new System.Windows.Forms.Label(); this.treeGattObjects = new System.Windows.Forms.TreeView(); this.tabCtrlGattData = new nsoftware.Demos.bleclientDemo.TabControlWithoutHeader(); this.tabGattServer = new System.Windows.Forms.TabPage(); this.gbSrvDiscoverEverything = new System.Windows.Forms.GroupBox(); this.lblSrvDiscoverAll = new System.Windows.Forms.Label(); this.btnSrvDiscoverEverything = new System.Windows.Forms.Button(); this.gbSrvDiscovery = new System.Windows.Forms.GroupBox(); this.btnSrvChooseServiceUuids = new System.Windows.Forms.Button(); this.btnSrvDiscoverServices = new System.Windows.Forms.Button(); this.lbSrvServiceUuids = new System.Windows.Forms.ListBox(); this.lblSrvServiceUuids = new System.Windows.Forms.Label(); this.lblSrvDiscovery = new System.Windows.Forms.Label(); this.lblServerId = new System.Windows.Forms.Label(); this.tbServerId = new System.Windows.Forms.TextBox(); this.tbServerName = new System.Windows.Forms.TextBox(); this.lblServerName = new System.Windows.Forms.Label(); this.tabGattService = new System.Windows.Forms.TabPage(); this.tabCtrlSvcDiscovery = new System.Windows.Forms.TabControl(); this.tabSvcDiscoverCharacteristics = new System.Windows.Forms.TabPage(); this.btnSvcChooseCharacteristics = new System.Windows.Forms.Button(); this.btnSvcDiscoverCharacteristics = new System.Windows.Forms.Button(); this.lbSvcCharacteristicUuids = new System.Windows.Forms.ListBox(); this.lblSvcCharacteristicUuids = new System.Windows.Forms.Label(); this.lblSrvDiscoverCharacteristics = new System.Windows.Forms.Label(); this.tabSvcDiscoverInclServices = new System.Windows.Forms.TabPage(); this.btnSvcChooseInclServices = new System.Windows.Forms.Button(); this.btnSvcDiscoverInclServices = new System.Windows.Forms.Button(); this.lbSvcInclServiceUuids = new System.Windows.Forms.ListBox(); this.lblSvcInclServiceUuids = new System.Windows.Forms.Label(); this.lblSvcDiscoverInclServices = new System.Windows.Forms.Label(); this.lblServiceColorsNote = new System.Windows.Forms.Label(); this.tbServiceId = new System.Windows.Forms.TextBox(); this.lblServiceId = new System.Windows.Forms.Label(); this.lblServiceUuid = new System.Windows.Forms.Label(); this.tbServiceUuid = new System.Windows.Forms.TextBox(); this.tbServiceName = new System.Windows.Forms.TextBox(); this.lblServiceName = new System.Windows.Forms.Label(); this.tabGattCharacteristic = new System.Windows.Forms.TabPage(); this.tbCharacteristicUserDescription = new System.Windows.Forms.TextBox(); this.btnUpdateCharacteristicUserDescription = new System.Windows.Forms.Button(); this.gbCharacteristicValue = new System.Windows.Forms.GroupBox(); this.btnCharaPostValue = new System.Windows.Forms.Button(); this.btnToggleSubscribe = new System.Windows.Forms.Button(); this.btnCharaWriteValue = new System.Windows.Forms.Button(); this.btnCharaReadValue = new System.Windows.Forms.Button(); this.tbCharacteristicValue = new System.Windows.Forms.TextBox(); this.gbCharaDisplayValueAs = new System.Windows.Forms.GroupBox(); this.rbCharaCustom = new System.Windows.Forms.RadioButton(); this.rbCharaUTF16 = new System.Windows.Forms.RadioButton(); this.rbCharaUTF8 = new System.Windows.Forms.RadioButton(); this.cboCharaNumberType = new System.Windows.Forms.ComboBox(); this.rbCharaNumber = new System.Windows.Forms.RadioButton(); this.rbCharaBoolean = new System.Windows.Forms.RadioButton(); this.btnCustomizeCharaFormat = new System.Windows.Forms.Button(); this.rbCharaHexBytes = new System.Windows.Forms.RadioButton(); this.lblCharacteristicValue = new System.Windows.Forms.Label(); this.lblCharacteristicValueFormatExponent = new System.Windows.Forms.Label(); this.lblCharacteristicValueFormatUnit = new System.Windows.Forms.Label(); this.tbCharacteristicValueFormatExponent = new System.Windows.Forms.TextBox(); this.tbCharacteristicValueFormatUnit = new System.Windows.Forms.TextBox(); this.tbCharacteristicValueFormatType = new System.Windows.Forms.TextBox(); this.lblCharacteristicValueFormats = new System.Windows.Forms.Label(); this.numCharacteristicValueFormatIdx = new System.Windows.Forms.NumericUpDown(); this.tbCharacteristicFlags = new System.Windows.Forms.TextBox(); this.lblCharacteristicFlags = new System.Windows.Forms.Label(); this.gbCharaDiscoverDescriptors = new System.Windows.Forms.GroupBox(); this.lblCharaDiscoverDescriptors = new System.Windows.Forms.Label(); this.btnCharaDiscoverDescriptors = new System.Windows.Forms.Button(); this.lblCharacteristicUserDescription = new System.Windows.Forms.Label(); this.tbCharacteristicId = new System.Windows.Forms.TextBox(); this.lblCharacteristicId = new System.Windows.Forms.Label(); this.lblCharacteristicUuid = new System.Windows.Forms.Label(); this.tbCharacteristicUuid = new System.Windows.Forms.TextBox(); this.tbCharacteristicName = new System.Windows.Forms.TextBox(); this.lblCharacteristicName = new System.Windows.Forms.Label(); this.tabGattDescriptor = new System.Windows.Forms.TabPage(); this.gbDescriptorValue = new System.Windows.Forms.GroupBox(); this.btnDescWriteValue = new System.Windows.Forms.Button(); this.btnDescReadValue = new System.Windows.Forms.Button(); this.tbDescriptorValue = new System.Windows.Forms.TextBox(); this.gbDescDisplayValueAs = new System.Windows.Forms.GroupBox(); this.rbDescCustom = new System.Windows.Forms.RadioButton(); this.btnCustomizeDescFormat = new System.Windows.Forms.Button(); this.rbDescUTF16 = new System.Windows.Forms.RadioButton(); this.rbDescUTF8 = new System.Windows.Forms.RadioButton(); this.cboDescNumberType = new System.Windows.Forms.ComboBox(); this.rbDescNumber = new System.Windows.Forms.RadioButton(); this.rbDescBoolean = new System.Windows.Forms.RadioButton(); this.rbDescHexBytes = new System.Windows.Forms.RadioButton(); this.lblDescriptorValue = new System.Windows.Forms.Label(); this.tbDescriptorId = new System.Windows.Forms.TextBox(); this.lblDescriptorId = new System.Windows.Forms.Label(); this.lblDescriptorUuid = new System.Windows.Forms.Label(); this.tbDescriptorUuid = new System.Windows.Forms.TextBox(); this.tbDescriptorName = new System.Windows.Forms.TextBox(); this.lblDescriptorName = new System.Windows.Forms.Label(); this.lblBrowseOverlay = new System.Windows.Forms.Label(); this.tabSubscribed = new System.Windows.Forms.TabPage(); this.splitSubscribed = new System.Windows.Forms.SplitContainer(); this.flowSubscribedCharacteristics = new System.Windows.Forms.FlowLayoutPanel(); this.lblSubscribedOverlay = new System.Windows.Forms.Label(); this.tabLog = new System.Windows.Forms.TabPage(); this.btnPrintGattObjTree = new System.Windows.Forms.Button(); this.tbLog = new System.Windows.Forms.TextBox(); this.btnClearLog = new System.Windows.Forms.Button(); this.cbLogAdvertisements = new System.Windows.Forms.CheckBox(); this.cbbLogLevel = new System.Windows.Forms.ComboBox(); this.lblLogLevel = new System.Windows.Forms.Label(); this.ToolTip1 = new System.Windows.Forms.ToolTip(this.components); this.bleclient1 = new nsoftware.IPWorksBLE.Bleclient(this.components); this.contextMenuStrip1 = new System.Windows.Forms.ContextMenuStrip(this.components); this.toolStripMenuItemCopyValue = new System.Windows.Forms.ToolStripMenuItem(); this.tabCtrlMain.SuspendLayout(); this.tabScanConnect.SuspendLayout(); this.gbConnectCtrls.SuspendLayout(); this.gbScanCtrls.SuspendLayout(); this.tabBrowse.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitBrowse)).BeginInit(); this.splitBrowse.Panel1.SuspendLayout(); this.splitBrowse.Panel2.SuspendLayout(); this.splitBrowse.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitData)).BeginInit(); this.splitData.Panel1.SuspendLayout(); this.splitData.Panel2.SuspendLayout(); this.splitData.SuspendLayout(); this.tabCtrlGattData.SuspendLayout(); this.tabGattServer.SuspendLayout(); this.gbSrvDiscoverEverything.SuspendLayout(); this.gbSrvDiscovery.SuspendLayout(); this.tabGattService.SuspendLayout(); this.tabCtrlSvcDiscovery.SuspendLayout(); this.tabSvcDiscoverCharacteristics.SuspendLayout(); this.tabSvcDiscoverInclServices.SuspendLayout(); this.tabGattCharacteristic.SuspendLayout(); this.gbCharacteristicValue.SuspendLayout(); this.gbCharaDisplayValueAs.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.numCharacteristicValueFormatIdx)).BeginInit(); this.gbCharaDiscoverDescriptors.SuspendLayout(); this.tabGattDescriptor.SuspendLayout(); this.gbDescriptorValue.SuspendLayout(); this.gbDescDisplayValueAs.SuspendLayout(); this.tabSubscribed.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.splitSubscribed)).BeginInit(); this.splitSubscribed.Panel1.SuspendLayout(); this.splitSubscribed.Panel2.SuspendLayout(); this.splitSubscribed.SuspendLayout(); this.tabLog.SuspendLayout(); this.contextMenuStrip1.SuspendLayout(); this.SuspendLayout(); // // lblInstructions // this.lblInstructions.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblInstructions.ForeColor = System.Drawing.SystemColors.Highlight; this.lblInstructions.Location = new System.Drawing.Point(12, 9); this.lblInstructions.Name = "lblInstructions"; this.lblInstructions.Size = new System.Drawing.Size(1010, 32); this.lblInstructions.TabIndex = 0; this.lblInstructions.Text = resources.GetString("lblInstructions.Text"); // // tabCtrlMain // this.tabCtrlMain.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tabCtrlMain.Controls.Add(this.tabScanConnect); this.tabCtrlMain.Controls.Add(this.tabBrowse); this.tabCtrlMain.Controls.Add(this.tabSubscribed); this.tabCtrlMain.Controls.Add(this.tabLog); this.tabCtrlMain.Location = new System.Drawing.Point(12, 44); this.tabCtrlMain.Name = "tabCtrlMain"; this.tabCtrlMain.SelectedIndex = 0; this.tabCtrlMain.ShowToolTips = true; this.tabCtrlMain.Size = new System.Drawing.Size(1010, 480); this.tabCtrlMain.TabIndex = 1; // // tabScanConnect // this.tabScanConnect.Controls.Add(this.gbConnectCtrls); this.tabScanConnect.Controls.Add(this.gbScanCtrls); this.tabScanConnect.Controls.Add(this.lvwDevices); this.tabScanConnect.Location = new System.Drawing.Point(4, 22); this.tabScanConnect.Name = "tabScanConnect"; this.tabScanConnect.Padding = new System.Windows.Forms.Padding(3); this.tabScanConnect.Size = new System.Drawing.Size(1002, 454); this.tabScanConnect.TabIndex = 0; this.tabScanConnect.Text = "Scan and Connect"; this.tabScanConnect.ToolTipText = "The \"Scan and Connect\" tab allows you to scan for devices, view advertisement dat" + "a, and manage what device you\'re connected to."; this.tabScanConnect.UseVisualStyleBackColor = true; // // gbConnectCtrls // this.gbConnectCtrls.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.gbConnectCtrls.Controls.Add(this.btnDisconnect); this.gbConnectCtrls.Controls.Add(this.lblCurrentlyConnectedTo); this.gbConnectCtrls.Controls.Add(this.tbConnectedServerId); this.gbConnectCtrls.Controls.Add(this.btnConnect); this.gbConnectCtrls.Controls.Add(this.tbSelectedServerId); this.gbConnectCtrls.Controls.Add(this.lblSelectedServerId); this.gbConnectCtrls.Location = new System.Drawing.Point(685, 6); this.gbConnectCtrls.Name = "gbConnectCtrls"; this.gbConnectCtrls.Size = new System.Drawing.Size(311, 91); this.gbConnectCtrls.TabIndex = 1; this.gbConnectCtrls.TabStop = false; this.gbConnectCtrls.Text = "Connection"; // // btnDisconnect // this.btnDisconnect.Enabled = false; this.btnDisconnect.Location = new System.Drawing.Point(231, 41); this.btnDisconnect.Name = "btnDisconnect"; this.btnDisconnect.Size = new System.Drawing.Size(74, 23); this.btnDisconnect.TabIndex = 5; this.btnDisconnect.Text = "&Disconnect"; this.btnDisconnect.UseVisualStyleBackColor = true; this.btnDisconnect.Click += new System.EventHandler(this.btnDisconnect_Click); // // lblCurrentlyConnectedTo // this.lblCurrentlyConnectedTo.AutoSize = true; this.lblCurrentlyConnectedTo.Location = new System.Drawing.Point(6, 46); this.lblCurrentlyConnectedTo.Name = "lblCurrentlyConnectedTo"; this.lblCurrentlyConnectedTo.Size = new System.Drawing.Size(122, 13); this.lblCurrentlyConnectedTo.TabIndex = 3; this.lblCurrentlyConnectedTo.Text = "Currently Connected To:"; // // tbConnectedServerId // this.tbConnectedServerId.Location = new System.Drawing.Point(6, 65); this.tbConnectedServerId.Name = "tbConnectedServerId"; this.tbConnectedServerId.ReadOnly = true; this.tbConnectedServerId.Size = new System.Drawing.Size(299, 20); this.tbConnectedServerId.TabIndex = 4; this.tbConnectedServerId.Text = "[Not Connected]"; // // btnConnect // this.btnConnect.Location = new System.Drawing.Point(231, 11); this.btnConnect.Name = "btnConnect"; this.btnConnect.Size = new System.Drawing.Size(74, 23); this.btnConnect.TabIndex = 2; this.btnConnect.Text = "&Connect"; this.btnConnect.UseVisualStyleBackColor = true; this.btnConnect.Click += new System.EventHandler(this.btnConnect_Click); // // tbSelectedServerId // this.tbSelectedServerId.CharacterCasing = System.Windows.Forms.CharacterCasing.Upper; this.tbSelectedServerId.Location = new System.Drawing.Point(67, 13); this.tbSelectedServerId.Name = "tbSelectedServerId"; this.tbSelectedServerId.Size = new System.Drawing.Size(158, 20); this.tbSelectedServerId.TabIndex = 1; // // lblSelectedServerId // this.lblSelectedServerId.AutoSize = true; this.lblSelectedServerId.Location = new System.Drawing.Point(6, 16); this.lblSelectedServerId.Name = "lblSelectedServerId"; this.lblSelectedServerId.Size = new System.Drawing.Size(55, 13); this.lblSelectedServerId.TabIndex = 0; this.lblSelectedServerId.Text = "Server &ID:"; // // gbScanCtrls // this.gbScanCtrls.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbScanCtrls.Controls.Add(this.lbScanFilter); this.gbScanCtrls.Controls.Add(this.btnChooseScanUuids); this.gbScanCtrls.Controls.Add(this.lblScanFilter); this.gbScanCtrls.Controls.Add(this.cbActiveScanning); this.gbScanCtrls.Controls.Add(this.btnScan); this.gbScanCtrls.Location = new System.Drawing.Point(6, 6); this.gbScanCtrls.Name = "gbScanCtrls"; this.gbScanCtrls.Size = new System.Drawing.Size(673, 91); this.gbScanCtrls.TabIndex = 0; this.gbScanCtrls.TabStop = false; this.gbScanCtrls.Text = "Scanning"; // // lbScanFilter // this.lbScanFilter.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lbScanFilter.FormattingEnabled = true; this.lbScanFilter.Location = new System.Drawing.Point(99, 32); this.lbScanFilter.Name = "lbScanFilter"; this.lbScanFilter.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; this.lbScanFilter.Size = new System.Drawing.Size(568, 56); this.lbScanFilter.TabIndex = 3; this.ToolTip1.SetToolTip(this.lbScanFilter, "If not empty when scanning begins, BLEClient will filter out any devices which ar" + "e not advertising one or more of these services."); this.lbScanFilter.KeyUp += new System.Windows.Forms.KeyEventHandler(this.lbUuids_KeyUp); // // btnChooseScanUuids // this.btnChooseScanUuids.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnChooseScanUuids.Location = new System.Drawing.Point(570, 8); this.btnChooseScanUuids.Name = "btnChooseScanUuids"; this.btnChooseScanUuids.Size = new System.Drawing.Size(97, 23); this.btnChooseScanUuids.TabIndex = 4; this.btnChooseScanUuids.Text = "C&hoose UUIDs"; this.btnChooseScanUuids.UseVisualStyleBackColor = true; this.btnChooseScanUuids.Click += new System.EventHandler(this.btnChooseScanUuids_Click); // // lblScanFilter // this.lblScanFilter.AutoSize = true; this.lblScanFilter.Location = new System.Drawing.Point(99, 15); this.lblScanFilter.Name = "lblScanFilter"; this.lblScanFilter.Size = new System.Drawing.Size(203, 13); this.lblScanFilter.TabIndex = 2; this.lblScanFilter.Text = "Service UUIDs to &filter advertisements by:\r\n"; // // cbActiveScanning // this.cbActiveScanning.Checked = true; this.cbActiveScanning.CheckState = System.Windows.Forms.CheckState.Checked; this.cbActiveScanning.Location = new System.Drawing.Point(7, 49); this.cbActiveScanning.Name = "cbActiveScanning"; this.cbActiveScanning.Size = new System.Drawing.Size(86, 38); this.cbActiveScanning.TabIndex = 1; this.cbActiveScanning.Text = "Use &Active Scanning"; this.ToolTip1.SetToolTip(this.cbActiveScanning, "Active scanning will cause BLEClient to request a\r\nscan response for every advert" + "isement received.\r\nThis uses more battery life."); this.cbActiveScanning.UseVisualStyleBackColor = true; // // btnScan // this.btnScan.Location = new System.Drawing.Point(6, 19); this.btnScan.Name = "btnScan"; this.btnScan.Size = new System.Drawing.Size(87, 23); this.btnScan.TabIndex = 0; this.btnScan.Text = "&Start Scanning"; this.btnScan.UseVisualStyleBackColor = true; this.btnScan.Click += new System.EventHandler(this.btnScan_Click); // // lvwDevices // this.lvwDevices.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lvwDevices.Columns.AddRange(new System.Windows.Forms.ColumnHeader[] { this.colServerId, this.colName, this.colRssi, this.colTxPower, this.colConnectable, this.colServiceUuids, this.colServicesWithData, this.colManufacturerCompanyId, this.colManufacturerData, this.colSolicitedServiceUuids}); this.lvwDevices.FullRowSelect = true; this.lvwDevices.GridLines = true; this.lvwDevices.Location = new System.Drawing.Point(3, 103); this.lvwDevices.MultiSelect = false; this.lvwDevices.Name = "lvwDevices"; this.lvwDevices.ShowItemToolTips = true; this.lvwDevices.Size = new System.Drawing.Size(996, 348); this.lvwDevices.TabIndex = 2; this.lvwDevices.UseCompatibleStateImageBehavior = false; this.lvwDevices.View = System.Windows.Forms.View.Details; this.lvwDevices.SelectedIndexChanged += new System.EventHandler(this.lvwDevices_SelectedIndexChanged); this.lvwDevices.MouseUp += new System.Windows.Forms.MouseEventHandler(this.lvwDevices_MouseUp); // // colServerId // this.colServerId.Text = "Server ID"; this.colServerId.Width = 90; // // colName // this.colName.Text = "Local Name"; this.colName.Width = 120; // // colRssi // this.colRssi.Text = "RSSI"; this.colRssi.Width = 40; // // colTxPower // this.colTxPower.Text = "TxPwr"; this.colTxPower.Width = 45; // // colConnectable // this.colConnectable.Text = "Connectable"; this.colConnectable.Width = 72; // // colServiceUuids // this.colServiceUuids.Text = "Service UUIDs"; this.colServiceUuids.Width = 300; // // colServicesWithData // this.colServicesWithData.Text = "Services With Data"; this.colServicesWithData.Width = 105; // // colManufacturerCompanyId // this.colManufacturerCompanyId.Text = "Mfr ID"; // // colManufacturerData // this.colManufacturerData.Text = "Manufacturer Data"; this.colManufacturerData.Width = 300; // // colSolicitedServiceUuids // this.colSolicitedServiceUuids.Text = "Solicited Service UUIDs"; this.colSolicitedServiceUuids.Width = 130; // // tabBrowse // this.tabBrowse.Controls.Add(this.splitBrowse); this.tabBrowse.Location = new System.Drawing.Point(4, 22); this.tabBrowse.Name = "tabBrowse"; this.tabBrowse.Padding = new System.Windows.Forms.Padding(3); this.tabBrowse.Size = new System.Drawing.Size(1002, 454); this.tabBrowse.TabIndex = 1; this.tabBrowse.Text = "Browse Data"; this.tabBrowse.ToolTipText = "The \"Browse Data\" tab allows you to discover and browse the currently connected d" + "evice\'s services, characteristics, and descriptors."; this.tabBrowse.UseVisualStyleBackColor = true; // // splitBrowse // this.splitBrowse.Dock = System.Windows.Forms.DockStyle.Fill; this.splitBrowse.IsSplitterFixed = true; this.splitBrowse.Location = new System.Drawing.Point(3, 3); this.splitBrowse.Name = "splitBrowse"; this.splitBrowse.Orientation = System.Windows.Forms.Orientation.Horizontal; // // splitBrowse.Panel1 // this.splitBrowse.Panel1.Controls.Add(this.splitData); // // splitBrowse.Panel2 // this.splitBrowse.Panel2.Controls.Add(this.lblBrowseOverlay); this.splitBrowse.Panel2Collapsed = true; this.splitBrowse.Size = new System.Drawing.Size(996, 448); this.splitBrowse.SplitterDistance = 419; this.splitBrowse.TabIndex = 0; this.splitBrowse.TabStop = false; // // splitData // this.splitData.Dock = System.Windows.Forms.DockStyle.Fill; this.splitData.Location = new System.Drawing.Point(0, 0); this.splitData.Name = "splitData"; // // splitData.Panel1 // this.splitData.Panel1.Controls.Add(this.lblGattObjectsTree); this.splitData.Panel1.Controls.Add(this.treeGattObjects); // // splitData.Panel2 // this.splitData.Panel2.Controls.Add(this.tabCtrlGattData); this.splitData.Panel2MinSize = 650; this.splitData.Size = new System.Drawing.Size(996, 448); this.splitData.SplitterDistance = 332; this.splitData.TabIndex = 0; // // lblGattObjectsTree // this.lblGattObjectsTree.AutoSize = true; this.lblGattObjectsTree.Dock = System.Windows.Forms.DockStyle.Top; this.lblGattObjectsTree.Location = new System.Drawing.Point(0, 0); this.lblGattObjectsTree.Margin = new System.Windows.Forms.Padding(3, 0, 3, 3); this.lblGattObjectsTree.Name = "lblGattObjectsTree"; this.lblGattObjectsTree.Size = new System.Drawing.Size(160, 13); this.lblGattObjectsTree.TabIndex = 0; this.lblGattObjectsTree.Text = "Discovered &GATT Objects Tree:"; // // treeGattObjects // this.treeGattObjects.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.treeGattObjects.HideSelection = false; this.treeGattObjects.Location = new System.Drawing.Point(0, 19); this.treeGattObjects.Name = "treeGattObjects"; treeNode1.Name = "nodeServer"; treeNode1.Text = "[Server]"; this.treeGattObjects.Nodes.AddRange(new System.Windows.Forms.TreeNode[] { treeNode1}); this.treeGattObjects.ShowPlusMinus = false; this.treeGattObjects.Size = new System.Drawing.Size(332, 429); this.treeGattObjects.TabIndex = 1; this.treeGattObjects.BeforeCollapse += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeGattObjects_BeforeCollapse); this.treeGattObjects.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeGattObjects_AfterSelect); // // tabCtrlGattData // this.tabCtrlGattData.Controls.Add(this.tabGattServer); this.tabCtrlGattData.Controls.Add(this.tabGattService); this.tabCtrlGattData.Controls.Add(this.tabGattCharacteristic); this.tabCtrlGattData.Controls.Add(this.tabGattDescriptor); this.tabCtrlGattData.Dock = System.Windows.Forms.DockStyle.Fill; this.tabCtrlGattData.Location = new System.Drawing.Point(0, 0); this.tabCtrlGattData.Multiline = true; this.tabCtrlGattData.Name = "tabCtrlGattData"; this.tabCtrlGattData.SelectedIndex = 0; this.tabCtrlGattData.Size = new System.Drawing.Size(660, 448); this.tabCtrlGattData.TabIndex = 0; this.tabCtrlGattData.TabStop = false; // // tabGattServer // this.tabGattServer.Controls.Add(this.gbSrvDiscoverEverything); this.tabGattServer.Controls.Add(this.gbSrvDiscovery); this.tabGattServer.Controls.Add(this.lblServerId); this.tabGattServer.Controls.Add(this.tbServerId); this.tabGattServer.Controls.Add(this.tbServerName); this.tabGattServer.Controls.Add(this.lblServerName); this.tabGattServer.Location = new System.Drawing.Point(4, 22); this.tabGattServer.Name = "tabGattServer"; this.tabGattServer.Padding = new System.Windows.Forms.Padding(3); this.tabGattServer.Size = new System.Drawing.Size(652, 422); this.tabGattServer.TabIndex = 0; this.tabGattServer.Text = "[Server Controls]"; this.tabGattServer.UseVisualStyleBackColor = true; // // gbSrvDiscoverEverything // this.gbSrvDiscoverEverything.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbSrvDiscoverEverything.Controls.Add(this.lblSrvDiscoverAll); this.gbSrvDiscoverEverything.Controls.Add(this.btnSrvDiscoverEverything); this.gbSrvDiscoverEverything.Location = new System.Drawing.Point(6, 376); this.gbSrvDiscoverEverything.Name = "gbSrvDiscoverEverything"; this.gbSrvDiscoverEverything.Size = new System.Drawing.Size(640, 40); this.gbSrvDiscoverEverything.TabIndex = 5; this.gbSrvDiscoverEverything.TabStop = false; this.gbSrvDiscoverEverything.Text = "Discover Everything"; // // lblSrvDiscoverAll // this.lblSrvDiscoverAll.AutoSize = true; this.lblSrvDiscoverAll.ForeColor = System.Drawing.SystemColors.Highlight; this.lblSrvDiscoverAll.Location = new System.Drawing.Point(6, 16); this.lblSrvDiscoverAll.Name = "lblSrvDiscoverAll"; this.lblSrvDiscoverAll.Size = new System.Drawing.Size(421, 13); this.lblSrvDiscoverAll.TabIndex = 0; this.lblSrvDiscoverAll.Text = "If you wish to discover everything on the server at once, you can. (It might take" + " a while.)"; // // btnSrvDiscoverEverything // this.btnSrvDiscoverEverything.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnSrvDiscoverEverything.Location = new System.Drawing.Point(511, 11); this.btnSrvDiscoverEverything.Name = "btnSrvDiscoverEverything"; this.btnSrvDiscoverEverything.Size = new System.Drawing.Size(123, 23); this.btnSrvDiscoverEverything.TabIndex = 1; this.btnSrvDiscoverEverything.Text = "Discover &Everything"; this.btnSrvDiscoverEverything.UseVisualStyleBackColor = true; this.btnSrvDiscoverEverything.Click += new System.EventHandler(this.btnSrvDiscoverEverything_Click); // // gbSrvDiscovery // this.gbSrvDiscovery.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbSrvDiscovery.Controls.Add(this.btnSrvChooseServiceUuids); this.gbSrvDiscovery.Controls.Add(this.btnSrvDiscoverServices); this.gbSrvDiscovery.Controls.Add(this.lbSrvServiceUuids); this.gbSrvDiscovery.Controls.Add(this.lblSrvServiceUuids); this.gbSrvDiscovery.Controls.Add(this.lblSrvDiscovery); this.gbSrvDiscovery.Location = new System.Drawing.Point(6, 59); this.gbSrvDiscovery.Name = "gbSrvDiscovery"; this.gbSrvDiscovery.Size = new System.Drawing.Size(640, 311); this.gbSrvDiscovery.TabIndex = 4; this.gbSrvDiscovery.TabStop = false; this.gbSrvDiscovery.Text = "Root Service Discovery"; // // btnSrvChooseServiceUuids // this.btnSrvChooseServiceUuids.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnSrvChooseServiceUuids.Location = new System.Drawing.Point(6, 282); this.btnSrvChooseServiceUuids.Name = "btnSrvChooseServiceUuids"; this.btnSrvChooseServiceUuids.Size = new System.Drawing.Size(113, 23); this.btnSrvChooseServiceUuids.TabIndex = 3; this.btnSrvChooseServiceUuids.Text = "&Choose Services"; this.btnSrvChooseServiceUuids.UseVisualStyleBackColor = true; this.btnSrvChooseServiceUuids.Click += new System.EventHandler(this.btnSrvChooseServiceUuids_Click); // // btnSrvDiscoverServices // this.btnSrvDiscoverServices.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnSrvDiscoverServices.Location = new System.Drawing.Point(498, 282); this.btnSrvDiscoverServices.Name = "btnSrvDiscoverServices"; this.btnSrvDiscoverServices.Size = new System.Drawing.Size(136, 23); this.btnSrvDiscoverServices.TabIndex = 4; this.btnSrvDiscoverServices.Text = "&Discover Root Services"; this.btnSrvDiscoverServices.UseVisualStyleBackColor = true; this.btnSrvDiscoverServices.Click += new System.EventHandler(this.btnSrvDiscoverServices_Click); // // lbSrvServiceUuids // this.lbSrvServiceUuids.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lbSrvServiceUuids.FormattingEnabled = true; this.lbSrvServiceUuids.Location = new System.Drawing.Point(6, 71); this.lbSrvServiceUuids.Name = "lbSrvServiceUuids"; this.lbSrvServiceUuids.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; this.lbSrvServiceUuids.Size = new System.Drawing.Size(628, 199); this.lbSrvServiceUuids.TabIndex = 2; this.lbSrvServiceUuids.KeyUp += new System.Windows.Forms.KeyEventHandler(this.lbUuids_KeyUp); // // lblSrvServiceUuids // this.lblSrvServiceUuids.AutoSize = true; this.lblSrvServiceUuids.Location = new System.Drawing.Point(6, 55); this.lblSrvServiceUuids.Name = "lblSrvServiceUuids"; this.lblSrvServiceUuids.Size = new System.Drawing.Size(147, 13); this.lblSrvServiceUuids.TabIndex = 1; this.lblSrvServiceUuids.Text = "Root Service Discovery &Filter:"; // // lblSrvDiscovery // this.lblSrvDiscovery.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblSrvDiscovery.ForeColor = System.Drawing.SystemColors.Highlight; this.lblSrvDiscovery.Location = new System.Drawing.Point(6, 16); this.lblSrvDiscovery.Name = "lblSrvDiscovery"; this.lblSrvDiscovery.Size = new System.Drawing.Size(628, 31); this.lblSrvDiscovery.TabIndex = 0; this.lblSrvDiscovery.Text = resources.GetString("lblSrvDiscovery.Text"); // // lblServerId // this.lblServerId.AutoSize = true; this.lblServerId.Location = new System.Drawing.Point(6, 36); this.lblServerId.Name = "lblServerId"; this.lblServerId.Size = new System.Drawing.Size(55, 13); this.lblServerId.TabIndex = 2; this.lblServerId.Text = "Server ID:"; // // tbServerId // this.tbServerId.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbServerId.Location = new System.Drawing.Point(67, 33); this.tbServerId.Name = "tbServerId"; this.tbServerId.ReadOnly = true; this.tbServerId.Size = new System.Drawing.Size(579, 20); this.tbServerId.TabIndex = 3; // // tbServerName // this.tbServerName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbServerName.Location = new System.Drawing.Point(87, 6); this.tbServerName.Name = "tbServerName"; this.tbServerName.ReadOnly = true; this.tbServerName.Size = new System.Drawing.Size(559, 20); this.tbServerName.TabIndex = 1; // // lblServerName // this.lblServerName.AutoSize = true; this.lblServerName.Location = new System.Drawing.Point(6, 9); this.lblServerName.Name = "lblServerName"; this.lblServerName.Size = new System.Drawing.Size(75, 13); this.lblServerName.TabIndex = 0; this.lblServerName.Text = "Server Name: "; // // tabGattService // this.tabGattService.Controls.Add(this.tabCtrlSvcDiscovery); this.tabGattService.Controls.Add(this.lblServiceColorsNote); this.tabGattService.Controls.Add(this.tbServiceId); this.tabGattService.Controls.Add(this.lblServiceId); this.tabGattService.Controls.Add(this.lblServiceUuid); this.tabGattService.Controls.Add(this.tbServiceUuid); this.tabGattService.Controls.Add(this.tbServiceName); this.tabGattService.Controls.Add(this.lblServiceName); this.tabGattService.Location = new System.Drawing.Point(4, 22); this.tabGattService.Name = "tabGattService"; this.tabGattService.Padding = new System.Windows.Forms.Padding(3); this.tabGattService.Size = new System.Drawing.Size(652, 422); this.tabGattService.TabIndex = 1; this.tabGattService.Text = "[Service Controls]"; this.tabGattService.UseVisualStyleBackColor = true; // // tabCtrlSvcDiscovery // this.tabCtrlSvcDiscovery.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tabCtrlSvcDiscovery.Controls.Add(this.tabSvcDiscoverCharacteristics); this.tabCtrlSvcDiscovery.Controls.Add(this.tabSvcDiscoverInclServices); this.tabCtrlSvcDiscovery.Location = new System.Drawing.Point(6, 97); this.tabCtrlSvcDiscovery.Name = "tabCtrlSvcDiscovery"; this.tabCtrlSvcDiscovery.SelectedIndex = 0; this.tabCtrlSvcDiscovery.Size = new System.Drawing.Size(640, 319); this.tabCtrlSvcDiscovery.TabIndex = 7; // // tabSvcDiscoverCharacteristics // this.tabSvcDiscoverCharacteristics.Controls.Add(this.btnSvcChooseCharacteristics); this.tabSvcDiscoverCharacteristics.Controls.Add(this.btnSvcDiscoverCharacteristics); this.tabSvcDiscoverCharacteristics.Controls.Add(this.lbSvcCharacteristicUuids); this.tabSvcDiscoverCharacteristics.Controls.Add(this.lblSvcCharacteristicUuids); this.tabSvcDiscoverCharacteristics.Controls.Add(this.lblSrvDiscoverCharacteristics); this.tabSvcDiscoverCharacteristics.Location = new System.Drawing.Point(4, 22); this.tabSvcDiscoverCharacteristics.Name = "tabSvcDiscoverCharacteristics"; this.tabSvcDiscoverCharacteristics.Padding = new System.Windows.Forms.Padding(3); this.tabSvcDiscoverCharacteristics.Size = new System.Drawing.Size(632, 293); this.tabSvcDiscoverCharacteristics.TabIndex = 0; this.tabSvcDiscoverCharacteristics.Text = "Discover Characteristics"; this.tabSvcDiscoverCharacteristics.UseVisualStyleBackColor = true; // // btnSvcChooseCharacteristics // this.btnSvcChooseCharacteristics.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnSvcChooseCharacteristics.Location = new System.Drawing.Point(6, 264); this.btnSvcChooseCharacteristics.Name = "btnSvcChooseCharacteristics"; this.btnSvcChooseCharacteristics.Size = new System.Drawing.Size(132, 23); this.btnSvcChooseCharacteristics.TabIndex = 3; this.btnSvcChooseCharacteristics.Text = "&Choose Characteristics"; this.btnSvcChooseCharacteristics.UseVisualStyleBackColor = true; this.btnSvcChooseCharacteristics.Click += new System.EventHandler(this.btnSvcChooseCharacteristics_Click); // // btnSvcDiscoverCharacteristics // this.btnSvcDiscoverCharacteristics.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnSvcDiscoverCharacteristics.Location = new System.Drawing.Point(490, 264); this.btnSvcDiscoverCharacteristics.Name = "btnSvcDiscoverCharacteristics"; this.btnSvcDiscoverCharacteristics.Size = new System.Drawing.Size(136, 23); this.btnSvcDiscoverCharacteristics.TabIndex = 4; this.btnSvcDiscoverCharacteristics.Text = "&Discover Characteristics"; this.btnSvcDiscoverCharacteristics.UseVisualStyleBackColor = true; this.btnSvcDiscoverCharacteristics.Click += new System.EventHandler(this.btnSvcDiscoverCharacteristics_Click); // // lbSvcCharacteristicUuids // this.lbSvcCharacteristicUuids.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lbSvcCharacteristicUuids.FormattingEnabled = true; this.lbSvcCharacteristicUuids.Location = new System.Drawing.Point(6, 50); this.lbSvcCharacteristicUuids.Name = "lbSvcCharacteristicUuids"; this.lbSvcCharacteristicUuids.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; this.lbSvcCharacteristicUuids.Size = new System.Drawing.Size(620, 212); this.lbSvcCharacteristicUuids.TabIndex = 2; this.lbSvcCharacteristicUuids.KeyUp += new System.Windows.Forms.KeyEventHandler(this.lbUuids_KeyUp); // // lblSvcCharacteristicUuids // this.lblSvcCharacteristicUuids.AutoSize = true; this.lblSvcCharacteristicUuids.Location = new System.Drawing.Point(6, 34); this.lblSvcCharacteristicUuids.Name = "lblSvcCharacteristicUuids"; this.lblSvcCharacteristicUuids.Size = new System.Drawing.Size(149, 13); this.lblSvcCharacteristicUuids.TabIndex = 1; this.lblSvcCharacteristicUuids.Text = "Characteristic Discovery &Filter:"; // // lblSrvDiscoverCharacteristics // this.lblSrvDiscoverCharacteristics.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblSrvDiscoverCharacteristics.ForeColor = System.Drawing.SystemColors.Highlight; this.lblSrvDiscoverCharacteristics.Location = new System.Drawing.Point(6, 3); this.lblSrvDiscoverCharacteristics.Name = "lblSrvDiscoverCharacteristics"; this.lblSrvDiscoverCharacteristics.Size = new System.Drawing.Size(620, 31); this.lblSrvDiscoverCharacteristics.TabIndex = 0; this.lblSrvDiscoverCharacteristics.Text = resources.GetString("lblSrvDiscoverCharacteristics.Text"); // // tabSvcDiscoverInclServices // this.tabSvcDiscoverInclServices.Controls.Add(this.btnSvcChooseInclServices); this.tabSvcDiscoverInclServices.Controls.Add(this.btnSvcDiscoverInclServices); this.tabSvcDiscoverInclServices.Controls.Add(this.lbSvcInclServiceUuids); this.tabSvcDiscoverInclServices.Controls.Add(this.lblSvcInclServiceUuids); this.tabSvcDiscoverInclServices.Controls.Add(this.lblSvcDiscoverInclServices); this.tabSvcDiscoverInclServices.Location = new System.Drawing.Point(4, 22); this.tabSvcDiscoverInclServices.Name = "tabSvcDiscoverInclServices"; this.tabSvcDiscoverInclServices.Padding = new System.Windows.Forms.Padding(3); this.tabSvcDiscoverInclServices.Size = new System.Drawing.Size(632, 293); this.tabSvcDiscoverInclServices.TabIndex = 1; this.tabSvcDiscoverInclServices.Text = "Discover Included Services"; this.tabSvcDiscoverInclServices.UseVisualStyleBackColor = true; // // btnSvcChooseInclServices // this.btnSvcChooseInclServices.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnSvcChooseInclServices.Location = new System.Drawing.Point(6, 264); this.btnSvcChooseInclServices.Name = "btnSvcChooseInclServices"; this.btnSvcChooseInclServices.Size = new System.Drawing.Size(113, 23); this.btnSvcChooseInclServices.TabIndex = 3; this.btnSvcChooseInclServices.Text = "&Choose Services"; this.btnSvcChooseInclServices.UseVisualStyleBackColor = true; this.btnSvcChooseInclServices.Click += new System.EventHandler(this.btnSvcChooseInclServices_Click); // // btnSvcDiscoverInclServices // this.btnSvcDiscoverInclServices.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnSvcDiscoverInclServices.Location = new System.Drawing.Point(468, 264); this.btnSvcDiscoverInclServices.Name = "btnSvcDiscoverInclServices"; this.btnSvcDiscoverInclServices.Size = new System.Drawing.Size(158, 23); this.btnSvcDiscoverInclServices.TabIndex = 4; this.btnSvcDiscoverInclServices.Text = "&Discover Included Services"; this.btnSvcDiscoverInclServices.UseVisualStyleBackColor = true; this.btnSvcDiscoverInclServices.Click += new System.EventHandler(this.btnSvcDiscoverInclServices_Click); // // lbSvcInclServiceUuids // this.lbSvcInclServiceUuids.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lbSvcInclServiceUuids.FormattingEnabled = true; this.lbSvcInclServiceUuids.Location = new System.Drawing.Point(6, 50); this.lbSvcInclServiceUuids.Name = "lbSvcInclServiceUuids"; this.lbSvcInclServiceUuids.SelectionMode = System.Windows.Forms.SelectionMode.MultiExtended; this.lbSvcInclServiceUuids.Size = new System.Drawing.Size(620, 212); this.lbSvcInclServiceUuids.TabIndex = 2; this.lbSvcInclServiceUuids.KeyUp += new System.Windows.Forms.KeyEventHandler(this.lbUuids_KeyUp); // // lblSvcInclServiceUuids // this.lblSvcInclServiceUuids.AutoSize = true; this.lblSvcInclServiceUuids.Location = new System.Drawing.Point(6, 34); this.lblSvcInclServiceUuids.Name = "lblSvcInclServiceUuids"; this.lblSvcInclServiceUuids.Size = new System.Drawing.Size(165, 13); this.lblSvcInclServiceUuids.TabIndex = 1; this.lblSvcInclServiceUuids.Text = "Included Service Discovery &Filter:"; // // lblSvcDiscoverInclServices // this.lblSvcDiscoverInclServices.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblSvcDiscoverInclServices.ForeColor = System.Drawing.SystemColors.Highlight; this.lblSvcDiscoverInclServices.Location = new System.Drawing.Point(6, 3); this.lblSvcDiscoverInclServices.Name = "lblSvcDiscoverInclServices"; this.lblSvcDiscoverInclServices.Size = new System.Drawing.Size(620, 31); this.lblSvcDiscoverInclServices.TabIndex = 0; this.lblSvcDiscoverInclServices.Text = resources.GetString("lblSvcDiscoverInclServices.Text"); // // lblServiceColorsNote // this.lblServiceColorsNote.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblServiceColorsNote.ForeColor = System.Drawing.SystemColors.Highlight; this.lblServiceColorsNote.Location = new System.Drawing.Point(6, 55); this.lblServiceColorsNote.Name = "lblServiceColorsNote"; this.lblServiceColorsNote.Size = new System.Drawing.Size(640, 28); this.lblServiceColorsNote.TabIndex = 6; this.lblServiceColorsNote.Text = resources.GetString("lblServiceColorsNote.Text"); // // tbServiceId // this.tbServiceId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.tbServiceId.Location = new System.Drawing.Point(511, 32); this.tbServiceId.Name = "tbServiceId"; this.tbServiceId.ReadOnly = true; this.tbServiceId.Size = new System.Drawing.Size(135, 20); this.tbServiceId.TabIndex = 5; // // lblServiceId // this.lblServiceId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.lblServiceId.AutoSize = true; this.lblServiceId.Location = new System.Drawing.Point(445, 35); this.lblServiceId.Name = "lblServiceId"; this.lblServiceId.Size = new System.Drawing.Size(60, 13); this.lblServiceId.TabIndex = 4; this.lblServiceId.Text = "Service ID:"; // // lblServiceUuid // this.lblServiceUuid.AutoSize = true; this.lblServiceUuid.Location = new System.Drawing.Point(6, 35); this.lblServiceUuid.Name = "lblServiceUuid"; this.lblServiceUuid.Size = new System.Drawing.Size(76, 13); this.lblServiceUuid.TabIndex = 2; this.lblServiceUuid.Text = "Service UUID:"; // // tbServiceUuid // this.tbServiceUuid.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbServiceUuid.Location = new System.Drawing.Point(88, 32); this.tbServiceUuid.Name = "tbServiceUuid"; this.tbServiceUuid.ReadOnly = true; this.tbServiceUuid.Size = new System.Drawing.Size(351, 20); this.tbServiceUuid.TabIndex = 3; // // tbServiceName // this.tbServiceName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbServiceName.Location = new System.Drawing.Point(89, 6); this.tbServiceName.Name = "tbServiceName"; this.tbServiceName.ReadOnly = true; this.tbServiceName.Size = new System.Drawing.Size(557, 20); this.tbServiceName.TabIndex = 1; // // lblServiceName // this.lblServiceName.AutoSize = true; this.lblServiceName.Location = new System.Drawing.Point(6, 9); this.lblServiceName.Name = "lblServiceName"; this.lblServiceName.Size = new System.Drawing.Size(77, 13); this.lblServiceName.TabIndex = 0; this.lblServiceName.Text = "Service Name:"; // // tabGattCharacteristic // this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicUserDescription); this.tabGattCharacteristic.Controls.Add(this.btnUpdateCharacteristicUserDescription); this.tabGattCharacteristic.Controls.Add(this.gbCharacteristicValue); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicValueFormatExponent); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicValueFormatUnit); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicValueFormatExponent); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicValueFormatUnit); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicValueFormatType); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicValueFormats); this.tabGattCharacteristic.Controls.Add(this.numCharacteristicValueFormatIdx); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicFlags); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicFlags); this.tabGattCharacteristic.Controls.Add(this.gbCharaDiscoverDescriptors); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicUserDescription); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicId); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicId); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicUuid); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicUuid); this.tabGattCharacteristic.Controls.Add(this.tbCharacteristicName); this.tabGattCharacteristic.Controls.Add(this.lblCharacteristicName); this.tabGattCharacteristic.Location = new System.Drawing.Point(4, 22); this.tabGattCharacteristic.Name = "tabGattCharacteristic"; this.tabGattCharacteristic.Padding = new System.Windows.Forms.Padding(3); this.tabGattCharacteristic.Size = new System.Drawing.Size(652, 422); this.tabGattCharacteristic.TabIndex = 2; this.tabGattCharacteristic.Text = "[Characteristic Controls]"; this.tabGattCharacteristic.UseVisualStyleBackColor = true; // // tbCharacteristicUserDescription // this.tbCharacteristicUserDescription.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicUserDescription.Location = new System.Drawing.Point(100, 58); this.tbCharacteristicUserDescription.Name = "tbCharacteristicUserDescription"; this.tbCharacteristicUserDescription.ReadOnly = true; this.tbCharacteristicUserDescription.Size = new System.Drawing.Size(462, 20); this.tbCharacteristicUserDescription.TabIndex = 7; // // btnUpdateCharacteristicUserDescription // this.btnUpdateCharacteristicUserDescription.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnUpdateCharacteristicUserDescription.Enabled = false; this.btnUpdateCharacteristicUserDescription.Location = new System.Drawing.Point(571, 56); this.btnUpdateCharacteristicUserDescription.Name = "btnUpdateCharacteristicUserDescription"; this.btnUpdateCharacteristicUserDescription.Size = new System.Drawing.Size(75, 23); this.btnUpdateCharacteristicUserDescription.TabIndex = 8; this.btnUpdateCharacteristicUserDescription.Text = "&Update"; this.btnUpdateCharacteristicUserDescription.UseVisualStyleBackColor = true; this.btnUpdateCharacteristicUserDescription.Click += new System.EventHandler(this.btnUpdateCharacteristicUserDescription_Click); // // gbCharacteristicValue // this.gbCharacteristicValue.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbCharacteristicValue.Controls.Add(this.btnCharaPostValue); this.gbCharacteristicValue.Controls.Add(this.btnToggleSubscribe); this.gbCharacteristicValue.Controls.Add(this.btnCharaWriteValue); this.gbCharacteristicValue.Controls.Add(this.btnCharaReadValue); this.gbCharacteristicValue.Controls.Add(this.tbCharacteristicValue); this.gbCharacteristicValue.Controls.Add(this.gbCharaDisplayValueAs); this.gbCharacteristicValue.Controls.Add(this.lblCharacteristicValue); this.gbCharacteristicValue.Location = new System.Drawing.Point(6, 136); this.gbCharacteristicValue.Name = "gbCharacteristicValue"; this.gbCharacteristicValue.Size = new System.Drawing.Size(640, 234); this.gbCharacteristicValue.TabIndex = 18; this.gbCharacteristicValue.TabStop = false; this.gbCharacteristicValue.Text = "Characteristic Value"; // // btnCharaPostValue // this.btnCharaPostValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnCharaPostValue.Enabled = false; this.btnCharaPostValue.Location = new System.Drawing.Point(238, 205); this.btnCharaPostValue.Name = "btnCharaPostValue"; this.btnCharaPostValue.Size = new System.Drawing.Size(110, 23); this.btnCharaPostValue.TabIndex = 5; this.btnCharaPostValue.Text = "&Post Value"; this.btnCharaPostValue.UseVisualStyleBackColor = true; this.btnCharaPostValue.Click += new System.EventHandler(this.btnCharaPostValue_Click); // // btnToggleSubscribe // this.btnToggleSubscribe.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Right))); this.btnToggleSubscribe.Enabled = false; this.btnToggleSubscribe.Location = new System.Drawing.Point(524, 205); this.btnToggleSubscribe.Name = "btnToggleSubscribe"; this.btnToggleSubscribe.Size = new System.Drawing.Size(110, 23); this.btnToggleSubscribe.TabIndex = 6; this.btnToggleSubscribe.Text = "&Subscribe"; this.btnToggleSubscribe.UseVisualStyleBackColor = true; this.btnToggleSubscribe.Click += new System.EventHandler(this.btnToggleSubscribe_Click); // // btnCharaWriteValue // this.btnCharaWriteValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnCharaWriteValue.Enabled = false; this.btnCharaWriteValue.Location = new System.Drawing.Point(122, 205); this.btnCharaWriteValue.Name = "btnCharaWriteValue"; this.btnCharaWriteValue.Size = new System.Drawing.Size(110, 23); this.btnCharaWriteValue.TabIndex = 4; this.btnCharaWriteValue.Text = "&Write Value"; this.btnCharaWriteValue.UseVisualStyleBackColor = true; this.btnCharaWriteValue.Click += new System.EventHandler(this.btnCharaWriteValue_Click); // // btnCharaReadValue // this.btnCharaReadValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnCharaReadValue.Enabled = false; this.btnCharaReadValue.Location = new System.Drawing.Point(6, 205); this.btnCharaReadValue.Name = "btnCharaReadValue"; this.btnCharaReadValue.Size = new System.Drawing.Size(110, 23); this.btnCharaReadValue.TabIndex = 3; this.btnCharaReadValue.Text = "&Read Value"; this.btnCharaReadValue.UseVisualStyleBackColor = true; this.btnCharaReadValue.Click += new System.EventHandler(this.btnCharaReadValue_Click); // // tbCharacteristicValue // this.tbCharacteristicValue.AcceptsReturn = true; this.tbCharacteristicValue.AcceptsTab = true; this.tbCharacteristicValue.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicValue.Location = new System.Drawing.Point(6, 100); this.tbCharacteristicValue.Multiline = true; this.tbCharacteristicValue.Name = "tbCharacteristicValue"; this.tbCharacteristicValue.ReadOnly = true; this.tbCharacteristicValue.Size = new System.Drawing.Size(628, 99); this.tbCharacteristicValue.TabIndex = 2; // // gbCharaDisplayValueAs // this.gbCharaDisplayValueAs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbCharaDisplayValueAs.Controls.Add(this.rbCharaCustom); this.gbCharaDisplayValueAs.Controls.Add(this.rbCharaUTF16); this.gbCharaDisplayValueAs.Controls.Add(this.rbCharaUTF8); this.gbCharaDisplayValueAs.Controls.Add(this.cboCharaNumberType); this.gbCharaDisplayValueAs.Controls.Add(this.rbCharaNumber); this.gbCharaDisplayValueAs.Controls.Add(this.rbCharaBoolean); this.gbCharaDisplayValueAs.Controls.Add(this.btnCustomizeCharaFormat); this.gbCharaDisplayValueAs.Controls.Add(this.rbCharaHexBytes); this.gbCharaDisplayValueAs.Location = new System.Drawing.Point(6, 46); this.gbCharaDisplayValueAs.Name = "gbCharaDisplayValueAs"; this.gbCharaDisplayValueAs.Size = new System.Drawing.Size(628, 48); this.gbCharaDisplayValueAs.TabIndex = 1; this.gbCharaDisplayValueAs.TabStop = false; this.gbCharaDisplayValueAs.Text = "Display Value As..."; // // rbCharaCustom // this.rbCharaCustom.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.rbCharaCustom.AutoSize = true; this.rbCharaCustom.Location = new System.Drawing.Point(446, 19); this.rbCharaCustom.Name = "rbCharaCustom"; this.rbCharaCustom.Size = new System.Drawing.Size(95, 17); this.rbCharaCustom.TabIndex = 6; this.rbCharaCustom.Text = "Custom &Format"; this.rbCharaCustom.UseVisualStyleBackColor = true; this.rbCharaCustom.CheckedChanged += new System.EventHandler(this.rbCharaDisplayType_CheckedChanged); // // rbCharaUTF16 // this.rbCharaUTF16.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.rbCharaUTF16.AutoSize = true; this.rbCharaUTF16.Location = new System.Drawing.Point(379, 19); this.rbCharaUTF16.Name = "rbCharaUTF16"; this.rbCharaUTF16.Size = new System.Drawing.Size(61, 17); this.rbCharaUTF16.TabIndex = 5; this.rbCharaUTF16.Text = "UTF-1&6"; this.rbCharaUTF16.UseVisualStyleBackColor = true; this.rbCharaUTF16.CheckedChanged += new System.EventHandler(this.rbCharaDisplayType_CheckedChanged); // // rbCharaUTF8 // this.rbCharaUTF8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.rbCharaUTF8.AutoSize = true; this.rbCharaUTF8.Location = new System.Drawing.Point(318, 19); this.rbCharaUTF8.Name = "rbCharaUTF8"; this.rbCharaUTF8.Size = new System.Drawing.Size(55, 17); this.rbCharaUTF8.TabIndex = 4; this.rbCharaUTF8.Text = "UTF-&8"; this.rbCharaUTF8.UseVisualStyleBackColor = true; this.rbCharaUTF8.CheckedChanged += new System.EventHandler(this.rbCharaDisplayType_CheckedChanged); // // cboCharaNumberType // this.cboCharaNumberType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.cboCharaNumberType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cboCharaNumberType.FormattingEnabled = true; this.cboCharaNumberType.Items.AddRange(new object[] { "UInt8", "UInt16", "UInt32", "UInt64", "SInt8", "SInt16", "SInt32", "SInt64", "Float32", "Float64"}); this.cboCharaNumberType.Location = new System.Drawing.Point(222, 17); this.cboCharaNumberType.Name = "cboCharaNumberType"; this.cboCharaNumberType.Size = new System.Drawing.Size(90, 21); this.cboCharaNumberType.TabIndex = 3; this.cboCharaNumberType.SelectionChangeCommitted += new System.EventHandler(this.cboCharaNumberType_SelectionChangeCommitted); // // rbCharaNumber // this.rbCharaNumber.AutoSize = true; this.rbCharaNumber.Location = new System.Drawing.Point(155, 19); this.rbCharaNumber.Name = "rbCharaNumber"; this.rbCharaNumber.Size = new System.Drawing.Size(65, 17); this.rbCharaNumber.TabIndex = 2; this.rbCharaNumber.Text = "&Number:"; this.rbCharaNumber.UseVisualStyleBackColor = true; this.rbCharaNumber.CheckedChanged += new System.EventHandler(this.rbCharaDisplayType_CheckedChanged); // // rbCharaBoolean // this.rbCharaBoolean.AutoSize = true; this.rbCharaBoolean.Location = new System.Drawing.Point(85, 19); this.rbCharaBoolean.Name = "rbCharaBoolean"; this.rbCharaBoolean.Size = new System.Drawing.Size(64, 17); this.rbCharaBoolean.TabIndex = 1; this.rbCharaBoolean.Text = "&Boolean"; this.rbCharaBoolean.UseVisualStyleBackColor = true; this.rbCharaBoolean.CheckedChanged += new System.EventHandler(this.rbCharaDisplayType_CheckedChanged); // // btnCustomizeCharaFormat // this.btnCustomizeCharaFormat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnCustomizeCharaFormat.Location = new System.Drawing.Point(547, 16); this.btnCustomizeCharaFormat.Name = "btnCustomizeCharaFormat"; this.btnCustomizeCharaFormat.Size = new System.Drawing.Size(75, 23); this.btnCustomizeCharaFormat.TabIndex = 7; this.btnCustomizeCharaFormat.Text = "&Customize..."; this.btnCustomizeCharaFormat.UseVisualStyleBackColor = true; this.btnCustomizeCharaFormat.Click += new System.EventHandler(this.btnCustomizeCharaFormat_Click); // // rbCharaHexBytes // this.rbCharaHexBytes.AutoSize = true; this.rbCharaHexBytes.Checked = true; this.rbCharaHexBytes.Location = new System.Drawing.Point(6, 19); this.rbCharaHexBytes.Name = "rbCharaHexBytes"; this.rbCharaHexBytes.Size = new System.Drawing.Size(73, 17); this.rbCharaHexBytes.TabIndex = 0; this.rbCharaHexBytes.TabStop = true; this.rbCharaHexBytes.Text = "&Hex Bytes"; this.rbCharaHexBytes.UseVisualStyleBackColor = true; this.rbCharaHexBytes.CheckedChanged += new System.EventHandler(this.rbCharaDisplayType_CheckedChanged); // // lblCharacteristicValue // this.lblCharacteristicValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblCharacteristicValue.ForeColor = System.Drawing.SystemColors.Highlight; this.lblCharacteristicValue.Location = new System.Drawing.Point(6, 16); this.lblCharacteristicValue.Name = "lblCharacteristicValue"; this.lblCharacteristicValue.Size = new System.Drawing.Size(628, 27); this.lblCharacteristicValue.TabIndex = 0; this.lblCharacteristicValue.Text = resources.GetString("lblCharacteristicValue.Text"); // // lblCharacteristicValueFormatExponent // this.lblCharacteristicValueFormatExponent.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.lblCharacteristicValueFormatExponent.AutoSize = true; this.lblCharacteristicValueFormatExponent.Location = new System.Drawing.Point(524, 113); this.lblCharacteristicValueFormatExponent.Name = "lblCharacteristicValueFormatExponent"; this.lblCharacteristicValueFormatExponent.Size = new System.Drawing.Size(55, 13); this.lblCharacteristicValueFormatExponent.TabIndex = 16; this.lblCharacteristicValueFormatExponent.Text = "Exponent:"; // // lblCharacteristicValueFormatUnit // this.lblCharacteristicValueFormatUnit.AutoSize = true; this.lblCharacteristicValueFormatUnit.Location = new System.Drawing.Point(199, 113); this.lblCharacteristicValueFormatUnit.Name = "lblCharacteristicValueFormatUnit"; this.lblCharacteristicValueFormatUnit.Size = new System.Drawing.Size(29, 13); this.lblCharacteristicValueFormatUnit.TabIndex = 14; this.lblCharacteristicValueFormatUnit.Text = "Unit:"; // // tbCharacteristicValueFormatExponent // this.tbCharacteristicValueFormatExponent.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicValueFormatExponent.Location = new System.Drawing.Point(585, 110); this.tbCharacteristicValueFormatExponent.Name = "tbCharacteristicValueFormatExponent"; this.tbCharacteristicValueFormatExponent.ReadOnly = true; this.tbCharacteristicValueFormatExponent.Size = new System.Drawing.Size(61, 20); this.tbCharacteristicValueFormatExponent.TabIndex = 17; this.ToolTip1.SetToolTip(this.tbCharacteristicValueFormatExponent, resources.GetString("tbCharacteristicValueFormatExponent.ToolTip")); // // tbCharacteristicValueFormatUnit // this.tbCharacteristicValueFormatUnit.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicValueFormatUnit.Location = new System.Drawing.Point(234, 110); this.tbCharacteristicValueFormatUnit.Name = "tbCharacteristicValueFormatUnit"; this.tbCharacteristicValueFormatUnit.ReadOnly = true; this.tbCharacteristicValueFormatUnit.Size = new System.Drawing.Size(284, 20); this.tbCharacteristicValueFormatUnit.TabIndex = 15; this.ToolTip1.SetToolTip(this.tbCharacteristicValueFormatUnit, resources.GetString("tbCharacteristicValueFormatUnit.ToolTip")); // // tbCharacteristicValueFormatType // this.tbCharacteristicValueFormatType.Location = new System.Drawing.Point(128, 110); this.tbCharacteristicValueFormatType.Name = "tbCharacteristicValueFormatType"; this.tbCharacteristicValueFormatType.ReadOnly = true; this.tbCharacteristicValueFormatType.Size = new System.Drawing.Size(65, 20); this.tbCharacteristicValueFormatType.TabIndex = 13; this.ToolTip1.SetToolTip(this.tbCharacteristicValueFormatType, resources.GetString("tbCharacteristicValueFormatType.ToolTip")); // // lblCharacteristicValueFormats // this.lblCharacteristicValueFormats.AutoSize = true; this.lblCharacteristicValueFormats.Location = new System.Drawing.Point(6, 113); this.lblCharacteristicValueFormats.Name = "lblCharacteristicValueFormats"; this.lblCharacteristicValueFormats.Size = new System.Drawing.Size(77, 13); this.lblCharacteristicValueFormats.TabIndex = 11; this.lblCharacteristicValueFormats.Text = "&Value Formats:"; this.ToolTip1.SetToolTip(this.lblCharacteristicValueFormats, resources.GetString("lblCharacteristicValueFormats.ToolTip")); // // numCharacteristicValueFormatIdx // this.numCharacteristicValueFormatIdx.Location = new System.Drawing.Point(89, 110); this.numCharacteristicValueFormatIdx.Maximum = new decimal(new int[] { 1, 0, 0, -2147483648}); this.numCharacteristicValueFormatIdx.Minimum = new decimal(new int[] { 1, 0, 0, -2147483648}); this.numCharacteristicValueFormatIdx.Name = "numCharacteristicValueFormatIdx"; this.numCharacteristicValueFormatIdx.ReadOnly = true; this.numCharacteristicValueFormatIdx.Size = new System.Drawing.Size(33, 20); this.numCharacteristicValueFormatIdx.TabIndex = 12; this.ToolTip1.SetToolTip(this.numCharacteristicValueFormatIdx, resources.GetString("numCharacteristicValueFormatIdx.ToolTip")); this.numCharacteristicValueFormatIdx.Value = new decimal(new int[] { 1, 0, 0, -2147483648}); this.numCharacteristicValueFormatIdx.ValueChanged += new System.EventHandler(this.numCharacteristicValueFormatIdx_ValueChanged); // // tbCharacteristicFlags // this.tbCharacteristicFlags.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicFlags.Location = new System.Drawing.Point(47, 84); this.tbCharacteristicFlags.Name = "tbCharacteristicFlags"; this.tbCharacteristicFlags.ReadOnly = true; this.tbCharacteristicFlags.Size = new System.Drawing.Size(599, 20); this.tbCharacteristicFlags.TabIndex = 10; // // lblCharacteristicFlags // this.lblCharacteristicFlags.AutoSize = true; this.lblCharacteristicFlags.Location = new System.Drawing.Point(6, 87); this.lblCharacteristicFlags.Name = "lblCharacteristicFlags"; this.lblCharacteristicFlags.Size = new System.Drawing.Size(35, 13); this.lblCharacteristicFlags.TabIndex = 9; this.lblCharacteristicFlags.Text = "Flags:"; // // gbCharaDiscoverDescriptors // this.gbCharaDiscoverDescriptors.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbCharaDiscoverDescriptors.Controls.Add(this.lblCharaDiscoverDescriptors); this.gbCharaDiscoverDescriptors.Controls.Add(this.btnCharaDiscoverDescriptors); this.gbCharaDiscoverDescriptors.Location = new System.Drawing.Point(6, 376); this.gbCharaDiscoverDescriptors.Name = "gbCharaDiscoverDescriptors"; this.gbCharaDiscoverDescriptors.Size = new System.Drawing.Size(640, 40); this.gbCharaDiscoverDescriptors.TabIndex = 19; this.gbCharaDiscoverDescriptors.TabStop = false; this.gbCharaDiscoverDescriptors.Text = "Discover Descriptors"; // // lblCharaDiscoverDescriptors // this.lblCharaDiscoverDescriptors.AutoSize = true; this.lblCharaDiscoverDescriptors.ForeColor = System.Drawing.SystemColors.Highlight; this.lblCharaDiscoverDescriptors.Location = new System.Drawing.Point(6, 16); this.lblCharaDiscoverDescriptors.Name = "lblCharaDiscoverDescriptors"; this.lblCharaDiscoverDescriptors.Size = new System.Drawing.Size(454, 13); this.lblCharaDiscoverDescriptors.TabIndex = 0; this.lblCharaDiscoverDescriptors.Text = "BLEClient allows you to discover all of a characteristic\'s descriptors. Press the" + " button the do so."; // // btnCharaDiscoverDescriptors // this.btnCharaDiscoverDescriptors.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnCharaDiscoverDescriptors.Location = new System.Drawing.Point(511, 11); this.btnCharaDiscoverDescriptors.Name = "btnCharaDiscoverDescriptors"; this.btnCharaDiscoverDescriptors.Size = new System.Drawing.Size(123, 23); this.btnCharaDiscoverDescriptors.TabIndex = 1; this.btnCharaDiscoverDescriptors.Text = "&Discover Descriptors"; this.btnCharaDiscoverDescriptors.UseVisualStyleBackColor = true; this.btnCharaDiscoverDescriptors.Click += new System.EventHandler(this.btnCharaDiscoverDescriptors_Click); // // lblCharacteristicUserDescription // this.lblCharacteristicUserDescription.AutoSize = true; this.lblCharacteristicUserDescription.Location = new System.Drawing.Point(6, 61); this.lblCharacteristicUserDescription.Name = "lblCharacteristicUserDescription"; this.lblCharacteristicUserDescription.Size = new System.Drawing.Size(88, 13); this.lblCharacteristicUserDescription.TabIndex = 6; this.lblCharacteristicUserDescription.Text = "User D&escription:"; // // tbCharacteristicId // this.tbCharacteristicId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicId.Location = new System.Drawing.Point(518, 32); this.tbCharacteristicId.Name = "tbCharacteristicId"; this.tbCharacteristicId.ReadOnly = true; this.tbCharacteristicId.Size = new System.Drawing.Size(128, 20); this.tbCharacteristicId.TabIndex = 5; // // lblCharacteristicId // this.lblCharacteristicId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.lblCharacteristicId.AutoSize = true; this.lblCharacteristicId.Location = new System.Drawing.Point(424, 35); this.lblCharacteristicId.Name = "lblCharacteristicId"; this.lblCharacteristicId.Size = new System.Drawing.Size(88, 13); this.lblCharacteristicId.TabIndex = 4; this.lblCharacteristicId.Text = "Characteristic ID:"; // // lblCharacteristicUuid // this.lblCharacteristicUuid.AutoSize = true; this.lblCharacteristicUuid.Location = new System.Drawing.Point(6, 35); this.lblCharacteristicUuid.Name = "lblCharacteristicUuid"; this.lblCharacteristicUuid.Size = new System.Drawing.Size(104, 13); this.lblCharacteristicUuid.TabIndex = 2; this.lblCharacteristicUuid.Text = "Characteristic UUID:"; // // tbCharacteristicUuid // this.tbCharacteristicUuid.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicUuid.Location = new System.Drawing.Point(116, 32); this.tbCharacteristicUuid.Name = "tbCharacteristicUuid"; this.tbCharacteristicUuid.ReadOnly = true; this.tbCharacteristicUuid.Size = new System.Drawing.Size(302, 20); this.tbCharacteristicUuid.TabIndex = 3; // // tbCharacteristicName // this.tbCharacteristicName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbCharacteristicName.Location = new System.Drawing.Point(117, 6); this.tbCharacteristicName.Name = "tbCharacteristicName"; this.tbCharacteristicName.ReadOnly = true; this.tbCharacteristicName.Size = new System.Drawing.Size(529, 20); this.tbCharacteristicName.TabIndex = 1; // // lblCharacteristicName // this.lblCharacteristicName.AutoSize = true; this.lblCharacteristicName.Location = new System.Drawing.Point(6, 9); this.lblCharacteristicName.Name = "lblCharacteristicName"; this.lblCharacteristicName.Size = new System.Drawing.Size(105, 13); this.lblCharacteristicName.TabIndex = 0; this.lblCharacteristicName.Text = "Characteristic Name:"; // // tabGattDescriptor // this.tabGattDescriptor.Controls.Add(this.gbDescriptorValue); this.tabGattDescriptor.Controls.Add(this.tbDescriptorId); this.tabGattDescriptor.Controls.Add(this.lblDescriptorId); this.tabGattDescriptor.Controls.Add(this.lblDescriptorUuid); this.tabGattDescriptor.Controls.Add(this.tbDescriptorUuid); this.tabGattDescriptor.Controls.Add(this.tbDescriptorName); this.tabGattDescriptor.Controls.Add(this.lblDescriptorName); this.tabGattDescriptor.Location = new System.Drawing.Point(4, 22); this.tabGattDescriptor.Name = "tabGattDescriptor"; this.tabGattDescriptor.Padding = new System.Windows.Forms.Padding(3); this.tabGattDescriptor.Size = new System.Drawing.Size(652, 422); this.tabGattDescriptor.TabIndex = 3; this.tabGattDescriptor.Text = "[Descriptor Controls]"; this.tabGattDescriptor.UseVisualStyleBackColor = true; // // gbDescriptorValue // this.gbDescriptorValue.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbDescriptorValue.Controls.Add(this.btnDescWriteValue); this.gbDescriptorValue.Controls.Add(this.btnDescReadValue); this.gbDescriptorValue.Controls.Add(this.tbDescriptorValue); this.gbDescriptorValue.Controls.Add(this.gbDescDisplayValueAs); this.gbDescriptorValue.Controls.Add(this.lblDescriptorValue); this.gbDescriptorValue.Location = new System.Drawing.Point(6, 58); this.gbDescriptorValue.Name = "gbDescriptorValue"; this.gbDescriptorValue.Size = new System.Drawing.Size(640, 358); this.gbDescriptorValue.TabIndex = 6; this.gbDescriptorValue.TabStop = false; this.gbDescriptorValue.Text = "Descriptor Value"; // // btnDescWriteValue // this.btnDescWriteValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnDescWriteValue.Location = new System.Drawing.Point(122, 329); this.btnDescWriteValue.Name = "btnDescWriteValue"; this.btnDescWriteValue.Size = new System.Drawing.Size(110, 23); this.btnDescWriteValue.TabIndex = 4; this.btnDescWriteValue.Text = "&Write Value"; this.btnDescWriteValue.UseVisualStyleBackColor = true; this.btnDescWriteValue.Click += new System.EventHandler(this.btnDescWriteValue_Click); // // btnDescReadValue // this.btnDescReadValue.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Bottom | System.Windows.Forms.AnchorStyles.Left))); this.btnDescReadValue.Location = new System.Drawing.Point(6, 329); this.btnDescReadValue.Name = "btnDescReadValue"; this.btnDescReadValue.Size = new System.Drawing.Size(110, 23); this.btnDescReadValue.TabIndex = 3; this.btnDescReadValue.Text = "&Read Value"; this.btnDescReadValue.UseVisualStyleBackColor = true; this.btnDescReadValue.Click += new System.EventHandler(this.btnDescReadValue_Click); // // tbDescriptorValue // this.tbDescriptorValue.AcceptsReturn = true; this.tbDescriptorValue.AcceptsTab = true; this.tbDescriptorValue.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbDescriptorValue.Location = new System.Drawing.Point(6, 87); this.tbDescriptorValue.Multiline = true; this.tbDescriptorValue.Name = "tbDescriptorValue"; this.tbDescriptorValue.Size = new System.Drawing.Size(628, 236); this.tbDescriptorValue.TabIndex = 2; // // gbDescDisplayValueAs // this.gbDescDisplayValueAs.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.gbDescDisplayValueAs.Controls.Add(this.rbDescCustom); this.gbDescDisplayValueAs.Controls.Add(this.btnCustomizeDescFormat); this.gbDescDisplayValueAs.Controls.Add(this.rbDescUTF16); this.gbDescDisplayValueAs.Controls.Add(this.rbDescUTF8); this.gbDescDisplayValueAs.Controls.Add(this.cboDescNumberType); this.gbDescDisplayValueAs.Controls.Add(this.rbDescNumber); this.gbDescDisplayValueAs.Controls.Add(this.rbDescBoolean); this.gbDescDisplayValueAs.Controls.Add(this.rbDescHexBytes); this.gbDescDisplayValueAs.Location = new System.Drawing.Point(6, 33); this.gbDescDisplayValueAs.Name = "gbDescDisplayValueAs"; this.gbDescDisplayValueAs.Size = new System.Drawing.Size(628, 48); this.gbDescDisplayValueAs.TabIndex = 1; this.gbDescDisplayValueAs.TabStop = false; this.gbDescDisplayValueAs.Text = "Display Value As..."; // // rbDescCustom // this.rbDescCustom.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.rbDescCustom.AutoSize = true; this.rbDescCustom.Location = new System.Drawing.Point(446, 19); this.rbDescCustom.Name = "rbDescCustom"; this.rbDescCustom.Size = new System.Drawing.Size(95, 17); this.rbDescCustom.TabIndex = 6; this.rbDescCustom.Text = "Custom &Format"; this.rbDescCustom.UseVisualStyleBackColor = true; this.rbDescCustom.CheckedChanged += new System.EventHandler(this.rbDescDisplayType_CheckedChanged); // // btnCustomizeDescFormat // this.btnCustomizeDescFormat.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnCustomizeDescFormat.Location = new System.Drawing.Point(547, 16); this.btnCustomizeDescFormat.Name = "btnCustomizeDescFormat"; this.btnCustomizeDescFormat.Size = new System.Drawing.Size(75, 23); this.btnCustomizeDescFormat.TabIndex = 7; this.btnCustomizeDescFormat.Text = "&Customize..."; this.btnCustomizeDescFormat.UseVisualStyleBackColor = true; this.btnCustomizeDescFormat.Click += new System.EventHandler(this.btnCustomizeDescFormat_Click); // // rbDescUTF16 // this.rbDescUTF16.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.rbDescUTF16.AutoSize = true; this.rbDescUTF16.Location = new System.Drawing.Point(379, 19); this.rbDescUTF16.Name = "rbDescUTF16"; this.rbDescUTF16.Size = new System.Drawing.Size(61, 17); this.rbDescUTF16.TabIndex = 5; this.rbDescUTF16.Text = "UTF-1&6"; this.rbDescUTF16.UseVisualStyleBackColor = true; this.rbDescUTF16.CheckedChanged += new System.EventHandler(this.rbDescDisplayType_CheckedChanged); // // rbDescUTF8 // this.rbDescUTF8.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.rbDescUTF8.AutoSize = true; this.rbDescUTF8.Location = new System.Drawing.Point(318, 19); this.rbDescUTF8.Name = "rbDescUTF8"; this.rbDescUTF8.Size = new System.Drawing.Size(55, 17); this.rbDescUTF8.TabIndex = 4; this.rbDescUTF8.Text = "UTF-&8"; this.rbDescUTF8.UseVisualStyleBackColor = true; this.rbDescUTF8.CheckedChanged += new System.EventHandler(this.rbDescDisplayType_CheckedChanged); // // cboDescNumberType // this.cboDescNumberType.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.cboDescNumberType.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList; this.cboDescNumberType.FormattingEnabled = true; this.cboDescNumberType.Items.AddRange(new object[] { "UInt8", "UInt16", "UInt32", "UInt64", "SInt8", "SInt16", "SInt32", "SInt64", "Float32", "Float64"}); this.cboDescNumberType.Location = new System.Drawing.Point(222, 17); this.cboDescNumberType.Name = "cboDescNumberType"; this.cboDescNumberType.Size = new System.Drawing.Size(90, 21); this.cboDescNumberType.TabIndex = 3; this.cboDescNumberType.SelectionChangeCommitted += new System.EventHandler(this.cboDescNumberType_SelectionChangeCommitted); // // rbDescNumber // this.rbDescNumber.AutoSize = true; this.rbDescNumber.Location = new System.Drawing.Point(155, 19); this.rbDescNumber.Name = "rbDescNumber"; this.rbDescNumber.Size = new System.Drawing.Size(65, 17); this.rbDescNumber.TabIndex = 2; this.rbDescNumber.Text = "&Number:"; this.rbDescNumber.UseVisualStyleBackColor = true; this.rbDescNumber.CheckedChanged += new System.EventHandler(this.rbDescDisplayType_CheckedChanged); // // rbDescBoolean // this.rbDescBoolean.AutoSize = true; this.rbDescBoolean.Location = new System.Drawing.Point(85, 19); this.rbDescBoolean.Name = "rbDescBoolean"; this.rbDescBoolean.Size = new System.Drawing.Size(64, 17); this.rbDescBoolean.TabIndex = 1; this.rbDescBoolean.Text = "&Boolean"; this.rbDescBoolean.UseVisualStyleBackColor = true; this.rbDescBoolean.CheckedChanged += new System.EventHandler(this.rbDescDisplayType_CheckedChanged); // // rbDescHexBytes // this.rbDescHexBytes.AutoSize = true; this.rbDescHexBytes.Checked = true; this.rbDescHexBytes.Location = new System.Drawing.Point(6, 19); this.rbDescHexBytes.Name = "rbDescHexBytes"; this.rbDescHexBytes.Size = new System.Drawing.Size(73, 17); this.rbDescHexBytes.TabIndex = 0; this.rbDescHexBytes.TabStop = true; this.rbDescHexBytes.Tag = ""; this.rbDescHexBytes.Text = "&Hex Bytes"; this.rbDescHexBytes.UseVisualStyleBackColor = true; this.rbDescHexBytes.CheckedChanged += new System.EventHandler(this.rbDescDisplayType_CheckedChanged); // // lblDescriptorValue // this.lblDescriptorValue.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.lblDescriptorValue.ForeColor = System.Drawing.SystemColors.Highlight; this.lblDescriptorValue.Location = new System.Drawing.Point(6, 16); this.lblDescriptorValue.Name = "lblDescriptorValue"; this.lblDescriptorValue.Size = new System.Drawing.Size(628, 14); this.lblDescriptorValue.TabIndex = 0; this.lblDescriptorValue.Text = "These controls allow you to read and display a descriptor\'s value in a variety of" + " ways. You can also write the value."; // // tbDescriptorId // this.tbDescriptorId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.tbDescriptorId.Location = new System.Drawing.Point(523, 32); this.tbDescriptorId.Name = "tbDescriptorId"; this.tbDescriptorId.ReadOnly = true; this.tbDescriptorId.Size = new System.Drawing.Size(123, 20); this.tbDescriptorId.TabIndex = 5; // // lblDescriptorId // this.lblDescriptorId.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.lblDescriptorId.AutoSize = true; this.lblDescriptorId.Location = new System.Drawing.Point(445, 35); this.lblDescriptorId.Name = "lblDescriptorId"; this.lblDescriptorId.Size = new System.Drawing.Size(72, 13); this.lblDescriptorId.TabIndex = 4; this.lblDescriptorId.Text = "Descriptor ID:"; // // lblDescriptorUuid // this.lblDescriptorUuid.AutoSize = true; this.lblDescriptorUuid.Location = new System.Drawing.Point(6, 35); this.lblDescriptorUuid.Name = "lblDescriptorUuid"; this.lblDescriptorUuid.Size = new System.Drawing.Size(88, 13); this.lblDescriptorUuid.TabIndex = 2; this.lblDescriptorUuid.Text = "Descriptor UUID:"; // // tbDescriptorUuid // this.tbDescriptorUuid.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbDescriptorUuid.Location = new System.Drawing.Point(100, 32); this.tbDescriptorUuid.Name = "tbDescriptorUuid"; this.tbDescriptorUuid.ReadOnly = true; this.tbDescriptorUuid.Size = new System.Drawing.Size(339, 20); this.tbDescriptorUuid.TabIndex = 3; // // tbDescriptorName // this.tbDescriptorName.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbDescriptorName.Location = new System.Drawing.Point(101, 6); this.tbDescriptorName.Name = "tbDescriptorName"; this.tbDescriptorName.ReadOnly = true; this.tbDescriptorName.Size = new System.Drawing.Size(545, 20); this.tbDescriptorName.TabIndex = 1; // // lblDescriptorName // this.lblDescriptorName.AutoSize = true; this.lblDescriptorName.Location = new System.Drawing.Point(6, 9); this.lblDescriptorName.Name = "lblDescriptorName"; this.lblDescriptorName.Size = new System.Drawing.Size(89, 13); this.lblDescriptorName.TabIndex = 0; this.lblDescriptorName.Text = "Descriptor Name:"; // // lblBrowseOverlay // this.lblBrowseOverlay.Dock = System.Windows.Forms.DockStyle.Fill; this.lblBrowseOverlay.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblBrowseOverlay.Location = new System.Drawing.Point(0, 0); this.lblBrowseOverlay.Name = "lblBrowseOverlay"; this.lblBrowseOverlay.Size = new System.Drawing.Size(150, 46); this.lblBrowseOverlay.TabIndex = 0; this.lblBrowseOverlay.Text = "You must connect to a device before you can browse its data"; this.lblBrowseOverlay.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // tabSubscribed // this.tabSubscribed.Controls.Add(this.splitSubscribed); this.tabSubscribed.Location = new System.Drawing.Point(4, 22); this.tabSubscribed.Name = "tabSubscribed"; this.tabSubscribed.Size = new System.Drawing.Size(1002, 454); this.tabSubscribed.TabIndex = 3; this.tabSubscribed.Text = "Subscribed Characteristics"; this.tabSubscribed.ToolTipText = "The \"Subscribed Characteristics\" tab shows real-time updates of the values of all" + " characteristics subscribed to in the \"Browse Data\" tab."; this.tabSubscribed.UseVisualStyleBackColor = true; // // splitSubscribed // this.splitSubscribed.Dock = System.Windows.Forms.DockStyle.Fill; this.splitSubscribed.IsSplitterFixed = true; this.splitSubscribed.Location = new System.Drawing.Point(0, 0); this.splitSubscribed.Name = "splitSubscribed"; this.splitSubscribed.Orientation = System.Windows.Forms.Orientation.Horizontal; // // splitSubscribed.Panel1 // this.splitSubscribed.Panel1.AutoScroll = true; this.splitSubscribed.Panel1.Controls.Add(this.flowSubscribedCharacteristics); this.splitSubscribed.Panel1Collapsed = true; // // splitSubscribed.Panel2 // this.splitSubscribed.Panel2.Controls.Add(this.lblSubscribedOverlay); this.splitSubscribed.Size = new System.Drawing.Size(1002, 454); this.splitSubscribed.SplitterDistance = 334; this.splitSubscribed.TabIndex = 0; this.splitSubscribed.TabStop = false; // // flowSubscribedCharacteristics // this.flowSubscribedCharacteristics.AutoSize = true; this.flowSubscribedCharacteristics.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; this.flowSubscribedCharacteristics.Dock = System.Windows.Forms.DockStyle.Top; this.flowSubscribedCharacteristics.FlowDirection = System.Windows.Forms.FlowDirection.TopDown; this.flowSubscribedCharacteristics.Location = new System.Drawing.Point(0, 0); this.flowSubscribedCharacteristics.Name = "flowSubscribedCharacteristics"; this.flowSubscribedCharacteristics.Size = new System.Drawing.Size(150, 0); this.flowSubscribedCharacteristics.TabIndex = 0; this.flowSubscribedCharacteristics.WrapContents = false; this.flowSubscribedCharacteristics.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.flowSubscribedCharacteristics_ControlsChanged); this.flowSubscribedCharacteristics.ControlRemoved += new System.Windows.Forms.ControlEventHandler(this.flowSubscribedCharacteristics_ControlsChanged); // // lblSubscribedOverlay // this.lblSubscribedOverlay.Dock = System.Windows.Forms.DockStyle.Fill; this.lblSubscribedOverlay.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.lblSubscribedOverlay.Location = new System.Drawing.Point(0, 0); this.lblSubscribedOverlay.Name = "lblSubscribedOverlay"; this.lblSubscribedOverlay.Size = new System.Drawing.Size(1002, 454); this.lblSubscribedOverlay.TabIndex = 0; this.lblSubscribedOverlay.Text = "Any characteristics you subscribe to in the \"Browse Data\" tab\r\nwill show up here," + " and their values will update in real time\r\n"; this.lblSubscribedOverlay.TextAlign = System.Drawing.ContentAlignment.MiddleCenter; // // tabLog // this.tabLog.Controls.Add(this.btnPrintGattObjTree); this.tabLog.Controls.Add(this.tbLog); this.tabLog.Controls.Add(this.btnClearLog); this.tabLog.Controls.Add(this.cbLogAdvertisements); this.tabLog.Controls.Add(this.cbbLogLevel); this.tabLog.Controls.Add(this.lblLogLevel); this.tabLog.Location = new System.Drawing.Point(4, 22); this.tabLog.Name = "tabLog"; this.tabLog.Size = new System.Drawing.Size(1002, 454); this.tabLog.TabIndex = 2; this.tabLog.Text = "Log"; this.tabLog.ToolTipText = "The \"Log\" tab keeps a running log of all component operations."; this.tabLog.UseVisualStyleBackColor = true; // // btnPrintGattObjTree // this.btnPrintGattObjTree.Location = new System.Drawing.Point(756, 3); this.btnPrintGattObjTree.Name = "btnPrintGattObjTree"; this.btnPrintGattObjTree.Size = new System.Drawing.Size(162, 23); this.btnPrintGattObjTree.TabIndex = 3; this.btnPrintGattObjTree.Text = "&Print GATT Object Tree Info"; this.btnPrintGattObjTree.UseVisualStyleBackColor = true; this.btnPrintGattObjTree.Click += new System.EventHandler(this.btnPrintGattObjTree_Click); // // tbLog // this.tbLog.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.tbLog.Font = new System.Drawing.Font("Consolas", 9.75F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.tbLog.Location = new System.Drawing.Point(0, 32); this.tbLog.MaxLength = 0; this.tbLog.Multiline = true; this.tbLog.Name = "tbLog"; this.tbLog.ReadOnly = true; this.tbLog.ScrollBars = System.Windows.Forms.ScrollBars.Vertical; this.tbLog.Size = new System.Drawing.Size(1002, 422); this.tbLog.TabIndex = 4; this.tbLog.VisibleChanged += new System.EventHandler(this.tbLog_VisibleChanged); // // btnClearLog // this.btnClearLog.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right))); this.btnClearLog.AutoSize = true; this.btnClearLog.Location = new System.Drawing.Point(924, 3); this.btnClearLog.Name = "btnClearLog"; this.btnClearLog.Size = new System.Drawing.Size(75, 23); this.btnClearLog.TabIndex = 5; this.btnClearLog.Text = "&Clear Log"; this.btnClearLog.UseVisualStyleBackColor = true; this.btnClearLog.Click += new System.EventHandler(this.btnClearLog_Click); // // cbLogAdvertisements // this.cbLogAdvertisements.AutoSize = true; this.cbLogAdvertisements.CheckAlign = System.Drawing.ContentAlignment.MiddleRight; this.cbLogAdvertisements.Location = new System.Drawing.Point(192, 5); this.cbLogAdvertisements.Name = "cbLogAdvertisements"; this.cbLogAdvertisements.Size = new System.Drawing.Size(122, 17); this.cbLogAdvertisements.TabIndex = 2; this.cbLogAdvertisements.Text = "Log &Advertisements:"; this.cbLogAdvertisements.UseVisualStyleBackColor = true; // // cbbLogLevel // this.cbbLogLevel.FormattingEnabled = true; this.cbbLogLevel.Items.AddRange(new object[] { "None", "Info", "Verbose", "Debug"}); this.cbbLogLevel.Location = new System.Drawing.Point(65, 3); this.cbbLogLevel.Name = "cbbLogLevel"; this.cbbLogLevel.Size = new System.Drawing.Size(121, 21); this.cbbLogLevel.TabIndex = 1; this.cbbLogLevel.Text = "Debug"; this.cbbLogLevel.SelectedIndexChanged += new System.EventHandler(this.cbbLogLevel_SelectedIndexChanged); // // lblLogLevel // this.lblLogLevel.AutoSize = true; this.lblLogLevel.Location = new System.Drawing.Point(2, 6); this.lblLogLevel.Name = "lblLogLevel"; this.lblLogLevel.Size = new System.Drawing.Size(57, 13); this.lblLogLevel.TabIndex = 0; this.lblLogLevel.Text = "Log &Level:"; // // bleclient1 // this.bleclient1.About = "IP*Works! BLE 2016 [Build 6800]"; this.bleclient1.InvokeThrough = this; this.bleclient1.OnAdvertisement += new nsoftware.IPWorksBLE.Bleclient.OnAdvertisementHandler(this.bleclient1_OnAdvertisement); this.bleclient1.OnConnected += new nsoftware.IPWorksBLE.Bleclient.OnConnectedHandler(this.bleclient1_OnConnected); this.bleclient1.OnDisconnected += new nsoftware.IPWorksBLE.Bleclient.OnDisconnectedHandler(this.bleclient1_OnDisconnected); this.bleclient1.OnDiscovered += new nsoftware.IPWorksBLE.Bleclient.OnDiscoveredHandler(this.bleclient1_OnDiscovered); this.bleclient1.OnError += new nsoftware.IPWorksBLE.Bleclient.OnErrorHandler(this.bleclient1_OnError); this.bleclient1.OnLog += new nsoftware.IPWorksBLE.Bleclient.OnLogHandler(this.bleclient1_OnLog); this.bleclient1.OnServerUpdate += new nsoftware.IPWorksBLE.Bleclient.OnServerUpdateHandler(this.bleclient1_OnServerUpdate); this.bleclient1.OnStartScan += new nsoftware.IPWorksBLE.Bleclient.OnStartScanHandler(this.bleclient1_OnStartScan); this.bleclient1.OnStopScan += new nsoftware.IPWorksBLE.Bleclient.OnStopScanHandler(this.bleclient1_OnStopScan); this.bleclient1.OnSubscribed += new nsoftware.IPWorksBLE.Bleclient.OnSubscribedHandler(this.bleclient1_OnSubscribed); this.bleclient1.OnUnsubscribed += new nsoftware.IPWorksBLE.Bleclient.OnUnsubscribedHandler(this.bleclient1_OnUnsubscribed); this.bleclient1.OnValue += new nsoftware.IPWorksBLE.Bleclient.OnValueHandler(this.bleclient1_OnValue); this.bleclient1.OnWriteResponse += new nsoftware.IPWorksBLE.Bleclient.OnWriteResponseHandler(this.bleclient1_OnWriteResponse); // // contextMenuStrip1 // this.contextMenuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] { this.toolStripMenuItemCopyValue}); this.contextMenuStrip1.Name = "contextMenuStrip1"; this.contextMenuStrip1.RenderMode = System.Windows.Forms.ToolStripRenderMode.System; this.contextMenuStrip1.ShowImageMargin = false; this.contextMenuStrip1.Size = new System.Drawing.Size(109, 26); // // toolStripMenuItemCopyValue // this.toolStripMenuItemCopyValue.Name = "toolStripMenuItemCopyValue"; this.toolStripMenuItemCopyValue.Size = new System.Drawing.Size(108, 22); this.toolStripMenuItemCopyValue.Text = "&Copy Value"; this.toolStripMenuItemCopyValue.Click += new System.EventHandler(this.toolStripMenuItemCopyValue_Click); // // bleclientDemo // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(1034, 536); this.Controls.Add(this.tabCtrlMain); this.Controls.Add(this.lblInstructions); this.MinimumSize = new System.Drawing.Size(1050, 575); this.Name = "bleclientDemo"; this.Text = "BLEClient Demo"; this.tabCtrlMain.ResumeLayout(false); this.tabScanConnect.ResumeLayout(false); this.gbConnectCtrls.ResumeLayout(false); this.gbConnectCtrls.PerformLayout(); this.gbScanCtrls.ResumeLayout(false); this.gbScanCtrls.PerformLayout(); this.tabBrowse.ResumeLayout(false); this.splitBrowse.Panel1.ResumeLayout(false); this.splitBrowse.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitBrowse)).EndInit(); this.splitBrowse.ResumeLayout(false); this.splitData.Panel1.ResumeLayout(false); this.splitData.Panel1.PerformLayout(); this.splitData.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitData)).EndInit(); this.splitData.ResumeLayout(false); this.tabCtrlGattData.ResumeLayout(false); this.tabGattServer.ResumeLayout(false); this.tabGattServer.PerformLayout(); this.gbSrvDiscoverEverything.ResumeLayout(false); this.gbSrvDiscoverEverything.PerformLayout(); this.gbSrvDiscovery.ResumeLayout(false); this.gbSrvDiscovery.PerformLayout(); this.tabGattService.ResumeLayout(false); this.tabGattService.PerformLayout(); this.tabCtrlSvcDiscovery.ResumeLayout(false); this.tabSvcDiscoverCharacteristics.ResumeLayout(false); this.tabSvcDiscoverCharacteristics.PerformLayout(); this.tabSvcDiscoverInclServices.ResumeLayout(false); this.tabSvcDiscoverInclServices.PerformLayout(); this.tabGattCharacteristic.ResumeLayout(false); this.tabGattCharacteristic.PerformLayout(); this.gbCharacteristicValue.ResumeLayout(false); this.gbCharacteristicValue.PerformLayout(); this.gbCharaDisplayValueAs.ResumeLayout(false); this.gbCharaDisplayValueAs.PerformLayout(); ((System.ComponentModel.ISupportInitialize)(this.numCharacteristicValueFormatIdx)).EndInit(); this.gbCharaDiscoverDescriptors.ResumeLayout(false); this.gbCharaDiscoverDescriptors.PerformLayout(); this.tabGattDescriptor.ResumeLayout(false); this.tabGattDescriptor.PerformLayout(); this.gbDescriptorValue.ResumeLayout(false); this.gbDescriptorValue.PerformLayout(); this.gbDescDisplayValueAs.ResumeLayout(false); this.gbDescDisplayValueAs.PerformLayout(); this.tabSubscribed.ResumeLayout(false); this.splitSubscribed.Panel1.ResumeLayout(false); this.splitSubscribed.Panel1.PerformLayout(); this.splitSubscribed.Panel2.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.splitSubscribed)).EndInit(); this.splitSubscribed.ResumeLayout(false); this.tabLog.ResumeLayout(false); this.tabLog.PerformLayout(); this.contextMenuStrip1.ResumeLayout(false); this.ResumeLayout(false); } #endregion #region BLEClient Event Handlers private void bleclient1_OnAdvertisement(object sender, BleclientAdvertisementEventArgs e) { LogAdvertisement(e); HandleAdvertisement(e); } private void bleclient1_OnConnected(object sender, BleclientConnectedEventArgs e) { if (e.StatusCode == 0) { Log("Successfully connected to server"); SetUpBrowseTab(); } else { Log(string.Format("Failed to connect to server: [{0}] {1}", e.StatusCode, e.Description)); MessageBox.Show(string.Format("Error Connecting: [{0}] {1}", e.StatusCode, e.Description)); } tbSelectedServerId.Enabled = true; lvwDevices.Enabled = true; tbConnectedServerId.Text = !string.IsNullOrEmpty(bleclient1.ServerId) ? bleclient1.ServerId : "[Not Connected]"; btnDisconnect.Enabled = !string.IsNullOrEmpty(bleclient1.ServerId); btnConnect.Enabled = true; } private void bleclient1_OnDisconnected(object sender, BleclientDisconnectedEventArgs e) { Log(string.Format("Disconnected from server: [{0}] {1}", e.StatusCode, e.Description)); ResetBrowseTab(); ResetSubscribedCharacteristicsTab(); btnDisconnect.Enabled = false; tbConnectedServerId.Text = "[Not Connected]"; tbSelectedServerId.Enabled = true; btnConnect.Enabled = true; } private void bleclient1_OnDiscovered(object sender, BleclientDiscoveredEventArgs e) { HandleGattObjDiscovered(e); } private void bleclient1_OnError(object sender, BleclientErrorEventArgs e) { LogAndShowMessage(string.Format("Error: [{0}] {1}", e.ErrorCode, e.Description)); } private void bleclient1_OnLog(object sender, BleclientLogEventArgs e) { Log(string.Format("Log [{0}]: {1} - {2}", TranslateLogLevel(e.LogLevel), e.LogType, e.Message)); } private void bleclient1_OnServerUpdate(object sender, BleclientServerUpdateEventArgs e) { Log("Server Update: Name=" + e.Name); UpdateServerName(); } private void bleclient1_OnStartScan(object sender, BleclientStartScanEventArgs e) { Log("Start Scan: " + (string.IsNullOrEmpty(e.ServiceUuids) ? "[No Filter]" : e.ServiceUuids)); btnScan.Text = "&Stop Scanning"; btnScan.Enabled = true; } private void bleclient1_OnStopScan(object sender, BleclientStopScanEventArgs e) { Log(e.ErrorCode != 0 ? string.Format("StopScan: [{0}] {1}", e.ErrorCode, e.ErrorDescription) : "StopScan fired"); btnScan.Text = "&Start Scanning"; SetScanCtrlsEnabled(true); btnScan.Enabled = true; } private void bleclient1_OnSubscribed(object sender, BleclientSubscribedEventArgs e) { Log(string.Format("Subscribed to characteristic {0} ({1})", e.Uuid, e.CharacteristicId)); CreateSubCharaRow(GetCharacteristic(e.ServiceId, e.CharacteristicId)); } private void bleclient1_OnUnsubscribed(object sender, BleclientUnsubscribedEventArgs e) { Log(string.Format("Unsubscribed from characteristic {0} ({1})", e.Uuid, e.CharacteristicId)); RemoveSubCharaRow(e.CharacteristicId); } private void bleclient1_OnValue(object sender, BleclientValueEventArgs e) { // We only handle characteristic values here. Descriptors values are handled without events. if (string.IsNullOrEmpty(e.DescriptorId)) { RefreshDisplayedValueForCharacteristic(e.CharacteristicId, e.Uuid, e.ValueB); // Can we write this to disk here??? Seems to be working, SEpt 25 2018 PRAA //string pathString = @"c:\WiiGraphData\DataChannel2"; // Channel 2 = RED, Channel1 = BLUE string pathString = @"c:\WiiGraphData\DataChannel1"; //byte[] data = new byte[] { 0x41, 0x42, 0x43, 0x44 }; byte[] data = e.ValueB; int index; int limit = data.Length; Stopwatch stopwatch = new Stopwatch(); // Begin timing. stopwatch.Start(); Boolean done = false; int howMany = 0; while (!done) { try { using (System.IO.FileStream fs = System.IO.File.Create(pathString)) { /*for (index = 0; index < limit; index++) { fs.WriteByte(data[index]); fs. }*/ fs.Write(data, 0, limit); fs.Close(); done = true; } } catch (Exception) { // delay 7 milliseconds and try again System.Threading.Thread.Sleep(7); howMany += 1; if (howMany > 10) done = true; //throw; if (howMany == 2) { // PUt in test here to see if the directory is missing - if so, create it. string dataDirectory = @"c:\WiiGraphData"; if (!Directory.Exists(dataDirectory)) Directory.CreateDirectory(dataDirectory); } } } // Stop timing. stopwatch.Stop(); // Write result. Console.WriteLine("Time elapsed RED: {0}", stopwatch.Elapsed); } } private void bleclient1_OnWriteResponse(object sender, BleclientWriteResponseEventArgs e) { if (string.IsNullOrEmpty(e.DescriptorId)) Log(string.Format("Characteristic Write Response: {0} ({1})", e.Uuid, e.CharacteristicId)); else Log(string.Format("Descriptor Write Response: {0} ({1})", e.Uuid, e.DescriptorId)); } #endregion #region Scan and Connect Tab private void SetScanCtrlsEnabled(bool enabled) { cbActiveScanning.Enabled = btnChooseScanUuids.Enabled = lbScanFilter.Enabled = enabled; } private void btnChooseScanUuids_Click(object sender, EventArgs e) { OpenUuidPickerForListbox(TYPE_SERVICE, lbScanFilter); } private void btnScan_Click(object sender, EventArgs e) { btnScan.Enabled = false; SetScanCtrlsEnabled(false); if (btnScan.Text == "&Start Scanning" && !bleclient1.Scanning) { lvwDevices.Items.Clear(); try { bleclient1.ActiveScanning = cbActiveScanning.Checked; bleclient1.StartScanning(GetUuidListStrFromListbox(lbScanFilter)); } catch (IPWorksBLEException ex) { HandleEx(ex); SetScanCtrlsEnabled(true); btnScan.Enabled = true; } } else if (btnScan.Text == "&Stop Scanning" && bleclient1.Scanning) bleclient1.StopScanning(); // StartScan and StopScan events take care of the rest. } private void HandleAdvertisement(BleclientAdvertisementEventArgs e) { ListViewItem advertItem = lvwDevices.Items[e.ServerId]; if (advertItem == null) { // Need to make a new item. advertItem = new ListViewItem(new string[] { e.ServerId, e.Name, e.RSSI.ToString(), e.TxPower == int.MinValue ? "" : e.TxPower.ToString(), e.IsConnectable.ToString(), GattUuidUtils.GetNiceNames(e.ServiceUuids), GattUuidUtils.GetNiceNames(e.ServicesWithData), e.ManufacturerCompanyId.ToString(), BitConverter.ToString(e.ManufacturerDataB), GattUuidUtils.GetNiceNames(e.SolicitedServiceUuids) }); advertItem.Name = e.ServerId; if (advertItem.SubItems[5].Text.Equals("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")) { Console.WriteLine("they are equal"); advertItem.SubItems[1].Text = " goal !! "; } //ifadvertItem.Name = "just because"; lvwDevices.Items.Add(advertItem); } else { // Need to update an existing item. // Don't overwrite our name with empty. string temp = advertItem.SubItems[1].Text; if (string.IsNullOrEmpty(temp) || (!string.IsNullOrEmpty(e.Name) && !temp.Equals(e.Name))) advertItem.SubItems[1].Text = e.Name; //advertItem.SubItems[1].Text = "why isn't this here?"; // testing MArch 2019 PRAA //advertItem.SubItems[1].Text = "testing 1 2 3 "; advertItem.SubItems[2].Text = e.RSSI.ToString(); advertItem.SubItems[3].Text = e.TxPower == int.MinValue ? "" : e.TxPower.ToString(); // We want to keep our "IsConnectable" column true if we ever got a "true"...that way scan response can't make it false again. temp = advertItem.SubItems[4].Text; advertItem.SubItems[4].Text = !string.IsNullOrEmpty(temp) ? (bool.Parse(temp) || e.IsConnectable).ToString() : e.IsConnectable.ToString(); // Don't overwrite our serviceUuids with empty. temp = advertItem.SubItems[5].Text; if (string.IsNullOrEmpty(temp)) advertItem.SubItems[5].Text = GattUuidUtils.GetNiceNames(e.ServiceUuids); else advertItem.SubItems[5].Text = !string.IsNullOrEmpty(e.ServiceUuids) ? GattUuidUtils.GetNiceNames(e.ServiceUuids) : temp; /* TEsting, PRAA MArch 2019 */ int test = advertItem.SubItems[1].Text.IndexOf("luefruit52Oct12"); if (test==1) { test = advertItem.SubItems[1].Text.Length; char RedOrBlue = advertItem.SubItems[1].Text[test - 1]; Console.WriteLine("the letter is {0}", RedOrBlue); if ((RedOrBlue == '1') || (RedOrBlue == '3') || (RedOrBlue == '5') || (RedOrBlue == '7') || (RedOrBlue == '9')) { Console.WriteLine("It seems odd"); advertItem.SubItems[6].Text = "WeTooMove - Blue"; } else { Console.WriteLine("It's not odd, it's even"); advertItem.SubItems[6].Text = "WeTooMove - Red"; } } /*if (advertItem.SubItems[5].Text.Equals("6E400001-B5A3-F393-E0A9-E50E24DCCA9E")) { Console.WriteLine("they are equal, trying to Connect"); advertItem.SubItems[1].Text = " goal "; try { bleclient1.Connect(advertItem.SubItems[0].Text); Console.WriteLine(" enter something . . . . I'll wait for you"); string hemp = Console.ReadLine(); Console.WriteLine(hemp); hemp = bleclient1.ServerName; Console.WriteLine(hemp); } catch (IPWorksBLEException ex) { HandleEx(ex); Console.WriteLine("an error occurred"); } bleclient1.Disconnect(); } */ // Don't overwrite our servicesWithData with empty. temp = advertItem.SubItems[6].Text; if (string.IsNullOrEmpty(temp)) advertItem.SubItems[6].Text = GattUuidUtils.GetNiceNames(e.ServicesWithData); else advertItem.SubItems[6].Text = !string.IsNullOrEmpty(e.ServicesWithData) ? GattUuidUtils.GetNiceNames(e.ServicesWithData) : temp; // Don't overwrite our manufacturer data details. temp = advertItem.SubItems[7].Text; if (string.IsNullOrEmpty(temp) || e.ManufacturerCompanyId != -1) { advertItem.SubItems[7].Text = e.ManufacturerCompanyId.ToString(); advertItem.SubItems[8].Text = BitConverter.ToString(e.ManufacturerDataB); } // Don't overwrite our solicitiedServiceUuids with empty. temp = advertItem.SubItems[9].Text; if (string.IsNullOrEmpty(temp)) advertItem.SubItems[9].Text = GattUuidUtils.GetNiceNames(e.SolicitedServiceUuids); else advertItem.SubItems[9].Text = !string.IsNullOrEmpty(e.SolicitedServiceUuids) ? GattUuidUtils.GetNiceNames(e.SolicitedServiceUuids) : temp; } } private void btnConnect_Click(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(tbSelectedServerId.Text) || tbSelectedServerId.Text.Trim().Equals(bleclient1.ServerId, StringComparison.OrdinalIgnoreCase)) return; btnConnect.Enabled = false; btnDisconnect.Enabled = false; lvwDevices.Enabled = false; tbSelectedServerId.Enabled = false; try { bleclient1.Connect(tbSelectedServerId.Text); } catch (IPWorksBLEException ex) { HandleEx(ex); tbSelectedServerId.Enabled = true; lvwDevices.Enabled = true; btnDisconnect.Enabled = !string.IsNullOrEmpty(bleclient1.ServerId); btnConnect.Enabled = true; } // Connected event (and possibly Disconnected and StopScan events too) will take care of the rest. } private void btnDisconnect_Click(object sender, EventArgs e) { btnDisconnect.Enabled = false; if (string.IsNullOrEmpty(bleclient1.ServerId)) { // Already disconnected! tbConnectedServerId.Text = "[Not Connected]"; return; } btnConnect.Enabled = false; tbSelectedServerId.Enabled = false; bleclient1.Disconnect(); // Disconnected event will take care of the rest. } private void lvwDevices_SelectedIndexChanged(object sender, EventArgs e) { if (lvwDevices.SelectedItems.Count == 0) return; tbSelectedServerId.Text = lvwDevices.SelectedItems[0].Name; } private void lvwDevices_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { ListViewHitTestInfo htInfo = lvwDevices.HitTest(e.Location); if (htInfo.Item != null && htInfo.SubItem != null) { toolStripMenuItemCopyValue.Tag = htInfo.SubItem.Text; contextMenuStrip1.Show(lvwDevices, e.Location); } } } private void toolStripMenuItemCopyValue_Click(object sender, EventArgs e) { if (toolStripMenuItemCopyValue.Tag != null) Clipboard.SetText((string) toolStripMenuItemCopyValue.Tag); } #endregion #region Browse Data Tab private void SetUpBrowseTab() { UpdateServerName(); if (treeGattObjects.SelectedNode == GetServerNode()) { // Workaround for AfterSelect not firing when already-selected node is selected. UpdateServerDataTab(); tabCtrlGattData.SelectedIndex = TYPE_SERVER; } else treeGattObjects.SelectedNode = GetServerNode(); splitBrowse.Panel1Collapsed = false; splitBrowse.Panel2Collapsed = true; // try to automate - March 27 PRAA object sender = null; EventArgs e = null; btnSrvDiscoverEverything_Click(sender, e); } private void ResetBrowseTab() { GetServerNode().Nodes.Clear(); UpdateServerName(); // We need a default number selection for these. cboCharaNumberType.SelectedItem = "SInt32"; cboDescNumberType.SelectedItem = "SInt32"; splitBrowse.Panel1Collapsed = true; splitBrowse.Panel2Collapsed = false; } #region Discovery and TreeView Handling private void HandleGattObjDiscovered(BleclientDiscoveredEventArgs e) { int index = 0; // used to find the stuff we want to subscribe to // In the case of services, we'll need to check to see if we've discovered that an _already discovered_ service TreeNode node = GetNodeById(e.ServiceId, e.CharacteristicId, e.DescriptorId); TreeNode parentNode = null; if (node == null && !string.IsNullOrEmpty(e.DescriptorId)) { // Create a descriptor TreeNode. Descriptor d = GetDescriptor(e.ServiceId, e.CharacteristicId, e.DescriptorId); if (node == null) { // Make sure that we have a display type and custom format ready for this UUID. if (!uuidDisplayTypes.ContainsKey(d.Uuid)) uuidDisplayTypes[d.Uuid] = DisplayType.HexBytes; if (!uuidCustomFormats.ContainsKey(d.Uuid)) uuidCustomFormats[d.Uuid] = new CustomFormat(); } node = new TreeNode() { Name = e.DescriptorId, Text = GattUuidUtils.GetNiceName(d.Uuid) }; parentNode = GetNodeById(e.ServiceId, e.CharacteristicId, null); } else if (node == null && !string.IsNullOrEmpty(e.CharacteristicId)) { // Create a characteristic TreeNode. Characteristic c = GetCharacteristic(e.ServiceId, e.CharacteristicId); if (node == null) { // Make sure that we have a display type and custom format ready for this UUID. if (!uuidDisplayTypes.ContainsKey(c.Uuid)) uuidDisplayTypes[c.Uuid] = DisplayType.HexBytes; if (!uuidCustomFormats.ContainsKey(c.Uuid)) uuidCustomFormats[c.Uuid] = new CustomFormat(); } node = new TreeNode() { Name = e.CharacteristicId, Text = GattUuidUtils.GetNiceName(c.Uuid) }; parentNode = GetNodeById(e.ServiceId, null, null); } else if (!string.IsNullOrEmpty(e.ServiceId)) { if (node == null) { // Create a service TreeNode. Service s = GetService(e.ServiceId); node = new TreeNode() { Name = e.ServiceId, Text = GattUuidUtils.GetNiceName(s.Uuid) }; parentNode = GetServerNode(); } ColorServiceNode(node); } if (node != null) { // test to see if it's one of our units . . . . could also check the color at this point . . . Console.WriteLine("Node follows this"); Console.WriteLine(node); Console.WriteLine("trying to compare"); string magic_string = "6E400003-B5A3-F393-E0A9-E50E24DCCA9E"; //string magic_string = "6E40000"; Console.WriteLine("mAgic = {0}", magic_string); string buffer = "{0}"; buffer = string.Format( buffer, node); Console.WriteLine(buffer); // Note that Buffer contains leading text along the lines of "Tree ID: . . . . index = buffer.IndexOf(magic_string, StringComparison.OrdinalIgnoreCase); Console.WriteLine("Using the index function {0}", index); // If it's a match, try to connect . . . . but only after adding the node } // Add the new node to its parent, and make sure the parent is expanded. if (parentNode != null) { parentNode.Nodes.Add(node); if (!parentNode.IsExpanded) parentNode.Expand(); } // now that it's added, if it is the one we are looking for, try to subscribe to it if (index > 1) { //this is the btnToggleSubscribe . . . SetMainTabsEnabled(false); try { // TreeNode node = treeGattObjects.SelectedNode; bleclient1.Subscribe(node.Parent.Name, node.Name); } catch (IPWorksBLEException ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } } private void treeGattObjects_AfterSelect(object sender, TreeViewEventArgs e) { treeGattObjects.Enabled = false; // Determine what type of TreeNode this is based on its level. switch (e.Node.Level) { case TYPE_SERVER: UpdateServerDataTab(); break; case TYPE_SERVICE: UpdateServiceDataTab(e.Node); break; case TYPE_CHARACTERISTIC: UpdateCharacteristicDataTab(e.Node); break; case TYPE_DESCRIPTOR: UpdateDescriptorDataTab(e.Node); break; } // Select the tab containing the appropriate controls. tabCtrlGattData.SelectedIndex = e.Node.Level; treeGattObjects.Enabled = true; } private void treeGattObjects_BeforeCollapse(object sender, TreeViewCancelEventArgs e) { // Don't allow user to collapse nodes. e.Cancel = true; } private TreeNode GetServerNode() { // The server node is always present, and is always the only root node. return treeGattObjects.Nodes[0]; } private TreeNode GetNodeById(string serviceId, string characteristicId, string descriptorId) { TreeNode node = null; // Get service node. if (!GetServerNode().Nodes.ContainsKey(serviceId)) return null; node = GetServerNode().Nodes[serviceId]; if (string.IsNullOrEmpty(characteristicId)) return node; // Get characteristic node. if (!node.Nodes.ContainsKey(characteristicId)) return null; node = node.Nodes[characteristicId]; if (string.IsNullOrEmpty(descriptorId)) return node; // Get Descriptor node. if (!node.Nodes.ContainsKey(descriptorId)) return null; return node.Nodes[descriptorId]; } private void UpdateServerName() { if (string.IsNullOrEmpty(bleclient1.ServerId)) { GetServerNode().Text = "[Server]"; } else { GetServerNode().Text = string.IsNullOrEmpty(bleclient1.ServerName) ? ("[" + bleclient1.ServerId + "]") : bleclient1.ServerName; } tbServerName.Text = bleclient1.ServerName; } private void ColorServiceNode(TreeNode svcNodeToColor) { Color newColor = treeGattObjects.ForeColor; if (treeGattObjects.SelectedNode.Level == TYPE_SERVICE) { Service currService = GetService(treeGattObjects.SelectedNode.Name); if (currService.IncludedSvcIds.Contains(svcNodeToColor.Name)) newColor = CHILD_SVC_COLOR; else if (currService.ParentSvcIds.Contains(svcNodeToColor.Name)) newColor = PARENT_SVC_COLOR; } svcNodeToColor.ForeColor = newColor; } private void ColorAllServiceNodes() { foreach (TreeNode svcNode in GetServerNode().Nodes) ColorServiceNode(svcNode); } #endregion #region Server Data private void UpdateServerDataTab() { tbServerName.Text = bleclient1.ServerName; tbServerId.Text = bleclient1.ServerId; ColorAllServiceNodes(); } private void btnSrvChooseServiceUuids_Click(object sender, EventArgs e) { OpenUuidPickerForListbox(TYPE_SERVICE, lbSrvServiceUuids); } private void btnSrvDiscoverServices_Click(object sender, EventArgs e) { SetMainTabsEnabled(false); bleclient1.DiscoverServices(GetUuidListStrFromListbox(lbSrvServiceUuids), ""); SetMainTabsEnabled(true); } private void btnSrvDiscoverEverything_Click(object sender, EventArgs e) { SetMainTabsEnabled(false); bleclient1.Discover("", "", true, ""); SetMainTabsEnabled(true); } #endregion #region Service Data private void UpdateServiceDataTab(TreeNode node) { Service currService = GetService(node.Name); tbServiceName.Text = GattUuidUtils.GetNiceName(currService.Uuid); tbServiceUuid.Text = currService.Uuid; tbServiceId.Text = currService.Id; ColorAllServiceNodes(); } private void btnSvcChooseCharacteristics_Click(object sender, EventArgs e) { OpenUuidPickerForListbox(TYPE_CHARACTERISTIC, lbSvcCharacteristicUuids); } private void btnSvcDiscoverCharacteristics_Click(object sender, EventArgs e) { SetMainTabsEnabled(false); bleclient1.DiscoverCharacteristics(tbServiceId.Text, GetUuidListStrFromListbox(lbSvcCharacteristicUuids)); SetMainTabsEnabled(true); } private void btnSvcChooseInclServices_Click(object sender, EventArgs e) { OpenUuidPickerForListbox(TYPE_SERVICE, lbSvcInclServiceUuids); } private void btnSvcDiscoverInclServices_Click(object sender, EventArgs e) { SetMainTabsEnabled(false); bleclient1.DiscoverServices(GetUuidListStrFromListbox(lbSvcInclServiceUuids), tbServiceId.Text); SetMainTabsEnabled(true); } #endregion #region Characteristic Data private void UpdateCharacteristicDataTab(TreeNode node) { Characteristic currCharacteristic = GetCharacteristic(node.Parent.Name, node.Name); string uuid = currCharacteristic.Uuid; int flags = currCharacteristic.Flags; tbCharacteristicName.Text = GattUuidUtils.GetNiceName(uuid); tbCharacteristicUserDescription.Text = currCharacteristic.UserDescription; btnUpdateCharacteristicUserDescription.Enabled = HasFlag(FLAG_WRITABLE_AUXILIARIES, flags); tbCharacteristicUserDescription.ReadOnly = !btnUpdateCharacteristicUserDescription.Enabled; tbCharacteristicUuid.Text = currCharacteristic.Uuid; tbCharacteristicId.Text = currCharacteristic.Id; tbCharacteristicFlags.Text = TranslateFlags(flags); if (currCharacteristic.ValueFormatCount > 0) { numCharacteristicValueFormatIdx.Minimum = 0; numCharacteristicValueFormatIdx.Maximum = currCharacteristic.ValueFormatCount - 1; } else { numCharacteristicValueFormatIdx.Minimum = -1; numCharacteristicValueFormatIdx.Maximum = -1; } btnCharaReadValue.Enabled = HasFlag(FLAG_READ, flags); btnCharaWriteValue.Enabled = HasFlag(FLAG_WRITE, flags); btnCharaPostValue.Enabled = HasFlag(FLAG_WRITE_NO_RESPONSE, flags); tbCharacteristicValue.ReadOnly = !(btnCharaWriteValue.Enabled || btnCharaPostValue.Enabled); btnToggleSubscribe.Enabled = HasFlag(FLAG_NOTIFY, flags) || HasFlag(FLAG_INDICATE, flags); btnToggleSubscribe.Text = (btnToggleSubscribe.Enabled && currCharacteristic.Subscribed) ? "Unsubscribe" : "Subscribe"; currValue = btnCharaReadValue.Enabled ? currCharacteristic.CachedValueB : new byte[] {}; RestoreSelectedCharacteristicDisplayType(currCharacteristic.Uuid); tbCharacteristicValue.Text = ValueFormatter.BytesToFormattedValue(currValue, uuidDisplayTypes[uuid], uuidCustomFormats[uuid]); ColorAllServiceNodes(); if (btnToggleSubscribe.Text.Equals("Unsubscribe")) CreateSubCharaRow(currCharacteristic); } /// /// Selects the correct radio button (and number type, if applicable) based on the DisplayType currently /// associated with the current characteristic's UUID. /// private void RestoreSelectedCharacteristicDisplayType(string charaUuid) { suppressEvents = true; DisplayType dt = uuidDisplayTypes[charaUuid]; string dtStr = ValueFormatter.DisplayTypeToString(dt); if (cboCharaNumberType.Items.Contains(dtStr)) { cboCharaNumberType.SelectedItem = dtStr; rbCharaNumber.Checked = true; } else { gbCharaDisplayValueAs.Controls.OfType().FirstOrDefault(r => r.Text.Replace("&", "").Contains(dtStr)).Checked = true; } suppressEvents = false; } /// /// Refreshes the currently displayed value for the characteristic with the given ID and UUID. This will affect /// the browse tab if the currently shown item is the specified characteristic, and the subscribed characteristics /// tab if we're subscribed to the specified characteristic. /// /// Characteristic ID /// Characteristic UUID /// If not null, the new value to set before updating the displayed value private void RefreshDisplayedValueForCharacteristic(string charaId, string charaUuid, byte[] newValue) { // Get latest display type and custom format. DisplayType dt = uuidDisplayTypes[charaUuid]; CustomFormat customFormat = dt == DisplayType.Custom ? uuidCustomFormats[charaUuid] : null; // If we're currently showing this characteristic in the Browse tab, refresh there. TreeNode currNode = treeGattObjects.SelectedNode; if (currNode.Level == TYPE_CHARACTERISTIC && currNode.Name.Equals(charaId)) { if (newValue != null) currValue = newValue; tbCharacteristicValue.Text = ValueFormatter.BytesToFormattedValue(currValue, dt, customFormat); } // If we're subscribed to this characteristic in the Subscribed Characteristics tab, refresh there. SubscribedCharacteristic subbedChara = GetSubCharaForId(charaId); if (subbedChara != null) subbedChara.RefreshDisplayedValue(dt, customFormat, newValue); } /// /// Updates the samed display type for a characteristic, takes case of ensuring that both the browse and subscribed /// characteristics tabs are in sync if need be, and refreshes the displayed value to reflect the change. /// /// New DisplayType for the characteristic /// Characteristic ID /// Characteristic UUID /// If true, called from the Subscribed Characteristics tab; if false, called from the Browse tab private void UpdateDisplayTypeForCharacteristic(DisplayType newDt, string charaId, string charaUuid, bool fromSubChara) { uuidDisplayTypes[charaUuid] = newDt; // Make sure that all places using this are in sync. if (fromSubChara) RestoreSelectedCharacteristicDisplayType(charaUuid); else { SubscribedCharacteristic subbedChara = GetSubCharaForId(charaId); if (subbedChara != null) subbedChara.RestoreSelectedDisplayType(); } // Refresh the displayed value for this characteristic everywhere. RefreshDisplayedValueForCharacteristic(charaId, charaUuid, null); } private void numCharacteristicValueFormatIdx_ValueChanged(object sender, EventArgs e) { numCharacteristicValueFormatIdx.Enabled = false; Characteristic currCharacteristic = GetCharacteristic(treeGattObjects.SelectedNode.Parent.Name, treeGattObjects.SelectedNode.Name); currCharacteristic.ValueFormatIndex = (int) numCharacteristicValueFormatIdx.Value; tbCharacteristicValueFormatType.Text = currCharacteristic.ValueFormat.ToString().Replace("vf", ""); tbCharacteristicValueFormatUnit.Text = GattUuidUtils.GetNiceName(currCharacteristic.ValueUnit); tbCharacteristicValueFormatExponent.Text = currCharacteristic.ValueExponent.ToString(); numCharacteristicValueFormatIdx.Enabled = currCharacteristic.ValueFormatCount > 0; } private void btnUpdateCharacteristicUserDescription_Click(object sender, EventArgs e) { TreeNode node = treeGattObjects.SelectedNode; Characteristic c = GetCharacteristic(node.Parent.Name, node.Name); try { SetMainTabsEnabled(false); c.UserDescription = tbCharacteristicUserDescription.Text; } catch (IPWorksBLEException ex) { HandleEx(ex); } finally { tbCharacteristicUserDescription.Text = c.UserDescription; SetMainTabsEnabled(true); } } private void rbCharaDisplayType_CheckedChanged(object sender, EventArgs e) { if (suppressEvents) return; if (((RadioButton) sender).Checked) { RadioButton rb = (RadioButton) sender; DisplayType newDt = ValueFormatter.ParseDisplayType(rb != rbCharaNumber ? rb.Text.Replace("&", "") : (string) cboCharaNumberType.SelectedItem); UpdateDisplayTypeForCharacteristic(newDt, tbCharacteristicId.Text, tbCharacteristicUuid.Text, false); } } private void cboCharaNumberType_SelectionChangeCommitted(object sender, EventArgs e) { if (suppressEvents) return; if (rbCharaNumber.Checked) { DisplayType newDt = ValueFormatter.ParseDisplayType((string) cboCharaNumberType.SelectedItem); UpdateDisplayTypeForCharacteristic(newDt, tbCharacteristicId.Text, tbCharacteristicUuid.Text, false); } } private void btnCustomizeCharaFormat_Click(object sender, EventArgs e) { using (CustomFormatBuilder frmCustomFormatBuilder = new CustomFormatBuilder()) { CustomFormat customFormat = uuidCustomFormats[tbCharacteristicUuid.Text]; DialogResult result = frmCustomFormatBuilder.ShowForCustomFormat(customFormat); if (result == DialogResult.OK) { customFormat = frmCustomFormatBuilder.GetCustomFormat(); uuidCustomFormats[tbCharacteristicUuid.Text] = customFormat; ValueFormatter.SaveCustomFormats(uuidCustomFormats); if (rbCharaCustom.Checked) RefreshDisplayedValueForCharacteristic(tbCharacteristicId.Text, tbCharacteristicUuid.Text, null); } } } private void btnCharaReadValue_Click(object sender, EventArgs e) { try { SetMainTabsEnabled(false); TreeNode node = treeGattObjects.SelectedNode; bleclient1.ReadValue(node.Parent.Name, node.Name, ""); // Everything else is taken care of by the Value event. } catch (IPWorksBLEException ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } private void btnCharaWriteValue_Click(object sender, EventArgs e) { try { SetMainTabsEnabled(false); CustomFormat customFormat = uuidCustomFormats[tbCharacteristicUuid.Text]; byte[] newValue = ValueFormatter.FormattedValueToBytes(tbCharacteristicValue.Text, uuidDisplayTypes[tbCharacteristicUuid.Text], customFormat); TreeNode node = treeGattObjects.SelectedNode; bleclient1.WriteValue(node.Parent.Name, node.Name, "", newValue); currValue = newValue; } catch (Exception ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } private void btnCharaPostValue_Click(object sender, EventArgs e) { try { SetMainTabsEnabled(false); CustomFormat customFormat = uuidCustomFormats[tbCharacteristicUuid.Text]; byte[] newValue = ValueFormatter.FormattedValueToBytes(tbCharacteristicValue.Text, uuidDisplayTypes[tbCharacteristicUuid.Text], customFormat); TreeNode node = treeGattObjects.SelectedNode; bleclient1.PostValue(node.Parent.Name, node.Name, newValue); currValue = newValue; } catch (Exception ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } private void btnToggleSubscribe_Click(object sender, EventArgs e) { SetMainTabsEnabled(false); try { TreeNode node = treeGattObjects.SelectedNode; if (btnToggleSubscribe.Text.Equals("Subscribe")) { bleclient1.Subscribe(node.Parent.Name, node.Name); btnToggleSubscribe.Text = "Unsubscribe"; } else { bleclient1.Unsubscribe(node.Parent.Name, node.Name); btnToggleSubscribe.Text = "Subscribe"; } } catch (IPWorksBLEException ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } private void btnCharaDiscoverDescriptors_Click(object sender, EventArgs e) { treeGattObjects.Enabled = btnCharaDiscoverDescriptors.Enabled = false; bleclient1.DiscoverDescriptors(treeGattObjects.SelectedNode.Parent.Name, tbCharacteristicId.Text); treeGattObjects.Enabled = btnCharaDiscoverDescriptors.Enabled = true; } #endregion #region Descriptor Data private void UpdateDescriptorDataTab(TreeNode node) { Descriptor currDescriptor = GetDescriptor(node.Parent.Parent.Name, node.Parent.Name, node.Name); tbDescriptorName.Text = GattUuidUtils.GetNiceName(currDescriptor.Uuid); tbDescriptorUuid.Text = currDescriptor.Uuid; tbDescriptorId.Text = currDescriptor.Id; currValue = currDescriptor.CachedValueB; RestoreSelectedDescriptorDisplayType(currDescriptor.Uuid); RefreshDisplayedDescriptorValue(); ColorAllServiceNodes(); } private void RestoreSelectedDescriptorDisplayType(string descUuid) { suppressEvents = true; DisplayType dt = uuidDisplayTypes[descUuid]; string dtStr = ValueFormatter.DisplayTypeToString(dt); if (cboDescNumberType.Items.Contains(dtStr)) { cboDescNumberType.SelectedItem = dtStr; rbDescNumber.Checked = true; } else { gbDescDisplayValueAs.Controls.OfType().FirstOrDefault(r => r.Text.Replace("&", "").Contains(dtStr)).Checked = true; } suppressEvents = false; } private void RefreshDisplayedDescriptorValue() { RadioButton rb = gbDescDisplayValueAs.Controls.OfType().FirstOrDefault(r => r.Checked); DisplayType newDt = ValueFormatter.ParseDisplayType(rb != rbDescNumber ? rb.Text.Replace("&", "") : (string) cboDescNumberType.SelectedItem); uuidDisplayTypes[tbDescriptorUuid.Text] = newDt; CustomFormat customFormat = newDt == DisplayType.Custom ? uuidCustomFormats[tbDescriptorUuid.Text] : null; tbDescriptorValue.Text = ValueFormatter.BytesToFormattedValue(currValue, newDt, customFormat); } private void rbDescDisplayType_CheckedChanged(object sender, EventArgs e) { if (suppressEvents) return; if (((RadioButton) sender).Checked) RefreshDisplayedDescriptorValue(); } private void cboDescNumberType_SelectionChangeCommitted(object sender, EventArgs e) { if (suppressEvents) return; if (rbDescNumber.Checked) RefreshDisplayedDescriptorValue(); } private void btnCustomizeDescFormat_Click(object sender, EventArgs e) { using (CustomFormatBuilder frmCustomFormatBuilder = new CustomFormatBuilder()) { CustomFormat customFormat = uuidCustomFormats[tbDescriptorUuid.Text]; DialogResult result = frmCustomFormatBuilder.ShowForCustomFormat(customFormat); if (result == DialogResult.OK) { customFormat = frmCustomFormatBuilder.GetCustomFormat(); uuidCustomFormats[tbDescriptorUuid.Text] = customFormat; ValueFormatter.SaveCustomFormats(uuidCustomFormats); if (rbCharaCustom.Checked) RefreshDisplayedDescriptorValue(); } } } private void btnDescReadValue_Click(object sender, EventArgs e) { try { SetMainTabsEnabled(false); TreeNode node = treeGattObjects.SelectedNode; currValue = bleclient1.ReadValue(node.Parent.Parent.Name, node.Parent.Name, node.Name); RefreshDisplayedDescriptorValue(); } catch (IPWorksBLEException ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } private void btnDescWriteValue_Click(object sender, EventArgs e) { try { SetMainTabsEnabled(false); CustomFormat customFormat = uuidCustomFormats[tbDescriptorUuid.Text]; byte[] newValue = ValueFormatter.FormattedValueToBytes(tbDescriptorValue.Text, uuidDisplayTypes[tbDescriptorUuid.Text], customFormat); TreeNode node = treeGattObjects.SelectedNode; bleclient1.WriteValue(node.Parent.Parent.Name, node.Parent.Name, node.Name, newValue); currValue = newValue; } catch (Exception ex) { HandleEx(ex); } finally { SetMainTabsEnabled(true); } } #endregion #endregion Browse Data Tab #region Subscribed Characteristics Tab private void flowSubscribedCharacteristics_ControlsChanged(object sender, ControlEventArgs e) { // Automatically expand/collapse the panels in the SplitContainer as the Subscribed Characteristics FlowLayoutPanel // has the first control added to it or the last control removed from it. splitSubscribed.Panel1Collapsed = !(splitSubscribed.Panel2Collapsed = flowSubscribedCharacteristics.Controls.Count > 0); } private void ResetSubscribedCharacteristicsTab() { for (int i = subscribedCharacteristics.Count - 1; i >= 0; i--) subscribedCharacteristics[i].RemoveAndDispose(); } private void CreateSubCharaRow(Characteristic chara) { if (GetSubCharaForId(chara.Id) == null) SubscribedCharacteristic.CreateAndAdd(this, chara); } private void RemoveSubCharaRow(string charaId) { SubscribedCharacteristic subbedChara = GetSubCharaForId(charaId); if (subbedChara != null) subbedChara.RemoveAndDispose(); } private SubscribedCharacteristic GetSubCharaForId(string charaId) { foreach (SubscribedCharacteristic sc in subscribedCharacteristics) { if (sc.CharaId.Equals(charaId)) return sc; } return null; } /// /// Convenience class that handles all of the logic for each row of controls associated with a subscribed characteristic. /// private class SubscribedCharacteristic { private Panel pnlSubChara; private TextBox tbSubCharaName; private Label lblSubCharaName; private TextBox tbSubCharaValue; private GroupBox gbSubCharaDisplayValueAs; private RadioButton rbSubCharaCustom; private RadioButton rbSubCharaUTF16; private RadioButton rbSubCharaUTF8; private ComboBox cboSubCharaNumberType; private RadioButton rbSubCharaNumber; private RadioButton rbSubCharaBoolean; private Button btnSubCharaCustomize; private RadioButton rbSubCharaHexBytes; private Button btnShowSubCharaInBrowseTab; private TextBox tbSubCharaUuid; private Label lblSubCharaUuid; private readonly bleclientDemo owner; private string uuid; private byte[] currValue; private bool suppressEvents = false; public string CharaId { get; private set; } public static void CreateAndAdd(bleclientDemo owner, Characteristic characteristic) { new SubscribedCharacteristic(owner, characteristic); } private SubscribedCharacteristic(bleclientDemo owner, Characteristic characteristic) { this.owner = owner; CharaId = characteristic.Id; currValue = owner.HasFlag(FLAG_READ, characteristic.Flags) ? characteristic.CachedValueB : new byte[] {}; uuid = characteristic.Uuid; owner.subscribedCharacteristics.Add(this); #region Control Creation and Setup pnlSubChara = new Panel(); tbSubCharaValue = new TextBox(); gbSubCharaDisplayValueAs = new GroupBox(); rbSubCharaCustom = new RadioButton(); rbSubCharaUTF16 = new RadioButton(); rbSubCharaUTF8 = new RadioButton(); cboSubCharaNumberType = new ComboBox(); rbSubCharaNumber = new RadioButton(); rbSubCharaBoolean = new RadioButton(); btnSubCharaCustomize = new Button(); rbSubCharaHexBytes = new RadioButton(); lblSubCharaName = new Label(); tbSubCharaName = new TextBox(); lblSubCharaUuid = new Label(); tbSubCharaUuid = new TextBox(); btnShowSubCharaInBrowseTab = new Button(); // Start Layout owner.flowSubscribedCharacteristics.SuspendLayout(); pnlSubChara.SuspendLayout(); gbSubCharaDisplayValueAs.SuspendLayout(); // pnlSubChara pnlSubChara.AutoSize = true; pnlSubChara.AutoSizeMode = AutoSizeMode.GrowAndShrink; pnlSubChara.BorderStyle = BorderStyle.FixedSingle; pnlSubChara.Controls.Add(btnShowSubCharaInBrowseTab); pnlSubChara.Controls.Add(tbSubCharaUuid); pnlSubChara.Controls.Add(lblSubCharaUuid); pnlSubChara.Controls.Add(tbSubCharaName); pnlSubChara.Controls.Add(lblSubCharaName); pnlSubChara.Controls.Add(tbSubCharaValue); pnlSubChara.Controls.Add(gbSubCharaDisplayValueAs); pnlSubChara.Dock = DockStyle.Fill; pnlSubChara.Location = new Point(3, 3); pnlSubChara.Padding = new Padding(3); pnlSubChara.Size = new Size(996, 115); pnlSubChara.TabIndex = 0; // tbSubCharaValue tbSubCharaValue.AcceptsReturn = true; tbSubCharaValue.AcceptsTab = true; tbSubCharaValue.Anchor = ((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right); tbSubCharaValue.Location = new Point(6, 35); tbSubCharaValue.Multiline = true; tbSubCharaValue.ReadOnly = true; tbSubCharaValue.Size = new Size(656, 72); tbSubCharaValue.TabIndex = 5; // gbSubCharaDisplayAs gbSubCharaDisplayValueAs.Anchor = (AnchorStyles.Top | AnchorStyles.Right); gbSubCharaDisplayValueAs.Controls.Add(rbSubCharaCustom); gbSubCharaDisplayValueAs.Controls.Add(rbSubCharaUTF16); gbSubCharaDisplayValueAs.Controls.Add(rbSubCharaUTF8); gbSubCharaDisplayValueAs.Controls.Add(cboSubCharaNumberType); gbSubCharaDisplayValueAs.Controls.Add(rbSubCharaNumber); gbSubCharaDisplayValueAs.Controls.Add(rbSubCharaBoolean); gbSubCharaDisplayValueAs.Controls.Add(btnSubCharaCustomize); gbSubCharaDisplayValueAs.Controls.Add(rbSubCharaHexBytes); gbSubCharaDisplayValueAs.Location = new Point(668, 35); gbSubCharaDisplayValueAs.Size = new Size(320, 72); gbSubCharaDisplayValueAs.TabIndex = 6; gbSubCharaDisplayValueAs.TabStop = false; gbSubCharaDisplayValueAs.Text = "Display Value As..."; // rbSubCharaCustom rbSubCharaCustom.AutoSize = true; rbSubCharaCustom.Location = new Point(134, 47); rbSubCharaCustom.Size = new Size(95, 17); rbSubCharaCustom.TabIndex = 6; rbSubCharaCustom.Text = "Custom Format"; rbSubCharaCustom.UseVisualStyleBackColor = true; rbSubCharaCustom.CheckedChanged += rbSubCharaDisplayType_CheckedChanged; // rbSubCharaUTF16 rbSubCharaUTF16.AutoSize = true; rbSubCharaUTF16.Location = new Point(67, 47); rbSubCharaUTF16.Size = new Size(61, 17); rbSubCharaUTF16.TabIndex = 5; rbSubCharaUTF16.Text = "UTF-16"; rbSubCharaUTF16.UseVisualStyleBackColor = true; rbSubCharaUTF16.CheckedChanged += rbSubCharaDisplayType_CheckedChanged; // rbSubCharaUTF8 rbSubCharaUTF8.AutoSize = true; rbSubCharaUTF8.Location = new Point(6, 47); rbSubCharaUTF8.Size = new Size(55, 17); rbSubCharaUTF8.TabIndex = 4; rbSubCharaUTF8.Text = "UTF-8"; rbSubCharaUTF8.UseVisualStyleBackColor = true; rbSubCharaUTF8.CheckedChanged += rbSubCharaDisplayType_CheckedChanged; // cboSubCharaNumberType cboSubCharaNumberType.DropDownStyle = ComboBoxStyle.DropDownList; cboSubCharaNumberType.FormattingEnabled = true; cboSubCharaNumberType.Items.AddRange(new object[] { "UInt8", "UInt16", "UInt32", "UInt64", "SInt8", "SInt16", "SInt32", "SInt64", "Float32", "Float64"}); cboSubCharaNumberType.SelectedItem = "SInt32"; cboSubCharaNumberType.Location = new Point(222, 17); cboSubCharaNumberType.Size = new Size(92, 21); cboSubCharaNumberType.TabIndex = 3; cboSubCharaNumberType.SelectionChangeCommitted += cboSubCharaNumberType_SelectionChangeCommitted; // rbSubCharaNumber rbSubCharaNumber.AutoSize = true; rbSubCharaNumber.Location = new Point(155, 19); rbSubCharaNumber.Size = new Size(65, 17); rbSubCharaNumber.TabIndex = 2; rbSubCharaNumber.Text = "Number:"; rbSubCharaNumber.UseVisualStyleBackColor = true; rbSubCharaNumber.CheckedChanged += rbSubCharaDisplayType_CheckedChanged; // rbSubCharaBoolean rbSubCharaBoolean.AutoSize = true; rbSubCharaBoolean.Location = new Point(85, 19); rbSubCharaBoolean.Size = new Size(64, 17); rbSubCharaBoolean.TabIndex = 1; rbSubCharaBoolean.Text = "Boolean"; rbSubCharaBoolean.UseVisualStyleBackColor = true; rbSubCharaBoolean.CheckedChanged += rbSubCharaDisplayType_CheckedChanged; // btnSubCharaCustomize btnSubCharaCustomize.Location = new Point(235, 44); btnSubCharaCustomize.Size = new Size(79, 23); btnSubCharaCustomize.TabIndex = 7; btnSubCharaCustomize.Text = "Customize..."; btnSubCharaCustomize.UseVisualStyleBackColor = true; btnSubCharaCustomize.Click += btnSubCharaCustomize_Click; // rbSubCharaHexBytes rbSubCharaHexBytes.AutoSize = true; rbSubCharaHexBytes.Checked = true; rbSubCharaHexBytes.Location = new Point(6, 19); rbSubCharaHexBytes.Size = new Size(73, 17); rbSubCharaHexBytes.TabIndex = 0; rbSubCharaHexBytes.TabStop = true; rbSubCharaHexBytes.Text = "Hex Bytes"; rbSubCharaHexBytes.UseVisualStyleBackColor = true; rbSubCharaHexBytes.CheckedChanged += rbSubCharaDisplayType_CheckedChanged; // lblSubCharaName lblSubCharaName.AutoSize = true; lblSubCharaName.Location = new Point(6, 11); lblSubCharaName.Size = new Size(38, 13); lblSubCharaName.TabIndex = 0; lblSubCharaName.Text = "Name:"; // tbSubCharaName tbSubCharaName.Anchor = ((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right); tbSubCharaName.Location = new Point(50, 8); tbSubCharaName.ReadOnly = true; tbSubCharaName.Size = new Size(421, 20); tbSubCharaName.TabIndex = 1; // lblSubCharaUuid lblSubCharaUuid.Anchor = (AnchorStyles.Top | AnchorStyles.Right); lblSubCharaUuid.AutoSize = true; lblSubCharaUuid.Location = new Point(477, 11); lblSubCharaUuid.Size = new Size(37, 13); lblSubCharaUuid.TabIndex = 2; lblSubCharaUuid.Text = "UUID:"; // tbSubCharaUuid tbSubCharaUuid.Anchor = (AnchorStyles.Top | AnchorStyles.Right); tbSubCharaUuid.Location = new Point(520, 8); tbSubCharaUuid.ReadOnly = true; tbSubCharaUuid.Size = new Size(332, 20); tbSubCharaUuid.TabIndex = 3; // btnShowSubCharaInBrowseTab btnShowSubCharaInBrowseTab.Location = new Point(858, 6); btnShowSubCharaInBrowseTab.Size = new Size(130, 23); btnShowSubCharaInBrowseTab.TabIndex = 4; btnShowSubCharaInBrowseTab.Text = "Show In Browse Tab"; btnShowSubCharaInBrowseTab.UseVisualStyleBackColor = true; btnShowSubCharaInBrowseTab.Click += btnShowSubCharaInBrowseTab_Click; #endregion owner.flowSubscribedCharacteristics.Controls.Add(pnlSubChara); #region Do Control Layout // Finish control setup. owner.flowSubscribedCharacteristics.ResumeLayout(false); owner.flowSubscribedCharacteristics.PerformLayout(); pnlSubChara.ResumeLayout(false); pnlSubChara.PerformLayout(); gbSubCharaDisplayValueAs.ResumeLayout(false); gbSubCharaDisplayValueAs.PerformLayout(); #endregion tbSubCharaName.Text = GattUuidUtils.GetNiceName(uuid); tbSubCharaUuid.Text = uuid; RestoreSelectedDisplayType(); tbSubCharaValue.Text = ValueFormatter.BytesToFormattedValue(currValue, owner.uuidDisplayTypes[uuid], owner.uuidCustomFormats[uuid]); } public void RestoreSelectedDisplayType() { suppressEvents = true; DisplayType dt = owner.uuidDisplayTypes[uuid]; string dtStr = ValueFormatter.DisplayTypeToString(dt); if (cboSubCharaNumberType.Items.Contains(dtStr)) { cboSubCharaNumberType.SelectedItem = dtStr; rbSubCharaNumber.Checked = true; } else { gbSubCharaDisplayValueAs.Controls.OfType().FirstOrDefault(r => r.Text.Contains(dtStr)).Checked = true; } suppressEvents = false; } public void RefreshDisplayedValue(DisplayType dt, CustomFormat customFormat, byte[] newValue) { if (newValue != null) currValue = newValue; tbSubCharaValue.Text = ValueFormatter.BytesToFormattedValue(currValue, dt, customFormat); } public void RemoveAndDispose() { owner.flowSubscribedCharacteristics.Controls.Remove(pnlSubChara); pnlSubChara.Dispose(); owner.subscribedCharacteristics.Remove(this); } private void btnShowSubCharaInBrowseTab_Click(object sender, EventArgs e) { owner.tabCtrlMain.SelectedTab = owner.tabBrowse; // We can make this characteristic's service ID by taking the first 4 characters and replacing the last 8 with 0s. string svcId = CharaId.Substring(0, 4) + "00000000"; owner.treeGattObjects.SelectedNode = owner.GetNodeById(svcId, CharaId, null); } private void rbSubCharaDisplayType_CheckedChanged(object sender, EventArgs e) { if (suppressEvents) return; if (((RadioButton) sender).Checked) { RadioButton rb = (RadioButton) sender; DisplayType newDt = ValueFormatter.ParseDisplayType(rb != rbSubCharaNumber ? rb.Text : (string) cboSubCharaNumberType.SelectedItem); owner.UpdateDisplayTypeForCharacteristic(newDt, CharaId, uuid, true); } } private void cboSubCharaNumberType_SelectionChangeCommitted(object sender, EventArgs e) { if (suppressEvents) return; if (rbSubCharaNumber.Checked) { DisplayType newDt = ValueFormatter.ParseDisplayType((string) cboSubCharaNumberType.SelectedItem); owner.UpdateDisplayTypeForCharacteristic(newDt, CharaId, uuid, true); } } private void btnSubCharaCustomize_Click(object sender, EventArgs e) { using (CustomFormatBuilder frmCustomFormatBuilder = new CustomFormatBuilder()) { CustomFormat customFormat = owner.uuidCustomFormats[uuid]; DialogResult result = frmCustomFormatBuilder.ShowForCustomFormat(customFormat); if (result == DialogResult.OK) { customFormat = frmCustomFormatBuilder.GetCustomFormat(); owner.uuidCustomFormats[tbSubCharaUuid.Text] = customFormat; ValueFormatter.SaveCustomFormats(owner.uuidCustomFormats); if (rbSubCharaCustom.Checked) owner.RefreshDisplayedValueForCharacteristic(CharaId, uuid, null); } } } } #endregion #region Log Tab private string TranslateLogLevel(int logLevel) { switch (logLevel) { case 3: return "DEBUG"; case 2: return "VERBOSE"; case 1: return "INFO"; } return ""; } private void Log(string s) { if (tbLog.Disposing || tbLog.IsDisposed) return; tbLog.AppendText(s + "\r\n"); } private void LogAndShowMessage(string s) { Log(s); MessageBox.Show(s); } private void LogAdvertisement(BleclientAdvertisementEventArgs e) { if (!cbLogAdvertisements.Checked) return; Log(string.Format("Advertisement:\r\n" + "\tServerId: {0}\r\n" + "\tName: {1}\r\n" + "\tRSSI: {2}\r\n" + "\tTxPower: {3}\r\n" + "\tServiceUuids: {4}\r\n" + "\tServicesWithData: {5}\r\n" + "\tSolicitedServiceUuids: {6}\r\n" + "\tManufacturerCompanyId: {7}\r\n" + "\tManufacturerCompanyData: {8}\r\n" + "\tIsConnectable: {9}\r\n" + "\tIsScanResponse: {10}\r\n", e.ServerId, e.Name, e.RSSI, e.TxPower, e.ServiceUuids, e.ServicesWithData, e.SolicitedServiceUuids, e.ManufacturerCompanyId, BitConverter.ToString(e.ManufacturerDataB), e.IsConnectable, e.IsScanResponse)); } private void HandleEx(Exception ex) { if (ex is IPWorksBLEException) LogAndShowMessage(string.Format("Exception: [{0}] {1}", ((IPWorksBLEException) ex).Code, ex.Message)); else LogAndShowMessage("Exception: " + ex.Message); } private void btnPrintGattObjTree_Click(object sender, EventArgs e) { Log(bleclient1.Config("GattObjTreeInfo")); } private void btnClearLog_Click(object sender, EventArgs e) { tbLog.Clear(); } private void tbLog_VisibleChanged(object sender, EventArgs e) { if (tbLog.Visible) { tbLog.SelectionStart = tbLog.TextLength; tbLog.ScrollToCaret(); } } private void cbbLogLevel_SelectedIndexChanged(object sender, EventArgs e) { bleclient1.Config("LogLevel=" + cbbLogLevel.SelectedIndex); } #endregion #region Convenience & Utility /// /// When we do BLE operations, we typically don't want to let the user do other things, so we use this to /// disable all tab content for the main tabs (other than the log tab). Note that doing it this way still /// allows the user to switch between tabs, which is fine. /// private void SetMainTabsEnabled(bool enabled) { tabScanConnect.Enabled = tabBrowse.Enabled = tabSubscribed.Enabled = enabled; } private Service GetService(string serviceId) { foreach (Service service in bleclient1.Services) if (service.Id.Equals(serviceId)) return service; return null; } private Characteristic GetCharacteristic(string serviceId, string characteristicId) { bleclient1.Select(serviceId, ""); foreach (Characteristic characteristic in bleclient1.Characteristics) if (characteristic.Id.Equals(characteristicId)) return characteristic; return null; } private Descriptor GetDescriptor(string serviceId, string characteristicId, string descriptorId) { bleclient1.Select(serviceId, characteristicId); foreach (Descriptor descriptor in bleclient1.Descriptors) if (descriptor.Id.Equals(descriptorId)) return descriptor; return null; } private string TranslateFlags(int flags) { List flagsList = new List(); if (HasFlag(FLAG_BROADCAST, flags)) flagsList.Add("Broadcast"); if (HasFlag(FLAG_READ, flags)) flagsList.Add("Read"); if (HasFlag(FLAG_WRITE_NO_RESPONSE, flags)) flagsList.Add("Write_No_Response"); if (HasFlag(FLAG_WRITE, flags)) flagsList.Add("Write"); if (HasFlag(FLAG_NOTIFY, flags)) flagsList.Add("Notify"); if (HasFlag(FLAG_INDICATE, flags)) flagsList.Add("Indicate"); if (HasFlag(FLAG_AUTH_SIGNED_WRITE, flags)) flagsList.Add("Auth_Signed_Write"); if (HasFlag(FLAG_RELIABLE_WRITE, flags)) flagsList.Add("Reliable_Write"); if (HasFlag(FLAG_WRITABLE_AUXILIARIES, flags)) flagsList.Add("Writable_Auxiliaries"); return string.Join(", ", flagsList); } private bool HasFlag(int flag, int flags) { return (flags & flag) == flag; } /// /// Convenience method to open the UUID Picker dialog for a given UUID type, with the initial state and resulting state /// tied to a given ListBox. /// /// The UUID type. /// The ListBox to get the initial UUIDs from, and to put the resulting UUIDs into. private void OpenUuidPickerForListbox(int uuidType, ListBox lb) { using (UuidPicker frmUuidPicker = new UuidPicker()) { DialogResult result = frmUuidPicker.ShowForUuidType(uuidType, lb.Items.Cast().ToList()); if (result == DialogResult.OK) { lb.Items.Clear(); lb.Items.AddRange(frmUuidPicker.GetSelectedUuids().ToArray()); } } } private string GetUuidListStrFromListbox(ListBox lb) { if (lb.Items.Count == 0) return ""; return string.Join(",", lb.Items.Cast().Select(g => g.Uuid).ToArray()); } private void lbUuids_KeyUp(object sender, KeyEventArgs e) { ListBox lb = (ListBox) sender; // Remove selected items. if (e.KeyCode == Keys.Delete) { for (int i = lb.SelectedIndices.Count - 1; i >= 0; i--) lb.Items.RemoveAt(lb.SelectedIndices[i]); } } /// /// For ease of design-time manipulation, we use a TabControl to hold the sets of controls for different GATT objects /// in the Browse tab. But at runtime, we don't want to show the tabs since we don't want the user to be able to switch /// between them at will. /// Hiding the tabs alone technically doesn't require subclassing TabControl, but if we want to hide the tabs _and_ keep /// the TabControl from drawing a thick, ugly border around the tab pages then we have to do it this way. /// See https://stackoverflow.com/a/6954785 /// public partial class TabControlWithoutHeader : TabControl { private const int TCM_ADJUSTRECT = 0x1328; public TabControlWithoutHeader() { if (!this.DesignMode) this.Multiline = true; } protected override void OnKeyDown(KeyEventArgs ke) { // Prevent the user from switching tabs using Ctrl+Tab and Shift+Ctrl+Tab. TabControl is weird and we can't // just use the events for this. if (!(ke.Control && (ke.KeyCode == Keys.Tab || ke.KeyCode == Keys.Next || ke.KeyCode == Keys.Prior))) base.OnKeyDown(ke); } protected override void WndProc(ref Message m) { if (m.Msg == TCM_ADJUSTRECT && !this.DesignMode) m.Result = new IntPtr(1); else base.WndProc(ref m); } } #endregion } }