OWX merkt nicht, wenn device aktive wird

Begonnen von ntruchsess, 07 März 2013, 09:17:30

Vorheriges Thema - Nächstes Thema

ntruchsess

Ich habe ja die Anbindung vom FRM-Modul in OWX geschrieben - funktioniert auch soweit gut. Nur wenn beim Starten von OWX das FRM-modul noch gar nicht mit einem Arduino verbunden ist, dann schlägt OWX_Detect natürlich fehl (macht ja auch keinen Sinn auf einem nicht vorhandenen Bus nach Devices zu suchen). Wenn ich den code richtig verstehe ist das bei den anderen 1-Wire-Adaptern im Prinzip genauso - wenn die Hardware beim Starten von OWX nicht erreichbar ist, dann wird der State auf 'failed' gesetzt und das wars dann.

Wie bringe ich dem OWX jetzt am besten bei, beim Aktivwerden der Hardware erneut OWX_Detect aufzurufen? Ich möchte an dem fremden Modul jetzt nicht wild das Refactoren anfangen, daher hier erst mal die Nachfrage, damit man das halt aufeinander abgestimmt einbaut. Aber vieleicht habe ich ja auch nur was übersehen und es wäre ganz einfach ;-)

Gruß,

Norbert
while (!asleep()) {sheep++};

ntruchsess

Eigentlich bräuchte ich nur einen Einsprungpunkt mitten in die OWX_Define-methode, dort wo 'if (!OWX_Detect($hash))' aufgerufen wird (Zeile 229), den Rest (zum Arduino reconnecten und neu initialisieren) kann mein FRM ja schon.

Gruß,

Norbert
while (!asleep()) {sheep++};

Prof. Dr. Peter Henning

Ich habe noch keine neue Version von OWX.pm veröffentlicht, weil bis auf das Einbinden der Arduino-Routinen noch nichts notwendig war.

Insofern wären größere Bauarbeiten darin auch sehr kontraproduktiv...

Man kann das aber viel einfacher lösen: In dem COC/CUNO Teil der Define-Routine steht

  #-- loop for some time until the state is "Initialized"
      for(my $i=0;$i<6;$i++){
        last if( $owx_hwdevice->{STATE} eq "Initialized");
        Log 1,"OWX: Waiting, at t=$i ".$dev." is still ".$owx_hwdevice->{STATE};
        select(undef,undef,undef,3);
      }

d.h., das Define des OWX-Interface wartet hier bis zu 18 Sekunden auf COC und CUNO. Hat sich bisher als vollkommen ausreichend erwiesen. Sollte möglich sein, damit auch auf den Arduino zu warten.

LG

pah

 




ntruchsess

klar, beim Hochfahren von OWX reicht das. Aber nicht, wenn die Verbindung zum Arduino zwischendurch abbricht und wieder verbindet (was bei über Netzwerk angebundenen Devices ja nicht ungewöhnlich ist).

Leider kann ich OWX_Define nicht einfach noch mal aufrufen. Das würde - so wie es jetzt implementiert ist - zu einer Rekursion führen (OWX_Define ruft implizit den gleichen init-code im FRM auf, der FRM-seitig beim Reconnect aufgerufen wird). Die einfachste Lösung wäre, wenn die Definition des Devices (also das parsen des DEV-strings und merken der Configuration) vom eigentlichen Inititialisieren der betreffenden Hardware und dem Start des Busscannens abgekoppelt wäre. Also einfach ein Abtrennen ab Zeile 229 (nach 'if (!OWX_Detect($hash))') in eine neue (OWX_init oder OWX_start)-Methode. Soll ich Dir mal einen Patch schicken, wie ich mir das vorstelle?

Gruß,

Norbert
while (!asleep()) {sheep++};

Prof. Dr. Peter Henning