Une idée, peut-être : un afficheur LCD pour IPCop

Forum traitant de la distribution sécurisée montante nommée IP cop et basée sur la distribution Smoothwall. C'est à l'heure actuelle le forum le plus actif du site.

Modérateur: modos Ixus

Messagepar jibe » 17 Juil 2004 13:58

Fesch a écrit:Très bien jusque là ... il reste à déterminer les différentes donctions que les gens aimeraient avoir sur les bouttons ...


Ben... Je pensais qu'avec des scripts bash (ou n'importe quel autre exécutable, après tout, puisque tu peux gérer l'abscence de script/programme), l'avantage était que tu n'avais plus à te préoccuper dans ton script de ce que désirent les utilisateurs. Ils ont la possibilité d'implémenter ce qu'ils veulent à la seule condition de l'appeler lcd_normal_button_*. Pour le setup, je ne sais pas... C'est peut-être mieux que ce soit toi qui t'en occupes ou au moins donner des scrips de base que chacun pourrait éventuellement adapter à sa guise...
"Le monde ne sera pas détruit par ceux qui font le mal, mais par ceux qui les regardent sans rien faire" (Albert Einstein)

Autrefois, l'Etat défendait des valeurs. Maintenant, il défend des profits... (Anne Haunnime)
Avatar de l’utilisateur
jibe
Amiral
Amiral
 
Messages: 4366
Inscrit le: 17 Oct 2003 00:00
Localisation: Haute Savoie

Messagepar Franck78 » 17 Juil 2004 14:54

Le moteur : gère la partie ingrate
Le user : produit le résultat !



Les liens entre les deux: le moins possibles !
Le moteur appelle toujours le même point d"entrée dans user.

c'est plus souple d'appeler

<<callUser ("Bouton1Presse");>>

que ce qui semble équivalent

<<callBouton1Presse;>>


Dans le deuxième au moment de la compilation tu dois avoir la fonction définie même si elle ne fait rien.
Dans le premier cas, si l'appui sur B1 ne t'intéreesse pas, tu n'as rien à faire.

C'est le moteur qui s'occupe de toute la partie bas niveau. Il boucle en permanence et génère les messages. Ce qui est actionné par le message n'est pas du ressort du moteur.

Par exemple tu detectes:
appui B1 à (t) => evt (bt1, state, t)
release B1 à (t+1) => evt (bt1, state, t+1)

Le moteur expédie les évènements à User.
User ne les traite pas. Le moteur s'en occupe donc
et décortique evt(boutons, state,t).

Le moteur voit arriver le deuxième evt
Son job est de générer un nouveau message "click"
quand il repère le séquence Press/Release dans un intervalle de temps déterminé.

Code: Tout sélectionner
If LastTimebt1Pressed - evt(t)  < 2000 then   # 2000 est la durée en ms
   #click repéré !
   if evt(t) - Lastbt1Click < 1000 then # double click repéré
      evt (BT1_Click,btstate,t)      # envoie le message
   else
      evt (BT1_DBLClick,btstate,t)   # envoie le message
   endif
   Lastbt1Click=evt(t);
endif   


Tu vois qu'il est relativement facile dans le moteur d'implémenter une gestion d'evt sans interferer avec la partie User.


Dans un message évenement, il y a toujours en paramètre les données utiles:
evt ( NomType, # c'est quoi
data, # l'état de tout les boutons par exemple si message de bt
t) # le timestamp de l'evt

data c'est sans type ! Selon l'evt c'est rien, des bits d'état, un pointeur vers plus de data, vers une chaine de caractère... etc


En fait la séparation entre "moteur" et "user" se fait naturellement.

Par exemple l'obtention du pourcentage de bande passante utilisée par ftp est typiquement du mode user

Ta boucle actuelle doit inclure a un moment ou un autre les appels de ce genre de calcul.

Donc ça ce décompose comme suit:
Pendant l'init de 'user', 'user' a demandé au moteur de lui générer un message 'Timer' toutes les X secondes et un autre Y secondes.

Donc toutes les X secondes l'evt est généré et dans user tu trouves:


...
case Timer1: # Il est temps de recalculer les infos
buffer="bp FTP=" & calculeftp() & "kb/s"
print (L1,buffer) #appele une API du moteur

#ligne 2 si bt4 est appuyé l'info change !
if (mybt4)
buffer="Peak user connected:" & calculeXYZ()
else
buffer="Actual user connected:" & calculeXY()
endif
print (L2,buffer);
updateLcd; # déclenche un une fois
# l'affichage effectif

case Timer2: # Un deuxième Timer Y seconde actualise moins souvent cette
# info qui demande beaucoup de calcul !
...
buffer= "Ce long texte défile en continue sur une ligne du LCD et fournit un max d'informations générales";
defiler_text (L3,buffer)
...

Tu vois bien mieux la séparation je pense non ?
Ainsi un truc casse $%#&! comme faire défiler un texte est gérer par le moteur.
Deux ou trois evt associé à ça, une API minimale
defiler_setspeed()
defiler_pause(x)

C'est dur à mettre en place mais maintenant que tu maitrises bien la gestion du LCD et bouton c'est pas compliqué de faire la séparation entre les deux niveaux (moteur,user).

Bien sur tu fournis toujours le code "User" pour ipcop de base. Mais il devient facile pour n'importe qui d'écrire d'autre "User" du moment que tout passe par message et API.

Tandis que "moteur" peut toujours étendre les fonctions chiantes à gérer
au fur et a mesure. Par exemple un "menu" !
"User" appelle Domenu(L4,"choix 1","choix 2","choix 3", "choix 4","choix 5");
Le moteur répond en envoyant des événements simples comme
evt (MENU, item1selected)

Faut surtout pas faire tout d'un coup mais partir sur une base souple et robuste !


Est-ce que tu le sens ou pas ? Si le schema est clair dans ta tète, ca doit pas être trop long à retrouver ce qui correspond à l'API moteur et à "User" et bien sur à coder .
Franck
L'art de poser une question sur ce site afin d'obtenir la réponse
A LIRE
Avatar de l’utilisateur
Franck78
Amiral
Amiral
 
Messages: 5625
Inscrit le: 20 Fév 2004 01:00
Localisation: Paris

Messagepar Fesch » 17 Juil 2004 15:40

D'accord pour ton principe. Pour un développeur celà est clair et net ... :mrgreen: ... mais qu'en est-t-il pour les non-développeurs et petits programmeurs, uilisateurs "standard" voir ceux qui ne s'y connaissent pas du tout?

Disons que même en introduisant la notion d'événements, cela ne va pas simplifier d'autant plus que c'est déjà fait pour la version courrante, ni la boucle principale, ni la gestion du menu.

Attends, je m'explique: Dans la version courrante, bien que tout se trouve dans le même fichiers, il y a actuellement trois types de données et méthodes:
  1. Il y a tout ce qui est spécifique au bon fonctionnement du LCD et qui sert à le faire fonctionner, telles que les méthodes "init" ou "write_string_at", pour que nommer ces deux-là. Il y a aussi plein de constantes. Typiquement cela fait donc partie du «moteur» et constitue l'API.
  2. Toutes les fonctions commençant par "get_", qui elles sont responsable de l'acquisition de différentes données et qui sont supposées produire une chaîne de charactères de longeur $COLS (pour que cela colle sur le LCD!). C'est donc la partie «user». Fait partie aussi un certain nombre de constantes et variables globales comme par exemple les variables gérants le cache de certains données ou leur bon timing. (je pense là notemment aux méthodes de détection de vitesse ...)
  3. Mon troisième type, je vais le dénommé "glue" (de la colle quoi :P), est responsable de l'interconnexion des deux parties précédentes et donc aussi du pilotage du LCD. C'est donc la partie la plus difficile à diviser. (si si!) Cela se complique surtout au niveau du timer!!!

    En fait, comme c'est implémanté dans la version 0.7 (non, je l'ai pas encore publiée ....), j'ai trouvé un moyen assez facile pour pouvoir mettre une certaine fréquence de rafraichissement des infos du LCD tout en gardant un réactivité assez haute des bouttons. Je ne connais pas assez PERL pour dire s'il existe une sorte de "timer" voir même si on puisse en mettre plusieurs à la fois (mais je vais me renseigner là dessus!). Donc il me reste que l'exéctron principal que je peux boucler, ce qui me fait un seul et unique "timer" :arrow: Il faut donc que des fonctions qui doivent tourner moins vite que d'autres s'en chargent elle-même!


Bon, la structure vient de se cristaliser de mieux en mieux ... Si j'ai pas le temps de la faire dans le code, du moins dans ma tête elle est faite maintenant. :mrgreen: On va y arriver!
Pourquoi lis-tu ceci???
Avatar de l’utilisateur
Fesch
Amiral
Amiral
 
Messages: 2505
Inscrit le: 11 Sep 2003 00:00
Localisation: Luxembourg

Messagepar Franck78 » 17 Juil 2004 16:30

Bon on y arrive, la partie GLUE comme tu dis c'est comment l'un parle à l'autre.
De user vers moteur, API, ca à l'air clair.
Dans l'autre sens tu n'as pas encore désolidarisé les deux... !
Ca viendra (ie par messages).

Pour le débutant je sais pas ce qui est le plus dur.
Voir le squelette d'un "User" et y rajouter en réponse
à un message type
case BT1_Pressed : system ('/usr/bin/shutdown - t now');
me parait simple à comprendre.

Pour lui ca se limite à attendre des évènements et agir !

Et au fur et à mesure il rentrera dans l'API pour fignoler son truc.


C'est comme du visual basic. Les apprentis développeurs ne font que répondre aux sollicitations de windows et utilisent quelques objets simples. Ils ne se soucient pas de gérer le redimensionnement des fenetres, le chauvechement, l'ouverture, la fermeture.


Maintenant faut pas te bloquer sur un evt genre "timer". Si le premier jet dépend de dix compteurs et que c'est imprécis au début, c'est pas grave..

Ca doit s'inscrire tout logiquement dans la boucle interne qui 'est' le moteur !
En fait pour les Evt, le moteur n'appellent pas directement "User". C'est plus subtil. Le moteur place 'rapidement' les Evt dans une file d'attente.

Si c'est possible, tu as un autre 'thread' donc en parallèle du moteur qui lit cette file d'attente d'evt, rajoute elle aussi les siens et appelle "User". Cette partie haute du moteur gère tout en fait.

A lire pour te donner une idée:
http://www.perldoc.com/perl5.8.0/pod/pe ... ad-Anyway-

Reste à voir si "thread" est compilée dans Perl de ipcop !

Tout les échanges se passent par messages stockés dans des files d'attentes.
Voila pour la GLUE... !
Franck
L'art de poser une question sur ce site afin d'obtenir la réponse
A LIRE
Avatar de l’utilisateur
Franck78
Amiral
Amiral
 
Messages: 5625
Inscrit le: 20 Fév 2004 01:00
Localisation: Paris

Messagepar Fesch » 17 Juil 2004 17:34

Oki... ça roule. Si je vais essayer de mettre au point une version divisée ...

... et merci pour le lien super intéressant. :biz: C'est précisément ce que j'ai cherché! :)
Pourquoi lis-tu ceci???
Avatar de l’utilisateur
Fesch
Amiral
Amiral
 
Messages: 2505
Inscrit le: 11 Sep 2003 00:00
Localisation: Luxembourg

Messagepar akira9a » 18 Juil 2004 00:14

J ai un petit soucis avec le soft LCD (derniere version).

Lorsque je branche le LCD il affiche deux lignes noires (1 et 3).

Lorsque je lance lcd -loop j ai l erreur suivante :
ppp0: erreur lors de la recherche d infos sur l interface: Peripherique non trouve ...

Une idee ??
Avatar de l’utilisateur
akira9a
Second Maître
Second Maître
 
Messages: 43
Inscrit le: 10 Fév 2004 01:00

Messagepar Fesch » 18 Juil 2004 00:23

Est-ce que t'as pas d'interface "ppp0"? C'est peut-être la cas parce que ton interface RED est en DHCP ou en statique.

Change la ligne (+/- 61)

Code: Tout sélectionner
my $IFACE   = 'ppp0';


en

Code: Tout sélectionner
my $IFACE   = 'eth1';


par exemple, si "eth1" est ta zône RED ...
Pourquoi lis-tu ceci???
Avatar de l’utilisateur
Fesch
Amiral
Amiral
 
Messages: 2505
Inscrit le: 11 Sep 2003 00:00
Localisation: Luxembourg

Messagepar akira9a » 18 Juil 2004 00:53

C est bon, j ai plus le message d erreur .. je vas verifier la connectique. J utilisait jaLCD sous Windows XP ... et ca marche avec jaLCD. Faut que je verifie que la connexion est compatible.

Merci a toi. (J aurai surement d autre questions)
Avatar de l’utilisateur
akira9a
Second Maître
Second Maître
 
Messages: 43
Inscrit le: 10 Fév 2004 01:00

Messagepar M@nu » 18 Juil 2004 10:29

akira9a a écrit:J ai un petit soucis avec le soft LCD (derniere version).

Lorsque je branche le LCD il affiche deux lignes noires (1 et 3).

Lorsque je lance lcd -loop j ai l erreur suivante :
ppp0: erreur lors de la recherche d infos sur l interface: Peripherique non trouve ...

Une idee ??


Les deux lignes noires peuvent indiquer un mauvais reglage des potentiometres (c'etait mon cas)
Comment est connecté ton modem ?
USB > ppp0, ppp1, ....
LAN > eth0 , eth1 , eth2, ...
M@nu
Aspirant
Aspirant
 
Messages: 120
Inscrit le: 14 Mai 2004 17:20

Messagepar jibe » 18 Juil 2004 10:44

Salut,

Excusez-moi de vous demander pardon encore une fois... Je ne sais pas si j'ai bien été compris...

Franck78 a écrit:Pour le débutant je sais pas ce qui est le plus dur.
Voir le squelette d'un "User" et y rajouter en réponse
à un message type
case BT1_Pressed : system ('/usr/bin/shutdown - t now');
me parait simple à comprendre.


J'aurais plutôt vu (principe : je ne connais pas le perl) :
Code: Tout sélectionner
case BT1_Pressed : if (exist('/le_répertoire_defini_par_fesch/lcd_normal_button_1_down')) {
                                                 system('/le_répertoire_defini_par_fesch/lcd_normal_button_1_down');


Et celui qui veut personnaliser son afficheur n'a plus qu'à aller dans /le_répertoire_defini_par_fesch et y modifier le script bash lcd_normal_button_1_down pour y mettre son shutdown ou son reboot ou le lancement d'un programme en C++ écrit par ses soins...

La question du débutant ne se pose plus... Si le débutant en question ne sait même pas adapter un script basch, mieux vaut qu'il fasse appel à un spécialiste, et Fesch ne pourra rien pour lui, hormis faire tout le boulot à sa place...

Bon, ceci n'empêche pas d'améliorer le code selon les excellents conseils de Franck78 !
"Le monde ne sera pas détruit par ceux qui font le mal, mais par ceux qui les regardent sans rien faire" (Albert Einstein)

Autrefois, l'Etat défendait des valeurs. Maintenant, il défend des profits... (Anne Haunnime)
Avatar de l’utilisateur
jibe
Amiral
Amiral
 
Messages: 4366
Inscrit le: 17 Oct 2003 00:00
Localisation: Haute Savoie

Messagepar Fesch » 18 Juil 2004 11:34

@jibe: L'un n'exclue pas l'autre. Disons que de base je voulais mettre ce petit morveau avec l'appel au script externes. C'est le plus simple pour les non-perlistes :mrgreen:, mais pour les autres, un programme bein structuré avec une petite API aussi bien mise au point est aussi importante.

Pour le moment j'attends encore un peu les premiers feedback de la version 0.6 en ce qui concerne les bouttons ...
Pourquoi lis-tu ceci???
Avatar de l’utilisateur
Fesch
Amiral
Amiral
 
Messages: 2505
Inscrit le: 11 Sep 2003 00:00
Localisation: Luxembourg

Messagepar akira9a » 18 Juil 2004 11:41

@Manu :
Mon modem est sur le eth1. Sur ce plan c est regle, je n ai plus le message d erreur. Par contre j ai toujours uniquement les deux lignes noires. Je vais regarder les connections du potentiometre ... Sinon j imagine qu il faut etre en EPP pour utiliser les boutons, c est ca ? Bon j y retourne ...
Avatar de l’utilisateur
akira9a
Second Maître
Second Maître
 
Messages: 43
Inscrit le: 10 Fév 2004 01:00

Messagepar Fesch » 18 Juil 2004 11:46

Pour ce qui est de tes deux lignes noires ... je les ai aussi, mais uniquement juste après avoir mis sous tension le LCD. Une fois initialisé, elles n'y sont plus.

J'ai aucune idée du mode dans lequel il faut mettre le port // pour que les bouttons fonctionnent. Si j'ai bien compris le RFC, c'est sur une des premières specifications que je me suis basé pour cela, et donc tout mode devrait fonctionné ... *devrait* ....

Autre chose ... si ton LCd fonctionne sous Windows, c'est qu'il devrait aussi bien fonctionner sous Linux. Alors il y a peu-être un problème dans le script au niveau du timing lors de l'intitialisation ou écriture sur le port //. :idea: As-tu aussi vérifié l'adresse de base de ton port // sur ta machine IpCOP?
Pourquoi lis-tu ceci???
Avatar de l’utilisateur
Fesch
Amiral
Amiral
 
Messages: 2505
Inscrit le: 11 Sep 2003 00:00
Localisation: Luxembourg

Messagepar Franck78 » 18 Juil 2004 11:50

@jibe

Pour faire comme tu dis, justement tu peux donner un modèle "User" simplifié capable de répondre aux appuis.

Le problème, c'est que en faisant comme ça il n'y a pas de feedback possible vers le LCD. Ton script bash ne pourra jamais appeller une fonction comme "print_lcd".
Et en fait si c'est peut être prévu en appelant le programme principal avec dès paramètres, ca devient alors vraiment pas terrible.

Cà donne en mémoire:
PROG (pid 1)
=>bash (pid 2)
=> PROG (pid 3)
=>bash (pid 4)
Risques de faire un truc récursif. En plus la deuxième instance de PROG, même si elle ne fait que "afficher une ligne" risque de géner l'autre PROG...

Que des $%#&! en perspectives. Auxquelles en débutant ne comprendra rien !

Voila mon avis. Du bash oui mais alors pour faire un truc impossible en Perl.
Franck
L'art de poser une question sur ce site afin d'obtenir la réponse
A LIRE
Avatar de l’utilisateur
Franck78
Amiral
Amiral
 
Messages: 5625
Inscrit le: 20 Fév 2004 01:00
Localisation: Paris

Messagepar Fesch » 18 Juil 2004 13:19

Voilà ... la version 0.7 (pas encore divisée en deux!!!) est dispo sur la page résumé:

:arrow: viewtopic.php?p=136026

:wink:
Pourquoi lis-tu ceci???
Avatar de l’utilisateur
Fesch
Amiral
Amiral
 
Messages: 2505
Inscrit le: 11 Sep 2003 00:00
Localisation: Luxembourg

PrécédentSuivant

Retour vers IPCop

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité