예제 #1
0
        public static KNXmessage CreateResponse(FAHFunctionPropertyCommand MessageToRespondTo, FaHDevice atHomeDevice)
        {
            if (MessageToRespondTo.PropertyControl != FAHFunctionPropertyCommand.PropertyControlTypes.ReadDesc)
            {
                throw new InvalidCastException();
            }

            bool moreIndices = false;
            int  OIDindex    = MessageToRespondTo.PropertyID;

            byte[] bData;
            byte   indice = 0;

            if (MessageToRespondTo.FieldID != null)
            {
                indice = (byte)(MessageToRespondTo.FieldID);
            }

            if (!atHomeDevice.ReadOIDData(MessageToRespondTo.ObjectID, MessageToRespondTo.PropertyID, indice, out bData, out moreIndices))
            {
                return(MessageToRespondTo.CreateInvalidIndexMessage());
            }

            //OidChannel 5 needs ShortPkg! (currently based on packet payload lenght)
            KNXmessage kNXmessage;

            if (bData.Length < 5)
            {
                kNXmessage = new KNXmessage(knxControlField.KnxPacketType.KNX_PacketShort);
            }
            else
            {
                kNXmessage = new KNXmessage(knxControlField.KnxPacketType.KNX_PacketLong);
            }

            kNXmessage.DestinationAddressType = KNXmessage.DestinationAddressFieldType.Individual;

            const int HEADERSIZE = 5;

            //Todo, check lenght?
            uint payloadSize = (uint)(HEADERSIZE + bData.Length);

            kNXmessage.Payload.NewPayload(KNXAdpu.ApduType.FunctionPropertyStateResponse, payloadSize);
            kNXmessage.Payload.ReadablePayloadPacket = new FPSR_DeviceOIDData(kNXmessage.Payload);
            FPSR_DeviceOIDData newPkg = (FPSR_DeviceOIDData)kNXmessage.Payload.ReadablePayloadPacket;

            newPkg.UpdatePacketSettings();
            newPkg.FPSRpayload = bData;
            newPkg.PropertyID  = MessageToRespondTo.PropertyID;
            newPkg.ObjectID    = MessageToRespondTo.ObjectID;
            if (moreIndices)
            {
                newPkg.resultCode = KNXHelpers.knxPropertyReturnValues.MoreIndices;
            }
            else
            {
                newPkg.resultCode = KNXHelpers.knxPropertyReturnValues.Success;
            }
            return(kNXmessage);
        }