Beispiel #1
0
        /// <summary>
        /// Sucht die Position des ersten gültigen M3S-Frames in einem übergebenen Buffer
        /// </summary>
        /// <param name="rBuffer">Buffer, der durchsucht werden soll</param>
        /// <returns>Position des ersten gültigen M3S-Frames (-1 wenn nichts gefunden wurde)</returns>
        int GetFirstValidFramePosition(ThreadsafeReceiveBuffer rBuffer, out M3SProtocol oProtocol)
        {
            oProtocol = M3SProtocol.Invalid;

            if (!rBuffer.DataAvailable)                                                                         // Buffer Empty
            {
                return(-1);
            }
            if (rBuffer.DataPtr < protocol.MinimumFrameLength)              // not enough Data available
            {
                return(-1);
            }

            int upperBound = -1;

            for (int start = 0; start <= rBuffer.DataPtr - protocol.MinimumFrameLength; start++)
            {
                if (han.ExtractProtocol(rBuffer.ReadByte(start)) == M3SProtocol.Acknowledge)
                {
                    if (protocol.IsFrame(rBuffer.readBytes(start, start + 4)))
                    {
                        oProtocol = M3SProtocol.Acknowledge;
                        return(start);
                    }
                }


                upperBound = rBuffer.ReadByte(start + protocol.UpperBoundPosition);                    // Ausgelesenes Upperbound aus angenommener Bitposition..
                byte[] frameToTest = rBuffer.readBytes(start, start + upperBound + protocol.Overhead); // Zu testendes Frame

                if (protocol.IsFrame(frameToTest))
                {
                    oProtocol = han.ExtractProtocol(frameToTest[0]);
                    return(start);
                }
            }



            return(-1);
        }
Beispiel #2
0
        /// <summary>
        /// Sucht die Position des ersten gültigen M3S-Frames in einem übergebenen Buffer
        /// </summary>
        /// <param name="rBuffer">Buffer, der durchsucht werden soll</param>
        /// <returns>Position des ersten gültigen M3S-Frames (-1 wenn nichts gefunden wurde)</returns>
        int GetFirstValidFramePosition(ThreadsafeReceiveBuffer rBuffer, out M3SProtocol oProtocol)
        {
            oProtocol = M3SProtocol.Invalid;

            if(!rBuffer.DataAvailable)								// Buffer Empty
            {
                return(-1);
            }
            if(rBuffer.DataPtr < protocol.MinimumFrameLength)   // not enough Data available
            {
                return(-1);
            }

            int upperBound = -1;

            for(int start = 0; start<=rBuffer.DataPtr - protocol.MinimumFrameLength; start++)
            {

                if(han.ExtractProtocol(rBuffer.ReadByte(start))== M3SProtocol.Acknowledge)
                {
                    if(protocol.IsFrame(rBuffer.readBytes(start, start+4)))
                    {
                        oProtocol = M3SProtocol.Acknowledge;
                        return(start);
                    }
                }

                upperBound = rBuffer.ReadByte(start + protocol.UpperBoundPosition); // Ausgelesenes Upperbound aus angenommener Bitposition..
                byte[] frameToTest = rBuffer.readBytes(start, start + upperBound + protocol.Overhead); // Zu testendes Frame

                if(protocol.IsFrame(frameToTest))
                {
                    oProtocol = han.ExtractProtocol(frameToTest[0]);
                    return(start);
                }
            }

            return(-1);
        }
Beispiel #3
0
        /// <summary>
        /// Sendet einen Broad- oder Multicast (je nach parameter)
        /// </summary>
        /// <param name="vMulticastAddr">Multicastadresse, pass 0 if Broadcast should be sent</param>
        /// <param name="rData">Payload</param>
        /// <param name="vProtocol">M3S-Protocol Number</param>
        /// <param name="vMulticast">Determines wheter Multicast (true) or Broadcast is sent</param>
        /// <returns></returns>
        private int sendBroadOrMulticast(int vMulticastAddr, byte[] rData, M3SProtocol vProtocol, bool vMulticast)
        {
            int tmpErr;

            if(vMulticast) // wenn multicast, dann multicastadresse prüfen
            {
                tmpErr	= TBL.Check.CheckM3SSlaveAddress(vMulticastAddr);

                if(tmpErr != 0)
                {
                    return(tmpErr);
                }
            }

            protocol.CheckPayloadLength(rData, out tmpErr);

            if(tmpErr != 0)
            {
                return(tmpErr);
            }

            // Eigentliches Senden

            if(interferenceHandling) // Expliziter Aufruf da ich nix empfangen werde
            {
                recBuffer.HandleGarbage();
            }

            // Erzeuge Frame
            IM3S_Dataframe toSend = protocol.CreateFrame(vMulticastAddr,vProtocol, mAddr, rData,true,false); // Als Multicast deklarieren

            if(debugMode)
            {
                if(vMulticast)
                {
                    stdOut.Debug("Send Multicast ("+rData.Length+" bytes) to Multicast-Address " + vMulticastAddr.ToString() + " via Protocol " + vProtocol.ToString());
                }
                else
                {
                    if(vMulticast)
                    {
                        stdOut.Debug("Send Broadcast ("+rData.Length+" bytes) via Protocol " + vProtocol.ToString());
                    }
                }
            }

            return(sendToHardware(toSend.GetDataframe()));
        }
Beispiel #4
0
        /// <summary>
        /// Konstruktor: Alle zu verpackenden Parameter werden übergeben, können später nicht mehr geändert werden.
        /// </summary>			/// 
        /// <param name="pAddr">Slaveadresse (0 bei Broadcasts)</param>
        /// <param name="pProtocol"><see cref="M3SProtocol">M3SProtocol</see></param>
        /// <param name="pMAddr">Masteradresse (1..3), 0 bei Broadcasts und Reset</param>
        /// <param name="pData">max. 256 sendende Datenbytes als byte[]</param>
        /// <param name="pSend">Senden?
        /// <list type="bullet">
        /// <item>true ... Master send, Slave Receive</item>
        /// <item>false... Slave send / Master receive</item>
        /// </list>
        /// </param>
        /// <param name="vAcknowledge">true wenn Acknowledge oder AcknowledgeRequest signalisiert werden soll (nur bei Unicastprotokollen), false bei Not-Acknowledge, Not-AcknowledgeRequest und allen anderen Frames</param>
        /// <example>Das Beispiel zeigt das Verpacken Parametern in versandfertige Daten.
        /// <code>
        /// //TODO: Code Example
        /// </code>
        /// </example>
        public M3S_V1_Dataframe(int pAddr, M3SProtocol pProtocol, int pMAddr, byte[] pData, bool pSend, bool vAcknowledge)
        {
            addr = Convert.ToByte(pAddr);
                databytes = pData;
                send = pSend;

                if(pProtocol == M3SProtocol.Acknowledge || pProtocol == M3SProtocol.CommandBroadcast || pProtocol == M3SProtocol.BroadCast)
                {
                    acknowledgeOrAckRequest = vAcknowledge;
                }
                else
                {
                    acknowledgeOrAckRequest = false;
                }
                protocol = pProtocol;
                mAddr = pMAddr;

                // init...
                checksum_code = Convert.ToInt32(chkSumCode[0] <<16) | Convert.ToInt32(chkSumCode[1] << 8) | Convert.ToInt32(chkSumCode[2]);
        }
Beispiel #5
0
 /// <summary>
 /// Erzeugt eine neue <see cref="M3S_V2_Dataframe">M3S_V2_Dataframe</see> Instanz
 /// </summary>
 /// <param name="vSlaveAddress">Am Transfer beteiligter Frame</param>
 /// <param name="vProtocol">Verwendetes Protokoll</param>
 /// <param name="vMasterAddress">Am Transfer beteiligter Master</param>
 /// <param name="rData">Payload</param>
 /// <param name="vMasterSend">Datenrichtung: MasterSend / !SlaveSEnd</param>
 /// <param name="vAcknowledge">
 ///<list type="table">
 /// 	<listheader><term>Verwendetes Protokoll</term><description>Werte</description></listheader>
 /// 	<item><term>Acknowledge</term><description>True... Acknowledge, False ... Not Acknowledge></description></item>
 /// 	<item><term>Unicastprotokoll, Datenrichtung MasterSend</term><description>true ... Acknowledge Request, false ... Frame darf nicht quittiert werden</description></item>
 /// 	<item><term>Andere Protokolle</term><description>false übergeben</description></item>			
 /// </list>
 /// </param>
 /// <returns>Via <see cref="IM3S_Dataframe">IM3S_Dataframe</see> zugreifbare Instanz eines Datenframes</returns>			
 public IM3S_Dataframe CreateFrame(int vSlaveAddress, M3SProtocol vProtocol, int vMasterAddress, byte[] rData, bool vMasterSend, bool vAcknowledge)
 {
     return(new M3S_V2_Dataframe(vSlaveAddress,vProtocol,vMasterAddress,rData,vMasterSend,vAcknowledge));
 }
Beispiel #6
0
        /// <summary>
        /// Konstruktor: Alle zu verpackenden Parameter werden übergeben, können später nicht mehr geändert werden.
        /// </summary>			/// 
        /// <param name="pAddr">Slaveadresse (0 bei Broadcasts)</param>
        /// <param name="pProtocol"><see cref="M3SProtocol">M3SProtocol</see></param>
        /// <param name="pMAddr">Masteradresse (1..3), 0 bei Broadcasts und Reset</param>
        /// <param name="pData">max. 256 sendende Datenbytes als byte[]</param>
        /// <param name="pSend">Senden?
        /// <list type="bullet">
        /// <item>true ... Master send, Slave Receive</item>
        /// <item>false... Slave send / Master receive</item>
        /// </list>
        /// </param>
        /// <param name="vAcknowledge">true wenn Acknowledge oder AcknowledgeRequest signalisiert werden soll (nur bei Unicastprotokollen), false bei Not-Acknowledge, Not-AcknowledgeRequest und allen anderen Frames</param>
        /// <example>Das Beispiel zeigt das Verpacken diverser Parameter in versandfertige Datenbytes
        /// <code>
        /// TODO Codexample...
        /// </code>
        /// </example>
        public M3S_V2_Dataframe(int pAddr, M3SProtocol pProtocol, int pMAddr, byte[] pData, bool pSend, bool vAcknowledge)
        {
            addr = Convert.ToByte(pAddr);
                databytes = pData;
                send = pSend;

                acknowledgeOrAckRequest = vAcknowledge;
                protocol = pProtocol;
                mAddr = pMAddr;
        }