Esempio n. 1
0
 public MultiValueMode(ILegoWirelessProtocol protocol, PortModeInfo modeInfo, IObservable <PortValueData> modeValueObservable)
     : base(protocol, modeInfo, modeValueObservable)
 {
     Observable = CreateObservable();
     ObserveOnLocalProperty(Observable, v => Raw = v.Raw, v => SI = v.SI, v => Pct = v.Pct);
     ObserveForPropertyChanged(Observable, nameof(Raw), nameof(SI), nameof(Pct));
 }
Esempio n. 2
0
 public MoveHub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <MoveHub> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, SystemType.LegoSystem_MoveHub, new Port[] {
     new Port(0, "A", false, expectedDevice: DeviceType.MoveHubInternalMotor),
     new Port(1, "B", false, expectedDevice: DeviceType.MoveHubInternalMotor),
     // Since ports C and D can be any compatible sensor or motor, we don't set an expected device type here
     new Port(2, nameof(C), true),
     new Port(3, nameof(D), true),
     new Port(16, "AB", false, expectedDevice: DeviceType.MoveHubInternalMotor, true),
     new Port(50, string.Empty, false, expectedDevice: DeviceType.RgbLight),
     new Port(58, string.Empty, false, expectedDevice: DeviceType.MoveHubTiltSensor),
     new Port(59, string.Empty, false, expectedDevice: DeviceType.Current),
     new Port(60, string.Empty, false, expectedDevice: DeviceType.Voltage),
     // Note that there is a port with id 70 but is not currently known what this does (suspected to be debug port)
 },
            knownProperties: new HubProperty[] {
     HubProperty.AdvertisingName,
     HubProperty.Button,
     HubProperty.FwVersion,
     HubProperty.HwVersion,
     HubProperty.Rssi,
     HubProperty.BatteryVoltage,
     HubProperty.BatteryType,
     HubProperty.ManufacturerName,
     HubProperty.RadioFirmwareVersion,
     HubProperty.LegoWirelessProtocolVersion,
     HubProperty.SystemTypeId,
     HubProperty.HardwareNetworkId,
     HubProperty.PrimaryMacAddress,
     HubProperty.SecondaryMacAddress,
     //HubProperty.HardwareNetworkFamily, // Does not appear to work on Move Hub
 })
 {
 }
        public TechnicMediumHubGestureSensor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _gestureMode = SingleValueMode <sbyte>(ModeIndexGesture);

            ObserveForPropertyChanged(_gestureMode.Observable, nameof(Gesture));
        }
Esempio n. 4
0
        public BasicMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _powerMode = SingleValueMode<sbyte>(ModeIndexPower);

            ObserveForPropertyChanged(_powerMode.Observable, nameof(Power), nameof(PowerPct));
        }
Esempio n. 5
0
    public MarioHubPants(ILegoWirelessProtocol protocol, byte hubId, byte portId)
        : base(protocol, hubId, portId)
    {
        _pantsMode = SingleValueMode <sbyte, sbyte>(ModeIndexPants);

        ObserveForPropertyChanged(_pantsMode.Observable, nameof(Pants));
    }
Esempio n. 6
0
        protected AbsoluteMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _absoluteMode = SingleValueMode <short>(ModeIndexAbsolutePosition);

            ObserveForPropertyChanged(_absoluteMode.Observable, nameof(AbsolutePosition), nameof(AbsolutePositionPct));
        }
Esempio n. 7
0
        public TechnicMediumHubTemperatureSensor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _temperatureMode = SingleValueMode <short>(ModeIndexTemperature);

            ObserveForPropertyChanged(_temperatureMode.Observable, nameof(Temperature), nameof(TemperaturePct));
        }
Esempio n. 8
0
 public TechnicMediumHub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <TechnicMediumHub> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, SystemType.LegoTechnic_MediumHub, new Port[] {
     new Port(0, nameof(A), true),
     new Port(1, nameof(B), true),
     new Port(2, nameof(C), true),
     new Port(3, nameof(D), true),
     new Port(50, string.Empty, false, expectedDevice: DeviceType.RgbLight),
     new Port(59, string.Empty, false, expectedDevice: DeviceType.Current),
     new Port(60, string.Empty, false, expectedDevice: DeviceType.Voltage),
     new Port(61, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubTemperatureSensor),
     new Port(96, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubTemperatureSensor),
     new Port(97, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubAccelerometer),
     new Port(98, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubGyroSensor),
     new Port(99, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubTiltSensor),
     new Port(100, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubGestureSensor),
 },
            knownProperties: new HubProperty[] {
     HubProperty.AdvertisingName,
     HubProperty.Button,
     HubProperty.FwVersion,
     HubProperty.HwVersion,
     HubProperty.Rssi,
     HubProperty.BatteryVoltage,
     HubProperty.BatteryType,
     HubProperty.ManufacturerName,
     HubProperty.RadioFirmwareVersion,
     HubProperty.LegoWirelessProtocolVersion,
     HubProperty.SystemTypeId,
     HubProperty.HardwareNetworkId,
     HubProperty.PrimaryMacAddress,
     HubProperty.SecondaryMacAddress,
     //HubProperty.HardwareNetworkFamily, //  Throws command not recognized error for TechnicMediumHub
 })
 {
 }
Esempio n. 9
0
 public TwoPortHandset(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <TwoPortHandset> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, SystemType.LegoSystem_TwoPortHandset, new Port[] {
     new Port(0, string.Empty, false, expectedDevice: DeviceType.RemoteControlButton),
     new Port(1, string.Empty, false, expectedDevice: DeviceType.RemoteControlButton),
     new Port(52, string.Empty, false, expectedDevice: DeviceType.RgbLight),
     new Port(59, string.Empty, false, expectedDevice: DeviceType.Voltage),
     new Port(60, string.Empty, false, expectedDevice: DeviceType.RemoteControlRssi),
 },
            knownProperties: new HubProperty[] {
     HubProperty.AdvertisingName,
     HubProperty.Button,
     HubProperty.FwVersion,
     HubProperty.HwVersion,
     HubProperty.Rssi,
     HubProperty.BatteryVoltage,
     HubProperty.BatteryType,
     HubProperty.ManufacturerName,
     HubProperty.RadioFirmwareVersion,
     HubProperty.LegoWirelessProtocolVersion,
     HubProperty.SystemTypeId,
     HubProperty.HardwareNetworkId,
     HubProperty.PrimaryMacAddress,
     //HubProperty.SecondaryMacAddress, // unsupported on the two port handset
     HubProperty.HardwareNetworkFamily,
 })
 {
 }
Esempio n. 10
0
        public DuploTrainBaseMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _onSecMode = SingleValueMode <int>(ModeIndexOnSec);

            ObserveForPropertyChanged(_onSecMode.Observable, nameof(OnSeconds));
        }
Esempio n. 11
0
        public RemoteControlRssi(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _rssiMode = SingleValueMode <sbyte, sbyte>(ModeIndexRssi);

            ObserveForPropertyChanged(_rssiMode.Observable, nameof(Rssi));
        }
Esempio n. 12
0
 public TwoPortHub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <TwoPortHub> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, SystemType.LegoSystem_TwoPortHub, new Port[] {
     new Port(0, nameof(A), true),
     new Port(1, nameof(B), true),
     new Port(50, string.Empty, false, expectedDevice: DeviceType.RgbLight),
     new Port(59, string.Empty, false, expectedDevice: DeviceType.Current),
     new Port(60, string.Empty, false, expectedDevice: DeviceType.Voltage),
 },
            knownProperties: new HubProperty[] {
     HubProperty.AdvertisingName,
     HubProperty.Button,
     HubProperty.FwVersion,
     HubProperty.HwVersion,
     HubProperty.Rssi,
     HubProperty.BatteryVoltage,
     HubProperty.BatteryType,
     HubProperty.ManufacturerName,
     HubProperty.RadioFirmwareVersion,
     HubProperty.LegoWirelessProtocolVersion,
     HubProperty.SystemTypeId,
     HubProperty.HardwareNetworkId,
     HubProperty.PrimaryMacAddress,
     HubProperty.SecondaryMacAddress,
     //HubProperty.HardwareNetworkFamily, // support status unknown for TwoPortHub
 })
 {
 }
Esempio n. 13
0
 public DuploTrainBaseHub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <DuploTrainBaseHub> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, SystemType.LegoDuplo_DuploTrain, new Port[] {
     new Port(0, string.Empty, false, expectedDevice: DeviceType.DuploTrainBaseMotor),
     new Port(1, string.Empty, false, expectedDevice: DeviceType.DuploTrainBaseSpeaker),
     new Port(17, string.Empty, false, expectedDevice: DeviceType.RgbLight),
     new Port(18, string.Empty, false, expectedDevice: DeviceType.DuploTrainBaseColorSensor),
     new Port(19, string.Empty, false, expectedDevice: DeviceType.DuploTrainBaseSpeedometer),
     new Port(20, string.Empty, false, expectedDevice: DeviceType.Voltage),
 },
            knownProperties: new HubProperty[] {
     HubProperty.AdvertisingName,
     HubProperty.Button,
     HubProperty.FwVersion,
     HubProperty.HwVersion,
     HubProperty.Rssi,
     HubProperty.BatteryVoltage,
     HubProperty.BatteryType,
     HubProperty.ManufacturerName,
     HubProperty.RadioFirmwareVersion,
     HubProperty.LegoWirelessProtocolVersion,
     HubProperty.SystemTypeId,
     HubProperty.HardwareNetworkId,
     HubProperty.PrimaryMacAddress,
     // HubProperty.SecondaryMacAddress, // throws
     // HubProperty.HardwareNetworkFamily, // throws
 })
 {
 }
Esempio n. 14
0
        /// <summary>
        /// Verify a given Hub (protocol + hubId) aganinst a HubModel
        /// </summary>
        /// <param name="protocol"></param>
        /// <param name="hubId"></param>
        /// <param name="hubModel"></param>
        /// <returns></returns>
        public DeploymentModelError[] Verify(ILegoWirelessProtocol protocol, byte hubId, DeploymentHubModel hubModel)
        {
            if (protocol is null)
            {
                throw new ArgumentNullException(nameof(protocol));
            }

            if (hubModel is null)
            {
                throw new ArgumentNullException(nameof(hubModel));
            }

            var result = new List <DeploymentModelError>();

            var hubInfo = protocol.Knowledge.Hub(hubId);

            if (hubModel.HubType is not null && hubModel.HubType != hubInfo.SystemType)
            {
                result.Add(new DeploymentModelError(1002, hubInfo.HubId, null, $"Hub {hubInfo.HubId} with system type {hubInfo.SystemType} does not match expected {hubModel.HubType}."));
            }

            result.AddRange(
                hubModel.Devices.Select(Device =>
            {
                var PortInfo = protocol.Knowledge.Port(hubId, Device.PortId);

                return(Device, PortInfo);
            })
                .Select(t => t switch
            {
                (var Device, var PortInfo)when !PortInfo.IsDeviceConnected => (Error: 1000, t.Device, t.PortInfo),                                             // no device connected
                (var Device, var PortInfo)when Device.DeviceType is not null && PortInfo.IOTypeId != Device.DeviceType => (Error: 1001, t.Device, t.PortInfo), // wrong device connected
                _ => (Error: 0, t.Device, t.PortInfo),
            })
Esempio n. 15
0
 public MarioHub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <MarioHub> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, SystemType.LegoSystem_Mario, new Port[] {
     new Port(0, string.Empty, false, expectedDevice: DeviceType.MarioHubAccelerometer),
     new Port(1, string.Empty, false, expectedDevice: DeviceType.MarioHubTagSensor),
     new Port(2, string.Empty, false, expectedDevice: DeviceType.MarioHubPants),
     new Port(3, string.Empty, false, expectedDevice: DeviceType.MarioHubDebug),
     new Port(6, string.Empty, false, expectedDevice: DeviceType.Voltage),
 },
            knownProperties: new HubProperty[] {
     HubProperty.AdvertisingName,
     HubProperty.Button,
     HubProperty.FwVersion,
     HubProperty.HwVersion,
     HubProperty.Rssi,
     HubProperty.BatteryVoltage,
     HubProperty.BatteryType,
     HubProperty.ManufacturerName,
     HubProperty.RadioFirmwareVersion,
     HubProperty.LegoWirelessProtocolVersion,
     //HubProperty.SystemTypeId, // reports "2" which does not match 0x43
     //HubProperty.HardwareNetworkId, // Throws command not recognized error for MarioHub
     HubProperty.PrimaryMacAddress,
     HubProperty.SecondaryMacAddress,
     //HubProperty.HardwareNetworkFamily, // may throw command not recognized error for MarioHub
 })
 {
 }
Esempio n. 16
0
    public static async Task <PortFeedback> SendPortOutputCommandAsync(this ILegoWirelessProtocol self, PortOutputCommandMessage message)
    {
        var portId = message.PortId;

        var response = await self.SendMessageReceiveResultAsync <PortOutputCommandFeedbackMessage>(message, msg => msg.Feedbacks.Any(f => f.PortId == portId));

        return(response.Feedbacks.FirstOrDefault(f => f.PortId == portId).Feedback);
    }
Esempio n. 17
0
        public MarioHubAccelerometer(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _rawMode  = MultiValueMode <sbyte, sbyte>(ModeIndexRaw);
            _gestMode = MultiValueMode <short, short>(ModeIndexGesture);

            //ObserveForPropertyChanged(_rawMode.Observable, nameof(Coins));
        }
Esempio n. 18
0
        public Current(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _currentLMode = SingleValueMode <short>(ModeIndexCurrentL);
            _currentSMode = SingleValueMode <short>(ModeIndexCurrentS);

            ObserveForPropertyChanged(_currentLMode.Observable, nameof(CurrentL), nameof(CurrentLPct));
            ObserveForPropertyChanged(_currentSMode.Observable, nameof(CurrentS), nameof(CurrentSPct));
        }
Esempio n. 19
0
        public DuploTrainBaseSpeedometer(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _speedMode = SingleValueMode <short, short>(ModeIndexSpeed);
            _countMode = SingleValueMode <int, int>(ModeIndexCount);

            ObserveForPropertyChanged(_speedMode.Observable, nameof(Speed), nameof(SpeedPct));
            ObserveForPropertyChanged(_countMode.Observable, nameof(Count));
        }
Esempio n. 20
0
        protected TachoMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _speedMode    = SingleValueMode <sbyte, sbyte>(ModeIndexSpeed);
            _positionMode = SingleValueMode <int, int>(ModeIndexPosition);

            ObserveForPropertyChanged(_speedMode.Observable, nameof(Speed), nameof(SpeedPct));
            ObserveForPropertyChanged(_positionMode.Observable, nameof(Position), nameof(PositionPct));
        }
Esempio n. 21
0
        public Voltage(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _voltageLMode = SingleValueMode <short>(ModeIndexVoltageL);
            _voltageSMode = SingleValueMode <short>(ModeIndexVoltageS);

            ObserveForPropertyChanged(_voltageLMode.Observable, nameof(VoltageL), nameof(VoltageLPct));
            ObserveForPropertyChanged(_voltageSMode.Observable, nameof(VoltageS), nameof(VoltageSPct));
        }
Esempio n. 22
0
        public TechnicDistanceSensor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
            : base(protocol, hubId, portId)
        {
            _distlMode = SingleValueMode <short, short>(ModeIndexDistance);
            _distsMode = SingleValueMode <short, short>(ModeIndexShortOnlyDistance);
            _singlMode = SingleValueMode <short, short>(ModeIndexSingleMeasurement);
            _lightMode = MultiValueMode <sbyte, sbyte>(ModeIndexLight);

            ObserveForPropertyChanged(_distlMode.Observable, nameof(Distance));
            ObserveForPropertyChanged(_distsMode.Observable, nameof(ShortOnlyDistance));
            ObserveForPropertyChanged(_singlMode.Observable, nameof(Single));
        }
Esempio n. 23
0
        public Hub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <Hub> logger, IServiceProvider serviceProvider, Port[] knownPorts)
        {
            Protocol        = protocol ?? throw new ArgumentNullException(nameof(protocol));
            _deviceFactory  = deviceFactory ?? throw new ArgumentNullException(nameof(deviceFactory));
            ServiceProvider = serviceProvider ?? throw new ArgumentNullException(nameof(serviceProvider));
            AddKnownPorts(knownPorts ?? throw new ArgumentNullException(nameof(knownPorts)));
            _logger = logger;

            SetupOnHubChange();
            SetupOnPortChangeObservable(Protocol.UpstreamMessages);
            SetupHubAlertObservable(Protocol.UpstreamMessages);
            SetupHubPropertyObservable(Protocol.UpstreamMessages);
        }
Esempio n. 24
0
        public Device(ILegoWirelessProtocol protocol, byte hubId, byte portId)
        {
            _protocol = protocol ?? throw new ArgumentNullException(nameof(protocol));
            _hubId    = hubId;
            _portId   = portId;

            _portValueObservable = _protocol.UpstreamMessages
                                   .Where(msg => msg.HubId == _hubId)
                                   .SelectMany(msg => msg switch
            {
                PortValueSingleMessage pvsm => pvsm.Data,
                PortValueCombinedModeMessage pvcmm => pvcmm.Data,
                _ => Array.Empty <PortValueData>(),
            })
Esempio n. 25
0
 public TechnicMediumHub(ILegoWirelessProtocol protocol, IDeviceFactory deviceFactory, ILogger <TechnicMediumHub> logger, IServiceProvider serviceProvider = default)
     : base(protocol, deviceFactory, logger, serviceProvider, new Port[] {
     new Port(0, nameof(A), true),
     new Port(1, nameof(B), true),
     new Port(2, nameof(C), true),
     new Port(3, nameof(D), true),
     new Port(50, string.Empty, false, expectedDevice: DeviceType.RgbLight),
     new Port(59, string.Empty, false, expectedDevice: DeviceType.Current),
     new Port(60, string.Empty, false, expectedDevice: DeviceType.Voltage),
     new Port(61, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubTemperatureSensor),
     new Port(96, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubTemperatureSensor),
     new Port(97, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubAccelerometer),
     new Port(98, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubGyroSensor),
     new Port(99, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubTiltSensor),
     new Port(100, string.Empty, false, expectedDevice: DeviceType.TechnicMediumHubGestureSensor),
 })
 {
 }
Esempio n. 26
0
        public static Mode Create(ILegoWirelessProtocol protocol, byte hubId, byte portId, byte modeIndex, IObservable <PortValueData> modeValueObservable)
        {
            var modeInfo = protocol.Knowledge.PortMode(hubId, portId, modeIndex);

            Mode result = null;

            result = (modeInfo.DatasetType, modeInfo.NumberOfDatasets) switch
            {
                (PortModeInformationDataType.SByte, 1) => new SingleValueMode <sbyte>(protocol, modeInfo, modeValueObservable),
                (PortModeInformationDataType.SByte, _) => new MultiValueMode <sbyte>(protocol, modeInfo, modeValueObservable),

                (PortModeInformationDataType.Int16, 1) => new SingleValueMode <short>(protocol, modeInfo, modeValueObservable),
                (PortModeInformationDataType.Int16, _) => new MultiValueMode <short>(protocol, modeInfo, modeValueObservable),

                (PortModeInformationDataType.Int32, 1) => new SingleValueMode <int>(protocol, modeInfo, modeValueObservable),
                (PortModeInformationDataType.Int32, _) => new MultiValueMode <int>(protocol, modeInfo, modeValueObservable),

                (PortModeInformationDataType.Single, 1) => new SingleValueMode <float>(protocol, modeInfo, modeValueObservable),
                (PortModeInformationDataType.Single, _) => new MultiValueMode <float>(protocol, modeInfo, modeValueObservable),

                _ => throw new NotSupportedException("Mode of unknown data type"),
            };
Esempio n. 27
0
        public IPoweredUpDevice CreateConnected(DeviceType deviceType, ILegoWirelessProtocol protocol, byte hubId, byte portId)
        {
            var type = GetTypeFromDeviceType(deviceType);

            return((type == null) ? new DynamicDevice(protocol, hubId, portId) : (IPoweredUpDevice)ActivatorUtilities.CreateInstance(_serviceProvider, type, protocol, hubId, portId));
        }
 public TechnicLargeLinearMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId)
     : base(protocol, hubId, portId)
 {
 }
Esempio n. 29
0
 public DevicesList(ILegoWirelessProtocol protocol, DiscoverPorts discoverPorts)
 {
     this.protocol      = protocol ?? throw new ArgumentNullException(nameof(protocol));
     this.discoverPorts = discoverPorts ?? throw new ArgumentNullException(nameof(discoverPorts));
 }
Esempio n. 30
0
 public TraceMessages(ILegoWirelessProtocol protocol, ILogger <TraceMessages> logger = default)
 {
     _protocol = protocol ?? throw new ArgumentNullException(nameof(protocol));
     _logger   = logger;
 }