Tacho programieren?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Tacho programieren?

Beitrag von mcflay »

Guten Morgen,
ich versuche nen Tacho zu programieren.
Ansich funzt er auch nur gibt es da ein Problem auf Wince.
Folgender Code ist zum Zeichnen der Pfeile:

Code: Alles auswählen

rocedure ZeichnePfeil(Can: TCanvas; Col : TColor; SLange,Beta : Byte; Filled : Boolean; P1, P2: TPoint);
//created by Christof Urbaczek
 
  function GetDEG(Winkel: Extended): Extended; // Winkel ins Gradmaß
  begin
    Result := (Winkel * 2 * Pi) / 360;
  end;
 
  function GetRAD(Winkel: Extended): Extended; // Winkel im Winkelmaß
  begin
    Result := (Winkel * 360) / (2 * Pi);
  end;
 
var
  Punkte: array [0..2] of TPoint; // Array für die Punkte der Pfeilspitze
  Alpha, AlphaZ: Extended;        // Winkel zur horizontalen Achse durch P1
 
begin
 
  //Farben einstellen
  Can.Brush.Color := Col;
  Can.Pen.Color   := Col;
 
  //Linie zeichnen
  Can.Pen.Style   := psSolid;
  Can.MoveTo(P1.X, P1.Y);
  Can.LineTo(P2.X, P2.Y);
 
  //Pfeilspitze (1.Punkt)
  Punkte[0].X := P2.X;
  Punkte[0].Y := P2.Y;
 
  //Winkel ermitteln
  Alpha := 0;
  if P2.X = P1.X then
    AlphaZ := 0
  else
    AlphaZ := GetRAD(ArcTan((P2.Y - P1.Y) / (P2.X - P1.X)));
 
  if (P2.X > P1.X) and (P2.Y = P1.Y) then Alpha := 0
  else if (P2.X > P1.X) and (P2.Y < P1.Y) then Alpha := 0 - AlphaZ
  else if (P2.X = P1.X) and (P2.Y < P1.Y) then Alpha := 90
  else if (P2.X < P1.X) and (P2.Y < P1.Y) then Alpha := 180 - AlphaZ
  else if (P2.X < P1.X) and (P2.Y = P1.Y) then Alpha := 180
  else if (P2.X < P1.X) and (P2.Y > P1.Y) then Alpha := 180 - AlphaZ
  else if (P2.X = P1.X) and (P2.Y > P1.Y) then Alpha := 270
  else if (P2.X > P1.X) and (P2.Y > P1.Y) then Alpha := 360 - AlphaZ;
 
  //2.Punkt
  Punkte[1].X := round(P2.X - sLange * cos(GetDEG(Alpha - Beta div 2)));
  Punkte[1].Y := round(P2.Y + sLange * sin(GetDEG(Alpha - Beta div 2)));
 
  //3.Punkt
  Punkte[2].X := round(P2.X - sLange * cos(GetDEG(Alpha + Beta div 2)));
  Punkte[2].Y := round(P2.Y + sLange * sin(GetDEG(Alpha + Beta div 2)));
 
  //Pfeil zeichnen
  if Filled then Can.Polygon(Punkte) else begin
    Can.MoveTo(Punkte[0].X, Punkte[0].Y);
    Can.LineTo(Punkte[1].X, Punkte[1].Y);
    Can.MoveTo(Punkte[0].X, Punkte[0].Y);
    Can.LineTo(Punkte[2].X, Punkte[2].Y);
  end;
end;
Durch des integrierte GPS in meinem PDA bekomme ich die Geschwindigkeit die ich dann in einen Winkel umrechne.
Nun werden zwei Pfeile gezeichnet ein Roter der mir die aktuelle Geschwindigkeit anzeigt
und ein Schwarzer der die letzte Geschwindigkeit übermalt.
Leider hat keine der clear Funktionen funktioniert, da gabe es immer irgend welche Irrbilder die man nicht weg bekam,
deshalb der umweg mit dem übermalen.

Code: Alles auswählen

g:=speed*1.825;
b:=112+90*sin((180/80*g+180)*pi/180);
  c:=112+90*cos((180/80*g+180)*pi/180);
  xkm:=trunc(b);
  ykm:=trunc(c);
  Zeichnepfeil(image1.canvas,clblack,90,4,true,Point(112,112),Point(ykm1,xkm1));
  ZeichnePfeil(Image1.Canvas,clred,90,4,true,Point(112,112),Point(ykm,xkm));
ykm1:=ykm;
  xkm1:=xkm;
Nun stürzt das Proggie nach 20 sek auf dem PDA ab ohne Fehlermeldung
ich schätze das es an der Fülle von Pfeilen liegen mag.
Auch ein einfügen von doublebuffered brachte keine Verbesserung.
Gibt es eine bessere Lösung oder kann mir jemand einen Tip geben was ich umändern soll damit es laufen könnte.
Bin für jede Hilfe dankbar
Zuletzt geändert von monta am Fr 26. Mär 2010, 13:03, insgesamt 1-mal geändert.
Grund: Codehervorhebung gesetzt

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Tacho programieren?

Beitrag von Euklid »

mcflay hat geschrieben: Nun stürzt das Proggie nach 20 sek auf dem PDA ab ohne Fehlermeldung
ich schätze das es an der Fülle von Pfeilen liegen mag.
Hallo,

eventuell kannst Du das Programm von der Konsole aus aufrufen? In manchen Fällen hilft die Konsolenausgabe bei Abstürzen.

Viele Grüße, Euklid

mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Re: Tacho programieren?

Beitrag von mcflay »

Hallo Euklid,
In manchen Fällen hilft die Konsolenausgabe bei Abstürzen
kannst Du einem Doofen bitte kurz erklären was Du damit meinst!? :oops:
Höre heute das erstemal davon :shock:
Gruß
Stefan

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Tacho programieren?

Beitrag von Scotty »

Eine Konsole ist ein "schwarzes" Fenster für Kommandoeingaben - unter Windows kann man das per cmd starten, unter Linux per xterm o.ä. (http://de.wikipedia.org/wiki/Kommandozeile" onclick="window.open(this.href);return false;)
Bei deinem Problem würde ich überlegen, wie die Daten angeliefert oder abgeholt werden. Und ob es dabei nicht zu einem stack overflow kommt, weil dein Zeichnen zu langsam ist. Ansonsten solltest du versuchen, den Fehler einzugrenzen - entweder durch Debuggen oder per debugln/writeln oder wie auch immer. Eine Hilfe zu deiner Problembeschreibung wird sonst nicht einfach.
PS: Vielleicht gibt es bei TChart diese Art der Darstellung; dann müsstest du dich nicht mehr um das Zeichen kümmern.

Euklid
Lazarusforum e. V.
Beiträge: 2808
Registriert: Fr 22. Sep 2006, 10:38
OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
Wohnort: Hessen
Kontaktdaten:

Re: Tacho programieren?

Beitrag von Euklid »

mcflay:

Ich empfehle das Durchlaufen der folgenden Schritte zur Ausfindigmachung des Fehlers:
1. Projekt --> Compilereinstellungen --> Quelltext: Alle Überprüfungen an, alle Optimierungen aus, Smart-Linking aus.
2. Projekt --> Compilereinstellungen --> "Zeilennummern" ein, "Debuggersymbole entfernen" aus, Smart-Linking aus; wenn Du mit Pointern arbeitest ggf. die heaptrc an.
3. Start --> Alles kompilieren
4. Konsole (d.h. die Windows Eingabeaufforderung) öffnen und Dein Programm darin starten, indem Du mit dem Befehl "cd Pfad" in das Verzeichis Deines Programm wechselst und durch die Eingabe des Programmnamen dieses ausführst.
5. Fehler provozieren und vom Programm erstellte Textausgabe der Konsole interpretieren und ggf. hier posten.

Viele Grüße, Euklid

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Tacho programieren?

Beitrag von pluto »

Um einen Fehler zu besser zu finden kannst du vor einer Anweisung auch ein writeln('Test01'); oder so einfügen. So kannst du die Zeile ganz genau ermitteln, wenn der Debugger nicht gehen sollte. Im Übrigen: Die Dateinamen MÜSSEN klein geschrieben sein beim Debugger sonst verweigert er seine Arbeit. Warum das so ist, weiß ich nicht, ist halt ein "BUG". Der FPC hat damit keine Probleme, nur der Debugger hält sich nicht an diesen Standard.
MFG
Michael Springwald

mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Re: Tacho programieren?

Beitrag von mcflay »

Scotty hat geschrieben:Bei deinem Problem würde ich überlegen, wie die Daten angeliefert oder abgeholt werden. Und ob es dabei nicht zu einem stack overflow kommt, weil dein Zeichnen zu langsam ist.
Ich bekomme die Daten direkt über eine dll von Wince.
Habe jetzt auch mal nur eine Linie genommen zum Zeichnen, aber auch da stürzt es ab.
Scotty hat geschrieben: Ansonsten solltest du versuchen, den Fehler einzugrenzen - entweder durch Debuggen oder per debugln/writeln oder wie auch immer.
Debuggen tu ich immer und es kommt keine Fehlermeldung.
Mein Problem ist das ich das Proggi ja auf einem PDA laufen lasse und dabei entfällt ja das mit der Konsole oder?
Und wenn ich das selber nur mit von mir zur Verfühgung gestellte Daten auf dem PC laufen lasse ist der Fehler nicht da.
Es muß also mit Wince zu tun haben.
Scotty hat geschrieben:PS: Vielleicht gibt es bei TChart diese Art der Darstellung; dann müsstest du dich nicht mehr um das Zeichen kümmern.
Gucke ich mir gerade mal an, aber brauche noch etwas um damit klar zu kommen.
Euklid hat geschrieben:mcflay:

Ich empfehle das Durchlaufen der folgenden Schritte zur Ausfindigmachung des Fehlers:
1. Projekt --> Compilereinstellungen --> Quelltext: Alle Überprüfungen an, alle Optimierungen aus, Smart-Linking aus.
2. Projekt --> Compilereinstellungen --> "Zeilennummern" ein, "Debuggersymbole entfernen" aus, Smart-Linking aus; wenn Du mit Pointern arbeitest ggf. die heaptrc an.
3. Start --> Alles kompilieren
4. Konsole (d.h. die Windows Eingabeaufforderung) öffnen und Dein Programm darin starten, indem Du mit dem Befehl "cd Pfad" in das Verzeichis Deines Programm wechselst und durch die Eingabe des Programmnamen dieses ausführst.
5. Fehler provozieren und vom Programm erstellte Textausgabe der Konsole interpretieren und ggf. hier posten.

Viele Grüße, Euklid
Oh, das klingt aber kompliziert, werde es versuchen.
Das Proggi soll ja auf PDA's laufen und da gibt es keine Eingabeaufforderung.
Kann ich den auch den Emulator für Wince-Geräte damit laufen lassen?
pluto hat geschrieben:Im Übrigen: Die Dateinamen MÜSSEN klein geschrieben sein beim Debugger sonst verweigert er seine Arbeit. Warum das so ist, weiß ich nicht, ist halt ein "BUG". Der FPC hat damit keine Probleme, nur der Debugger hält sich nicht an diesen Standard.
Beim ersten mal Debuggen sagt mir Lazarus das ja von selber und ändert es auch.
Also daran sollte es nicht liegen.
Werde mal Eure Tips testen und sehen was so passiert.

Danke schon mal für Eure Hilfe

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Tacho programieren?

Beitrag von Scotty »

Lass das Zeichnen einfach mal weg und schreibe nur die Zahlenwerte in ein Label.

mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Re: Tacho programieren?

Beitrag von mcflay »

Scotty hat geschrieben:Lass das Zeichnen einfach mal weg und schreibe nur die Zahlenwerte in ein Label.
So mache ich das im Moment, dann läuft es.
Sobald ich das mit den Pfeilen dazu bringe geht es einfach aus :cry:

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Tacho programieren?

Beitrag von Scotty »

Geht es auch dann noch, wenn du das zweite zeichnen weg lässt?

mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Re: Tacho programieren?

Beitrag von mcflay »

Oh das habe ich noch nicht probiert.
Mache ich gleich mal und melde mich wieder.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Tacho programieren?

Beitrag von pluto »

Du kannst das Zeichnen sehr stark Optimieren. Z.B. wenn du nur eine Line Zeichnest, musst du natürlich kein Viereck Zeichnen um es überzeichnen. Es reicht wenn du die Line noch mal zeichnest, allerdings muss du dann den pen.copymode auf ich meine xornot oder so ähnlich stellen. In der DP gibt es dazu Beiträge. Ich glaube einen Hintergrund Buffer brauchst du auch nicht.
MFG
Michael Springwald

mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Re: Tacho programieren?

Beitrag von mcflay »

So nun ich mal wieder :oops:
Habe in der letzten Woche viel ausprobiert aber der Fehler ging nicht weg.
Dann habe ich einfach nur ein Hintergrundbild erstellt wo nun die Werte als Zahlen geschrieben werden.
Jetzt bekomme ich ne Fehlermeldung "Access violation"
Könnte es sein das irgendwas mit TImage nicht i.O ist.
Weil ohne Bild läuft es ohne Probleme :?:

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Tacho programieren?

Beitrag von pluto »

Die Fehler Meldung deutet auf einen anderen Fehler. Sie deutet darauf hin dass irgendein Objekt / Klasse nicht Richtig Installisiert wurde. Erstellst du das TImage zur Laufzeit ?
MFG
Michael Springwald

mcflay
Beiträge: 13
Registriert: So 14. Mär 2010, 13:00

Re: Tacho programieren?

Beitrag von mcflay »

Ich habe das tImage aufs Formular gezogen.
Ihm unter Picture gesagt das er mein Bild benutzen laden soll.
Mehr nicht. :cry:

Antworten