public void PushSendMessageToArduino(MessageProtocol mess, ArduinoBotComm bot)
 {
     if (bot != null)
     {
         bot.PushMessageAEnvoyer(mess);
     }
 }
        private void _OnArduinoTimeout(ArduinoBotComm bot)
        {
            // Deconnection et suppression des messages en attente
            _ArduinoManager.disconnectArduinoBot(bot.id);

            ArduinoTimeoutEventArgs e = new ArduinoTimeoutEventArgs(_ArduinoManager.getArduinoBotById(bot.id));

            OnArduinoTimeout(this, e);
        }
        private void SendMessageToArduino(MessageProtocol mess, ArduinoBotComm bot)
        {
            if (bot == null)
            {
                Logger.GlobalLogger.error("Robot inconu !");
                return;
            }

            if (bot.Connected)
            {
                if (bot.stateComm == StateArduinoComm.STATE_COMM_NONE)
                {
                    if (mess is PCtoEMBMessageAskSensor)
                    {
                        bot.stateComm = StateArduinoComm.STATE_COMM_WAIT_SENSOR;
                    }
                    else if (mess is PCtoEMBMessageCloseClaw || mess is PCtoEMBMessageOpenClaw)
                    {
                        bot.stateComm = StateArduinoComm.STATE_COMM_WAIT_ACK;
                    }
                    else if (mess is PCtoEMBMessageTurn || mess is PCtoEMBMessageMove)
                    {
                        bot.stateComm = StateArduinoComm.STATE_COMM_WAIT_ACK;
                    }
                    else if (mess is PCtoEMBMessagePing)
                    {
                        bot.stateComm = StateArduinoComm.STATE_COMM_WAIT_PING;
                    }
                    else if (mess is PCtoEMBMessageRespConn)
                    {
                        bot.stateComm = StateArduinoComm.STATE_COMM_WAIT_ACK;
                    }
                    else if (mess is PCtoEMBMessageAutoMode)
                    {
                        bot.stateComm = StateArduinoComm.STATE_COMM_WAIT_ACK;
                    }
                    else
                    {
                        Logger.GlobalLogger.error("Envoi d'un message non connu !");
                    }

                    bot.MessageAttenteAck(mess, bot.CountSend);
                    TrameProtocole trame = _SerialXbee.EncodeTrame(_IdPc, bot.id, bot.CountSend++, mess);
                    //trame.num = bot.CountSend++;
                    _SerialXbee.PushTrameAEnvoyer(trame);
                }
            }
            else
            {
                Logger.GlobalLogger.error("Envoi d'un message à un robot non connecté :(");
            }
        }
        private void _ThreadCheckMessageRecus()
        {
            while (true)
            {
                /* Traitement des trames entrantes */
                if (_SerialXbee.TrameRecusDisponible())
                {
                    TrameProtocole trame = _SerialXbee.PopTrameRecus();
                    // Si traitement par l'application (données capteur ou autre )
                    // Les Ack et autre sont gerrer ici
                    if (TraiteTrameRecue(trame))
                    {
                        // Envoi au couches supérrieures
                        if (OnNewTrameArduinoReceived != null)
                        {
                            MessageProtocol message = _SerialXbee.DecodeTrame(trame);
                            ArduinoBotComm  robot   = ArduinoManager.getArduinoBotById(trame.src);

                            NewTrameArduinoReceveidEventArgs arg = new NewTrameArduinoReceveidEventArgs(message, robot);
                            OnNewTrameArduinoReceived(this, arg);
                        }
                    }
                }


                /* Verification message en attente envoi */

                /*if (_MessagesEnAttenteEnvoi.Count > 0)
                 * {
                 *
                 *  int count = _MessagesEnAttenteEnvoi.Count;
                 *  for(int i=0 ; i< count;i++)
                 *  {
                 *      if (_MessagesEnAttenteEnvoi[i].robot.stateComm == StateArduinoComm.STATE_COMM_NONE)
                 *      {
                 *          Logger.GlobalLogger.debug("Envoi d'un message en attente au robot :" + _MessagesEnAttenteEnvoi[i].robot + " Messsage : " + _MessagesEnAttenteEnvoi[i].message.GetType().ToString(),1);
                 *          // L'arduino est libre, on peut envoyer
                 *          SendMessageToArduino(_MessagesEnAttenteEnvoi[i].message, _MessagesEnAttenteEnvoi[i].robot);
                 *      }
                 *  }
                 *
                 * }*/
                Thread.Sleep(_ThreadMessageRecuDelay);
            }
        }
示例#5
0
 public void addArduinoBot(ArduinoBotComm arduino)
 {
     _listArduino.Add(arduino);
 }
        /* Traite la trame et retourne si la trame doit remonter a la couche supérieure (true) */
        private bool TraiteTrameRecue(TrameProtocole trame)
        {
            MessageProtocol message = _SerialXbee.DecodeTrame(trame);
            ArduinoBotComm  robot   = ArduinoManager.getArduinoBotById(trame.src);

            if (message is EMBtoPCMessageAskConn)
            {
                if (robot == null) // Le robot n'as jamais été céer, on le créer
                {
                    robot = new ArduinoBotComm(trame.src);
                    robot.DateLastMessageReceived = DateTime.Now;
                    _ArduinoManager.addArduinoBot(robot);
                }
                Logger.GlobalLogger.debug("Reception du message EMBtoPCMessageAskConn par " + robot.id);
                if (!robot.Connected) // Robot non connecté, on l'ajoute dans la liste des connectés
                {
                    robot.Connect();
                    robot.DateLastMessageReceived = DateTime.Now;
                    robot.stateComm = StateArduinoComm.STATE_COMM_NONE;
                    robot.CountSend = trame.num; // Utilisation du compteur du robot

                    MessageProtocol reponse = MessageBuilder.createRespConnMessage(0x01);

                    // Ajout a la liste à envoyer
                    //TrameProtocole trameRet = _SerialXbee.EncodeTrame(_IdPc, trame.src, robot.CountSend++, reponse);
                    //trameRet.num = robot.CountSend++;
                    robot.PushMessageAEnvoyer(reponse);
                    //_SerialXbee.PushTrameToSend(trameRet);

                    return(true); // Notification a l'application
                }
                else
                {
                    Logger.GlobalLogger.error("Reception d'une demande de connexion d'un bot déjà connecté");
                    return(false);
                }
            }
            else if (message is EMBtoPCMessageGlobalAck)
            {
                Logger.GlobalLogger.debug("Reception du message EMBtoPCMessageGlobalAck par " + robot.id);

                if (robot == null)
                {
                    Logger.GlobalLogger.error("Robot Inconnu in EMBtoPCMessageGlobalAck");
                    return(false); // Marquer comme traité
                }


                if (robot.Connected) // Robot connecté
                {
                    robot.DateLastMessageReceived = DateTime.Now;

                    EMBtoPCMessageGlobalAck msg = ((EMBtoPCMessageGlobalAck)message);
                    if (msg.valueAck == 0x00) // !akitement negatif Message erreur
                    {
                        Logger.GlobalLogger.error("Ackitement Negatif !");
                    }
                    else if (msg.valueAck == 0x01)
                    {
                        if (robot.stateComm == StateArduinoComm.STATE_COMM_WAIT_ACK) // On attendais un ACK
                        {
                            robot.stateComm = StateArduinoComm.STATE_COMM_NONE;
                        }

                        robot.AckRecu(msg.idTrame);
                        //_SerialXbee.DeleteTrame(msg.idTrame);
                    }
                    else if (msg.valueAck == 0x02)
                    {
                        Logger.GlobalLogger.error("CRC corrompu, on r'envois !");
                    }
                    else
                    {
                        Logger.GlobalLogger.error("Ackitement inconnu !");
                    }


                    return(false);
                }
                else
                {
                    Logger.GlobalLogger.error("Reception d'un ACK alors que le robot n'est pas connecté !");
                    return(false);
                }
            }
            else if (message is EMBtoPCMessageRespPing)
            {
                Logger.GlobalLogger.debug("Reception du message EMBtoPCMessageRespPing par " + robot.id);
                if (robot == null)
                {
                    Logger.GlobalLogger.error("Robot Inconnu in EMBtoPCMessageRespPing");
                    return(false); // Marquer comme traité
                }

                if (robot.Connected) // Robot connecté
                {
                    robot.DateLastMessageReceived = DateTime.Now;
                    if (robot.stateComm == StateArduinoComm.STATE_COMM_WAIT_PING) // On attendais un ACK
                    {
                        robot.stateComm = StateArduinoComm.STATE_COMM_NONE;
                    }


                    /* Supprimer les demande de ping sans ackitements en provenance du robot */
                    foreach (MessageProtocol mp in robot.ListMessageAttenteAck())
                    {
                        if (mp.headerMess == (byte)PCtoEMBmessHeads.ASK_PING)
                        {
                            robot.SupprimerMessage(mp);
                        }
                    }
                    //List<TrameProtocole> Listtp = _SerialXbee.FetchTrameSentNoAck();

                    /*foreach (TrameProtocole tp in Listtp)
                     * {
                     * if (tp.data[0] == (byte)PCtoEMBmessHeads.ASK_PING)
                     *      if(tp.dst == robot.id)
                     *          _SerialXbee.DeleteTrame(tp.num);
                     * }*/

                    return(false);
                }
                else
                {
                    Logger.GlobalLogger.error("Reception d'un ACK alors que le robot n'est pas connecté !");
                    return(false);
                }
            }
            else if (message is EMBtoPCMessageAutoModeOff)
            {
                if (robot == null)
                {
                    Logger.GlobalLogger.error("Robot Inconnu in EMBtoPCMessageAutoModeOff");
                    return(false); // Marquer comme traité
                }
                Logger.GlobalLogger.debug("Reception du message EMBtoPCMessageAutoModeOff par " + robot.id);

                if (robot.Connected) // Robot connecté
                {
                    robot.DateLastMessageReceived = DateTime.Now;

                    /*if (robot.stateComm == StateArduinoComm.STATE_COMM_WAIT_PING) // On attendais un ACK
                     *  robot.stateComm = StateArduinoComm.STATE_COMM_NONE;*/

                    return(true); // Envoie au couche suppérieure
                }
                else
                {
                    Logger.GlobalLogger.error("Reception d'un message alors que le robot n'est pas connecté ! EMBtoPCMessageAutoModeOff");
                    return(false);
                }
            }
            else if (message is EMBtoPCMessageRespSensor)
            {
                Logger.GlobalLogger.debug("Reception du message EMBtoPCMessageRespSensor par " + robot.id);
                if (robot == null)
                {
                    Logger.GlobalLogger.error("Robot Inconnu in EMBtoPCMessageRespSensor");
                    return(false); // Marquer comme traité
                }

                if (robot.Connected) // Robot connecté
                {
                    robot.DateLastMessageReceived = DateTime.Now;
                    if (robot.stateComm == StateArduinoComm.STATE_COMM_WAIT_SENSOR) // On attendais un ACK
                    {
                        robot.stateComm = StateArduinoComm.STATE_COMM_NONE;
                    }

                    foreach (MessageProtocol mp in robot.ListMessageAttenteAck())
                    {
                        if (mp.headerMess == (byte)PCtoEMBmessHeads.ASK_SENSOR)
                        {
                            robot.SupprimerMessage(mp);
                        }
                    }

                    return(true); // Envoi a l'apllication pour traitement
                }
                else
                {
                    Logger.GlobalLogger.error("Reception d'un message alors que le robot n'est pas connecté ! EMBtoPCMessageRespSensor");
                    return(false);
                }
            }
            else
            {
                if (robot == null)
                {
                    Logger.GlobalLogger.error("Robot Inconnu");
                }
                Logger.GlobalLogger.error("Message de type Inconnu !");
                return(false); // Marquer comme traité
            }
        }
示例#7
0
 public void disconnectArduinoBot(byte id)
 {
     _listArduino.Find(ArduinoBotComm.ById(id)).Disconnect();
 }
示例#8
0
 public void addArduinoBot(ArduinoBotComm arduino)
 {
     _listArduino.Add(arduino);
 }
示例#9
0
 public ArduinoBotComm getArduinoBotById(byte id)
 {
     return(_listArduino.Find(ArduinoBotComm.ById(id)));
 }