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
EndProcedureCode: 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 ExitBernd


