NEWS
Frage an die Javascript Profis
-
Hallo Profis,
ich habe da mal ne Frage. :roll:
Folgender Sachverhalt:
Bei meinem EIBD Adapter, der an sich gut funktioniert existiert ein Kunstgriff, der mir so nicht passt.
Das muss eleganter gehen…
Um mit dem eibd zu kommunizieren nutze ich dies: https://github.com/andreek/node-eibd library.
Die ist auch schön asynchron, was ja eigentlich auch gut so ist.
Es wird also ein callback ausgeführt, wenn einen Request den ich angefordert habe ausgeführt worden ist. Soweit so gut. Die Schwierigkeit ist allerdings die Definition "ausgeführt". So wie ich das deute wird der callback geworfen, wenn eibd den Befehl entgegengenommen hat. Nicht wenn eibd den Befehl tatsächlich auf dem Bus abgesetzt hat. Ist der Bus busy, so queued eibd den Befehl und führt ihn aus wenn wieder idle.
Für die o.g. eibd library ist das nicht einsehbar. Sobald die lib einen Request/Befehl an eibd abgegeben hat ist für sie die Sache erledigt. Der Callback wird geworfen.
Das bedeutet, ich kann mit der lib schneller Daten an eibd senden, als dieser es auf den bus absetzen kann.
Ich habe mal ausprobiert, was passiert wenn ich es so richtig qualmen lasse. ca. 40 Request pro Sekunde.
Das Ergebnis war wie erwartet. Eibd queued die Befehle, und rotzt sie dann so schnell wie möglich auf den Bus.
Was dann uncool ist, da dann sonst nicht mehr viel auf dem Bus geht. / Es steht also fast alles...
Meine Lösung, die imho nicht so elegant ist, ist folgende:
Ich schreibe alle angefragten Befehle / Requests in einen eigenen Buffer und arbeite diesen dann über einen setinterval loop ab den ich auf 250ms gestellt habe. So ist gewährleistet, dass der Bus nicht überfahren wird.
Dieser Loop läuft natürlich die ganze Zeit weiter, auch wen der Buffer leer ist. Das kann nicht optimal sein.
Wie würde ein Profi das lösen?
Gruß
Martin
-
Bin zwar kein Profi aber kannst Du den Puffer nicht mit einer abfrage auf "0" versehen ?
Puffer == "0" schleife aus
Puffer <> "0" schleife startet wieder
-
aber kannst Du den Puffer nicht mit einer abfrage auf "0" versehen ? `
Dazu müsste er (bzw. die Software) vorausschauende Fähigkeiten haben -
Hallo Profis,
ich habe da mal ne Frage. :roll:
Folgender Sachverhalt:
Bei meinem EIBD Adapter, der an sich gut funktioniert existiert ein Kunstgriff, der mir so nicht passt.
Das muss eleganter gehen…
Um mit dem eibd zu kommunizieren nutze ich dies: https://github.com/andreek/node-eibd library.
Die ist auch schön asynchron, was ja eigentlich auch gut so ist.
Es wird also ein callback ausgeführt, wenn einen Request den ich angefordert habe ausgeführt worden ist. Soweit so gut. Die Schwierigkeit ist allerdings die Definition "ausgeführt". So wie ich das deute wird der callback geworfen, wenn eibd den Befehl entgegengenommen hat. Nicht wenn eibd den Befehl tatsächlich auf dem Bus abgesetzt hat. Ist der Bus busy, so queued eibd den Befehl und führt ihn aus wenn wieder idle.
Für die o.g. eibd library ist das nicht einsehbar. Sobald die lib einen Request/Befehl an eibd abgegeben hat ist für sie die Sache erledigt. Der Callback wird geworfen.
Das bedeutet, ich kann mit der lib schneller Daten an eibd senden, als dieser es auf den bus absetzen kann.
Ich habe mal ausprobiert, was passiert wenn ich es so richtig qualmen lasse. ca. 40 Request pro Sekunde.
Das Ergebnis war wie erwartet. Eibd queued die Befehle, und rotzt sie dann so schnell wie möglich auf den Bus.
Was dann uncool ist, da dann sonst nicht mehr viel auf dem Bus geht. / Es steht also fast alles...
Meine Lösung, die imho nicht so elegant ist, ist folgende:
Ich schreibe alle angefragten Befehle / Requests in einen eigenen Buffer und arbeite diesen dann über einen setinterval loop ab den ich auf 250ms gestellt habe. So ist gewährleistet, dass der Bus nicht überfahren wird.
Dieser Loop läuft natürlich die ganze Zeit weiter, auch wen der Buffer leer ist. Das kann nicht optimal sein.
Wie würde ein Profi das lösen?
Gruß
Martin `
Hast du Fremdlib modifiziert oder dein Adapter?Wenn das irgendwo eingecheckt ist, dann kann ich auf dem git schauen.
Ich wurde Tick anders machen.
Merken wann letztes Kommando abgesetzt war und falls unter 250 ms, dann mit setTimeout warten bis 250 Intervall erreicht wird. Danach senden und im callback vom Write wieder Queue abarbeiten bis die Länge vom Queue Null ist.
-
Nö, die lib ist unverändert.
Der code liegt hier:
https://github.com/ruhigundrelaxed/ioBroker.eibd
In eibd.js gibt es die auskommentierte function:
recurseQueue
Da hab ich versucht die queue rekursiv, ohne setInterval abzuarbeiten.
Hat leider nicht funktioniert.. weil halt "zu" asynchron…(galube ich zumindest) :roll:
..ist nur noch nicht aufgeräumt.
> …250 ms, dann mit setTimeout warten bis 250 Intervall erreicht wird.
wird mir nicht ganz klar. Aber es geht in die Richtung: setInterval pausieren zu lassen wen buffer leer, und resumen wenn buffer nicht leer?
du bildest seInterval mit setTimeout nach?!?
Ok. Das könnt ich probieren….
Danke.