Page 1 of 1

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 8:04 am
by infratec
Hi,

a quick hack:

save this as LEDGadget.pbi:

Code: Select all

;
; 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: Select all

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

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 9:01 am
by Fangbeast
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:):)

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 9:36 am
by infratec
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()

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 10:00 am
by Fangbeast
of course of your question, the PB world has now a LEDGadget() :mrgreen:
HAHA, excellent!
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.
Btw.: I updated my code above.
More to study:
Now you can also have a border around the LED and you can change the color at runtime with LEDGadgetSetAttribute()
Better and better.

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 10:06 am
by infratec
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: Select all

LEDGadgetSetState(LEDList()\GadgetNo, LEDList()\State)
With something like this:

Code: Select all

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: Select all

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

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 10:27 am
by Sirius-2337
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: Select all

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: Select all

  SetGadgetState(LEDList()\GadgetNo, LEDList()\ImageID(LEDList()\State))
It's a bit shorter

Re: Flashing leds at various timings

Posted: Fri Apr 20, 2012 1:02 pm
by Fangbeast
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!

Re: Flashing leds at various timings

Posted: Sat May 12, 2012 12:07 pm
by infratec
Hi,

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

Save it as LEDGadget.pbi

Code: Select all

;
; 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: Select all

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