Discussion KaTZe-Etcher du 2015/02/11 dans la nuit
CITATION
CITATION
J'ai dis une connerie, ce soir.
Si SIOC n'est pas connecté à DCS, le système de ping-pong ne fonctionne pas.
Donc, la boucle du Link reste bloquée en attente d'une instruction de SIOC, et donc elle ne peut pas écouter puis envoyer les commandes TS.
Bref, il faudrait que je modifie le Link, pour qu'il continue de tourner même sans input de SIOC (socket non bloquante). Malheureusement c'est sur ma todo liste.
Idem pour le Link, sans info. du Pit (retour du pong), il considère que le pit est déco, et il libère la socket. Donc pour le KaTZ-Radio, tout seul, j'avais fait un link simplifié, sans système de pingpong.
Bref faut que j'y réfléchisse
Si tu veux je m'en occupe ?
Merci,
Je propose dans un premier temps de calmer un peu le jeu, et de vérifier que çà tourne stable (EKPI + le KatzPit comme actuel).
Pour le Link, il faudra effectivement travailler sur la version multi, et en effet j’atteins ma limite de compétence avec "l’orienté objet"
, c'est pour çà que je m’étais arrêté au mono-poste.
Of course ton aide, ou même ton développement sera indispensable.
Il faudrait qu'on discute plus généralement de l'architecture du Link-V2
J'ai pas mal galéré avec les socket bloquantes, vs non bloquantes, et la mise en place du ping-pong pour détecter une déconnexion et libérer la socket.
--------------------
Coté WebSocket, lorsqu'on arrive dans la boucle d'envoi/écoute, je teste si la socket est ready (5ms):
CODE
ready_to_read, ready_to_write, in_error = select.select(miaou_in, miaou_out, miaou_in, 0.05)
Si elle a reçu un message du KaTZ-Pit, je le lis, sinon j'incrémente un compteur.
Si le compteur dépasse n boucles sans recevoir de nouvelle du pit (le seuil (pulse_ws), alors il considère qu'il est déco, ferme la socket et se remet en écoute).
Pour s'assurer de ce trafic montant, le Link envoi à SIOC un pulseur (l'heure de mission), sur le canal 9 , à chaque boucle. (Accessoirement ce pulseur indique à SIOC qu'on est en écoute prêt à recevoir des ordres (Sans lui SIOC nous déco).
Sioc avec un intervalle de 5 secondes, le copie sur le canal 8, et le revoie ainsi au Link , qui le transmet au Pit (sous la forme "8=heure"), dans le pit la réception de ce ping, déclenche une réponse pong sur le Canal 7
C'est dans la fonction serverws_message
CODE
if (KaTZPit_data["Ping"] != KaTZPit_data["Ping_old"]){
CmdSiocSpe(7, KaTZPit_data["Ping"])
KaTZPit_data["Ping_old"] = KaTZPit_data["Ping"]
Donc toutes les 5 secondes (soit 50 boucles de 0.1 secondes maximum), même si on n'effectue pas de commande DCS depuis le pit, Link recoit un message du Pit sous forme du pong. Le compteur de "boucles sans réponse" est ainsi réinitialisé.
--------------------
Bref ce système de ping/pong réfléchi sur SIOC, fonctionne très bien et le système est super stable pendant des vols de plusieurs heures (c'est pour cela, que je suis super prudent avec les évolutions du Link).
--------------------
Là ou j'ai un problème, çà n'est donc pas côté WebSocket, mais du côté "client SIOC, client TS"
Pour TS pas de problème, comme on ne fait qu'envoyer des ordres (out only), on flood en UDP sur TS. (D'ailleurs si on met au point un retour de canal TS, il faudra alors changer pour un système in/out ??)
Pour SIOC , on est en TCP
A) Les envois sont effectué par
CODE
try:
sioc_socket.sendall(msg_cmd.encode())
except:
Si çà plante on considère qu'on a perdu la connexion avec SIOC (ou qu'il n'est pas démarré, et le programme stoppe et part dans la boucle de connexion avec message à l'utilisateur, et tentative de reco toutes les 15 secondes.
Les réceptions sont effectuées par
CODE
# Message recu de SIOC
try:
KTZmain.msgSioc = sioc_socket.recv(4096).decode()
except:
Or, cette instruction est bloquante, tant qu'on a pas de réponse de SIOC, la boucle (et donc tout le Link est en pause là).
C'est ce qui explique que si l'on démarre SIOC, sans DCS, puis le Link et le Pit, la commande TS ne fonctionne pas. Le link est en pause, en attente de recevoir une info. de SIOC.
C'est pour çà que j'exporte toujours chaque seconde l'heure de mission depuis DCS, pour assurer un flux de données descendantes, et garder le Link actif. Ainsi dès la "dépause", le Link, et donc le contrôle de TS fonctionne.
La solution au problème, (que j'avais utilisé dans la KaTZ-Radio), était de ne plus écouter SIOC, et de désactiver le PingPong, et le Link tourne en boucle ... mais çà n'est pas applicable pour le Pit.
Pour la V2, il faudrait trouver une instruction
NON BLOCANTE de client TCP, qui écoute la socket, et sans réponse passe à la suite.
A ce moment, le TS commande fonctionnera, même sans connexion SIOC.
Autre alternative, que j'utilise lorsque je travaille sur les pits, j'ai un générateurs de pulsation en python (que j'appelle "DCS-Shadows"), qui se connecte sur SIOC et créé un traffic descendant virtuel (comme si DCS était présent). Ce générateur pourrait être intégré au Link dans un thread spécifique, avec comme but de rebondir sur SIOC en évitant ainsi le blocage de la socket d'écoute.
A discuter ce pm si tu es là