Microsoft Small Basic

Program Listing: SGP929
' AnalogClock01.smallbasic - Analog Clock v0.1 (C) 2011 Nonki Takahashi

' History:
' v0.1 2011/04/26 Created from Earth Clock v0.2 PPH681-0 (243 lines)

' Main
rLocal = 9 ' local time for Japan
sVersion = "v0.1"
GraphicsWindow.Title = "Analog Clock " + sVersion
Clock_Init()
Digital_Init()
Alarm_Init()
Analog_Init()
Analog_DrawHourNumerals()
While "True"
If bTick Then
Digital_ShowTime()
Digital_ShowDate()
Analog_Rotate()
Alarm_Ring()
bTick = "False"
Else
Program.Delay(500)
EndIf
EndWhile

' Alarm | Initialization
Sub Alarm_Init
iAX = 18 ' character size for alarm
iAY = 26
iAL0 = 11 ' alarm y position in line
GraphicsWindow.FontSize = iAY
GraphicsWindow.BrushColor = sFGColor
GraphicsWindow.BackgroundColor = sBGColor
GraphicsWindow.DrawText(iAX * 3, iAY * iAL0, "ALARM:")
GraphicsWindow.DrawText(iAX * 21, iAY * iAL0, ":")
GraphicsWindow.BrushColor = "Black"
oHour = Controls.AddTextBox(iAX * 11, iAY * iAL0)
oMin = Controls.AddTextBox(iAX * 23, iAY * iAL0)
GraphicsWindow.Height = iAY * (iAL0 + 2.5)
EndSub

' Alarm | Ring
Sub Alarm_Ring
iAHour = Controls.GetTextBoxText(oHour)
iAMin = Controls.GetTextBoxText(oMin)
If (iHour = iAHour) And (iMin = iAMin) Then
Sound.PlayChimesAndWait()
EndIf
EndSub

' Analog | Draw hour numerals
Sub Analog_DrawHourNumerals
GraphicsWindow.BrushColor = sFGColor
GraphicsWindow.FontSize = iHY
For iHour = 1 To 12
If iHour > 9 Then
idX = - iHX
Else
idX = - iHX / 2
EndIf
iX = iXC + Math.Round(iR * 0.8 * Math.Sin(iHour * 2 * 3.14159 / 12) + idX)
iY = iYC - Math.Round(iR * 0.8 * Math.Cos(iHour * 2 * 3.14159 / 12) + iHY / 2)
GraphicsWindow.DrawText(iX, iY, iHour)
EndFor
EndSub

' Analog | Initialization
Sub Analog_Init
' time table initialization
sCity[0] = "GMT" ' Greenwich Mean Time
rDelta[0] = 0
sCity[1] = "Paris"
rDelta[1] = 1
sCity[2] = "Cairo"
rDelta[2] = 2
sCity[3] = "Moscow"
rDelta[3] = 3
sCity[4] = "Dubai"
rDelta[4] = 4
sCity[5] = "Karachi"
rDelta[5] = 5
sCity[6] = "Dhaka"
rDelta[6] = 6
sCity[7] = "Bangkok"
rDelta[7] = 7
sCity[8] = "Hong Kong"
rDelta[8] = 8
sCity[9] = "Tokyo"
rDelta[9] = 9
sCity[10] = "Sydney"
rDelta[10] = 10
sCity[11] = "Noumea"
rDelta[11] = 11
sCity[12] = "Wellington"
rDelta[12] = 12
sCity[13] = "Midway Island"
rDelta[13] = -11
sCity[14] = "Honolulu"
rDelta[14] = -10
sCity[16] = "Los Angeles"
rDelta[16] = -8
sCity[17] = "Denver"
rDelta[17] = -7
sCity[18] = "Chicago"
rDelta[18] = -6
sCity[19] = "New York"
rDelta[19] = -5
sCity[20] = "Caracas"
rDelta[20] = -4
sCity[21] = "Rio de Janeiro"
rDelta[21] = -3
sCity[23] = "Azores"
rDelta[23] = -1
iCities = 24
' show city
iCity = 9
GraphicsWindow.BrushColor = sFGColor
If rDelta[iCity] > 0 Then
sSign = "+"
Else
sSign = ""
EndIf
GraphicsWindow.DrawText(iAX * 3 + iTX0, iAY * 7, sCity[iCity] + " (" + sSign + rDelta[iCity] + ")")
' show clock face
iR = 100 ' radius for analog clock face
iXC = 50 + iR ' center of analog clock
iYC = 40 + iR
GraphicsWindow.BrushColor = sClockColor
GraphicsWindow.FillEllipse(iXC - iR * 1.2, iYC - iR * 1.2, iR * 2.4, iR * 2.4)
GraphicsWindow.BrushColor = sDialColor
GraphicsWindow.FillEllipse(iXC - iR, iYC - iR, iR * 2, iR * 2)
' add hour hand as shape
iX1 = Math.Round(iR / 2 / Math.SquareRoot(2))
iY1 = Math.Round(iR / 2 / Math.SquareRoot(2)) - 10
iX2 = Math.Round(iR / 2 / Math.SquareRoot(2)) - 10
iY2 = Math.Round(iR / 2 / Math.SquareRoot(2))
iX3 = Math.Round(iR / Math.SquareRoot(2))
iY3 = Math.Round(iR / Math.SquareRoot(2))
GraphicsWindow.PenColor = sFGColor
GraphicsWindow.BrushColor = sFGColor
oHour = Shapes.AddTriangle(iX1, iY1, iX2, iY2, iX3, iY3)
Shapes.SetOpacity(oHour, 50)
Shapes.Move(oHour, iXC - iX1, iYC - iY2)
' add minute hand as shape
iX1 = Math.Round(iR / Math.SquareRoot(2))
iY1 = Math.Round(iR / Math.SquareRoot(2)) - 10
iX2 = Math.Round(iR / Math.SquareRoot(2)) - 10
iY2 = Math.Round(iR / Math.SquareRoot(2))
iX3 = Math.Round(iR * 2 / Math.SquareRoot(2))
iY3 = Math.Round(iR * 2 / Math.SquareRoot(2))
GraphicsWindow.PenColor = sFGColor
GraphicsWindow.BrushColor = sFGColor
oMinute = Shapes.AddTriangle(iX1, iY1, iX2, iY2, iX3, iY3)
Shapes.SetOpacity(oMinute, 50)
Shapes.Move(oMinute, iXC - iX1, iYC - iY2)
EndSub

' Analog | Rotate
Sub Analog_Rotate
rDegree = (((iHour - 4.5) * 60 + iMin) * 60 + iSec) * 720 / iDaySec
Shapes.Rotate(oHour, rDegree)
rDegree = ((iMin - 22.5) * 60 + iSec) * 360 / iHourSec
Shapes.Rotate(oMinute, rDegree)
EndSub

' Clock | Initialization
Sub Clock_Init
sBGColor = "Tan" ' background color
sFGColor = "Black" ' foreground color
sClockColor = "SaddleBrown" ' clock color
sDialColor = "White" ' dial plate color
Timer.Interval = 1000
Timer.Tick = Clock_OnTick
bTick = "False"
iDaySec = 24 * 60 * 60
iHourSec = 60 * 60
EndSub

' Clock | Event processing on tick
Sub Clock_OnTick
iHour = Clock.Hour
iMin = Clock.Minute
iSec = Clock.Second
iYear = Clock.Year
iMonth = Clock.Month
iDay = Clock.Day
bTick = "True"
EndSub

' Digital | Initialization
Sub Digital_Init
uFolder = "http://homepage2.nifty.com/nobukit/smallbasic.files/"
iTX = 6 * 6 ' character size for time
iTY = 10 * 6
iTX0 = 260
iHX = 18 ' character size for hour numerals
iHY = 26
EndSub

' Digital | Show date
Sub Digital_ShowDate
sDate = iYear + "/"
If iMonth < 10 Then
sDate = sDate + "0" + iMonth + "/"
Else
sDate = sDate + iMonth + "/"
EndIf
If iDay < 10 Then
sDate = sDate + "0" + iDay
Else
sDate = sDate + iDay
EndIf
GraphicsWindow.FontSize = iAY
GraphicsWindow.BrushColor = sBGColor
GraphicsWindow.FillRectangle(iAX * 3 + iTX0, iAY * 5, iAX * 10, iAY * 1.1)
GraphicsWindow.BrushColor = sFGColor
GraphicsWindow.DrawText(iAX * 3 + iTX0, iAY * 5 - 3, sDate)
EndSub

' Digital | Show time
Sub Digital_ShowTime
If iHour < 10 Then
sTime = Text.Append("0", iHour) + ":"
Else
sTime = iHour + ":"
EndIf
If iMin < 10 Then
sTime = sTime + "0" + iMin + ":"
Else
sTime = sTime + iMin + ":"
EndIf
If iSec < 10 Then
sTime = sTime + "0" + iSec
Else
sTime = sTime + iSec
EndIf
GraphicsWindow.FontSize = iTY
GraphicsWindow.BrushColor = sBGColor
GraphicsWindow.FillRectangle(iTX * 1.4 + iTX0, iTY, iTX * 8, iTY * 1.1)
GraphicsWindow.BrushColor = sFGColor
GraphicsWindow.DrawText(iTX * 1.4 + iTX0, iTY - 3, sTime)
EndSub