public static void ReadParametersFromFile(string XmlFileName) { XmlEibItemList list; FileStream fs = null; try { XmlSerializer mySerializer = new XmlSerializer(typeof(XmlEibItemList)); fs = new FileStream(XmlFileName, FileMode.Open); if (fs == null) { return; } XmlReader reader = new XmlTextReader(fs); list = (XmlEibItemList)mySerializer.Deserialize(reader); foreach (XmlEibItem i in list.list) { Type ttt = Type.GetType(i.EisName); HDKnx o = (HDKnx)Activator.CreateInstance(ttt); o.name = i.name; o.destAdr = new EIB_Adress(i.EibAdress); //o.sourceAdr = new EIB_Adress(0, EIB_Adress_Typ.PhysAdr); o.unit = i.unit; if (!hdKnxObjList.ContainsKey(o.destAdr)) { hdKnxObjList.Add(o.destAdr, o); } } return; } catch (FileNotFoundException fnfeX) { list = null; Debug(fnfeX.ToString()); return; } finally { if (fs != null) { fs.Close(); } } }
public static HDKnx GetObject(cEMI emi) { // Suchen des passenden Objektes if (hdKnxObjList.ContainsKey(emi.destinationAdr)) { return(hdKnxObjList[emi.destinationAdr]); } // Wenn keines gefunden, dann eines anlegen HDKnx hdKnx = null; switch (emi.DataLen) { case 1: hdKnx = new EIS1(emi); break; case 2: hdKnx = new EIS14(emi); break; case 3: hdKnx = new EIS5(emi); break; case 4: hdKnx = new EIS3(emi); break; case 5: hdKnx = new EIS11(emi); break; default: hdKnx = null; break; } hdKnxObjList.Add(emi.destinationAdr, hdKnx); return(hdKnx); }
public override bool Equals(System.Object obj) { // If parameter is null return false. if (obj == null) { return(false); } // If parameter cannot be cast to Point return false. HDKnx p = obj as HDKnx; if ((System.Object)p == null) { return(false); } // Return true if the fields match: if (!destAdr.Equals(p.destAdr)) { return(false); } //if (!eisTyp.Equals(p.eisTyp)) return false; return(emi.Equals(p.emi)); }
/// <summary> /// Diese Funktion wird vom UDP-Client aufgerufen wenn ein neues Telegramm eingetroffen ist /// </summary> /// <param name="ar"></param> public void ReceiveCallback(IAsyncResult ar) { int Anz = (int)ar.AsyncState; IPEndPoint e = new IPEndPoint(IPAddress.Any, 0); Byte[] receiveBytes = udpClient.EndReceive(ar, ref e); Anz++; Debug("Empf: Telegr[" + Anz + "]=" + KnxTools.BytesToString(receiveBytes)); int AnzBytes = receiveBytes.Length; if (AnzBytes < 7) { Err("Err: Telegramm zu kurz, wird verworfen. " + KnxTools.BytesToString(receiveBytes)); return; } try { // prüfen ob es ein ControlTelegramm ist if (receiveBytes[2] == 0x02) { // es ist ein Controlltelegramm switch (receiveBytes[3]) { case 0x01: // Search Request Debug("Search Request from Gateway"); Debug("<S:" + KnxTools.BytesToString(receiveBytes)); break; case 0x02: // Search Response _channelId = receiveBytes[6]; Debug("Search Response from Gateway"); Debug("<s:" + KnxTools.BytesToString(receiveBytes)); break; case 0x03: // Description Request Debug("Description Request from Gateway"); Debug("<D:" + KnxTools.BytesToString(receiveBytes)); break; case 0x04: // Description Response _channelId = receiveBytes[6]; Debug("Description Response from Gateway"); Debug("<d:" + KnxTools.BytesToString(receiveBytes)); break; case 0x05: // Connect Request Info("Connection Request from Gateway"); Debug("<O:" + KnxTools.BytesToString(receiveBytes)); break; case 0x06: // Connect Response _channelId = receiveBytes[6]; Info("ChannelId = " + _channelId); Debug("<o:" + KnxTools.BytesToString(receiveBytes)); if (receiveBytes[7] == 0) { ConnectionState = KnxConnectionState.connected; } break; case 0x07: // Heartbeat Request Debug("HeartbeatRequest for ChannelId = " + _channelId); Debug("<H:" + KnxTools.BytesToString(receiveBytes)); break; case 0x08: // Heartbeat Response Debug("HeartbeatResponse from ChannelId = " + _channelId); Debug("<h:" + KnxTools.BytesToString(receiveBytes)); if (receiveBytes[7] == 0) { ConnectionState = KnxConnectionState.connected; } break; case 0x09: // Disconnect Request Debug("DisconnectRequest for ChannelId = " + _channelId); Debug("<C:" + KnxTools.BytesToString(receiveBytes)); break; case 0x0A: // Disconnect Response Debug("Disconnected ChannelId = " + _channelId); Debug("<c:" + KnxTools.BytesToString(receiveBytes)); if (receiveBytes[7] == 0) { ConnectionState = KnxConnectionState.disconnected; } break; default: Debug("<?:" + KnxTools.BytesToString(receiveBytes)); break; } } else if (receiveBytes[2] == 0x04) { // es ist kein Controlltelegramm if (receiveBytes[3] == 0x20) { // es ist ein Datentelegramm // erst ein Ack senden DataAck(receiveBytes[8]); // Header entfernen int idx = 0x0A; int len = receiveBytes.Length - idx; byte[] t = new byte[len]; Array.Copy(receiveBytes, idx, t, 0, len); // und cemi Telegramm daraus erzeugen cEMI emi = new cEMI(t); Debug("ReceiveCallback: " + emi.ToString()); // Suchen des passenden HDKnx Objektes HDKnx hdKnx = HDKnxHandler.GetObject(emi); // und dort den Wert setzen, falls erforderlich hdKnx.SetValue(emi); // und auch das emi übergeben hdKnx.emi = emi; // Prüfen auf doppelte Telegramme if (hdKnx.Equals(last_hdKnx)) { // verwerfen //Info("doppeltes Telegramm verworfen:"); } else { //Console.WriteLine("Setze last Telegramm: \r\nvon {0} == \r\nzu {1}",last_hdKnx, hdKnx); last_hdKnx = new HDKnx(hdKnx.emi); // Rohdaten melden falls gewünscht if (rawTelegramReceived != null) { rawTelegramReceived(t); } // geänderte Daten melden falls gewünscht if (dataChanged != null) { Debug("KnxNet.ReceiveCallback vor dataChanged" + t.ToString()); dataChanged(hdKnx); Debug("KnxNet.ReceiveCallback nach dataChanged" + t.ToString()); } if (telegramReceived != null) { // Ein Delegate ist eingerichtet, dann diesen aufrufen telegramReceived(emi); } if (QueueEnable) { // in Queue speichern lock (fromKnxQueue) { fromKnxQueue.Enqueue(emi); } Debug("AddToQueue: " + emi.ToString()); } } } else if (receiveBytes[3] == 0x21) { // Bestätigung eines Datentelegramm Debug("Daten bestätigt status = " + receiveBytes[9]); } } ar = udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), Anz); } catch (Exception ex) { Err("Err: Telegr[" + Anz + "]=" + KnxTools.BytesToString(receiveBytes)); Err("Err: ReceiveCallback: " + ex.ToString()); ar = udpClient.BeginReceive(new AsyncCallback(ReceiveCallback), Anz); } }
public static void ReadParametersFromEsfFile(string esfFileName) { FileStream fs = null; try { fs = new FileStream(esfFileName, FileMode.Open); if (fs == null) { return; } StreamReader reader = new StreamReader(fs); String line; //String teil; //int pos; // Read lines from the file until the end of // the file is reached. while ((line = reader.ReadLine()) != null) { // Console.WriteLine(line); try { String[] mainArray = line.Split(new char[] { '\t' }); String[] adrArray = mainArray[0].Split(new char[] { '.' }); String typ = mainArray[2]; Type ttt = null; if (typ.StartsWith("EIS 1")) { ttt = Type.GetType("Knx.EIS1"); } else if (typ.StartsWith("Uncertain (1 Byte)")) { ttt = Type.GetType("Knx.EIS1"); // sollte in ETS gepflegt werden } else if (typ.StartsWith("EIS 2")) { ttt = Type.GetType("Knx.EIS1"); // todo xxx da es eis2 noch nicht gibt! } else if (typ.StartsWith("Uncertain (2 Byte)")) { ttt = Type.GetType("Knx.EIS5"); // sollte in ETS gepflegt werden } else if (typ.StartsWith("Uncertain (3 Byte)")) { ttt = Type.GetType("Knx.EIS3"); // sollte in ETS gepflegt werden } else if (typ.StartsWith("EIS 3)")) { ttt = Type.GetType("Knx.EIS3"); // Zeit } else if (typ.StartsWith("EIS 4)")) { ttt = Type.GetType("Knx.EIS4"); // Datum } else { // Console.WriteLine(typ); } HDKnx o = (HDKnx)Activator.CreateInstance(ttt); o.name = mainArray[1]; o.destAdr = new EIB_Adress(adrArray[2]); o.unit = "?"; if (!hdKnxObjList.ContainsKey(o.destAdr)) { hdKnxObjList.Add(o.destAdr, o); } } catch (Exception) { Console.WriteLine("Fehler in " + line); } } return; } catch (FileNotFoundException fnfeX) { Console.WriteLine(fnfeX.ToString()); return; } finally { if (fs != null) { fs.Close(); } } }