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); }
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; } }