public DetectorSetup()
        {
            this.InitializeComponent();

            btleConn = new BtleConnection();
            btleConn.writeGattChar = new Fn_IntPtr_IntPtr_ByteArray(writeCharacteristic);
            btleConn.readGattChar  = new Fn_IntPtr_IntPtr(readCharacteristic);

            initDelegate = new Fn_IntPtr_Int(initialized);

            dataprocDelegates = new Dictionary <string, Fn_IntPtr>();

            logReadyDelegates = new Fn_IntPtr[2];
        }
        /// <summary>
        /// Initialize the API
        /// </summary>
        /// <returns>Status value from calling <see cref="mbl_mw_metawearboard_initialize(IntPtr, Fn_IntPtr_Int)"/></returns>
        public async Task <int> Initialize()
        {
            if (notifyChar == null)
            {
                notifyChar = btleDevice.GetGattService(GattCharGuid.METAWEAR_NOTIFY_CHAR.serviceGuid).GetCharacteristics(GattCharGuid.METAWEAR_NOTIFY_CHAR.guid).FirstOrDefault();
                notifyChar.ValueChanged += notifyHandler;
                await notifyChar.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
            }

            initTaskSource = new TaskCompletionSource <int>();

            initDelegate = new Fn_IntPtr_Int((caller, status) => {
                initTaskSource.SetResult(status);
            });
            mbl_mw_metawearboard_initialize(cppBoard, initDelegate);

            return(await initTaskSource.Task);
        }