Page 1 of 3

Starting a clock collection...

Posted: Wed Mar 18, 2009 6:23 pm
by Michael Vogel
Hi,

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

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()

Posted: Wed Mar 18, 2009 6:34 pm
by Kwai chang caine
One word

SPLENDID !!

When i was young...i had exactly this type of clock.

I love it :D

Thanks for sharing
Good day

Posted: Wed Mar 18, 2009 7:24 pm
by Micko
very nice :D

Posted: Wed Mar 18, 2009 8:32 pm
by infratec
Hi Michael,

with a few additions it also works in Linux:

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
    #Gray=$808080
    #White=$FFFFFF
    #Black=$000000
CompilerEndIf

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      Case #WM_CHAR
         If EventwParam()=27
            ProcedureReturn #True
         EndIf
CompilerEndIf

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
   SetTimer_(WinID,0,1000,0)
CompilerEndIf

Code: Select all

CompilerIf #PB_Compiler_OS = #PB_OS_Windows
      Case #WM_TIMER
         ;If Second(Date())&1=0
            UpdateClock()
         ;EndIf
CompilerEndIf
      EndSelect

CompilerIf #PB_Compiler_OS = #PB_OS_Linux
      NewSecond = Second(Date())
      If NewSecond <> OldSecond
        UpdateClock()
        OldSecond = NewSecond
      EndIf
CompilerEndIf

   Until Later
It looks nice :D

Bernd

P.S.: in general: with my changes it works also in Windows.
So why did you use this special windows stuff?

Posted: Wed Mar 18, 2009 8:59 pm
by Michael Vogel
infratec wrote:So why did you use this special windows stuff?
Hi Bernd,

there are some reasons for that...
• I had just one hour to do the whole stuff (50 minutes, to be exact :wink:)
• I do not know linux very well (thats no excuse, I know)
• I also thought, that the timer uses less CPU power :roll:

There should be a lot of potential for optimizing the image part, which takes quite long on my small netbook...

Michael

Posted: Wed Mar 18, 2009 9:35 pm
by idle
I like it, looks good!

Posted: Wed Mar 18, 2009 9:48 pm
by rsts
Very nice. reminds me of one I used to have too.

cheers

Posted: Wed Mar 18, 2009 10:34 pm
by luis
Really really nice, I will stea... I will incorporate your drawing routines in something of mine sooner or later, thank you!

Posted: Wed Mar 18, 2009 11:15 pm
by Michael Vogel
luis wrote:Really really nice, I will stea... I will incorporate your drawing routines in something of mine sooner or later, thank you!
Va be - forse c'e un posto per un piccolo messaggio col mio nome :lol:

Ciao,
Michael

Posted: Wed Mar 18, 2009 11:55 pm
by SCRJ
Really cool, thanks for sharing :D

Posted: Thu Mar 19, 2009 6:09 am
by Tranquil
Good Work, thanks for posting it!

Posted: Thu Mar 19, 2009 6:29 am
by Fangbeast
We all had clocks like this when we were younger I think. Some of them made a swishing sound as the flat number leaves changed and all our airports, train terminals etc used to use the same system. They were fun to watch.

Love it, good job. I am going to keep it running for nostalgia.

Posted: Thu Mar 19, 2009 12:35 pm
by bembulak
First of all:
thanks for the cool code.
It looks very nice, I love the clock!

Second,
look what time I had today:

Image

:D

Posted: Thu Mar 19, 2009 10:41 pm
by WilliamL
Works on Mac in x86. I messed up the code but the final result runs fine. Maybe somebody else can figure out why the Image(array) doesn't work in line 111/117.

Code: Select all

; see Mac code below with ebs' additions

  
[took out this code to reduce clutter]

Posted: Fri Mar 20, 2009 10:56 am
by Michael Vogel
WilliamL wrote:Works on Mac in x86. I messed up the code but the final result runs fine. Maybe somebody else can figure out why the Image(array) doesn't work in line 111/117.
Hm,
not sure, but perhaps the ResizeImage function does not return the handle of the new image in the Mac version of PB. The help file does not show a return value of this function (I just tried it and hoped it works like all other bitmap functions)...

Michael