just had one hour free time today, so I coded a simple clock (not sure if this should stay here in this thread

Michael
Code: Select all
; Define
#Phases=10
#Halftime=#Phases>>1
#Delay=60
#BorderColor=#Gray
Enumeration
#Never
;
#Hours=0
#Minutes
#Seconds
#OldValue
#NewValue
#Drawboard
#Plate
;
#WinID
#Numbers
;
#Now
#Undefined=-1
EndEnumeration
Global WinID
Global WX=590
Global WY=200
Global GX=190
Global GY=190
Global G_X=GX-1
Global G_Y=GY-1
Global G_M=G_Y>>1
Global OX=5
Global OY=5
Global OZ=5
Global Later=#Never
Global HourLast=#Undefined
Global MinuteLast=#Undefined
Global SecondLast=#Undefined
Global Font
Global Dim Image(#Plate)
Global Text.s
Global Dim Size(#Phases)
; EndDefine
Procedure.l Greyscale(n,x)
n=x-n
n<<6
n/x
ProcedureReturn n*$10101
EndProcedure
Procedure.l QuickEvent(n)
n+ElapsedMilliseconds()
While n>ElapsedMilliseconds()
Select WaitWindowEvent(10)
Case #PB_Event_CloseWindow
ProcedureReturn #True
Case #WM_CHAR
If EventwParam()=27
ProcedureReturn #True
EndIf
EndSelect
Wend
ProcedureReturn #False
EndProcedure
Procedure Plate(index,old,new,phase)
Image(#NewValue)=CopyImage(#Plate,#NewValue)
StartDrawing(ImageOutput(#NewValue))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(Font)
Text=RSet(Str(new),2,"0")
DrawText((GX-TextWidth(Text))>>1,(GY-TextHeight(Text))>>1,Text,#White)
StopDrawing()
Image(#OldValue)=CopyImage(#Plate,#OldValue)
StartDrawing(ImageOutput(#OldValue))
DrawingMode(#PB_2DDrawing_Transparent)
DrawingFont(Font)
Text=RSet(Str(old),2,"0")
DrawText((GX-TextWidth(Text))>>1,(GY-TextHeight(Text))>>1,Text,#White)
StopDrawing()
StartDrawing(ImageOutput(index))
If phase<>#Phases
Image(#Drawboard)=GrabImage(#NewValue,#Drawboard,0,0,GX,G_M)
DrawImage(Image(#Drawboard),0,0)
Image(#Drawboard)=GrabImage(#OldValue,#Drawboard,0,G_M,GX,G_M)
DrawImage(Image(#Drawboard),0,G_M)
If phase<#Halftime
Image(#Drawboard)=GrabImage(#OldValue,#Drawboard,0,0,GX,G_M)
Image(#Drawboard)=ResizeImage(#Drawboard,GX,Size(phase))
DrawImage(Image(#Drawboard),0,G_M-Size(phase))
LineXY(0,G_M-Size(phase),GX,G_M-Size(phase),#BorderColor)
ElseIf phase>#Halftime
Image(#Drawboard)=GrabImage(#NewValue,#Drawboard,0,G_M,GX,G_M)
Image(#Drawboard)=ResizeImage(#Drawboard,GX,Size(phase))
DrawImage(Image(#Drawboard),0,G_M)
LineXY(0,G_M+Size(phase),GX,G_M+Size(phase),#BorderColor)
EndIf
Else
Image(index)=CopyImage(#NewValue,index)
EndIf
StopDrawing()
EndProcedure
Procedure Flip(Hour,Minute,Second)
Protected n
For n=1 To #Phases
If Hour<>#Undefined
Plate(#Hours,HourLast,Hour,n)
SetGadgetState(#Hours,Image(#Hours))
EndIf
If Minute<>#Undefined
Plate(#Minutes,MinuteLast,Minute,n)
SetGadgetState(#Minutes,Image(#Minutes))
EndIf
If Second<>#Undefined
Plate(#Seconds,SecondLast,Second,n)
SetGadgetState(#Seconds,Image(#Seconds))
EndIf
If QuickEvent(#Delay)
Later=#Now
Break
EndIf
Next n
If Hour<>#Undefined
HourLast=Hour
EndIf
If Minute<>#Undefined
MinuteLast=Minute
EndIf
If Second<>#Undefined
SecondLast=Second
EndIf
EndProcedure
Procedure UpdateClock()
Protected HourNow,MinuteNow,SecondNow
Protected Clock=Date()
HourNow=Hour(Clock)
MinuteNow=Minute(Clock)
SecondNow=Second(Clock)
If HourLast=HourNow
HourNow=#Undefined
EndIf
If MinuteLast=MinuteNow
MinuteNow=#Undefined
EndIf
If SecondLast=SecondNow
SecondNow=#Undefined
EndIf
Flip(HourNow,MinuteNow,SecondNow)
EndProcedure
Procedure Init()
Protected i
WinID=OpenWindow(#WinID,0,0,WX,WY,"Flip Flop",#PB_Window_Invisible|#PB_Window_ScreenCentered|#PB_Window_SystemMenu)
SetWindowColor(#WinID,$200000)
For i=#Hours To #Seconds
ImageGadget(i,OX+(GX+OZ)*i,OY,GX,GY,0)
Next i
For i=#Hours To #Plate
Image(i)=CreateImage(i,GX,GY)
Next i
Font=LoadFont(#Numbers,"MS Trebuchet",GY*0.65,#PB_Font_Bold)
StartDrawing(ImageOutput(#Plate))
Box(0,0,G_X,G_Y,#Black)
For i=0 To G_M/3
c=GreyScale(i,G_M/3)
LineXY(0,i,G_X,i,c)
LineXY(0,i+G_M,G_X,i+G_M,c)
Next i
StopDrawing()
For i=1 To #Phases
Size(i)=Abs(Cos(i*#PI/#Phases)*G_M)
Next i
UpdateClock()
SetTimer_(WinID,0,1000,0)
HideWindow(#WinID,0)
EndProcedure
Procedure Main()
Init()
Repeat
Select WaitWindowEvent(100)
Case #PB_Event_CloseWindow
Later=#Now
Case #WM_TIMER
;If Second(Date())&1=0
UpdateClock()
;EndIf
EndSelect
Until Later
EndProcedure
Main()