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); } }
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é } }
public void disconnectArduinoBot(byte id) { _listArduino.Find(ArduinoBotComm.ById(id)).Disconnect(); }
public ArduinoBotComm getArduinoBotById(byte id) { return(_listArduino.Find(ArduinoBotComm.ById(id))); }