Seite 1 von 2

xy-Endlos-Schreiber für Daten von Messgerät

Verfasst: 24.03.2007 23:26
von legion
Hallo Leute !

Ich arbeite an einem Programm das Daten von einem Messgerät empfängt und auf einen XY-Schreiber darstellen soll. Brauch das für meine Hypnose - Sitzungen um die Trancetiefe optisch darzustellen.

Aber ich scheitere bereits im Ansatz !
Jedesmal wenn der Schreiber ans Ende gelangt und das Image gescrollt wird beginnt alles zu flimmern.

Die Aufzeichnungsdauer ist jetzt durch die Imagegrosse begrenzt !
Aber das Ding sollte zumindest 2-3 Stunden aufzeichnen können und man muss zu jedem Punkt scrollen können.

Vielleicht hat ja jemand einen Tipp für mich ?

Danke !

Legion

Mein Denkansatz bis jetzt ....

Code: Alles auswählen


Global Window_0, TrackBar_0, ScrollArea_0, Image_0
Global GrundImage
Global X = 0
Global Y = 240

Procedure Open_Window_0()
  Window_0 = OpenWindow(#PB_Any, 101, 10, 745, 537, "Window 0",  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered )
  If Window_0
    If CreateGadgetList(WindowID(Window_0))   
      ScrollArea_0 = ScrollAreaGadget(#PB_Any, 30, 10, 680, 430,659,426,0)
      SetGadgetColor(ScrollArea_0, #PB_Gadget_BackColor, $DEDEDE)
      Image_0 = ImageGadget(#PB_Any, 0,0,680,430,0)
      CloseGadgetList()
      TrackBar_0 = TrackBarGadget(#PB_Any, 150, 480, 480, 30, 0, 480)
      SetGadgetState(TrackBar_0,240)    
    EndIf
  EndIf
EndProcedure

Procedure Schreibe()
StartDrawing(ImageOutput(GrundImage))
LineXY(X,Y,X,GetGadgetState(TrackBar_0),$67FDB0)
DrawText(5, 5, "X = "+Str(X),$67FDB0,$000000)
StopDrawing()
SetGadgetState(Image_0,ImageID(GrundImage))
X= X+1
Y= GetGadgetState(TrackBar_0)
If X > 659
SetGadgetAttribute(ScrollArea_0,#PB_ScrollArea_InnerWidth,X)
SetGadgetAttribute(ScrollArea_0,#PB_ScrollArea_X ,GetGadgetAttribute(ScrollArea_0, #PB_ScrollArea_X) + 1)
EndIf
EndProcedure

Open_Window_0()
GrundImage = CreateImage(#PB_Any,1360,430)
StartDrawing(ImageOutput(GrundImage))
Box(0, 0, 1360, 430, $000000)
StopDrawing() 
SetGadgetState(Image_0,ImageID(GrundImage))

Repeat 
  
  Event = WaitWindowEvent()  
  WindowID = EventWindow() 
  GadgetID = EventGadget()
  EventType = EventType() 
  
  If Event = #PB_Event_Gadget    
    If GadgetID = TrackBar_0 : Schreibe()        
    EndIf   
  EndIf 
Until Event = #PB_Event_CloseWindow ; End of the event loop

End

Verfasst: 24.03.2007 23:51
von Kaeru Gaman
so ne ähnliche frage hatten wir letztens erst...

zeichne deine werte in ein array auf, und stelle sie aus diesem speicher dar.

Verfasst: 25.03.2007 00:01
von legion
Danke für den Tipp !

Darüber hab ich schon nachgedacht.
Wenn ich die Daten aus dem Speicher hole müsste ich dann beim Scrollen
in Bruchteilen von Sekunden mit den Daten neue Images erstellen und ScrollAreaGadget darstellen.

Ob das geht ? Werde es mal testen !

Verfasst: 25.03.2007 01:57
von Kaeru Gaman
die darstellung in einem image in ner scrollarea muss nicht sein...

du kannst das ganze auch auf nen WindowedScreen plotten,
da müsstest du eh in jedem Frame neuzeichnen...

hättest du denn nur einen y-wert pro x-wert, oder ggf. mehrere?


ich hatte letztens erst ein beispiel gepostet....
vielleicht find ichs ja auf die schnelle...

[edit]
http://www.purebasic.fr/german/viewtopi ... 458#140458

Verfasst: 25.03.2007 10:12
von legion
Danke für deine Unterstützung !

Ich habe nur einen Y-Wert pro X-Scrolling !
Das Messgerät sendet alle 500ms Daten, dass ist lange genug um den Screen neu zu zeichnen.

Habe im englischen Forum noch ein Beispiel gefunden:
http://www.purebasic.fr/english/viewto ... ter+metre
Was da abgeht ist mir aber noch um eine Nummer zu Gross !

Lg. Legion

Verfasst: 25.03.2007 11:24
von Kaeru Gaman
> Ich habe nur einen Y-Wert pro X-Scrolling !
> Das Messgerät sendet alle 500ms Daten

na super. das wird ja ein spaziergang.... :lol:

> dass ist lange genug um den Screen neu zu zeichnen.

mehr als das.
ein normaler windowed screen hat eine framerate von 60 - 80 - 100,
je nachdem, wie der monitor das haben will...
(das ist ne grobe angabe, und ich will jetzt keine spams, wer welche framerates hat)

also selbst bei nem 'bequemen' monitor mit 60Hz zeichnest du also 30x so oft ein neues Bild,
wie du einen neuen wert bekommst.

bei dem beispiel das ich dir verlinkt habe, plottet er mehrere werte pro x, und
da ging so ab 100(!)Werte pro X die framerate langsam runter, also ab 60.000 plots.
also, bei einem wert pro x kann er locker seine framerate halten,
auch wenn du nen extremen widescreen von 1600 oder 2048 pix ausnutzen willst...

in dem link im englischen scheint es um ein ownerdrawn gadget zu gehen,
dass ist oversized für deine zwecke sag ich mal...


du hast die wahl, ob du es in nem windowed-screen machen willst oder im fullscreen.
wenn es ne anwendung sein soll, würde ich ersteres vorziehen.

brauchst du noch unterschiedliche gadgets dabei, für einstellungen und funktionen,
oder würde es dir genügen, einen graphen aufm bild zu haben und alles per tastatur zu steuern.

du könntest auch zwei fenster aufmachen, eines nur für den graphen,
ein zweites für das handling.

und natürlich wäre es kein problem, verlaufsdateien zu speichern und zu laden.

grundsätzlich wäre noch eines wichtig:
in welcher form bekommst du eigentlich die daten,
also, wie sieht das interface zum meßgerät aus.

Verfasst: 25.03.2007 12:34
von legion
Danke für die tolle Unterstützung !

Die Daten vom Messgerät werden von mir in einen Double-Wert decodiert.
Siehe:
http://www.purebasic.fr/german/viewtopic.php?t=12206

Ein Vollbild kommt nicht in Frage, da ich andere Gadgets für Buttons, Menü usw. benötige. Werde "OpenWindowedScreen" verwenden.

Lg. Legion

Verfasst: 25.03.2007 14:22
von Kaeru Gaman
> Danke für die tolle Unterstützung !

kein problem.
ich bin froh, wenn mein wissen auch mal ne praktische anwendung findet.
sonst daddel ich ja eher im game-bereich herum....


> Ein Vollbild kommt nicht in Frage, da ich andere Gadgets für Buttons, Menü usw. benötige. Werde "OpenWindowedScreen" verwenden.

denk auch noch mal über meinen vorschlag nach,
anzeigefenster und einstellungsfenster getrennt zu erstellen,
das könnte dir ne menge kopfzerbrechen ersparen.
besonders größenänderung des anzeigebereichs wird dann viel einfacher...


> Die Daten vom Messgerät werden von mir in einen Double-Wert decodiert.
> Siehe: *LINK*

das werd ich mir später noch mal in ruhe ansehen.
evtl. kann man die gesamte decodierung noch optimieren,
gerade in bezug darauf dass sie je eingebettet werden soll.

Verfasst: 25.03.2007 16:08
von legion
Danke !

Werde deinen Rat beherzigen.
Der Schreiber mit "OpenWindowedScreen" und Scrolling funzt schon !
Wie du sagtest, die Zeit für den Screen neu zeichnen geht sich leicht aus.
Muß jetzt nur noch das ScrollBarGadget reinflicken ! In Arbeit .....

Wenn der Schreiberteil funktioniert werd ich den Source natürlich posten!

Lg. Legion

Verfasst: 25.03.2007 20:17
von legion
So, der Schreiberteil funktioniert soweit. Auch das Scrolling funzt !
Nur ein Softscrolling über das ScrollBarGadget konnte ich noch nicht realisieren. Das Gadget schickt nach bewegen des Balkens die Position nur
in einem Stück.

Code: Alles auswählen


Enumeration
  #Window_0
EndEnumeration

Enumeration
  #TrackBar_0
  #ScrollBar_0
  #Text_0
EndEnumeration

Global X = 0
Global Y = 218
Global Dim XYArray.l(999999)
Global Startpos.l = 0

Procedure Open_Window_0()
  If OpenWindow(#Window_0, 216, 0, 664, 537, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window_0))
      OpenWindowedScreen(WindowID(#Window_0),20,20,620,435,0,0,0)
      TrackBarGadget(#TrackBar_0, 20, 500, 620, 30, 0, 435)
      SetGadgetState(#TrackBar_0,218)
      ScrollBarGadget(#ScrollBar_0, 20, 460, 620, 20, 0, 620, 620)
      TextGadget(#Text_0, 290, 485, 200, 15, "Bewege mich ! ! ! ! ")      
    EndIf
  EndIf
EndProcedure

Procedure Schreibe()
Protected i
ClearScreen($402010)
StartDrawing(ScreenOutput())
FrontColor($80C020)
DrawingMode(1)
XYArray(X)= GetGadgetState(#TrackBar_0)
If X > 620  
 Startpos = Startpos -1  
 SetGadgetAttribute(#ScrollBar_0, #PB_ScrollBar_Maximum, GetGadgetAttribute(#ScrollBar_0, #PB_ScrollBar_Maximum)+1)
 SetGadgetState(#ScrollBar_0, 620 + X)
EndIf

For i = 1 To X
 LineXY(Startpos+i,XYArray(i-1),Startpos+i+1,XYArray(i),$67FDB0)
Next i

StopDrawing()
X = X + 1
EndProcedure

Procedure ScrollPicture()
Protected i
If GetGadgetAttribute(#ScrollBar_0, #PB_ScrollBar_Maximum) > 640
 ClearScreen($402010)
 StartDrawing(ScreenOutput())
 FrontColor($80C020)
 DrawingMode(1)
 For i = 0 To 640
  LineXY(i,XYArray(i+GetGadgetState(#ScrollBar_0)),i+1,XYArray(GetGadgetState(#ScrollBar_0)+i+1),$67FDB0)
 Next i
 StopDrawing()
EndIf 
EndProcedure

InitSprite()
InitKeyboard()
Open_Window_0()
Repeat
  
  Event = WaitWindowEvent()  
  WindowID = EventWindow()  
  GadgetID = EventGadget() 
  EventType = EventType()
    
  If Event = #PB_Event_Gadget
    
    If GadgetID = #TrackBar_0
     Schreibe() 
    ElseIf GadgetID = #ScrollBar_0
     ScrollPicture()
    EndIf
    
  EndIf
  FlipBuffers()
Until Event = #PB_Event_CloseWindow

End
;