wie einzlene LED im Window darstellen?

Anfängerfragen zum Programmieren mit PureBasic.
geriatroniker
Beiträge: 13
Registriert: 07.06.2011 19:19
Wohnort: Wien
Kontaktdaten:

wie einzlene LED im Window darstellen?

Beitrag von geriatroniker »

Hi

Irgendwie bin ich schon betriebsblind!
Was ist die huebscheste Methode ein paar Leuchtdioden am Schirm graphisch zu simulieren,
sowas wie helle und dunkle Farbe fuer ein/aus?

Helft mir mal bitte auf die Spruenge. Ich will eine meiner Frontplatten als Simulator an einer RS232 der echten Baugruppe nachbauen.

Ich habe mir fest eingeblidet da gabs mal was Fertiges (a la Gadget sogar mit Blinken)
Aber ev. war das eine andere Sprache bzw. Tool? Man wird eben alt!

Danke schon mal im Voraus!
(PB4.51, Linux, x86)
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: wie einzlene LED im Window darstellen?

Beitrag von ts-soft »

http://www.purebasic.fr/english/viewtop ... 383#p88383
etwas älter und evtl. muß da was angepaßt werden, aber sollte helfen.

Ansonsten in der 2D Drawing Lib ist alles was man benötigt. Circle usw.

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
dige
Beiträge: 1239
Registriert: 08.09.2004 08:53

Re: wie einzlene LED im Window darstellen?

Beitrag von dige »

Habs mal eben für PB 4.6 aktualisiert

Code: Alles auswählen

; Code by Localmotion, English forum
; http://www.purebasic.fr/english/viewtopic.php?p=88383#p88383
; Update for PB 4.6 by dige

Structure gauge
  imagegad.l
  ImageID.l
  Width.l
  Height.l
  imagehwnd.l
  precision.l
  ticks.l
EndStructure

Global NewList led.gauge()

ProcedureDLL LEDgadget(number,x,y,Width,Height,display)
  AddElement(led())
  SelectElement(led(),number)
  led()\Width=Width
  led()\Height=Height
  led()\ImageID=CreateImage(#PB_Any,led()\Width,led()\Height)
  StartDrawing(ImageOutput(led()\ImageID))
    Box(0,0,led()\Width,led()\Height,#Black)
    ledheight=led()\Height-20
    boxwidth=(led()\Width-10-1)/2
    secondx= 6+boxwidth
    tickcount=0
    For a=0 To led()\Height-20 Step 4
      tickcount=tickcount+1
      Box(5,a,boxwidth,3,$7F00)
      Box(secondx,a,boxwidth,3,$7F00)
    Next 
    led()\ticks=tickcount
    BackColor(#Black)
    FrontColor(RGB(0, $FF, 0))
    DrawText((led()\Width/2)-10,led()\Height-15, "0%")
  StopDrawing()
  led()\imagegad=ImageGadget(#PB_Any,x,y,Width,Height,ImageID(led()\ImageID),#PB_Image_Border)
  ProcedureReturn led()\imagegad
EndProcedure

ProcedureDLL setLEDstate(led,percent)
  SelectElement(led(),led)
  tickcount=led()\ticks
  perc.f=100/led()\ticks
  percents.f=(percent/100)
  finalpercent.f=percents*tickcount
  stringpercent.s=StrF(finalpercent)
  Result.f = Round(finalpercent, 1)
  finalresult=led()\ticks-Result
  ledheight=led()\Height-20
  boxwidth=(led()\Width-10-1)/2
  secondx=6+boxwidth
  
  StartDrawing(ImageOutput(led()\ImageID))
    tickcount=0
    For a=0 To led()\Height-20 Step 4
      tickcount=tickcount+1
      If tickcount>=finalresult
        Box(5,a,boxwidth,3,$FF00)
        Box(secondx,a,boxwidth,3,$FF00)
      Else
        Box(5,a,boxwidth,3,$7F00)
        Box(secondx,a,boxwidth,3,$7F00)
      EndIf
    Next
    Box(0,led()\Height-15,led()\Width,15,#Black)
    BackColor(#Black)
    FrontColor(RGB(0, $FF, 0))
    DrawText((led()\Width/2)-10,led()\Height-15, Str(percent)+"%")
  StopDrawing()
  SetGadgetState(led()\imagegad, ImageID(led()\ImageID))
EndProcedure

#WindowWidth  = 390
#WindowHeight = 350
If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "LED", #WS_OVERLAPPEDWINDOW)
  led=LEDgadget(0,50,50,75,200,0)
  
  Repeat
    setLEDstate(0,Random(100))
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget
      
      Select EventGadget()
        Case led
          
      EndSelect
      
    EndIf
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf

End 

Code: Alles auswählen

; http://www.purebasic.fr/english/viewtopic.php?p=88383#p88383
; By Localmotion, English forum
; Improved by Tommeh
; Update for PB 4.6 by dige

Structure gauge
  imagegad.l
  ImageID.l
  Width.l
  Height.l
  imagehwnd.l
  precision.l
  ticks.l
  frontcol.l
  backcol.l
  cpercent.l
EndStructure

Global NewList led.gauge()


ProcedureDLL setLEDfcol(led,Col)
  SelectElement(led(),led)
  led()\frontcol = Col
EndProcedure

ProcedureDLL setLEDbcol(led,Col)
  SelectElement(led(),led)
  led()\backcol = Col
EndProcedure


ProcedureDLL LEDgadget(number,x,y,Width,Height,display)
  AddElement(led())
  SelectElement(led(),number)
  led()\Width=Width
  led()\Height=Height
  led()\ImageID=CreateImage(#PB_Any,led()\Width,led()\Height)
  StartDrawing(ImageOutput(led()\ImageID))
    Box(0,0,led()\Width,led()\Height,#Black)
    ledheight=led()\Height-20
    boxwidth=(led()\Width-10-1)/2
    secondx= 6+boxwidth
    tickcount=0
    For a=0 To led()\Height-20 Step 4
      tickcount=tickcount+1
      Box(5,a,boxwidth,3,led()\backcol)
      Box(secondx,a,boxwidth,3,led()\backcol)
    Next
    led()\ticks=tickcount
    
    BackColor(#Black)
    FrontColor(RGB(0, $FF, 0))
    DrawText((led()\Width/2)-10,led()\Height-15, "0%")
  StopDrawing()
  led()\imagegad=ImageGadget(#PB_Any,x,y,Width,Height, ImageID(led()\ImageID),#PB_Image_Border)
  ProcedureReturn led()\imagegad
EndProcedure

ProcedureDLL setLEDstate(led,percent)
  SelectElement(led(),led)
  led()\cpercent = percent
  tickcount=led()\ticks
  perc.f=100/led()\ticks
  percents.f=(percent/100)
  finalpercent.f=percents*tickcount
  stringpercent.s=StrF(finalpercent)
  Result.f = Round(finalpercent, 1)
  finalresult=led()\ticks-Result
  ledheight=led()\Height-20
  boxwidth=(led()\Width-10-1)/2
  secondx=6+boxwidth
  
  StartDrawing(ImageOutput(led()\ImageID))
    tickcount=0
    For a=0 To led()\Height-20 Step 4
      tickcount=tickcount+1
      If tickcount>=finalresult
        Box(5,a,boxwidth,3,led()\frontcol)
        Box(secondx,a,boxwidth,3,led()\frontcol)
      Else
        Box(5,a,boxwidth,3,led()\backcol)
        Box(secondx,a,boxwidth,3,led()\backcol)
      EndIf
    Next
    Box(0,led()\Height-15,led()\Width,15,#Black)
    
    BackColor(#Black)
    FrontColor(RGB(0, $FF, 0))
    DrawText((led()\Width/2)-10,led()\Height-15, Str(percent)+"%")
  StopDrawing()
  SetGadgetState(led()\imagegad, ImageID(led()\ImageID))
EndProcedure

ProcedureDLL getLEDstate(led)
  SelectElement(led(),led)
  ProcedureReturn led()\cpercent
EndProcedure

ProcedureDLL Beep(freq.l, time.l)
  n.f = (freq/1000)*100
  setLEDfcol(0, RGB(n.f*2.5, 250-(n.f*2.5), 0))
  setLEDstate(0, n.f)
  Beep_(freq, time)
EndProcedure

ProcedureDLL StartBeep(times)
  tempo=180
  For t=1 To times
    Beep(284,tempo)
    Beep(568,tempo)
    Beep(426,tempo)
    Beep(379,tempo)
    Beep(758,tempo)
    Beep(426,tempo)
    Beep(716,tempo)
    Beep(426,tempo)
    
    Beep(284,tempo)
    Beep(568,tempo)
    Beep(426,tempo)
    Beep(379,tempo)
    Beep(758,tempo)
    Beep(426,tempo)
    Beep(716,tempo)
    Beep(426,tempo)
    
    Beep(319,tempo)
    Beep(568,tempo)
    Beep(426,tempo)
    Beep(379,tempo)
    Beep(758,tempo)
    Beep(426,tempo)
    Beep(716,tempo)
    Beep(426,tempo)
    
    Beep(319,tempo)
    Beep(568,tempo)
    Beep(426,tempo)
    Beep(379,tempo)
    Beep(758,tempo)
    Beep(426,tempo)
    Beep(716,tempo)
    Beep(426,tempo)
    
    Beep(379,tempo)
    Beep(568,tempo)
    Beep(426,tempo)
  Next t
EndProcedure

#WindowWidth  = 390
#WindowHeight = 350
If OpenWindow(0, 100, 200, #WindowWidth, #WindowHeight, "LED", #WS_OVERLAPPEDWINDOW)
  led=LEDgadget(0,50,50,75,200,0)
  setLEDbcol(0, RGB(45,60,45))
  StartBeep(2)
  
  Repeat
    
    EventID = WaitWindowEvent()
    
    If EventID = #PB_Event_Gadget
      
      Select EventGadget()
        Case led
          
      EndSelect
      
    EndIf
    
  Until EventID = #PB_Event_CloseWindow
  
EndIf

End
"Papa, ich laufe schneller - dann ist es nicht so weit."
Antworten