コード例 #1
0
ファイル: HDKnxHandler.cs プロジェクト: RrPt/HDObjects
        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();
                }
            }
        }
コード例 #2
0
ファイル: HDKnxHandler.cs プロジェクト: RrPt/HDObjects
        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);
        }
コード例 #3
0
ファイル: HDKnx.cs プロジェクト: RrPt/HDObjects
        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));
        }
コード例 #4
0
ファイル: KnxNet.cs プロジェクト: RrPt/HDObjects
        /// <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);
            }
        }
コード例 #5
0
ファイル: HDKnxHandler.cs プロジェクト: RrPt/HDObjects
        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();
                }
            }
        }