-
Notifications
You must be signed in to change notification settings - Fork 0
/
interactable_demo2.py
132 lines (110 loc) · 3.22 KB
/
interactable_demo2.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python
import Adafruit_CharLCD as LCD
import os
import socket
import time
import fcntl
import struct
import psutil
import json
import urllib2
from subprocess import PIPE, Popen
from threading import Thread, Event
#Generate IP Check
def get_ip(interface):
temp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(temp.fileno(), 0x8915, struct.pack('256s', interface[:15]))[20:24])
#Generate Temperature Check
def get_temp():
process = Popen(['vcgencmd', 'measure_temp'], stdout=PIPE)
output, _error = process.communicate()
return float(output[output.index('=') + 1:output.rindex("'")])
#Generate data set from piHole API
def get_piHole(address):
global data
url = "http://" + address + "/admin/api.php"
data = json.load(urllib2.urlopen(url))
#Update And Print Values to LCD
def update():
lcd.clear()
#Gather system information
CPU_temp = get_temp()
CPU_usage = psutil.cpu_percent()
hostname = socket.gethostname()
ip = get_ip('eth0')
get_piHole(ip)
#Display different screen based on variable 'i' value
if i == 0:
lcd.message("Temp : {:.1f}C".format(CPU_temp))
lcd.message("\nUsage : {:.1f}%".format(CPU_usage))
elif i == 1:
lcd.message(hostname)
lcd.message("\n" + ip)
elif i == 2:
lcd.message("Blocked : {}".format(data['ads_blocked_today']))
lcd.message("\nPercent : {}%".format(data['ads_percentage_today']))
elif i == 3:
lcd.message("Queries : {}".format(data['dns_queries_today']))
lcd.message("\nDomains : {}".format(data['domains_being_blocked']))
#Threading function. Repeats indefinitely. Runs as a daemon thread; will quit with keyboard interrupt
def repeater(interval, func, *args):
stopped = Event()
def loop():
while not stopped.wait(interval):
func(*args)
t = Thread(target=loop)
t.daemon = True
t.start()
return stopped.set
#Main Function; Loops Until Given A Keyboard Interrupt
def main_loop():
try:
#Define global variables for state changes
global i, j
i = 0
j = 0
#For some reason the backlight defaults to on, this turns it off before the loop initiates
lcd.set_color(0.0, 0.0, 0.0)
#Creates background thread for screen updates. This runs independently of the main loop
repeater(5, update)
while True:
#Backgorund toggle
if lcd.is_pressed(LCD.SELECT):
time.sleep(0.5)
if j == 0:
lcd.set_color(1.0, 0.0, 0.0)
j = 1
elif j == 1:
lcd.set_color(0.0, 0.0, 0.0)
j = 0
#Buttons incriment the variable in charge of current screen display
if lcd.is_pressed(LCD.LEFT):
time.sleep(0.5)
if i == 0:
i = 3
else:
i-=1
elif lcd.is_pressed(LCD.RIGHT):
time.sleep(0.5)
if i == 3:
i = 0
else:
i+=1
#Screen clear in case display corrupts.
elif lcd.is_pressed(LCD.DOWN):
lcd.clear()
#Reboot device
elif lcd.is_pressed(LCD.UP):
lcd.clear()
lcd.message("ShutDown Engaged\nRestarting in 1s")
os.system('sudo shutdown -r now')
#Quits loop and exits program
except KeyboardInterrupt:
lcd.clear()
lcd.set_color(0.0, 0.0, 0.0)
print("\nDone")
#Sets Global Vairable 'lcd'
#This is called everytime the screen is interacted with
lcd = LCD.Adafruit_CharLCDPlate()
if __name__ == "__main__":
main_loop()