# Shoes Thermometer by Jonas Elfström 2008-07-19
# heavily based on Shoes Clock by Thomas Bell
#
# Gets the temperature from my webserver every fifth minute
# and presents it as a classic round thermometer.
#
require 'net/http'
Shoes.app :height => 290,
:width => 270 do
@radius, @centerx, @centery = 90, 136,
155
@host = 'kafka.mine.nu'
@path = '/t/ute.txt'
@unit = 'C'
@location = ' in Kumla at '
click do
draw_thermometer
end
every(300) do
draw_thermometer
end
def get_temperature
# A quite ugly way to get and convert the temperature to 1
decimal place
return ((Net::HTTP.get(@host, @path).to_f*10).round).to_f/10
end
def draw_thermometer
ftemp=get_temperature
clear do
draw_background
stack do
background black
para span(ftemp.to_s +
@unit + @location + Time.now.strftime("%Y-%m-%d
%H:%M"), :stroke
=> "#fed"),
:margin => 4
end
thermometer_indicator ftemp,2
end
end
def draw_background
background rgb(230, 240, 200)
fill white
stroke black
strokewidth 4
oval @centerx - 102, @centery - 102,
204, 204
fill black
nostroke
oval @centerx - 5, @centery -
5, 10, 10
stroke black
strokewidth 1
line(@centerx, @centery - 102,
@centerx, @centery - 95)
line(@centerx - 102, @centery,
@centerx - 95, @centery)
line(@centerx + 95, @centery,
@centerx + 102, @centery)
line(@centerx, @centery + 95,
@centerx, @centery + 102)
# Write the Celsius numbers in the circle/oval
unit=50
radius_local
=
85
(-40..40).step(5)
do
|temperature|
_x
=
radius_local
*
Math.sin(
temperature
*
Math::PI
/
unit
)
_y
=
radius_local
*
Math.cos(
temperature
*
Math::PI
/
unit
)
if
_x<0
_x=_x-15
else
if
_x>0
_x=_x-12
else
_x=_x-8
end
end
_x=_x+4
if
temperature==5
para
temperature.to_s,
:left=>@centerx+_x,
:top=>@centery-_y-13
end
end
def
thermometer_indicator(temperature,
sw,
unit=50,
color=red)
radius_local
=
unit
==
50
?
@radius
:
@radius
-
25
_x
=
radius_local
*
Math.sin(
temperature
*
Math::PI
/
unit
)
_y
=
radius_local
*
Math.cos(
temperature
*
Math::PI
/
unit
)
stroke
color
strokewidth
sw
line(@centerx,
@centery,
@centerx
+
_x,
@centery
-
_y)
end
#
Present the
thermometer at
application
start
draw_thermometer
end