private void SendMessage(CMessageCom message)
        {
            m_mutexStackDll.WaitOne();
            if (m_StackDll != null)
            {
                m_StackDll.SendData(message.Data(), message.Address, message.Command(), message.FID(), message.Response());
            }
            m_mutexStackDll.Release();

            //Se notifica de los Reset para poder continuar con el updater en las estaciones de protocolo 1
            if (message.Command() == (byte)EnumCommandFrame.M_RESET)
            {
                if (ResetSendedEvent != null)
                {
                    ResetSendedEvent(message.Address);
                }
            }
        }
Example #2
0
        /// <summary>
        /// Send messages until the pending messages to response is equal to the frame window
        /// </summary>
        private void TryToSend()
        {
            while (m_ToSendFrameWindow > 0)
            {
                CMessageCom message = ReadMessage();

                if (ReferenceEquals(message, null))
                {
                    break;
                }
                else
                {
                    //Decrementamos la ventana de mensajes
                    m_ToSendFrameWindow--;

                    //Activamos el timer de timeout
                    m_TimerConnectTimeOut.Change(Timeout.Infinite, Timeout.Infinite); //Stop the Timer
                    if (message.DelayedResponse)
                    {
                        //No desactivamos el mantenimiento de la conexión ya que el tiempo de respuesta es demasiado elevado
                        m_TimerConnectMaintenance.Change(TIMER_CONNECT_MAINTENANCE, TIMER_CONNECT_MAINTENANCE);                     //Start the Timer

                        m_TimerConnectTimeOut.Change(TIME_TIMEOUT_MESSAGE_DELAYED_RESPONSE, TIME_TIMEOUT_MESSAGE_DELAYED_RESPONSE); //Start the Timer
                    }
                    else
                    {
                        //Desactivamos el mantenimiento de la conexión
                        m_TimerConnectMaintenance.Change(Timeout.Infinite, Timeout.Infinite);     //Stop the Timer

                        m_TimerConnectTimeOut.Change(TIME_TIMEOUT_MESSAGE, TIME_TIMEOUT_MESSAGE); //Start the Timer
                    }

                    //FIXME . Modo BURST solo se utiliza para la DME.
                    //Para la DME todas las comunicaciones van contra la dirección 0x00 pero cuando se envía un ACK se tiene que hacer contra la 0x10, sino, responde NACK
                    if (m_frameWindow > 1 & message.Command() == (byte)EnumCommandFrame.M_ACK)
                    {
                        message.Address = (byte)(0x10);
                    }

                    if (SendMessageEvent != null)
                    {
                        SendMessageEvent(message);
                    }
                }
            }
        }
Example #3
0
        /// <summary>
        /// Manage a timeout communication. Tries to resend the message. If attempts have been exhausted, raise an event
        /// </summary>
        /// <param name="state">Timer state</param>
        private void Elapsed_ConnectTimeOut(object state)
        {
            m_TimerConnectTimeOut.Change(Timeout.Infinite, Timeout.Infinite); //Stop the Timer

            if (m_Messages.Count > 0)
            {
                CMessageCom message = m_Messages[0];

                if (message.TriesRemaining() > 0)
                {
                    message.DecrementTriesRemaining();
                    m_Messages[0] = message;
                    if (message.DelayedResponse)
                    {
                        m_TimerConnectTimeOut.Change(TIME_TIMEOUT_MESSAGE_DELAYED_RESPONSE, TIME_TIMEOUT_MESSAGE_DELAYED_RESPONSE); //Start the Timer
                    }
                    else
                    {
                        m_TimerConnectTimeOut.Change(TIME_TIMEOUT_MESSAGE, TIME_TIMEOUT_MESSAGE); //Start the Timer
                    }


                    if (SendMessageEvent != null)
                    {
                        SendMessageEvent(message);
                    }
                }
                else
                {
                    m_Messages.RemoveAt(0);

                    if (ConnectionTimeOutEvent != null)
                    {
                        ConnectionTimeOutEvent(m_address, message.Command());
                    }
                }
            }
        }