import
os
import
time
import
pygame
import
MySQLdb as mdb
import
signal
import
sys
imglocation
=
"/var/www/weewx/Bootstrap"
class
pyscreen :
screen
=
None
;
def
__init__(
self
):
"Initializes a new pygame screen using the framebuffer"
disp_no
=
os.getenv(
"DISPLAY"
)
if
disp_no:
print
"I'm running under X display = {0}"
.
format
(disp_no)
drivers
=
[
'fbcon'
,
'directfb'
,
'svgalib'
]
found
=
False
for
driver
in
drivers:
if
not
os.getenv(
'SDL_VIDEODRIVER'
):
os.putenv(
'SDL_VIDEODRIVER'
, driver)
try
:
pygame.display.init()
except
pygame.error:
print
'Driver: {0} failed.'
.
format
(driver)
continue
found
=
True
break
if
not
found:
raise
Exception(
'No suitable video driver found!'
)
size
=
(pygame.display.Info().current_w, pygame.display.Info().current_h)
print
"Framebuffer size: %d x %d"
%
(size[
0
], size[
1
])
self
.screen
=
pygame.display.set_mode(size, pygame.FULLSCREEN)
pygame.mouse.set_visible(
False
)
self
.screen.fill((
0
,
0
,
0
))
pygame.font.init()
pygame.display.update()
def
__del__(
self
):
"Destructor to make sure pygame shuts down, etc."
def
size(
self
):
size
=
(pygame.display.Info().current_w, pygame.display.Info().current_h)
return
size
def
fill(
self
, colour):
if
self
.screen.get_at((
0
,
0
)) !
=
colour:
self
.screen.fill((
0
,
0
,
0
))
self
.screen.fill(colour)
pygame.display.update()
def
image(
self
, img, locX, locY, sizX, sizY):
try
:
if
((
"week"
not
in
img)
and
(os.stat(img).st_mtime > time.time()
-
600
)):
image
=
pygame.image.load(img)
image
=
pygame.transform.scale(image, (sizX, sizY))
self
.screen.blit(image, (locX, locY))
elif
((
"week"
in
img)
and
(os.stat(img).st_mtime > time.time()
-
7200
)):
image
=
pygame.image.load(img)
image
=
pygame.transform.scale(image, (sizX, sizY))
self
.screen.blit(image, (locX, locY))
else
:
pygame.draw.rect(
self
.screen, (
255
,
0
,
0
), (locX, locY, sizX, sizY),
0
)
except
pygame.error, message:
pygame.draw.rect(
self
.screen, (
255
,
0
,
0
), (locX, locY, sizX, sizY),
0
)
pygame.display.update()
def
text_object(
self
, msg, font):
black
=
(
0
,
0
,
0
)
textSurface
=
font.render(msg,
True
, black)
return
textSurface, textSurface.get_rect()
def
error(
self
, msg):
largeText
=
pygame.font.Font(
'freesansbold.ttf'
,
115
)
TextSurf, TextRect
=
screeny.text_object(msg, largeText)
size
=
screeny.size
TextRect.center
=
((pygame.display.Info().current_w
/
2
),(pygame.display.Info().current_h
/
2
))
self
.screen.blit(TextSurf, TextRect)
pygame.display.update()
class
fileman:
global
imglocation
def
__init__(
self
):
"Init for fileman. Nothing to do atm."
def
__del__(
self
):
"Destructor for fileman. Nothing to do again."
def
total_files(
self
):
count
=
0
for
file
in
os.listdir(imglocation):
if
file
.endswith(
".png"
):
count
=
count
+
1
return
count
class
sqly:
def
__init__(
self
):
"do nothing"
def
test(
self
):
try
:
con
=
mdb.connect(
'localhost'
,
'weewx'
,
'weewx'
,
'weather'
)
cur
=
con.cursor()
cur.execute(
"SELECT VERSION()"
)
ver
=
cur.fetchone()
return
0
except
mdb.Error, e:
return
1
finally
:
"do nothing"
def
restart(
self
):
time.sleep(
30
)
if
not
mysql_con.test():
try
:
os.system(
"service mysql start"
)
except
:
"do nothing"
def
sigterm_handler(_signo, _stack_frame):
"When sysvinit send the TERM signal, cleanup before exiting"
print
(
"["
+
get_now()
+
"] received signal {}, exiting..."
.
format
(_signo))
sys.exit(
0
)
signal.signal(signal.SIGTERM, sigterm_handler)
def
reboot():
"check if we've been reboot in the last 30 mins"
uptimef
=
open
(
"/proc/uptime"
,
"r"
)
uptimestr
=
uptimef.read()
uptimelst
=
uptimestr.split()
uptimef.close()
if
float
(uptimelst[
0
]) <
1800
:
"We've reboot in the last 30 mins, ignoring"
else
:
try
:
os.system(
"reboot"
)
except
:
"do nothing"
if
__name__
=
=
"__main__"
:
try
:
screeny
=
pyscreen()
filey
=
fileman()
screeny.fill((
0
,
0
,
255
))
size
=
screeny.size()
border
=
7
sizewquarter
=
((size[
0
]
-
(border
*
5
))
/
4
)
sizehthird
=
((size[
1
]
-
(border
*
4
))
/
3
)
print
(
"Total files : %d"
%
(filey.total_files()))
while
1
:
mysql_con
=
sqly()
if
mysql_con.test():
screeny.fill((
250
,
0
,
0
))
screeny.error(
"Database Offline. Restarting!"
)
mysql_con.restart()
elif
(os.stat(
"/var/www/weewx/Bootstrap/index.html"
).st_mtime < time.time()
-
600
):
screeny.fill((
254
,
0
,
0
))
screeny.error(
"NOT Updating. Reboot Imminent!"
)
reboot()
else
:
screeny.fill((
0
,
0
,
255
))
screeny.image(
"/var/www/weewx/Bootstrap/barometerGauge.png"
, (border
*
1
), (border
*
1
), sizewquarter, sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/outTempGauge.png"
, ((border
*
2
)
+
(sizewquarter
*
1
)), (border
*
1
), sizewquarter, sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/windDirGauge.png"
, ((border
*
3
)
+
(sizewquarter
*
2
)), (border
*
1
), sizewquarter, sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/windSpeedGauge.png"
, ((border
*
4
)
+
(sizewquarter
*
3
)), (border
*
1
), sizewquarter, sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/big_images/weekbarometer-Bootstrap.png"
, (border
*
1
), ((border
*
2
)
+
(sizehthird
*
1
)), ((sizewquarter
*
2
)
+
(border
*
1
)), sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/big_images/weektempchill-Bootstrap.png"
, (border
*
1
), ((border
*
3
)
+
(sizehthird
*
2
)), ((sizewquarter
*
2
)
+
(border
*
1
)), sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/big_images/weekwinddir-Bootstrap.png"
, ((border
*
3
)
+
(sizewquarter
*
2
)), ((border
*
2
)
+
(sizehthird
*
1
)), ((sizewquarter
*
2
)
+
(border
*
1
)), sizehthird)
screeny.image(
"/var/www/weewx/Bootstrap/big_images/weekwind-Bootstrap.png"
, ((border
*
3
)
+
(sizewquarter
*
2
)), ((border
*
3
)
+
(sizehthird
*
2
)), ((sizewquarter
*
2
)
+
(border
*
1
)), sizehthird)
time.sleep(
1
)
except
KeyboardInterrupt:
"We've got an interupt"