Example #1
0
        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);
        }
Example #2
0
        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));
            }
        }