public static byte[] Encode(LegoWirelessMessage message, ProtocolKnowledge knowledge) { var messageType = message switch { HubPropertyMessage msg => MessageType.HubProperties, HubActionMessage msg => MessageType.HubActions, HubAlertMessage msg => MessageType.HubAlerts, HubAttachedIOMessage msg => MessageType.HubAttachedIO, GenericErrorMessage msg => MessageType.GenericErrorMessages, PortInformationRequestMessage msg => MessageType.PortInformationRequest, PortModeInformationRequestMessage msg => MessageType.PortModeInformationRequest, PortInputFormatSetupSingleMessage msg => MessageType.PortInputFormatSetupSingle, PortInputFormatSetupCombinedModeMessage msg => MessageType.PortInputFormatSetupCombinedMode, PortInformationMessage msg => MessageType.PortInformation, PortModeInformationMessage msg => MessageType.PortModeInformation, PortValueSingleMessage msg => MessageType.PortValueSingle, PortValueCombinedModeMessage msg => MessageType.PortValueCombinedMode, PortInputFormatSingleMessage msg => MessageType.PortInputFormatSingle, PortInputFormatCombinedModeMessage msg => MessageType.PortInputFormatCombinedMode, VirtualPortSetupMessage msg => MessageType.VirtualPortSetup, PortOutputCommandMessage msg => MessageType.PortOutputCommand, PortOutputCommandFeedbackMessage msg => MessageType.PortOutputCommandFeedback, _ => throw new NotImplementedException(), }; var encoder = CreateEncoder(messageType, knowledge); var contentLength = encoder.CalculateContentLength(message); var commonHeaderLength = (contentLength + 3 > 127) ? 4 : 3; byte[] data = new byte[commonHeaderLength + contentLength]; CommonMessageHeaderEncoder.Encode(contentLength, message.HubId, messageType, data.AsSpan().Slice(0, commonHeaderLength)); encoder.Encode(message, data.AsSpan().Slice(commonHeaderLength)); return(data); }
private void OnHubPropertyMessage(HubPropertyMessage hubProperty) { if (hubProperty.Property == HubProperty.AdvertisingName && hubProperty is HubPropertyMessage <string> advData) { AdvertisingName = advData.Payload; OnPropertyChanged(nameof(AdvertisingName)); } else if (hubProperty.Property == HubProperty.Button && hubProperty is HubPropertyMessage <bool> btnData) { Button = btnData.Payload; OnPropertyChanged(nameof(Button)); } else if (hubProperty.Property == HubProperty.FwVersion && hubProperty is HubPropertyMessage <Version> fwVersionData) { FirmwareVersion = fwVersionData.Payload; OnPropertyChanged(nameof(FirmwareVersion)); } else if (hubProperty.Property == HubProperty.HwVersion && hubProperty is HubPropertyMessage <Version> hwVersionData) { HardwareVersion = hwVersionData.Payload; OnPropertyChanged(nameof(HardwareVersion)); } else if (hubProperty.Property == HubProperty.Rssi && hubProperty is HubPropertyMessage <sbyte> rssiData) { Rssi = rssiData.Payload; OnPropertyChanged(nameof(Rssi)); } else if (hubProperty.Property == HubProperty.BatteryVoltage && hubProperty is HubPropertyMessage <byte> batteryVoltageData) { BatteryVoltageInPercent = batteryVoltageData.Payload; OnPropertyChanged(nameof(BatteryVoltageInPercent)); } else if (hubProperty.Property == HubProperty.BatteryVoltage && hubProperty is HubPropertyMessage <BatteryType> batteryTypeData) { BatteryType = batteryTypeData.Payload; OnPropertyChanged(nameof(BatteryType)); } else if (hubProperty.Property == HubProperty.ManufacturerName && hubProperty is HubPropertyMessage <string> manNameData) { ManufacturerName = manNameData.Payload; OnPropertyChanged(nameof(ManufacturerName)); } else if (hubProperty.Property == HubProperty.RadioFirmwareVersion && hubProperty is HubPropertyMessage <string> radioData) { RadioFirmwareVersion = radioData.Payload; OnPropertyChanged(nameof(RadioFirmwareVersion)); } else if (hubProperty.Property == HubProperty.LegoWirelessProtocolVersion && hubProperty is HubPropertyMessage <Version> lwpData) { LegoWirelessProtocolVersion = lwpData.Payload; OnPropertyChanged(nameof(LegoWirelessProtocolVersion)); } else if (hubProperty.Property == HubProperty.SystemTypeId && hubProperty is HubPropertyMessage <SystemType> systemData) { SystemType = systemData.Payload; OnPropertyChanged(nameof(SystemType)); } else if (hubProperty.Property == HubProperty.HardwareNetworkId && hubProperty is HubPropertyMessage <byte> hwNetData) { HardwareNetworkId = hwNetData.Payload; OnPropertyChanged(nameof(HardwareNetworkId)); } else if (hubProperty.Property == HubProperty.PrimaryMacAddress && hubProperty is HubPropertyMessage <byte[]> primaryData) { PrimaryMacAddress = primaryData.Payload; OnPropertyChanged(nameof(PrimaryMacAddress)); } else if (hubProperty.Property == HubProperty.SecondaryMacAddress && hubProperty is HubPropertyMessage <byte[]> secondaryData) { SecondaryMacAddress = secondaryData.Payload; OnPropertyChanged(nameof(SecondaryMacAddress)); } else if (hubProperty.Property == HubProperty.HardwareNetworkFamily && hubProperty is HubPropertyMessage <byte> hwNetFamilyData) { HardwareNetworkFamily = hwNetFamilyData.Payload; OnPropertyChanged(nameof(HardwareNetworkFamily)); } }