Пример #1
0
        /// <summary>
        /// Sollte nur vom Konstruktor aufgerufen werden, versucht übergebenes Objekt in M3S-Datenframe oder Interference zu konvertieren
        /// </summary>
        /// <param name="rToStore">m3sDataframe oder Bytestream</param>
        private void analyseAndStore(object rToStore)
        {
            // Differenziere was es ist...
            logTime = DateTime.Now;
            dgv     = new DataGridView();

            if (rToStore.GetType() == typeof(IM3S_Dataframe))
            {
                validFrame = rToStore as IM3S_Dataframe;
            }

            else if (rToStore.GetType() == typeof(byte[]))
            {
                // Konvertierung war nicht erfolgreich, probiere es in einen Bytestream zu verwandeln

                byte[] tempStream = rToStore as byte[];

                try
                {
                    int errCode = -555;
                    validFrame = protocol.CreateFrameByBytestream(tempStream, out errCode);

                    if (errCode == 0)                            // Konvertierung war erfolgreich
                    {
                        isValidFrame = true;
                        interference = null;
                    }
                    else                             // Konvertierung war nicht erfolgreich
                    {
                        validFrame   = null;
                        interference = tempStream;                                 // Ablegen
                        isValidFrame = false;
                    }
                }
                catch
                {
                    // Nothing, war einfach nicht konvertierbar... Muss also Störung sein
                    validFrame   = null;
                    interference = tempStream;                             // Ablegen
                    isValidFrame = false;
                }
            }
            else if (rToStore.GetType() == typeof(byte))
            {
            }
            else
            {
                // War auch kein Bytearray, also Exception
                TBL.Exceptions.ConversionException ex = new TBL.Exceptions.ConversionException("Das bei der Instanzierung an M3sLogFrame übergebene hat keinen gültigen Typ (erlaubt: m3sDataframe und byte[])");
                throw ex;
            }

            if (this.isValidFrame)
            {
                if (this.validFrame.Protocol == M3SProtocol.Reset)
                {
                    resetCounter++;
                }
            }
        }
Пример #2
0
        private void recBuffer_ByteReceived(object sender, EventArgs e)
        {
            int err;

            while (recBuffer.DataPtr > protocol.MinimumFrameLength)            // während im Buffer entsprechen dda
            {
                somethingToSend = false;
                bool ackResult = false;
                // immer von vorne her anschaun


                if (state == DevComSlaveState.NotReady)
                {
                    for (int i = 0; i < resetFrame.Length && i < recBuffer.DataPtr; i++)
                    {
                        if (recBuffer.ReadByte(i) != resetFrame[i])               // If it doesnt match frame
                        {
                            recBuffer.FreeBytes(0, i);                            // Remove Bytes incl. faulty byte
                            recBuffer.Flush();
                            break;
                        }

                        if (i == resetFrame.GetUpperBound(0))                        // got here without error => reset gotten
                        {
                            recBuffer.FreeBytes(0, i);
                            recBuffer.Flush();
                            reset();
                        }
                    }
                }
                else
                {
                    for (int bufferIdx = protocol.MinimumFrameLength - 1; bufferIdx < recBuffer.DataPtr; bufferIdx++)
                    {
                        byte[] possFrame = recBuffer.readBytes(0, bufferIdx);

                        if (protocol.IsFrame(possFrame))
                        {
                            // Do something with the frame
                            IM3S_Dataframe frame = protocol.CreateFrameByBytestream(possFrame, out err);

                            if (err != 0)
                            {
                                if (debugmode)
                                {
                                    stdOut.Error("Could not convert Bytestream to valid M3S-Dataframe: " + TBLConvert.BytesToHexString(possFrame));
                                }
                            }
                            else
                            {
                                switch (frame.Protocol)
                                {
                                case M3SProtocol.CommandBroadcast:
                                    if (frame.MulticastAddress == 0 || frame.MulticastAddress == mcAddr)
                                    {
                                        ackResult = processFrame(frame, out err);
                                    }
                                    break;

                                case M3SProtocol.DataTransfer:
                                    if (frame.SlaveAddress == slaveAddr)
                                    {
                                        ackResult = processFrame(frame, out err);
                                    }
                                    break;

                                case M3SProtocol.Command:
                                    if (frame.SlaveAddress == slaveAddr)
                                    {
                                        ackResult = processFrame(frame, out err);
                                    }
                                    break;

                                case M3SProtocol.BroadCast:
                                    if (frame.MulticastAddress == 0 || frame.MulticastAddress == mcAddr)
                                    {
                                        ackResult = processFrame(frame, out err);
                                    }
                                    break;
                                }
                                if (frame.NeedsAcknowledgement && !ackAlreadySent)
                                {
                                    hwInterface.WriteData(protocol.GetAcknowledgeFrame(ackResult, possFrame).GetDataframe());
                                    somethingToSend = true;
                                }
                            }

                            // remove the frame
                            recBuffer.FreeBytes(0, bufferIdx);
                            recBuffer.Flush();
                        }
                    }
                }


                if (!somethingToSend)
                {
                    // Only for TCP clients
                    try
                    {
                        DevComTcpServer serv = hwInterface as DevComTcpServer;                         // if castable, its a server

                        serv.RemainListening();
                    }
                    catch
                    {
                        // do nothing instead
                    }
                }
            }
        }