protected static SerialConfig AddPort(SerialConfig cfgBase, bool autoConnect) { if (Serials.ContainsKey(cfgBase.PortName)) { //Serials[cfg.PortName].SetParams((uint)cfg.Speed, cfg.DataBits, cfg.StopBits, cfg.Parity); if (autoConnect && !Serials[cfgBase.PortName].IsOpened) { Serials[cfgBase.PortName].Connect(); } return cfgBase; } var cfg = ComPortConfigs.FirstOrDefault(s => s.PortName == cfgBase.PortName); SerialConfig cfgNew = null; SerialManager sm; switch (cfgBase.RxPacketType) { case PacketType.SimpleCoded: case PacketType.SimpleCRC: throw new NotImplementedException("PacketType.SimpleCRC have no manager today!"); case PacketType.Sized: sm = new SerialPacketManager(cfgBase); break; case PacketType.SizedOld: sm = new SerialPacketManager(cfgBase); break; case PacketType.Addressed: sm = new SerialAddressedManager(cfgBase); (sm as SerialAddressedManager).DeviceAddr = 0xAA; break; case PacketType.AddressedOld: sm = new SerialAddressedManager(cfgBase); break; case PacketType.XRouting: /*if (cfg == null) { cfgNew = new XRSerialConfig(cfgBase); sm = new XRoutingManager(cfgNew as XRSerialConfig); } else { sm = new XRoutingManager(cfg as XRSerialConfig); } */ sm = new XRoutingManager(cfgBase); (sm as XRoutingManager).DeviceAddr = 0xAB; break; default: sm = new SerialManager(cfgBase); break; } if (cfg == null) { if (cfgNew != null) { ComPortConfigs.Add(cfgNew); cfg = cfgNew; } else { ComPortConfigs.Add(cfgBase); cfg = cfgBase; } } Log(cfg); sm.OnReceive += serial_OnReceive; sm.OnSend += sm_OnSend; sm.OnError += serial_OnError; sm.OnStateChange += serial_OnStateChange; if (autoConnect) { if (sm.Connect()) { Serials.Add(cfg.PortName, sm); return cfg; } else { Warn("Can't connect " + cfg.PortName); sm.OnReceive -= serial_OnReceive; sm.OnSend -= sm_OnSend; sm.OnError -= serial_OnError; sm.OnStateChange -= serial_OnStateChange; return null; } } return cfg; }
private void _msg_routing_GiveFactoryNum(XPacket packet, XRoutingManager manager) { if (packet.SourceAddr == 0 && packet.DestinationType == 1) { var fr = packet.ToFactoryRecord(); XDevice device = KnownDevices.FirstOrDefault<XDevice>(xd => xd.FactoryRec == fr); if (device == null) { device = new XDevice() { FactoryRec = fr }; byte addr = 01; while (KnownDevices.FirstOrDefault<XDevice>(xd => xd.Addr == addr) != null) { addr++; if (addr >= 255) throw new Exception("All addressed closed!"); } device.Addr = addr; KnownDevices.Add(device); } LastDeviceAddr = device.Addr; /* #dstAddr 00 #dstType 02 #srcAddr 254 #srcType A6 FactoryNum */ Send(new XPacket() { Data = packet.Data, SourceAddr = DeviceAddr, SourceType = device.Addr, DestinationType = 2 } ); State = EDeviceState.Working; } if (packet.DestinationAddr == DeviceAddr && packet.DestinationType == 4) { XDevice device = KnownDevices.FirstOrDefault<XDevice>(xd => xd.Addr == packet.SourceAddr); if (device == null) { device = new XDevice() { Addr = packet.SourceAddr, FactoryRec = packet.ToFactoryRecord() }; KnownDevices.Add(device); } if (packet.SourceAddr == 0) { if (device.Addr == 0) { byte addr = 01; while (KnownDevices.FirstOrDefault<XDevice>(xd => xd.Addr == addr) != null) { addr++; if (addr >= 255) throw new Exception("All addressed closed!"); } device.Addr = addr; } /* #dstAddr 3F #dstType 04 #srcAddr 23 #srcType 00 FactoryNum */ Send(new XPacket() { Data = packet.Data, SourceAddr = DeviceAddr, SourceType = device.Addr, DestinationType = 2 }); } else { if (packet.SourceAddr == DeviceAddr) DeviceAddr--;//ЕСЛИ В СЕТИ УЖЕ ЕСТЬ УСТРОЙСТВО С ТАКИМ АДРЕСОМ } LastDeviceAddr = device.Addr; State = EDeviceState.Working; } if (packet.DestinationType == 5) { Send(new XPacket() { Data = FactoryRec, SourceAddr = DeviceAddr, SourceType = 05, DestinationAddr = packet.DestinationAddr, DestinationType = 4 }); } }