Jump to content

AuronX

Members
  • Gesamte Inhalte

    887
  • Benutzer seit

  • Letzter Besuch

Posts erstellt von AuronX

  1. Degree ist nur da um dir das Leben leichter zu machen. Deinen Servo interessieren nur Pulsweite und Periode.

     

    Wenn du jetzt als minimale Pulsweite zum Beispiel 1000 einstellst und als minimalen Degree -25000, dann bedeutet das nicht mehr, als dass dein Servo genau dann mit einer 1000er Pulsweite angesteuert wird, wenn du eine Position von -25000 einstellst. Dein Servo "weiß" gar nichts vom Degree.

     

    Der Sinn ist der: Wenn du einen Servo hast der 180° insgesamt drehen kann, dann kannst du den Degree von -9000 bis +9000 stellen und weißt dann, dass bei einer Position von 1000 der Servo 10° nach rechts gedreht ist.

    Wenn dein Servo hingegen einen Fahrtenregler ansteuert der von keine Motordrehung bis volle Drehzahl steuert, dann kannst du den Degree von 0 bis 100 stellen und weißt zum Beispiel, dass bei Position 0 die Drehzahl 0% vom Maximum ist und bei 100 halt 100% vom Maximum.

     

    Den Degree kannst du also frei definieren so wie es dir bequem ist, hoffe meine Erklärung war mehr hilfreich als verwirrend ^^

  2. Letzteres ist technisch nciht möglich und ich vermute sogar gegen die Bedingungen von Github (automatisches Anlegen von Accounts). Zumal ja nur ein Bruchteil der Forenuser auf Github was beisteuern wird und dann noch viele schon vorher einen Account hatten (wie ich).

     

    Code-formatierungen wird es von TF wohl zu nicht-unterstützten Sprachen kaum geben. Ansonsten reicht aber ein kostenloser Account völlig aus.

     

    Grundprinzip bei allen Github-Projekten sieht so aus:

    Du gehst auf das öffentliche Repo, dann forkst du es und führst alle Ändeurngen an deiner eigenen Kopie durch. Wenn was dabei ist was du für teilenswert hälst, dann kannst du ne "Pull Request" stellen, das ist quasi die Bitte an TF deine Änderungen zu übernehmen. Dann kann TF sich das anschauen, villt noch mit dir Rücksprache halten und am Ende übernehmen.

     

    Das war Github in Kurzform. Falls es jetzt noch Organisatorisch was gibt kann TF das ja nachtragen, aber meiner Erfahrung nach ist es recht unkompliziert ^^

  3. Github wird nicht von TF betrieben sondern ist ne unabhängige Seite die Git-Repositories für andere Leute hostet. Deswegen brauchst du da auch einen eigenen Account.

     

    Solltest du bisher nicht mit Git oder anderen Versionsverwaltungssystemen vertraut sein, kannst du dich ja auf http://help.github.com erstmal grundsätzlich damit vertraut machen. Allerdings gibt es definitiv eine gewisse Einstiegshürde, wenn man noch nie vorher Versionsverwaltung betrieben hat.

  4. Zu der Schleife:

    Findet das Warten nicht in der Funktion MsgWaitForMultipleObjects statt? Weil du das lock erst danach freigibst, das heißt also während du wartest darf es sich niemand anders nehmen. Ich würde jetzt vermuten, dass das Release VOR dem MsgWaitForMultipleObjects stehen sollte.

     

    Das if(closing) usw sollte wohl lieber zwischen aquire und if(count > 0) stehen, auf jeden fall sollte es nur dort stehen wo du das lock gerade besitzt. Sonst ist es wieder möglich, dass jemand close aufruft, nachdem du auf closing geprüft hast.

  5. Hmmh, ich sehe gerade das die Funktion Count in den C#Bindings überhaupt nicht benutzt wird, es wird immerzu das Property queue.count abgefragt, hat das ev. mit der o.g. Situation zutun ?

    Die Funktion count macht ja nicht mehr als innerhalb einer critical-section den queue.count abzufragen. Da queue.count sonst auch nur innerhalb der locks verwendet wird ist das äquivalent.

     

    Das lock(writeLock) in C# entspricht m.W. den Acquire und Release in Delphi

    writeLock.Acquire;
    try
    ...
    finally
      writeLock.Release;
    end;

    Tatsächlich sieht der vom C#-Compiler generierte Code ziemlich genau so aus (abgesehen von anderen Locking-Klassen ;))

     

    Anfangs hatte ich die CriticalSection (WriteLock) zu Beginn und Ende von TryDequeue eingetragen, aber das führte dazu, dass der HauptThread, der nur dort reinläuft, das Enqueue vom Recv-Thread aber solange blockiert, bis die 2.5 sec abgelaufen sind.

    Das klingt danach, dass du während des wartens das lock nicht abgegeben hast. Das wäre aber nötig. Ich versuche mal in Pseudo-code darzustellen wie es grob aussehen könnte (nicht schön aber selten):

    while(true) {
      lock.aquire();
      if(count > 0) {
        break;
      }
    
      lock.release();
      WaitSomeTime();
    }
    
    pop();
    lock.release();
    

     

    In diesem Beispiel habe ich jetzt sowas wie closing und exception-handling mal ausgeblendet. Das ist jetzt nur exemplarisch fürs locking, wenn du sonst keine besseren Bordmittel von Delphi bekommst.

  6. Ich befürchte TryDequeue ist noch nicht korrekt gelocked (habe aber auch Probleme Delphi zu lesen ^^):

            while (Count = 0) do begin
              state := MsgWaitForMultipleObjects(1,job,false,timeout,QS_ALLINPUT);
              if (closing) or (timeout < Timeout_Infinite) or (state=WAIT_TIMEOUT) then begin
               result := false;
               exit;
              end;
              timeout := tick-GetTickCount;
            end;

     

    Ich verstehe nicht ganz wie, aber wenn ich es richtig sehe ist das der Code der wartet bis mindestens ein Eintrag in der Queue steckt (das ist jetzt eine Annahme von mir).

     

    Daraufhin kommt dieser Code:

    writeLock.Acquire;
            try
              p:=queue.Pop;
              item := p^;
              dispose(p);
            finally
              writeLock.Release;
            end;

     

    Das Problem ist, dass zwischen dem Aquire und dem Verlassen der while-schleife darüber kein locking besteht. Es ist also möglich, dass mehrere Threads die while-schleife verlassen, dann bekommt der erste Thread das writeLock (Thread 2 hängt jetzt am aquire), holt sich das einzige Item in der Queue und gibt das lock wieder ab. Jetzt kann der zweite Thread weiterlaufen, beim Pop knallt es jetzt aber.

     

    Der C#-Code funktioniert deswegen, weil die gesamte Schleife in einem locked-Bereich liegt, aber das Monitor.Wait es zulässt, dass man sein Lock mittendrin wieder abgibt und auch wiederbekommen kann.

     

    Du müsstest also sicherstellen, dass man vor dem Prüfen des count das lock aquired, und es wieder abgibt und wartet falls der count == 0. Falls der count > 0, dann sollte man das lock behalten, poppen gehen und danach das lock abgeben.

     

    Viele Grüße

    Jan

  7. It works under Win7 64Bit.

     

    Did you check your host, the port and that the brickd is running?

     

    The host should normally be localhost (if running from the same computer)

    Port should be left unchanged (I don't remember the default)

    To see whether the brickd is running go to

    Start -> Rightclick on "Computer" -> Manage.

     

    You get a window where you can navigate through a tree at the left side:

    Services and applications -> Services

     

    In the list search for brickd and check whether the status is "Running".

  8. Ich habe zwar nicht für GPS gestimmt aber tatsächlich kenne ich eine Anwendung ^^

     

    Ich hatte mir schonmal die Idee zusammengesponnen, dass ich in mein Auto ein Display montieren könnte das mir den Abstand und die Geschwindigkeitsdifferenz zum Vordermann anzeigt (gibt aber leider bisher keine Distanzmessung über viele Meter). Wenn ich die absolute Geschwindigkeit meines Vordermanns haben will, dann brauche ich meine eigene Geschwindigkeit. Am wenigsten basteln muss man da mit GPS. Mit mehr basteln kann man auch irgendwo ne Raddrehzahl abnehmen und aus der die Geschwindigkeit berechnen ^^

     

    Das wäre ein (exotischer) Anwendungsfall.

  9. In sämtliche Funktionen wird für meinen Geschmack immer die gleiche Paketstruktur redundant zusammengebaut.

    Vermutlich lässt sich da noch einiges optimieren ^^

     

    Für einen einfachen Generator ist es am Ende nur wichtig, dass man die einzelnen Methoden nach einfachen Regeln bauen kann, deiner Beschreibung nach scheinst du ja die Handhabung sogar zu vereinfachen, sollte also gut sein.

     

    Wenn ich eine Methode generiere, dann habe ich die folgenden Informationen:

    - Welche ID hat sie auf TCP-Ebene

    - Wie heißt sie

    - Für alle Paramter/Rückgabewerte: Name, Typ, vielfältigkeit

     

    Vielfältigkeit wird in C# durch arrays abgebildet.

     

    (Zur Referenz: Config vom Stepper)

×
×
  • Neu erstellen...