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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

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

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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 !
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Benutzeravatar
legion
Beiträge: 467
Registriert: 08.10.2006 18:04
Computerausstattung: Intel Core i5-6500 @ 4x 3.6GHz mit Windows 10 Pro, Intel Core-i7 mit Ubuntu 18.04 bionic, x86_64 Linux 4.18.0-16-generic, Microsoft Surface Pro - Windows 10 Pro
Wohnort: Wien
Kontaktdaten:

Beitrag 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
;
PB 5.71 LTS Windows 10 Pro & Ubuntu 18.04.2 LTS & Linux Mint 19.3
-----------------------------------------------------
Alles ist, wie man glaubt, dass es ist!
Antworten