Jump to content

remotecontrol

Members
  • Gesamte Inhalte

    625
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von remotecontrol

  1. Kann der Brick durch irgendetwas gestört werden? Ich habe/hatte solche Effekte nur bei:

    - Spannungsschwankungen

    - Elektrische Störungen durch Motoren, Relais oder Schalter in der Nähe.

     

    Dann hat der Brick bei mir einen Reset gemacht.

     

    Der Brick hat auch einen Watchdog, der einen Reset auslösen kann (http://www.tinkerunity.org/forum/index.php/topic,673.msg10219.html#msg10219), wie der genau arbeitet weiss ich aber nicht.

    Falls das auftreten würde, ist das aus meiner Sicht aber ein Fehler in der Anwendung, die den Brick ansteuert.

  2. Mit dem

    deviceIdentifier = BrickletVoltageCurrent.DEVICE_IDENTIFIER

    liegst Du richtig. Anhand des Identifiers im Enumerate kannst Du den Typ von Brick(let) erkennen.

     

    Bei den Callbacks liegst Du auch richtig: du musst pro Bricklet und Callbacktyp je einen registrieren, also 4x etwas registrieren. Allerdings kannst Du eine Callbackfunktion ggf. wieder verwenden. Das hängt davon ab, wie Du sie implementierst.

     

    Wenn Du 4 Funktionen machst, ist damit schon klar definiert, welche Funktion für welches Bricklet wann aufgerufen wird. Wenn Du 2 Funktionen machst (z.B. je eine für Voltage und eine für Current) musst Du in der Funktion anhand des Bricklets (leider doch UID oder User-Parameter) unterscheiden.

     

    Ich habe auch eine Anwendung wo ich z.B. zwei Quad-Relais nutze. Da komme ich nicht drum herum, der Anwendung per Konfiguration (konkret UID) zu sagen, welches der beiden Relais welche Kanäle schaltet. Der Enumerate stellt ja keine Reihenfolge sicher.

     

    D.h. ich nutze dennoch den Enumerate, weise im Enumerate aber dann anhand der UID (falls ich mehr als 1 Bricklet gleicher Art erwerte) eine bestimmte Funktion zu.

  3. Ich mache das auch so ähnlich, aber in C++ mit Mutex und std::chrono. Damit kann ich bis auf Millisekunden genau (oder auch noch genauer) sagen, wann der Thread wieder aufwachen soll. Wenn der Thread dann 0,4ms rechnet wacht er auch brav nach weiteren 0,6ms wieder auf und verschäft nicht eine ganze Millisekunde ...

     

    Damit kann ich diesen Thread dann auch gezielt schnell beenden, wenn das Programm sich beenden soll.

     

    Stichworte: std::chrono::system_clock::time_point, std::unique_lock<std::mutex> und std::condition_variable

  4. You wrote

    send the UDP packets to the Master Brick
    , but you mean: you send TCP/IP packets to the brickd service or directly to a master with an ethernet extension?

     

    You'll need a TCP socket, not an UPD socket.

     

    You followed this instruction: http://www.tinkerforge.com/de/doc/Low_Level_Protocols/TCPIP.html#llproto-tcpip?

    You should dump your data packet in your code first, then you can compare which bytes sequence you're sending.

  5. Die Anwendung sollte zum Zeitpunkt der Ausführung keine Rechte setzen müssen, das ist klar.

     

    Das

    ich vom brickv aus für dieses Verzeichnis (nicht für mehr) die Berechtigungen öffnen kann
    geht eben nur bedingt: wenn "dieses Verzeichnis" per Default ein bin Verzeichnis ist sollte man das eben nicht ändern und da fängt es dann doch an, dass man etwas mehr Wissen über die Ablaufumgebung braucht, weil man die Skripte je nach Funktion anders einrichten oder starten muss.

     

    Ich habe in der Doku gesehen, dass beim Hochladen das Arbeitsverzeichnis angezeigt wird (im Beispiel war es "." was wohl == "/" ist): kannst Du das beim Hochladen auch vorgeben/ändern im brickv?

     

    Vielleicht reicht es ja, das Arbeitsverzeichnis auf das HOME-Verzeichnis des RED Users zu setzen.

     

  6. Je mehr Anforderungen die Anwendungen haben, umso mehr muss sich der Anwender auch mit der Umgebung auskennen. Selbst wenn das über brickv ginge: mal einfach globale Schreibrechte auf's "bin" Verzeichnis vergeben ist eine ganz schlechte Idee ...

     

    Die Anwendung sollte selber gezielt steuern, wohin sie die Daten schreibt. Ggf. beim Einrichten des Dienstes das Arbeitsverzeichnis explizit setzen auf das HOME Verzeichnis des Dienste Users (ich habe keine RED, kann darum nicht prüfen, welches User das ist). Dann müsste es schon gehen, wenn die Anwendung einfach ins Arbeitsverzeichnis schreibt.

     

    Letzteres (einfach ins Arbeitsverzeichnis schreiben) ist kein empfehlenswertes Vorgehen für Dienste. Da verliert man schnell die Kontrolle und sucht verzweifelt, wo denn der Output gelandet ist. Lieber mit einem Parameter arbeiten, der das Zielverzeichnis explizit festlegt.

  7. Die Bricklets selber sind ja erstmal relativ "dumm" und die Bricks steuern weitestgehend die Callbacks. Aber viel Speicher haben die Bricks nicht, d.h. einen größeren Puffer kann man da gar nicht einbauen.

     

    Eine machbare Funktion wäre wohl, alle X Millisekunden vom LCD einen Callback auszulösen der nur sagt "Timer abgelaufen". Aber das bringt nicht viel. Das kannst direkt in C/C++ machen. Das kommt auch nicht mit den TF Threads in Konflikt.

     

    Ich mache das so, dass ich mehrere "virtuelle" Displays habe. Die Anwendung schreibt von beliebigen Stellen/Threads in die virtuellen Displays und ein anderer Thread kontrolliert wann welcher Inhalt auf dem LCD ausgegeben wird - geht wunderbar (nur muss man auf saubere Thread-Synchronisierung achten).

  8. Make a "ping" to your stack connected via WIFI: you might get something below 10ms, but on average I would not rely on this.

     

    My experience is that I can transport about 50 data packages per second via WIFI (which makes 20ms per package) and that other WIFI networks in the surroundings have a big impact on the performance.

  9. Die Bricks können ja maximal 1000 Requests pro Sekunde verarbeiten (also max ein Request oder Callback pro Millisekunde), d.h. 2ms ist schon hart an der Grenze dessen, was die IO hergibt und Du hast 2 Callbacks mit je 2ms, also jede Millisekunde ein Callback. Das wird wohl etwas zu viel.

     

    Hast Du noch andere Bricks/Bricklets im Stack?

  10. CPU-Zeit ist ungleich verstrichener Zeit: sleep(10) wartet 10 Sekunden. In der Zwischenzeit verbraucht Dein Programm nur minimal CPU-Zeit, eben die 0.000271s CPU-Sekunden.

     

    Das Programm rechnet ja nicht aktiv vor sich hin, sondern wartet auf Events, d.h. es tut nichts => CPU-Zeit sehr gering => völlig normal.

     

    Willst Du CPU-Zeit oder verstichene Zeit (Delta zwischen 2 Zeitpunkten) messen? Delta zwischen zwei Zeitpunkten kannst Du mit gettimeofday Mikrosekunden genau machen. CPU-Zeit geht mit getrusage oder clock.

  11. clock() liefert die Processor-Zeit (CPU-Zeit), und das ist wohl nicht das was Du willst - oder?

    Dazu kommt noch, dass clock() stark systemabhängig ist - ich habe damit zumindest eher schlechte Erfahrungen gemacht (verhält sich anders zwischen Linux/Windows).

     

    Das Ganze soll C bleiben - oder? Dann geht die reine Zeitmessung auch mit

    #include <sys/time.h>
    struct timeval current;
    gettimeofday(&current, NULL);
    

     

    Noch ein kleiner Tipp:

    anstelle von

    void cb_interrupt(char port, uint8_t interrupt_mask, uint8_t value_mask, void *user_data) {
            // avoid unused parameter warning
            (void)user_data;
    

    sollte auch

    void cb_interrupt(char port, uint8_t interrupt_mask, uint8_t value_mask, void *) {
    

    gehen und somit das gleiche Ergebnis bei Warnings liefren.

×
×
  • Neu erstellen...