public async Task InitializeAsync(Func <IHubController, Response, Task> notificationHandler, IGattCharacteristicWrapper gattCharacteristicWrapper)
 {
     _hubCharacteristic = gattCharacteristicWrapper;
     await ToggleSubscribedForNotificationsAsync(notificationHandler);
     await ExecuteCommandAsync(new HubTypeCommand());
     await ExecuteCommandAsync(new HubFirmwareCommand());
 }
        public async Task TryReadValueAsync_ForGattCommunicationStatus_SetsProtocolError(
            RawValueReader sut,
            [Freeze] IBufferReader reader,
            IGattReadResultWrapper result,
            IGattCharacteristicWrapper characteristic,
            byte protocolError)
        {
            WithTryReadValueResult(reader,
                                   Array.Empty <byte> ( ));

            result.Status
            .Returns(GattCommunicationStatus.Success);

            result.ProtocolError
            .Returns(protocolError);

            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.Read)
            .WithReadValueAsyncResult(result);

            _ = await sut.TryReadValueAsync(characteristic);

            sut.ProtocolError
            .Should( )
            .Be(protocolError);
        }
        public static IGattCharacteristicWrapper WithWriteValueWithResultAsync(
            this IGattCharacteristicWrapper characteristic,
            IGattWriteResultWrapper result)
        {
            _ = characteristic.WriteValueWithResultAsync(Arg.Any <IBuffer> ( ))
                .Returns(Task.FromResult(result));

            return(characteristic);
        }
        public static IGattCharacteristicWrapper WithReadValueAsyncResult(
            this IGattCharacteristicWrapper characteristic,
            IGattReadResultWrapper result)
        {
            _ = characteristic.ReadValueAsync( )
                .Returns(Task.FromResult(result));

            return(characteristic);
        }
        public static IGattCharacteristicWrapper WithCharacteristicProperties(
            this IGattCharacteristicWrapper characteristic,
            GattCharacteristicProperties properties)
        {
            _ = characteristic.CharacteristicProperties
                .Returns(properties);

            return(characteristic);
        }
        public static IGattCharacteristicWrapper WithWriteValueAsyncResult(
            this IGattCharacteristicWrapper characteristic,
            GattCommunicationStatus status)
        {
            _ = characteristic.WriteValueAsync(Arg.Any <IBuffer> ( ))
                .Returns(Task.FromResult(status));

            return(characteristic);
        }
        TryWriteWithoutResponseAsync_ForCharacteristicDoesNotSupportWrite_DoesNotCallTryWriteValueAsync(
            RawValueWriter sut,
            [Freeze] IGattCharacteristicWrapper characteristic,
            IBuffer buffer)
        {
            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.None);

            await sut.TryWriteValueAsync(characteristic,
                                         buffer);

            await characteristic.DidNotReceive( )
            .WriteValueAsync(buffer);
        }
        public async Task TryWriteValueAsync_ForGattCommunicationStatusIsAccessDenied_False(
            RawValueWriter sut,
            [Freeze] IGattCharacteristicWrapper characteristic,
            IBuffer buffer)
        {
            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.Write)
            .WithWriteValueAsyncResult(GattCommunicationStatus.AccessDenied);

            var actual = await sut.TryWriteValueAsync(characteristic,
                                                      buffer);

            actual.Should( )
            .BeFalse( );
        }
        public void TryWriteValueAsync_ForBufferIsNull_Throws(
            RawValueWriter sut,
            IGattCharacteristicWrapper characteristic)
        {
            Func <Task> action = async( ) =>
            {
                await sut.TryWriteValueAsync(characteristic,
                                             null !);
            };

            action.Should( )
            .Throw <ArgumentNullException> ( )
            .WithParameter("buffer");
        }
        public async Task TryWritableAuxiliariesValueAsync_ForGattCommunicationStatusIsProtocolError_False(
            RawValueWriter sut,
            [Freeze] IGattCharacteristicWrapper characteristic,
            IBuffer buffer)
        {
            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.WritableAuxiliaries)
            .WithWriteValueAsyncResult(GattCommunicationStatus.ProtocolError);

            var actual = await sut.TryWritableAuxiliariesValueAsync(characteristic,
                                                                    buffer);

            actual.Should( )
            .BeFalse( );
        }
        public async Task TryWritableAuxiliariesValueAsync_ForCharacteristicDoesNotSupportWrite_False(
            RawValueWriter sut,
            [Freeze] IGattCharacteristicWrapper characteristic,
            IBuffer buffer)
        {
            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.None)
            .WithWriteValueAsyncResult(GattCommunicationStatus.AccessDenied);

            var actual = await sut.TryWritableAuxiliariesValueAsync(characteristic,
                                                                    buffer);

            actual.Should( )
            .BeFalse( );
        }
        public async Task TryWriteWithoutResponseAsync_ForGattCommunicationStatusIsAccessDenied_False(
            RawValueWriter sut,
            [Freeze] IGattCharacteristicWrapper characteristic,
            IBuffer buffer,
            IGattWriteResultWrapper result)
        {
            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.WriteWithoutResponse)
            .WithWriteValueWithResultAsync(result);

            var actual = await sut.TryWriteWithoutResponseAsync(characteristic,
                                                                buffer);

            actual.Should( )
            .Be(result);
        }
        TryWriteWithoutResponseAsync_ForCharacteristicDoesNotWriteWithoutResponse_GattWriteResultNotSupported(
            RawValueWriter sut,
            [Freeze] IGattCharacteristicWrapper characteristic,
            IBuffer buffer,
            IGattWriteResultWrapper result)
        {
            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.None)
            .WithWriteValueWithResultAsync(result);

            var actual = await sut.TryWriteWithoutResponseAsync(characteristic,
                                                                buffer);

            actual.Should( )
            .Be(GattWriteResultWrapper.NotSupported);
        }
        public async Task TryReadValueAsync_ForSupportsNotifyTrue_False(
            RawValueReader sut,
            [Freeze] IBufferReader reader,
            IGattReadResultWrapper result,
            IGattCharacteristicWrapper characteristic)
        {
            WithTryReadValueResult(reader,
                                   Array.Empty <byte> ( ));

            result.Status
            .Returns(GattCommunicationStatus.Success);

            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.Notify)
            .WithReadValueAsyncResult(result);

            var(success, _) = await sut.TryReadValueAsync(characteristic);

            success.Should( )
            .BeFalse( );
        }
        public async Task TryReadValueAsync_ForNotSupportingRead_Empty(
            RawValueReader sut,
            [Freeze] IBufferReader reader,
            IGattReadResultWrapper result,
            IGattCharacteristicWrapper characteristic)
        {
            WithTryReadValueResult(reader,
                                   Array.Empty <byte> ( ));

            result.Status
            .Returns(GattCommunicationStatus.Success);

            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.None)
            .WithReadValueAsyncResult(result);

            var(_, bytes) = await sut.TryReadValueAsync(characteristic);

            bytes.Should( )
            .BeEmpty( );
        }
Example #16
0
        private async Task <(bool, byte [])> ReadValue(
            [NotNull] IGattCharacteristicWrapper characteristic)
        {
            Guard.ArgumentNotNull(characteristic,
                                  nameof(characteristic));

            var readValue = await characteristic.ReadValueAsync( );

            ProtocolError = readValue.ProtocolError;
            Status        = readValue.Status;

            if (GattCommunicationStatus.Success != Status)
            {
                return(false, ArrayEmpty);
            }

            return(_reader.TryReadValue(readValue.Value,
                                        out var bytes)
                       ? (true, bytes)
                       : (false, ArrayEmpty));
        }
        public async Task TryReadValueAsync_ForGattCommunicationStatusIsSuccess_Bytes(
            RawValueReader sut,
            [Freeze] IBufferReader reader,
            IGattReadResultWrapper result,
            IGattCharacteristicWrapper characteristic,
            byte []                   bytes)
        {
            WithTryReadValueResult(reader,
                                   bytes);

            result.Status
            .Returns(GattCommunicationStatus.Success);

            characteristic.WithCharacteristicProperties(GattCharacteristicProperties.Read)
            .WithReadValueAsyncResult(result);

            var(_, value) = await sut.TryReadValueAsync(characteristic);

            value.Should( )
            .BeEquivalentTo(bytes);
        }
Example #18
0
        public async Task <bool> TryWritableAuxiliariesValueAsync(
            [NotNull] IGattCharacteristicWrapper characteristic,
            [NotNull] IBuffer buffer)
        {
            Guard.ArgumentNotNull(characteristic,
                                  nameof(characteristic));
            Guard.ArgumentNotNull(buffer,
                                  nameof(buffer));

            if (SupportsWritableAuxiliaries(characteristic))
            {
                Log.Information($"GattCharacteristic '{characteristic.Uuid}' " +
                                "doesn't support 'Write/WritableAuxiliaries/" +
                                "WriteWithoutResponse'");

                return(false);
            }

            var status = await characteristic.WriteValueAsync(buffer);

            return(status == GattCommunicationStatus.Success);
        }
Example #19
0
        public async Task <IGattWriteResultWrapper> TryWriteWithoutResponseAsync(
            [NotNull] IGattCharacteristicWrapper characteristic,
            [NotNull] IBuffer buffer)
        {
            Guard.ArgumentNotNull(characteristic,
                                  nameof(characteristic));
            Guard.ArgumentNotNull(buffer,
                                  nameof(buffer));

            if (SupportsWriteWithoutResponse(characteristic))
            {
                var message = $"GattCharacteristic '{characteristic.Uuid}' " +
                              "doesn't support 'Write/WritableAuxiliaries/" +
                              "WriteWithoutResponse'";

                Log.Information(message);

                return(GattWriteResultWrapper.NotSupported);
            }

            var status = await characteristic.WriteValueWithResultAsync(buffer);

            return(status);
        }
Example #20
0
        public async Task <(bool, byte [])> TryReadValueAsync(
            IGattCharacteristicWrapper characteristic)
        {
            Guard.ArgumentNotNull(characteristic,
                                  nameof(characteristic));

            if (SupportsNotify(characteristic))
            {
                _logger.Warning($"GattCharacteristic '{characteristic.Uuid}' " +
                                "doesn't support 'Read' but supports 'Notify'");

                return(false, ArrayEmpty);      // need to subscribe to value change
            }

            if (SupportsRead(characteristic))
            {
                return(await ReadValue(characteristic));
            }

            _logger.Information($"GattCharacteristic '{characteristic.Uuid}' " +
                                "doesn't support 'Read'");

            return(false, ArrayEmpty);
        }
Example #21
0
 private static bool SupportsWritableAuxiliaries(IGattCharacteristicWrapper characteristic)
 {
     return((characteristic.CharacteristicProperties & GattCharacteristicProperties.WritableAuxiliaries) !=
            GattCharacteristicProperties.WritableAuxiliaries);
 }
Example #22
0
 private static bool SupportsWrite(IGattCharacteristicWrapper characteristic)
 {
     return((characteristic.CharacteristicProperties & GattCharacteristicProperties.Write) !=
            GattCharacteristicProperties.Write);
 }
Example #23
0
 private static bool SupportsNotify(IGattCharacteristicWrapper characteristic)
 {
     return((characteristic.CharacteristicProperties & GattCharacteristicProperties.Notify) ==
            GattCharacteristicProperties.Notify);
 }
Example #24
0
 private static bool SupportsRead(IGattCharacteristicWrapper characteristic)
 {
     return((characteristic.CharacteristicProperties & GattCharacteristicProperties.Read) ==
            GattCharacteristicProperties.Read);
 }