V0.7 du Master ?

Tout ce qui est en rapport avec le développement du master
PtitKev
Messages : 50
Inscription : 23 Septembre 2015, 20:36

V0.7 du Master ?

Messagepar PtitKev » 29 Décembre 2015, 18:47

Bonjour à tous,

Voilà, j'ai réussi : ma version du master répond à ma node \o/

Pourquoi 0.7 ? Car je m'inspire du master plugin, version la plus aboutie d'une 0.6 mais pour moi déjà obsolète. Bref, ça m'est totalement égale :)

Je voudrais juste qu'on se penche un peu plus sur le conceptuel car je n'ai pas eu beaucoup de retour sur mes approches des différentes parties qui constituent Ydle.

Sachant que j'ai passé plus de temps à comprendre le code actuel, à factoriser et à réorganiser le code je vais donc dans un premier temps expliquer comment le master-plugins fonctionne mais en incluant directement mes modifications.

1 : Le fonctionnement
Le master a pour but de faire un lien entre les nodes et le HUB. Il agit donc comme une passerelle.
Les nodes utilisent un protocole (communication) à travers un connecteur (connexion physique).

Un serveur HTTP est intégré permettant au HUB de communiquer avec le master via des requêtes REST.

Quand le master reçois une frame (en provenance d'une node), il la transmet au HUB via une requête HTTP.
Quand le HUB a besoins de communiquer avec une node, il fait appel au webservice REST.

2 : Les dossiers
- le dossier bin : contient les binaires compilés et les fichiers .o
- le dossier includes : contient les fichiers .h commun au master et à la librairie misc
- le dossier misc : contient les librairies externes
- le dossier plugins : contient l'ensemble des plugins tous types confondus
- le dossier src : contient les sources du master et les librairies customisée pour le master (pas bien !)

Assez simple mais toujours pratique de la rappeler.

3 : Les interfaces
Les interfaces sont des classes définissant la structure minimum d'une classe qui sera par la suite hérité. Elles pausent donc les bases conceptuelle de l'organisation.
- IFeature.h :
Une feature permet d'ajouter du code au master. J'ai conservé cette partie mais pour moi le master doit se contenter de communiquer l'information au HUB. Il ne devrait donc pas être programmable en dehors des plugins de communication.
- INode.h :
La base d'une node. Les nodes étant référencées au chargement il faut donc leur donner une structure :
  • Un nom
  • Une classe
  • Un protocole
  • Une fonction pour l'initialiser
  • Une fonction pour démarrer
- IProtocol.h :
Le protocole permet de contrôler de l'information. Actuellement le master-plugins ne faisait pas la séparation du protocole et de la connexion.
Le protocole reprend donc les mêmes information de description qui constitue la node en remplaçant l'information protocole par un connecteur et en incluant deux méthodes supplémentaires ce qui donne :
  • Un nom
  • Une classe
  • Un connecteur
  • Une fonction pour l'initialiser
  • Une fonction pour démarrer
  • Une fonction pour la réception d'information
  • Une fonction pour l'envoi d'information
- INodesManager.h & IScriptsManager.h :
J'ai remplacé ces deux interface par IManager. Pour moi il y a qu'un NodesManager donc aucune utilité de poser une interface.
L'interface IScriptsManager étant liée aux Features j'ai converti ce code comme un plugin.

Voici mes nouvelles interfaces:
- IFrame.h :
Une frame est l'information structurée qui sera soit reçue (en provenance d'une node), soit émise (à destination d'une node).
Cette interface définit la structure basique d'une frame à savoir:
  • Un émetteur
  • Un récepteur
  • Une information
Chaque protocole pourra avoir une structure de frame vu que c'est lui qui s'occupe de piloter les informations.
- IManager.h :
Le manager permet de faire le lien entre le webservice REST et les ressources.
- IConnector.h :
Le connecteur fait le lien entre les protocoles et les connecteurs physique. Par exemple le connecteur radio informera tous les plugins de type radio des réception d'information.
Dans le cas du plugin radio j'ai introduit l'utilisation des "interruptions" permettant du coup de contourner la boucle de réception.

3 : Les sources
- IhmCommunicationThread.cpp :
Ce fichier contient le code permettant de gérer les appels à l'IHM à travers une thread.
Chaque frame reçue est ajoutée dans une liste qui sera traitée de façon asynchrone.
- Kernel.cpp :
Le kernel rassemble le code listant tous les plugins, les connecteurs, les protocols, les nodes, les managers et les features.
Chaque plugin s'enregistre auprès du kernel.
- main.cpp :
J'ai créé ce fichier contenant le lanceur du master.
- Master.cpp :
Contient toutes les méthodes d'initialisation du master à savoir :

  • InitConfig
  • InitLog : initialise les logs
  • InitRestLog : initialise les logs sur l'IHM
  • InitPlugins : charge les plugins
  • InitConnectors : initialise les connecteurs
  • InitProtocols : initialise les protocoles
  • InitNodes : initialise les nodes
  • InitFeatures : initialise les features
  • InitManagers : initialise les managers
  • InitRestServer : initialise les protocoles auprès du webservice REST

- NodeRequestHandler.cpp :
Traite des demandes associées aux nodes sur le webservice REST
- NodesManager.cpp :
Gère la liste exhaustive des nodes enregistrées sur le HUB.
Une requêtes sur le HUB permet de récupérer un json contenant les nodes.
- RestLogDestination.cpp :
Appel le HUB affin qu'il soit informé des erreurs survenues lors de l'exécution du master.
- WebBrowser.cpp :
Browser HTTP customisé.
- WebServer.cpp :
Server HTTP customisé.

Voila dans un premier temps la mise à plat du master...

Je prendrais un peu plus de temps pour mieux segmenter le post :)

Je vais faire une livraison sur Github... quand j'aurais compris comment ça marche xD

PtitKev
Messages : 50
Inscription : 23 Septembre 2015, 20:36

Re: V0.7 du Master ?

Messagepar PtitKev » 29 Décembre 2015, 19:08

Voici le log en mode débug : INIT + Réception d'une frame avec réponse ACK
[18:51:19] Master.cpp:79: Login enable : 4
[18:51:19] Master.cpp:96: REST Login enable : 1
[18:51:19] Master.cpp:104: Searching plugins into directory: plugins
[18:51:19] Kernel.cpp:31: - radio.so : OK
[18:51:19] Kernel.cpp:31: - ydle.so : OK
[18:51:19] Master.cpp:111: InitConnectors : 1
[18:51:19] Master.cpp:114: - Connector : Radio
[18:51:19] Master.cpp:123: InitProtocols : 1
[18:51:19] Master.cpp:132: - Protocol : Ydle on connector Radio
[18:51:19] Master.cpp:141: InitNodes : 1
[18:51:19] Master.cpp:150: - Node : Node Ydle on protocol Ydle
[18:51:19] Master.cpp:159: InitFeatures : 0
[18:51:19] Master.cpp:171: InitManagers : 1
[18:51:19] Master.cpp:174: - Manager : nodes
[18:51:19] NodesManager.cpp:36: Request HUB for nodes list
[18:51:19] WebBrowser.cpp:42: Full uri: http://127.0.0.1:80/nodes.json
[18:51:19] NodesManager.cpp:48: Node 2 : protocol protocol not loaded
[18:51:19] NodesManager.cpp:48: Node 3 : protocol protocol not loaded
[18:51:19] NodesManager.cpp:48: Node 4 : protocol protocol not loaded
[18:51:19] NodesManager.cpp:58: Node 5 : type temp not loaded
[18:51:19] NodesManager.cpp:64: 6 : ydle : node_ydle : Node6
[18:51:19] NodesManager.cpp:64: 2 : ydle : node_ydle : Node7
[18:51:19] Master.cpp:183: Init REST Server
[18:51:19] Master.cpp:193: Manager : nodes
[18:51:19] WebServer.cpp:436: HTTP Server started on port 8888
[18:51:19] main.cpp:21: Program start
[18:51:19] Master.cpp:209: Start Features
[18:51:19] Master.cpp:219: Subscribe IHM to protocols
Thread::SetPauseMs(1000) : s:1 nano:0
[18:51:19] Master.cpp:226: Protocol : Ydle
[18:51:19] IhmCommunicationThread.cpp:86: Start Communication thread
Thread::SetPauseMs(1000) : s:1 nano:0
[18:51:19] ydle.cpp:108: start received
Ok 2352 > 2300
[18:51:20] ydle.cpp:96: complete
[18:51:20] frame.h:17:
[18:51:20] frame.h:19: Emetteur : 2
[18:51:20] frame.h:20: Recepteur :1
[18:51:20] frame.h:21: Type :4
[18:51:20] frame.h:22: Taille :3
[18:51:20] frame.h:23: Crc :243
[18:51:20] frame.h:28: Data Hex: 0x20 0x14
[18:51:20] frame.h:33: Data Dec: 32 20
[18:51:20] ydle.cpp:134: New State/ACK frame ready to be sent :
[18:51:20] IhmCommunicationThread.cpp:73: Frame added
[18:51:20] frame.h:17:
[18:51:20] frame.h:19: Emetteur : 1
[18:51:20] frame.h:20: Recepteur :2
[18:51:20] frame.h:21: Type :3
[18:51:20] frame.h:22: Taille :1
[18:51:20] frame.h:23: Crc :52
[18:51:20] frame.h:28: Data Hex:
[18:51:20] frame.h:33: Data Dec:
[18:51:20] IhmCommunicationThread.cpp:40: IHM: Data Hex: 0x20 0x14
[18:51:20] NodesManager.cpp:102: NodesManager::GetNode 2
[18:51:20] WebBrowser.cpp:138: Full uri: http://127.0.0.1:80/datas.json POST Param : sender=2&value=0x200x14
[18:51:20] WebBrowser.cpp:155: curl_easy_perform() failed: HTTP response code said error
[18:51:20] WebBrowser.cpp:156: Error is :The requested URL returned error: 404
^C[18:51:23] main.cpp:35: Caught signal: 2


On constate plusieurs choses :
- "Thread::SetPauseMs(1000)" est la solution actuelle imposant aux threads une pause de 1000 ms pour éviter une loop gourmande. Je ne sais pas comment contourner ça autrement qu'en baissant la valeur pour plus de réactivité.
- "Ok 2352 > 2300" correspond à l'appel d'un timeout concernant les interruptions : sachant que les interruptions correspondent à un changement de status du pin de réception, quand la valeur de fin est à 0 il n'y a pas d'interruption. J'ai donc mis en place un timeout qui se déclenche si on ne reçois pas un signal durant une durée déterminée (2x1000ms + 2x150ms de lag max). Sans ce code la frame ne reçois jamais le dernier bit.
- "http://127.0.0.1:80/datas.json POST Param : sender=2&value=0x200x14" pour le moment j'envoie la data brute

Avatar de l’utilisateur
Xylerk
Messages : 149
Inscription : 18 Décembre 2013, 17:35
Localisation : Jura

Re: V0.7 du Master ?

Messagepar Xylerk » 31 Décembre 2015, 13:33

Tu t'en sors avec github?

PtitKev
Messages : 50
Inscription : 23 Septembre 2015, 20:36

Re: V0.7 du Master ?

Messagepar PtitKev » 02 Janvier 2016, 10:34

Voila : https://github.com/PtitKev/Master-plugins \o/

Je suis du coup reparti sur la Node du Master normal. Je vais regarder les modifications que tu as apportées sur la version que tu m'as envoyé.

Je vais faire un fork pour la Node (Arduino) que j'ai clean.

steeve
Messages : 8
Inscription : 02 Janvier 2016, 19:33

Re: V0.7 du Master ?

Messagepar steeve » 08 Janvier 2016, 15:14

bonjour

Je suis entrain d'installer tout ca et j'ai voulu mettre le master-plugins en route
mais le sudo ./master.sh me répond command not found
pourtant j'ai bien le fichier dans le bon repertoire

pourquoi ne pas avoir fait discuter l'arduino et le raspberry par le port USB ?
merci
a plus

Avatar de l’utilisateur
Xylerk
Messages : 149
Inscription : 18 Décembre 2013, 17:35
Localisation : Jura

Re: V0.7 du Master ?

Messagepar Xylerk » 08 Janvier 2016, 15:26

Pour le

Code : Tout sélectionner

command not found
c'est bizarre et

Code : Tout sélectionner

sudo sh master.sh
donne quoi?
Pour l'arduino non en usb c'est pour économiser un arduino tout simplement mais tu peux si tu veux, ça ne change rien au port série

steeve
Messages : 8
Inscription : 02 Janvier 2016, 19:33

Re: V0.7 du Master ?

Messagepar steeve » 08 Janvier 2016, 16:42

Ola
pour le programme master c'est bon ca l'a lancé et il attends la reception série de l'arduino
"Start communication thread"

J'avais compiler le sketch avec mon mac sur l'arduino et j'ai une sortie sur le port série avec un debit a 9400
moniteur de ide arduino
init complete
start
complete
S:255 R:255
Send MSG
RF msg received but serial not ready

donc je vais cabler l'arduino avec le rasberry comme marque dans le livre et je reviens
merci de ton aide

Avatar de l’utilisateur
Xylerk
Messages : 149
Inscription : 18 Décembre 2013, 17:35
Localisation : Jura

Re: V0.7 du Master ?

Messagepar Xylerk » 08 Janvier 2016, 16:44

Si tu as besoin passe sur IRC freenode #ydle ce sera plus simple pour en discuter

steeve
Messages : 8
Inscription : 02 Janvier 2016, 19:33

Re: V0.7 du Master ?

Messagepar steeve » 08 Janvier 2016, 21:27

Ola
merci de votre aide
j'essaye de comprendre l'architecture de ydle, en gros c'est facile des node un master et un HUB
Par contre entre fichier de conf et l'esprit des programmateur tortueux...

Pourquoi être partit sur un fonctionnement si complexe...

bon le vieux master tournait bien, j'avais des données sur le HUB
le nouveau après quelques debug commence a recevoir quelques chose mais je doit avoir un souci de liaison série usb arduino-raspberry sur le HUB rien
et le master me donne ca après le démarrage
merci de votre aide
steve

Code : Tout sélectionner

pi@raspberrypi:~/Master-plugins $ sudo sh master.sh
[21:3:17] master.cpp:204: Searching plugins into directory: plugins
ListFiles : looking : node0.5.so
ListFiles : looking : dht11.so
ListFiles : looking : serial-rf.so
Kernel : nodes=2
   Node : NODE VERSION 0.5
   Node : DHT11
Kernel : protocols=1
   Protocol : Protocol Serial-RF
mPort=6   baudr:4098  baudrate;115200
Kernel : features=0
SerialRF : Enter in thread
node 1 : <nodes.node1>=<NODE VERSION 0.5|123>
    : node<NODE VERSION 0.5|123>  nomPlugin<NODE VERSION 0.5> 
       : 123
node 2 : <nodes.node2>=<DHT11|11,124>
    : node<DHT11|11,124>  nomPlugin<DHT11> 
       : 11 124
[21:3:17] master.cpp:69: Program start
[21:3:17] webServer.cpp:429: HTTPServer::Run called but the server wasn't setup.
Thread::SetPauseMs(1000) : s:1 nano:0
   Protocol : Protocol Serial-RF
Thread::SetPauseMs(1000) : s:1 nano:0
[21:3:17] IhmCommunicationThread.cpp:57: Start Communication thread
   Ack(1) sent : ret=1
Got new MSG type:0 size:35
   data: 0x1 0x3 0x1 0x5 0x28 0xf0 0x7d 0x48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x35
[21:3:20] Node.cpp:47:    SerialRF::ManageNewMsg
[21:3:20] Node.cpp:48: Sender:3 Receptor:1 Type:1 Size:5 CRC:35
[21:3:20] Node.cpp:58: Data Hex:  0x28 0xF0 0x7D 0x48
[21:3:20] Node.cpp:63: Data Dec:  40 240 125 72
[21:3:20] serial-rf.cpp:192: SerialRF : New State frame ready to be sent :
[21:3:20] IhmCommunicationThread.cpp:98: IHM:Data Hex:  0x28 0xF0 0x7D 0x48
NodesManager::GetNode(3) 110
[21:3:20] IhmCommunicationThread.cpp:108: putFrame : node:3 UNKNOWN
[21:3:21] IhmCommunicationThread.cpp:98: IHM:Data Hex:  0x28 0xF0 0x7D 0x48
NodesManager::GetNode(3) 110
[21:3:21] IhmCommunicationThread.cpp:108: putFrame : node:3 UNKNOWN
[21:3:22] IhmCommunicationThread.cpp:98: IHM:Data Hex:  0x28 0xF0 0x7D 0x48
NodesManager::GetNode(3) 110
[21:3:22] IhmCommunicationThread.cpp:108: putFrame : node:3 UNKNOWN


PtitKev
Messages : 50
Inscription : 23 Septembre 2015, 20:36

Re: V0.7 du Master ?

Messagepar PtitKev » 09 Janvier 2016, 17:56

Salut Steeve,
Content que t'ai avancé :)
Par contre pourrait tu créer un sujet propre à ton expérience ? C'est pas comme si on croulait sous les commentaires sur le forum mais ça serait bien de garder une organisation et une cohérence entre les messages et les sujets.
Merci pour ta compréhension ^^


Revenir vers « Master »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 0 invité

cron