Exemplo n.º 1
0
        /*    void m_busCan_MessagesReceived(CANDW sender, CANDW.MessagesReceivedEventArgs e) // bus Can va receptionner le message
         *  {
         *      int count = e.MessageCount;
         *
         *      for(int i=0;i<count;i++)
         *          m_msgRecu[i] = e.Messages[i];
         *
         *      Debug.Print("CanId reçu" + m_msgRecu[0].ArbitrationId.ToString());
         *
         *      AutoResetEvent evtDONE = (AutoResetEvent)m_tabWaitDONE[0];
         *      AutoResetEvent evtSTOP = (AutoResetEvent)m_tabWaitDONE[1];
         *      AutoResetEvent evtBLOCKED = (AutoResetEvent)m_tabWaitDONE[2];
         *      AutoResetEvent evtACK = (AutoResetEvent)m_waitACK[0];
         *      AutoResetEvent evtACKSTOP = (AutoResetEvent)m_waitACK[1];
         *
         *      // Etude de la commande reçus.
         *      for (int i = 0; i < count; i++)
         *      {
         *          if ((m_msgRecu[i].ArbitrationId != (uint)IDcommande.WStopACK) && (m_msgRecu[i].ArbitrationId != (uint)IDcommande.WStopDONE))
         *              if (m_msgRecu[i].ArbitrationId == m_id + 1)
         *                  evtACK.Set();
         *              else if (m_msgRecu[i].ArbitrationId == m_id + 2)
         *                  evtDONE.Set();
         *
         *          switch (m_msgRecu[i].ArbitrationId)
         *          {
         *              case (uint)IDcommande.WStopACK:
         *                  evtACKSTOP.Set();
         *                  break;
         *              case (uint)IDcommande.WStopDONE:
         *                  evtSTOP.Set();
         *                  break;
         *              case (uint)IDcommande.WBeBlocked:
         *                  evtBLOCKED.Set();
         *                  break;
         *          }
         *      }
         *
         *  }*/


        public idErreur isDone(int timeOutDONE, byte[] data = null, int nbData = 0)
        {
            idErreur retour = idErreur.OK;

            // Attente DONE - DONE = 0; Stop = 1; Timer
            returnWaitAny = WaitHandle.WaitAny(m_tabWaitDONE, timeOutDONE, false);
            switch (returnWaitAny)
            {
            case 0:
                retour = idErreur.OK;
                if (m_msgRecu[0].Length != 0)
                {
                    for (int i = 0; i < m_msgRecu[0].Length; i++)
                    {
                        data[i] = m_msgRecu[0].Data[i];
                    }
                    nbData = m_msgRecu[0].Length;
                }
                break;

            case 1:
                retour = idErreur.STOPPED;
                break;

            case 2:
                retour = idErreur.BLOCKED;
                break;

            default:
                retour = idErreur.timoutDONE;
                break;
            }

            return(retour);
        }
Exemplo n.º 2
0
        public idErreur envoyer(uint id, byte[] data = null, int nbData = 0)
        {
            idErreur retour = idErreur.FatalErreurCAN;

            m_id = id;
            // Tableau d'envoie de commande.
            ControllerAreaNetwork.Message[] commande;
            commande    = new ControllerAreaNetwork.Message[1];
            commande[0] = new ControllerAreaNetwork.Message();

            //construction de la trame
            commande[0].ArbitrationId = id;
            commande[0].Length        = nbData;
            commande[0].IsExtendedId  = false;
            commande[0].IsRemoteTransmissionRequest = false;
            if (nbData != 0)
            {
                for (int i = 0; i < nbData; i++)
                {
                    commande[0].Data[i] = data[i];
                }
            }

            // --- lock de la commande à envoyer
            //System.Threading.Monitor.Enter(mutex);
            m_busCan.SendMessages(commande);
            Debug.Print("CanId Envoye" + commande[0].ArbitrationId.ToString());


            // ### Commande envoyé ###
            returnWaitAny = WaitHandle.WaitAny(m_waitACK, 500, false);
            switch (returnWaitAny)
            {
            case 0:
                retour = idErreur.OK;
                break;

            case 1:
                retour = idErreur.ACKSTOP;
                break;

            default:
                retour = idErreur.timoutACK;
                break;
            }

            // --- unlock de la commande
            //System.Threading.Monitor.Exit(mutex);

            return(retour);
        }