It is currently Sat May 18, 2013 7:33 pm

All times are UTC + 1 hour




Post new topic Reply to topic  [ 9 posts ] 
Author Message
 Post subject: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 6:20 am 
Offline
PureBasic Protozoa
PureBasic Protozoa
User avatar

Joined: Fri Apr 25, 2003 3:08 pm
Posts: 3011
I need to flash a series of lights on and off at various timings and not sure how to do it. Do you increment a counter inside a timer? Can you run a reverse (countdown) timer to decay the light?

What I need to do is :

Start off with flashing red light during event.

If even A happens, Flashing red light illuminates solid for 5 seconds.

If event b happens, light flashes For 5 seconds (Interval is .5 seconds on then .5 seconds off)

I need to do this with various leds.

Just got a testbed app ready to play with timings but no idea where to go yet. Still playing of course but suggestions would be greatly appreciated.

Suggestions of "Steal srod's underpants and wash the sheep with them" will be vastly amusing but not helpful!

Code:
;

Enumeration 1
  #Window_flashbox
EndEnumeration

#WindowIndex = #PB_Compiler_EnumerationValue

Enumeration 1
  #Gadget_flashbox_cFlashBox
  #Gadget_flashbox_Area3
  #Gadget_flashbox_cControl
  #Gadget_flashbox_Area5
  #Gadget_flashbox_BlueOff
  #Gadget_flashbox_GreenOff
  #Gadget_flashbox_RedOff
  #Gadget_flashbox_YellowOff
  #Gadget_flashbox_BlackOff
  #Gadget_flashbox_Start
  #Gadget_flashbox_Blink
  #Gadget_flashbox_Stop
EndEnumeration

#GadgetIndex = #PB_Compiler_EnumerationValue

Enumeration 1
  #Image_flashbox_BlueOff
  #Image_flashbox_BlueOn
  #Image_flashbox_GreenOff
  #Image_flashbox_GreenOn
  #Image_flashbox_RedOff
  #Image_flashbox_RedOn
  #Image_flashbox_YellowOff
  #Image_flashbox_YellowOn
  #Image_flashbox_BlackOff
  #Image_flashbox_BlackOn
EndEnumeration

#ImageIndex = #PB_Compiler_EnumerationValue

;

CatchImage(#Image_flashbox_BlueOff,   ?_MGB_flashbox_BlueOff)
CatchImage(#Image_flashbox_BlueOn,    ?_MGB_flashbox_BlueOn)
CatchImage(#Image_flashbox_GreenOff,  ?_MGB_flashbox_GreenOff)
CatchImage(#Image_flashbox_GreenOn,   ?_MGB_flashbox_GreenOn)
CatchImage(#Image_flashbox_RedOff,    ?_MGB_flashbox_RedOff)
CatchImage(#Image_flashbox_RedOn,     ?_MGB_flashbox_RedOn)
CatchImage(#Image_flashbox_YellowOff, ?_MGB_flashbox_YellowOff)
CatchImage(#Image_flashbox_YellowOn,  ?_MGB_flashbox_YellowOn)
CatchImage(#Image_flashbox_BlackOff,  ?_MGB_flashbox_BlackOff)
;CatchImage(#Image_flashbox_BlackOn,   ?_MGB_flashbox_BlackOn)

;

DataSection
  _MGB_flashbox_BlueOff   : IncludeBinary "Images\LedBlueOff 16x16.ico"
  _MGB_flashbox_BlueOn    : IncludeBinary "Images\LedBlueon 16x16.ico"
  _MGB_flashbox_GreenOff  : IncludeBinary "Images\LedGreenOff 16x16.ico"
  _MGB_flashbox_GreenOn   : IncludeBinary "Images\LedGreenOn 16x16.ico"
  _MGB_flashbox_RedOff    : IncludeBinary "Images\LedRedOff 16x16.ico"
  _MGB_flashbox_RedOn     : IncludeBinary "Images\LedRedOn 16x16.ico"
  _MGB_flashbox_YellowOff : IncludeBinary "Images\LedYellowOff 16x16.ico"
  _MGB_flashbox_YellowOn  : IncludeBinary "Images\LedYellowOn 16x16.ico"
  _MGB_flashbox_BlackOff  : IncludeBinary "Images\LedBlack 16x16.ico"
;  _MGB_flashbox_BlackOn   : IncludeBinary "Images\LedBlackOn 16x16.ico"
EndDataSection

;

Procedure.l Window_flashbox()
  If OpenWindow(#Window_flashbox,262,141,165,95,"Flashbox",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
    ContainerGadget(#Gadget_flashbox_cFlashBox,5,5,155,40,#PB_Container_Flat|#PB_Container_BorderLess)
    ImageGadget(#Gadget_flashbox_BlueOff,10,10,16,16,ImageID(#Image_flashbox_BlueOff))
    ImageGadget(#Gadget_flashbox_GreenOff,40,10,16,16,ImageID(#Image_flashbox_GreenOff))
    ImageGadget(#Gadget_flashbox_RedOff,70,10,16,16,ImageID(#Image_flashbox_RedOff))
    ImageGadget(#Gadget_flashbox_YellowOff,100,10,16,16,ImageID(#Image_flashbox_YellowOff))
    ImageGadget(#Gadget_flashbox_BlackOff,130,10,16,16,ImageID(#Image_flashbox_BlackOff))
    CloseGadgetList()
    ContainerGadget(#Gadget_flashbox_cControl,5,50,155,40,#PB_Container_Flat|#PB_Container_BorderLess)
    ButtonGadget(#Gadget_flashbox_Start,10,10,45,20,"Start")
      SetGadgetFont(#Gadget_flashbox_Start,LoadFont(#Gadget_flashbox_Start,"Comic Sans MS",10,0))
    ButtonGadget(#Gadget_flashbox_Blink,55,10,45,20,"Blink")
      SetGadgetFont(#Gadget_flashbox_Blink,LoadFont(#Gadget_flashbox_Blink,"Comic Sans MS",10,0))
    ButtonGadget(#Gadget_flashbox_Stop,100,10,45,20,"Stop")
      SetGadgetFont(#Gadget_flashbox_Stop,LoadFont(#Gadget_flashbox_Stop,"Comic Sans MS",10,0))
    CloseGadgetList()
    HideWindow(#Window_flashbox,0)
    ProcedureReturn WindowID(#Window_flashbox)
  EndIf
EndProcedure

; My constants here

Structure ProgramData
  FlashOn.i
EndStructure

Global Program.ProgramData

; My declarations here

Declare   StartLeds()
Declare   BlinkLeds()
Declare   StopLeds()
Declare   AsyncTimer(ObjectHandle, Message, EventNumber, TimePeriod)

;

Procedure StartLeds()
  ; Check if the program timer needs to turn on ; Windows, event number, resolution, procedure
  SetTimer_(WindowID(#Window_flashbox), 111, 1000, @AsyncTimer())
EndProcedure

Procedure BlinkLeds()
EndProcedure

;

Procedure StopLeds()
  KillTimer_(WindowID(#Window_flashbox), 111)
EndProcedure

; Run an asynchronous clock in the window title bar

Procedure AsyncTimer(ObjectHandle, Message, EventNumber, TimePeriod)
  Select EventNumber
    Case 111
      If Program\FlashOn = 1
        Program\FlashOn = 0
        SetGadgetState(#Gadget_flashbox_BlueOff, ImageID(#Image_flashbox_BlueOff))
      ElseIf Program\FlashOn = 0
        Program\FlashOn = 1
        SetGadgetState(#Gadget_flashbox_BlueOff, ImageID(#Image_flashbox_BlueOn))
      EndIf
  EndSelect
EndProcedure

;

If Window_flashbox()
  quitflashbox = 0
  Program\FlashOn = 0
  Repeat
    EventID  = WaitWindowEvent()
    MenuID   = EventMenu()
    GadgetID = EventGadget()
    WindowID = EventWindow()
    Select EventID
      Case #PB_Event_CloseWindow
        Select WindowID
            Case #Window_flashbox       : quitflashbox = 1
        EndSelect
      Case #PB_Event_Gadget
        Select GadgetID
          Case #Gadget_flashbox_Start   : StartLeds()
          Case #Gadget_flashbox_Blink   : BlinkLeds()
          Case #Gadget_flashbox_Stop    : StopLeds()
        EndSelect
    EndSelect
  Until quitflashbox
  CloseWindow(#Window_flashbox)
EndIf
End

_________________
Resist FaceBorg or have your ass laminated!


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 8:04 am 
Offline
Addict
Addict

Joined: Sun Sep 07, 2008 12:45 pm
Posts: 1440
Location: Germany
Hi,

a quick hack:

save this as LEDGadget.pbi:
Code:
;
; LEDGadget.pbi
;

;EnableExplicit

Enumeration
  #LEDGadget_OnColor
  #LEDGadget_OffColor
  #LEDGadget_BorderColor
  #LEDGadget_BackColor
EndEnumeration


Structure LEDGadgetStructure
  Radius.i
  OnColor.i
  OffColor.i
  BackColor.i
  ActualColor.i
  BorderColor.i
EndStructure



Procedure LEDGadgetDraw(gadgetNo)
  Protected *LEDGadget.LEDGadgetStructure
 
  If IsGadget(gadgetNo)
    *LEDGadget = GetGadgetData(gadgetNo)
    With *LEDGadget
      If StartDrawing(CanvasOutput(gadgetNo))
        Box(0, 0, OutputWidth(), OutputHeight(), \BackColor)
        If \BorderColor <> -1
          Circle(\Radius, \Radius, \Radius, \BorderColor)
          Circle(\Radius, \Radius, \Radius - 2 , \ActualColor)
        Else
          Circle(\Radius, \Radius, \Radius, \ActualColor)
        EndIf
        StopDrawing()
      EndIf
    EndWith
  EndIf

EndProcedure


Procedure LEDGadgetSetState(gadgetNo, State.i)
  Protected *LEDGadget.LEDGadgetStructure
 
  If IsGadget(gadgetNo)
    *LEDGadget = GetGadgetData(gadgetNo)
    With *LEDGadget
      If State
        \ActualColor = \OnColor
      Else
        \ActualColor = \OffColor
      EndIf
    EndWith
    LEDGadgetDraw(gadgetNo)
  EndIf
 
EndProcedure


Procedure LEDGadgetSetAttribute(gadgetNo, attribute, value)
  Protected *LEDGadget.LEDGadgetStructure
 
  If IsGadget(gadgetNo)
    *LEDGadget = GetGadgetData(gadgetNo)
    With *LEDGadget
      Select attribute
        Case #LEDGadget_OnColor : \OnColor = value
        Case #LEDGadget_OffColor : \OffColor = value
        Case #LEDGadget_BorderColor : \BorderColor = value
        Case #LEDGadget_BackColor : \BackColor = value
      EndSelect
    EndWith
    LEDGadgetDraw(gadgetNo)
  EndIf
EndProcedure



Procedure LEDGadget(gadgetNo, x, y, radius = 5, OnColor = $0000FF, OffColor = $7F7F7F, BorderColor = -1, BackColor = $F0F0F0)
  Protected *LEDGadget.LEDGadgetStructure
 
  If gadgetNo = #PB_Any Or IsGadget(gadgetNo) = 0
    gadgetNo = CanvasGadget(#PB_Any, x, y, radius * 2 + 1, radius * 2 + 1)
    If gadgetNo
      *LEDGadget = AllocateMemory(SizeOf(LEDGadgetStructure))
      SetGadgetData(gadgetNo, *LEDGadget)
     
      With *LEDGadget       
        If radius  = - 1
          \Radius = 5
        Else
          \Radius = radius
        EndIf
        If OnColor = - 1
          \OnColor = $0000FF
        Else
          \OnColor = OnColor
        EndIf
        If OffColor = - 1
          \OffColor = $7F7F7F
        Else
          \OffColor = OffColor
        EndIf
        If BorderColor <> 1
          \BorderColor = BorderColor
        EndIf
        If BackColor = - 1
          \BackColor = $F0F0F0
        Else
          \BackColor = BackColor
        EndIf
        \ActualColor = \OffColor
      EndWith
     
      LEDGadgetDraw(gadgetNo)
     
    EndIf
  EndIf
 
  ProcedureReturn gadgetNo
 
EndProcedure
And this as LEDGadgetTest.pb:
Code:
Enumeration
  #LED_Off
  #LED_On
  #LED_Flashing
EndEnumeration

Structure LEDStruc
  GadgetNo.i
  Command.i
  State.i
  DurationTime.i
  DurationCounter.i
  FlashTime.i
  FlashTimeCounter.i
EndStructure

NewList LEDList.LEDStruc()


IncludeFile "LEDGadget.pbi"


OpenWindow(0, 0, 0, 160, 100, "LED Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 20, 10, 10)
AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 70, 10, 10, $00FF00, -1, 0)
AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 120, 10, 10)

ButtonGadget(1, 10, 40, 40, 20, "On")
ButtonGadget(2, 10, 70, 40, 20, "Flash")

ButtonGadget(3, 60, 40, 40, 20, "On")
ButtonGadget(4, 60, 70, 40, 20, "Flash")

ButtonGadget(5, 110, 40, 40, 20, "On")
ButtonGadget(6, 110, 70, 40, 20, "Flash")


AddWindowTimer(0, 1, 100)

Exit = #False
Repeat
 
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1
        ForEach LEDList()
          Select LEDList()\Command
            Case #LED_On
              If LEDList()\DurationTime > 0
                LEDList()\DurationCounter + 1
                If LEDList()\DurationCounter = LEDList()\DurationTime
                  LEDGadgetSetState(LEDList()\GadgetNo, #False)
                  LEDList()\Command = #LED_Off
                  LEDList()\DurationCounter = 0
                  LEDList()\State = #False
                  LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
                EndIf               
              EndIf
            Case #LED_Flashing
              If LEDList()\DurationTime > 0
                LEDList()\DurationCounter + 1
                If LEDList()\DurationCounter = LEDList()\DurationTime
                  LEDList()\Command = #LED_Off
                  LEDList()\DurationCounter = 0
                  LEDList()\FlashTimeCounter = 0
                  LEDList()\State = #False
                EndIf
              EndIf
              If LEDList()\Command = #LED_Flashing
                LEDList()\FlashTimeCounter + 1
                If LEDList()\FlashTimeCounter = LEDList()\FlashTime
                  If LEDList()\State
                    LEDList()\State = #False
                  Else
                    LEDList()\State = #True
                  EndIf
                  LEDList()\FlashTimeCounter = 0
                EndIf
              EndIf
              LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
          EndSelect
        Next
      EndIf
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          SelectElement(LEDList(), 0)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 2
          SelectElement(LEDList(), 0)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDList()\FlashTime = 5
        Case 3
          SelectElement(LEDList(), 1)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 4
          SelectElement(LEDList(), 1)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDList()\FlashTime = 2
        Case 5
          SelectElement(LEDList(), 2)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 100
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 6
          SelectElement(LEDList(), 2)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 100
          LEDList()\State = #True
          LEDList()\FlashTime = 5
      EndSelect
    Case #PB_Event_CloseWindow
      Exit = #True
  EndSelect
 
Until Exit
Have fun,

Bernd


Last edited by infratec on Fri Apr 20, 2012 9:50 am, edited 2 times in total.

Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 9:01 am 
Offline
PureBasic Protozoa
PureBasic Protozoa
User avatar

Joined: Fri Apr 25, 2003 3:08 pm
Posts: 3011
Wow! That's great Bernd. I neevr imagined code like that. Was wondering if I need to create a structure but that's as far as that thought went!!

I am going to have a play and try to adapt the code to led images (that I have in a folder)


P.S I have a folder with your Scan2Image in it I am still playing with:):)

_________________
Resist FaceBorg or have your ass laminated!


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 9:36 am 
Offline
Addict
Addict

Joined: Sun Sep 07, 2008 12:45 pm
Posts: 1440
Location: Germany
Hi, hi,

of course of your question, the PB world has now a LEDGadget() :mrgreen:
I had no LED images, so I created this stuff :D

Btw.: I updated my code above.

Now you can also have a border around the LED and you can change the color at runtime with LEDGadgetSetAttribute()


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 10:00 am 
Offline
PureBasic Protozoa
PureBasic Protozoa
User avatar

Joined: Fri Apr 25, 2003 3:08 pm
Posts: 3011
Quote:
of course of your question, the PB world has now a LEDGadget() :mrgreen:


HAHA, excellent!

Quote:
I had no LED images, so I created this stuff :D


Now I have to figure out how to modify your code to work with real imagegadgets as I have some nice led images to use.

Quote:
Btw.: I updated my code above.


More to study:

Quote:
Now you can also have a border around the LED and you can change the color at runtime with LEDGadgetSetAttribute()


Better and better.

_________________
Resist FaceBorg or have your ass laminated!


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 10:06 am 
Offline
Addict
Addict

Joined: Sun Sep 07, 2008 12:45 pm
Posts: 1440
Location: Germany
Fangbeast wrote:
Now I have to figure out how to modify your code to work with real imagegadgets as I have some nice led images to use.
That's simple:

You have only to replace the lines with:
Code:
LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)

With something like this:
Code:
if LEDList()\State
  SetGadgetState(LEDList()\GadgetNo, ImageID(XYOn)
else
  SetGadgetState(LEDList()\GadgetNo, ImageID(XYOff)
endif
Of course you have to asign the GadgetNo somewhere.

Maybe you should extend the LEDList() structure by fields for the On- and Off-ImageID,
than you can use something like this:
Code:
if LEDList()\State
  SetGadgetState(LEDList()\GadgetNo, LEDList()\OnImageID)
else
  SetGadgetState(LEDList()\GadgetNo, LEDList()\OffImageID)
endif
So you can set individual on-/off-images for each LED.

Bernd


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 10:27 am 
Offline
User
User

Joined: Sat May 14, 2011 10:39 am
Posts: 37
infratec wrote:
Fangbeast wrote:
Maybe you should extend the LEDList() structure by fields for the On- and Off-ImageID,
than you can use something like this:
Code:
if LEDList()\State
  SetGadgetState(LEDList()\GadgetNo, LEDList()\OnImageID)
else
  SetGadgetState(LEDList()\GadgetNo, LEDList()\OffImageID)
endif
So you can set individual on-/off-images for each LED.


Or you extend the LEDList() structure by an Array() for the On- and Off-ImageID,
than you can use something like this:
Code:
  SetGadgetState(LEDList()\GadgetNo, LEDList()\ImageID(LEDList()\State))

It's a bit shorter


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Fri Apr 20, 2012 1:02 pm 
Offline
PureBasic Protozoa
PureBasic Protozoa
User avatar

Joined: Fri Apr 25, 2003 3:08 pm
Posts: 3011
I was playing around after tea and figured something out myself finally and got it working. Now I will work it over to trigger on events rather than buttons but thanks all for the great suggestions and examples!

_________________
Resist FaceBorg or have your ass laminated!


Top
 Profile  
 
 Post subject: Re: Flashing leds at various timings
PostPosted: Sat May 12, 2012 12:07 pm 
Offline
Addict
Addict

Joined: Sun Sep 07, 2008 12:45 pm
Posts: 1440
Location: Germany
Hi,

I extended the 'LEDGadget' to use pre loaded/created images for on/off

Save it as LEDGadget.pbi
Code:
;
; LEDGadget.pbi
;

;EnableExplicit

Enumeration
  #LEDGadget_OnColor
  #LEDGadget_OffColor
  #LEDGadget_BorderColor
  #LEDGadget_BackColor
EndEnumeration


Structure LEDGadgetStructure
  Radius.i
  OnColor.i
  OffColor.i
  BackColor.i
  ActualColor.i
  BorderColor.i
  OnImg.i
  OffImg.i
EndStructure



Procedure LEDGadgetDraw(gadgetNo)
  Protected *LEDGadget.LEDGadgetStructure
 
  If IsGadget(gadgetNo)
    *LEDGadget = GetGadgetData(gadgetNo)
    With *LEDGadget
      If StartDrawing(CanvasOutput(gadgetNo))
        If \OnImg <> -1 And \OffImg <> -1
          If \ActualColor = \OnColor
            DrawImage(ImageID(\OnImg), 0, 0)
          Else
            DrawImage(ImageID(\OffImg), 0, 0)
          EndIf
        Else
          Box(0, 0, OutputWidth(), OutputHeight(), \BackColor)
          If \BorderColor <> -1
            Circle(\Radius, \Radius, \Radius, \BorderColor)
            Circle(\Radius, \Radius, \Radius - 2 , \ActualColor)
          Else
            Circle(\Radius, \Radius, \Radius, \ActualColor)
          EndIf
        EndIf
        StopDrawing()
      EndIf
    EndWith
  EndIf

EndProcedure


Procedure LEDGadgetSetState(gadgetNo, State.i)
  Protected *LEDGadget.LEDGadgetStructure
 
  If IsGadget(gadgetNo)
    *LEDGadget = GetGadgetData(gadgetNo)
    With *LEDGadget
      If State
        \ActualColor = \OnColor
      Else
        \ActualColor = \OffColor
      EndIf
    EndWith
    LEDGadgetDraw(gadgetNo)
  EndIf
 
EndProcedure


Procedure LEDGadgetSetAttribute(gadgetNo, attribute, value)
  Protected *LEDGadget.LEDGadgetStructure
 
  If IsGadget(gadgetNo)
    *LEDGadget = GetGadgetData(gadgetNo)
    With *LEDGadget
      Select attribute
        Case #LEDGadget_OnColor : \OnColor = value
        Case #LEDGadget_OffColor : \OffColor = value
        Case #LEDGadget_BorderColor : \BorderColor = value
        Case #LEDGadget_BackColor : \BackColor = value
      EndSelect
    EndWith
    LEDGadgetDraw(gadgetNo)
  EndIf
EndProcedure



Procedure LEDGadget(gadgetNo, x, y, radius = 5, OnColor = $0000FF, OffColor = $7F7F7F, BorderColor = -1, BackColor = $F0F0F0, OnImg.i = -1, OffImg.i = -1)
  Protected *LEDGadget.LEDGadgetStructure
 
  If gadgetNo = #PB_Any Or IsGadget(gadgetNo) = 0
    If OnImg <> -1 And OffImg <> -1
      gadgetNo = CanvasGadget(#PB_Any, x, y, ImageWidth(OnImg), ImageHeight(OnImg))
    Else
      gadgetNo = CanvasGadget(#PB_Any, x, y, radius * 2 + 1, radius * 2 + 1)
    EndIf
    If gadgetNo
      *LEDGadget = AllocateMemory(SizeOf(LEDGadgetStructure))
      SetGadgetData(gadgetNo, *LEDGadget)
     
      With *LEDGadget       
        If radius  = - 1
          \Radius = 5
        Else
          \Radius = radius
        EndIf
        If OnColor = - 1
          \OnColor = $0000FF
        Else
          \OnColor = OnColor
        EndIf
        If OffColor = - 1
          \OffColor = $7F7F7F
        Else
          \OffColor = OffColor
        EndIf
        If BorderColor <> 1
          \BorderColor = BorderColor
        EndIf
        If BackColor = - 1
          \BackColor = $F0F0F0
        Else
          \BackColor = BackColor
        EndIf
        \ActualColor = \OffColor
       
        \OnImg = OnImg
        \OffImg = OffImg
      EndWith
     
      LEDGadgetDraw(gadgetNo)
     
    EndIf
  EndIf
 
  ProcedureReturn gadgetNo
 
EndProcedure
And this as LEDGadgetTest.pb
Code:
Enumeration
  #LED_Off
  #LED_On
  #LED_Flashing
EndEnumeration

Structure LEDStruc
  GadgetNo.i
  Command.i
  State.i
  DurationTime.i
  DurationCounter.i
  FlashTime.i
  FlashTimeCounter.i
EndStructure

NewList LEDList.LEDStruc()


IncludeFile "LEDGadget.pbi"


OpenWindow(0, 0, 0, 210, 100, "LED Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 20, 10, 10)
AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 70, 10, 10, $00FF00, -1, 0)
AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 120, 10, 10)

CreateImage(0, 16, 16)
StartDrawing(ImageOutput(0))
Box(0, 0, 16, 16, $00FF00)
StopDrawing()

CreateImage(1, 16, 16)
StartDrawing(ImageOutput(1))
Box(0, 0, 16, 16, $FF0000)
StopDrawing()

AddElement(LEDList())
LEDList()\GadgetNo = LEDGadget(#PB_Any, 170, 10, 10, -1, -1, -1, -1, 0, 1)


ButtonGadget(1, 10, 40, 40, 20, "On")
ButtonGadget(2, 10, 70, 40, 20, "Flash")

ButtonGadget(3, 60, 40, 40, 20, "On")
ButtonGadget(4, 60, 70, 40, 20, "Flash")

ButtonGadget(5, 110, 40, 40, 20, "On")
ButtonGadget(6, 110, 70, 40, 20, "Flash")

ButtonGadget(7, 160, 40, 40, 20, "On")
ButtonGadget(8, 160, 70, 40, 20, "Flash")


AddWindowTimer(0, 1, 100)

Exit = #False
Repeat
 
  Event = WaitWindowEvent()
  Select Event
    Case #PB_Event_Timer
      If EventTimer() = 1
        ForEach LEDList()
          Select LEDList()\Command
            Case #LED_On
              If LEDList()\DurationTime > 0
                LEDList()\DurationCounter + 1
                If LEDList()\DurationCounter = LEDList()\DurationTime
                  LEDGadgetSetState(LEDList()\GadgetNo, #False)
                  LEDList()\Command = #LED_Off
                  LEDList()\DurationCounter = 0
                  LEDList()\State = #False
                  LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
                EndIf               
              EndIf
            Case #LED_Flashing
              If LEDList()\DurationTime > 0
                LEDList()\DurationCounter + 1
                If LEDList()\DurationCounter = LEDList()\DurationTime
                  LEDList()\Command = #LED_Off
                  LEDList()\DurationCounter = 0
                  LEDList()\FlashTimeCounter = 0
                  LEDList()\State = #False
                EndIf
              EndIf
              If LEDList()\Command = #LED_Flashing
                LEDList()\FlashTimeCounter + 1
                If LEDList()\FlashTimeCounter = LEDList()\FlashTime
                  If LEDList()\State
                    LEDList()\State = #False
                  Else
                    LEDList()\State = #True
                  EndIf
                  LEDList()\FlashTimeCounter = 0
                EndIf
              EndIf
              LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
          EndSelect
        Next
      EndIf
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1
          SelectElement(LEDList(), 0)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 2
          SelectElement(LEDList(), 0)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDList()\FlashTime = 5
        Case 3
          SelectElement(LEDList(), 1)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 4
          SelectElement(LEDList(), 1)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 50
          LEDList()\State = #True
          LEDList()\FlashTime = 2
        Case 5
          SelectElement(LEDList(), 2)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 100
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 6
          SelectElement(LEDList(), 2)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 100
          LEDList()\State = #True
          LEDList()\FlashTime = 5
        Case 7
          SelectElement(LEDList(), 3)
          LEDList()\Command = #LED_On
          LEDList()\DurationTime = 80
          LEDList()\State = #True
          LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
        Case 8
          SelectElement(LEDList(), 3)
          LEDList()\Command = #LED_Flashing
          LEDList()\DurationTime = 80
          LEDList()\State = #True
          LEDList()\FlashTime = 3
      EndSelect
    Case #PB_Event_CloseWindow
      Exit = #True
  EndSelect
 
Until Exit
Have fun,

Bernd


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 9 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 2 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  

 


Powered by phpBB © 2008 phpBB Group
subSilver+ theme by Canver Software, sponsor Sanal Modifiye