Lua classes utiles

Portrait de reeb

Bonjour à tous,

J'ai partagé sur github des classes utilitaires notamment pour gérer une led ou un sensor digital.

ici : https://github.com/reebgame/nodemcu

ça pourra peut-être servir ..

Si jamais vous avez des idées d'évolutions ou constatez des anomalies n'hesitez pas à m'en faire part.

++

Portrait de GEEK

Pourrais savoir quel avantage de programmer en "LUA" plutôt qu'en "C" ?

Votre programme en LUA pour faire clignoter une LED :

Led = {} -- the table representing the class, which will double As the metatable For the instances

function Led:new(pin)
Print("pin=" .. pin)
   o = o Or {}
   o.onEvent = nil
   o.pin = pin
   o.blinkTimer = nil
   o.timeTimer = nil
   o.isOn = false
   setmetatable(o, self)
   self.__index = self
   gpio.mode(o.pin,gpio.OUTPUT)
   Return o
End

function Led:on()
    If self.pin ~= nil then
        gpio.write(self.pin,gpio.HIGH)
        self.isOn = true
        If self.onEvent ~= nil then
            evt = {}
            evt.type = "on"
            self.onEvent(evt)
        End
    End
End

function Led:off()    
    If self.pin ~= nil then
        gpio.write(self.pin,gpio.LOW)
        self.isOn = false
        If self.onEvent ~= nil then
            evt = {}
            evt.type = "off"
            self.onEvent(evt)
        End
    End
End

function Led:blink(delay, time, endCallback)

    If self.blinkTimer ~= nil then
        self.blinkTimer:unregister()
        self.blinkTimer = nil
    End
    
    Print("delay" .. delay)
    
    self:off()

    
    self.blinkTimer = tmr.create()
    self.blinkTimer:register(delay, tmr.ALARM_AUTO ,
        function()
            If self.isOn == true then
                self:off()
            Else
                self:on()
            End
        End
    )
    self.blinkTimer:start()

    If time ~= nil then
        Print("time" .. time)
        self.timeTimer = tmr.create()
        self.timeTimer:register(time, tmr.ALARM_SINGLE,
            function()
                self.blinkTimer:unregister()
                self.blinkTimer = nil
                self.timeTimer = nil
                If endCallback ~= nil then
                    endCallback()
                End
            End
        )
        self.timeTimer:start()
    End

End

Sachant qu'en C il suffit de :

int Etat = 1;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, Etat);
  Etat = !Etat;
  delay(1000);
}

Je pense qu'il doit y avoir un avantage pour que ce language soit utilisé mais dans un premier temps je ne vois pas lequel.

Merci de votre réponse

Portrait de Walter

Si je peux me permettre de répondre, pour moi l'Intérêt n'est pas dans le langage en lui-même.
A la base il a était créer pour moder des jeu vidéos, comme il est interprété, le mod n'a pas besoin d'être compiler pour chaque plateforme supporté par le jeu.

Mais pour de la programmation µC, en fait il n'a pas réellement d'avantage. car le fait de pouvoir proposer un programme modifiable par un tier et très peu utilisé sur ce genre de plateforme.

Par contre le code Lua est une classe pas un programme, elle ne fait rien si tu n'instancie pas cette classe.
Le programme qui utilise cette classe serait quelque chose comme ça(je n'ai pas testé)

led1=Led(4)
led2=Led(5)
led1:blink(5, 10000, nil)
led2:blink(2, 10000, nil)

De plus ton programme passe son temps à faire clignoter la led, sa classe utilise un timer, donc le µC est disponible pour autre chose.
 

Portrait de reeb

Oui il y a des avantages.

Le lua est un language de script ressemblant au javascript qui permet de developper une application organisée avec des classes ( meilleure organisation, reutilisabilité du code etc ) et qui repose sur une stratégie d'appels asynchrones avec gestion d'évenements (callback).

Ceci permet de rendre le code non sequentiel et donc de pouvoir paralléliser certaines tâches.

Un exemple ... lorsque l'on effectue une requête http ... l'appel est asynchrone, le traitement peut donc continuer a effectuer d'autres tâches ( clignotement led, lecture sensor etc) en attendant le retour de la réponse http.

Tout cela permet d'éviter le fameux .. delay(1000) de ton exemple qui bloque toute l'execution de ton programme pendant 1000ms.

La programmation asynchrone peut paraître déroutante à ceux qui n'ont programmé que de manière sequentielle ... mais quand on y a goûté ... difficile de s'en passer :)

Aujourd'hui toutes les applications web modernes sont basées sur ce type d'architecture technique notamment avec l'utilisation du javascript et des différents framework actuel (ReactJS, Angular etc)

 Un petit lien pour appréhender davantage l'intérêt de l'asynchrone :

https://javascript.developpez.com/actu/102019/Apprendre-les-mecanismes-de-base-de-l-asynchrone-en-JavaScript-un-tutoriel-de-Yahiko/

Portrait de GEEK

Les timers et interruptions existent en C donc pour l'instant je ne suis pas convaincu, mais ce n'est que mon avis ! Les classes sont aussi présentent en C et les codes sont tous aussi réutilisables dans d'autres applications. Il est aussi possible d'utiliser des séquences interprétées dans un programme du style écrire une fonction complexe dans un champ de saisie de d'obtenir le résultat sans autre traitement. Je serais curieux de savoir si la puissance et la rapidité sont au même niveau.

Je développe des applications très lourdes qui fonctionnent simultanément  sur PC et smartphone  avec pratiquement le même code et je ne trouve pas que ce code soit très intuitif surtout lorsque plusieurs développeurs interviennent sur ce même code.

Mais je conçois qu'il y ait des adeptes pour ce LUA

Portrait de Walter

Je me répète, mais le langage en soit n'a pas réellement d'avantage par rapport au C/C++, mais le contraire est vrai.
Le langage/interpréteur à été inventé pour permettre de moddé  de lourd moteur de jeu quelque soit la plateforme de destination.
Donc le but est qu'il soit très compacte et rapide, voir le wiki pour son cadre d'utilisation, d'ailleurs wikipédia peut l'utiliser.

Donc la rapidité est au rendez-vous.

Lorsque tu parle de développement PC et Smartphone avec le même code tu parle je suppose de l'outil Windev/Webdev et du langage Wlangage ?
On ne parle plus de C/C++ pour cette partie là.

Après intuitif c'est très relatif, les développeur WEB habitué au javascript, trouverons sûrement que le C/C++ n'est pas intuitif.
J'ai d'ailleurs du mal a voir en quoi il est moins intuitif qu'un autre langage?
Tu as des exemples précis par rapport au C/C++?
Sa syntaxe non permissif est au contraire un atout dans du développement collaboratif à contrario du C/C++
 

Pour moi le seul atout du C/C++ sur arduino &co est le nombre de librairie mis à disposition par la communauté, mais  ce n'est pas lié au langage à proprement parlé.

Moi je suis pas du tout convaincu qu'il y ait un intérêt a faire C/C++ plutôt que du lua.
Bien que l'on puisse faire exactement la même chose dans les deux langages, je trouve qu'il en général bien plus simple à mettre en place en Lua.
Ce qui est justement le cas pour les timer et interruption qui ne demande aucune librairie externe pour être mis simplement en exécution.

Portrait de reeb

Effectivement le choix d'une techno depend aussi du besoin ... performance, maintenance etc et aussi de son experience ... pour ma part j'ai une experience tres ..web ... et le lua se rapproche d'avantage de ce que je connais.

Le C est certainement plus performant car plus proche du processeur, le lua fonctionne comme le java je crois avec une jvm et du bytecode ... mais mon projet actuel ne necessite pas forcement un temps reel de malade :)

Portrait de GEEK

D'accord disons que ce n'est pas ma tasse de thé !

Mais pour ce qui est de tes classes je pense que tu peux optimiser ou alors je fais erreur sur le code, ce qui est tout à fait possible vu que je ne suis pas expert dans ce domaine.

J'ai fais un petit tour ICI.

Bien pour moi j'en ai appris assez !