コード例 #1
0
ファイル: DeviceLearner.cs プロジェクト: roel80/FreeAtHome
        static bool DiscoverDevice(ref KNXUartConnection kNXUart)
        {
            if (deviceToLearn.KnxAddress.knxAddress == 0 || deviceToLearn.ChannelCount == 0)
            {
                ConsoleWriteHeader("Waiting for Device Discovery Response ");
                //*----------------------------------------------------------------------------
                devLearnState = DeviceLearningState.deviceDiscovery;
                KNXmessage knxDeviceDescriptorRead = FAHDeviceDescriptorRead.CreateFAHDeviceDescriptorRead();
                Console.Write(string.Format("{0}; {1} ", knxDeviceDescriptorRead.Timestamp.ToString(KNXHelpers.DateTimeFormat), knxDeviceDescriptorRead.HeaderAsString));
                knxDeviceDescriptorRead.Payload.ReadablePayloadPacket.PrintUnaccountedBytes();
                kNXUart.WriteDirect(knxDeviceDescriptorRead, false);

                while (devLearnState != DeviceLearningState.deviceDiscoveryResponse)
                {
                    Console.Write('.');
                    Thread.Sleep(1000);
                }
                Console.WriteLine("OK: " + deviceToLearn.FaHAddress);

                /*
                 * if (deviceToLearn.SystemID == new FahSystemID(0xFF, 0xFF) || deviceToLearn.KnxAddress == new KNXAddress(0xFF, 0xFF))
                 * {
                 *  deviceToLearn.SystemID = SystemID;
                 *  deviceToLearn.KnxAddress = new KNXAddress(0x6F, 0x01);
                 * }*/
                //deviceToLearn.SetAddressInformation(new KNXAddress(0xFF, 0xFF), SystemID);
            }
            else
            {
                Console.WriteLine("Device ID known: {0}-->{1}", deviceToLearn.FaHAddress, deviceToLearn.KnxAddress);
            }

            //*----------------------------------------------------------------------------

            //if (deviceToLearn.SystemID == new FahSystemID(0xFF, 0xFF) || deviceToLearn.KnxAddress == new KNXAddress(0xFF, 0xFF))
            {
                ConsoleWriteHeader("IndividualAddressSerialNumberWrite");
                KNXmessage knxSetSerialNumber = FAHIndividualAddressSerialNumberWrite.CreateFAHIndividualAddressSerialNumberWrite(deviceToLearn);
                if (!kNXUart.WriteDirect(knxSetSerialNumber, true))
                {
                    return(false);
                }

                Console.WriteLine("OK: " + deviceToLearn.KnxAddress);
            }

            /*else
             * {
             *  writehead("Keeping Address: " + deviceToLearn.KnxAddress);
             * }*/
            devLearnState = DeviceLearningState.deviceReadSettings;
            return(true);
        }
コード例 #2
0
ファイル: DeviceLearner.cs プロジェクト: roel80/FreeAtHome
        private static void KNXUart_OnKNXMessage(KNXNetworkLayerTemplate caller, KNXBaseTypes.KNXmessage Message, KNXNetworkLayerTemplate.KnxPacketEvents uartEvent)
        {
            if (Message.ControlField.RepeatFrame)
            {
                //Repeatframe
                return;
            }
            if (Message.SourceAddress == SysApEmulator.KnxAddress)
            {
                //Self
                return;
            }

            switch (devLearnState)
            {
            case DeviceLearningState.deviceDiscovery:
                if (Message.Payload.Apdu.apduType == KNXAdpu.ApduType.DeviceDescriptorResponse)
                {
                    Message.Payload.ReadablePayloadPacket = new FAHDeviceDescriptorResponse(Message.Payload);
                    bool more;
                    ((FAHDeviceDescriptorResponse)Message.Payload.ReadablePayloadPacket).SaveToDevice(ref deviceToLearn, out more);
                    devLearnState = DeviceLearningState.deviceDiscoveryResponse;
                    return;
                }
                break;

            case DeviceLearningState.deviceReadSettings:
                if (Message.SourceAddress == deviceToLearn.KnxAddress)
                {
                    if (Message.ControlField.RepeatFrame)
                    {
                        //For now ignore
                        return;
                    }
                    knxMsgtoProcess = Message;
                }
                break;

            default:
                Console.Write(string.Format("{0} ", Message.HeaderAsString));
                Message.Payload.ReadablePayloadPacket.PrintUnaccountedBytes();
                break;
            }
        }