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)); }
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)); }
public BasicMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId) : base(protocol, hubId, portId) { _powerMode = SingleValueMode<sbyte>(ModeIndexPower); ObserveForPropertyChanged(_powerMode.Observable, nameof(Power), nameof(PowerPct)); }
public MarioHubPants(ILegoWirelessProtocol protocol, byte hubId, byte portId) : base(protocol, hubId, portId) { _pantsMode = SingleValueMode <sbyte, sbyte>(ModeIndexPants); ObserveForPropertyChanged(_pantsMode.Observable, nameof(Pants)); }
protected AbsoluteMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId) : base(protocol, hubId, portId) { _absoluteMode = SingleValueMode <short>(ModeIndexAbsolutePosition); ObserveForPropertyChanged(_absoluteMode.Observable, nameof(AbsolutePosition), nameof(AbsolutePositionPct)); }
public TechnicMediumHubTemperatureSensor(ILegoWirelessProtocol protocol, byte hubId, byte portId) : base(protocol, hubId, portId) { _temperatureMode = SingleValueMode <short>(ModeIndexTemperature); ObserveForPropertyChanged(_temperatureMode.Observable, nameof(Temperature), nameof(TemperaturePct)); }
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 }) { }
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, }) { }
public DuploTrainBaseMotor(ILegoWirelessProtocol protocol, byte hubId, byte portId) : base(protocol, hubId, portId) { _onSecMode = SingleValueMode <int>(ModeIndexOnSec); ObserveForPropertyChanged(_onSecMode.Observable, nameof(OnSeconds)); }
public RemoteControlRssi(ILegoWirelessProtocol protocol, byte hubId, byte portId) : base(protocol, hubId, portId) { _rssiMode = SingleValueMode <sbyte, sbyte>(ModeIndexRssi); ObserveForPropertyChanged(_rssiMode.Observable, nameof(Rssi)); }
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 }) { }
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 }) { }
/// <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), })
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 }) { }
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); }
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)); }
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)); }
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)); }
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)); }
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)); }
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)); }
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); }
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>(), })
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), }) { }
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"), };
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) { }
public DevicesList(ILegoWirelessProtocol protocol, DiscoverPorts discoverPorts) { this.protocol = protocol ?? throw new ArgumentNullException(nameof(protocol)); this.discoverPorts = discoverPorts ?? throw new ArgumentNullException(nameof(discoverPorts)); }
public TraceMessages(ILegoWirelessProtocol protocol, ILogger <TraceMessages> logger = default) { _protocol = protocol ?? throw new ArgumentNullException(nameof(protocol)); _logger = logger; }