#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GObject
from gi.repository import Gdk
from gi.repository import GLib
from gi.repository import GdkPixbuf
import cairo
import random
import math
import os
from time import sleep, time
# time between each sensor mesearuement (1s)
TIME_UPATE = 2000
class Sensors():
def __init__(self):
''' '''
self.sensor_dictionnary = {}
def found_iio_device_with_name(self, data, name):
prefix = "/sys/bus/iio/devices/"
of_name = 'OF_NAME=' + name
try:
for filefolder in os.listdir(prefix):
with open(prefix + '/' + filefolder + '/uevent') as f:
for line in f:
if line.split('\n')[0] == of_name:
''' return directory which contains "data" '''
if os.path.exists(prefix + '/' + filefolder + '/' + data):
return (prefix + '/' + filefolder + '/')
except OSError:
pass
except Exception as exc:
pass
return None
def found_all_sensor_path(self):
self.sensor_dictionnary['temperature'] = self.found_iio_device_with_name("in_temp_raw", "hts221")
self.sensor_dictionnary['humidity'] = self.found_iio_device_with_name("in_humidityrelative_raw", "hts221")
self.sensor_dictionnary['accelerometer'] = self.found_iio_device_with_name("in_accel_x_raw", "lsm6dsl")
self.sensor_dictionnary['gyroscope'] = self.found_iio_device_with_name("in_anglvel_x_raw", "lsm6dsl")
print("[DEBUG] temperature -> ", self.sensor_dictionnary['temperature'], "<")
print("[DEBUG] humidity -> ", self.sensor_dictionnary['humidity'], "<")
print("[DEBUG] accelerometer -> ", self.sensor_dictionnary['accelerometer'], "<")
print("[DEBUG] gyroscope -> ", self.sensor_dictionnary['gyroscope'], "<")
def temperature_read(self):
prefix_path = self.sensor_dictionnary['temperature']
try:
with open(prefix_path + "in_temp_" + 'raw', 'r') as f:
raw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_temp_" + 'raw', exc)
raw = 0.0
try:
with open(prefix_path + "in_temp_" + 'scale', 'r') as f:
scale = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_temp_" + 'scale', exc)
scale = 0.0
try:
with open(prefix_path + "in_temp_" + 'offset', 'r') as f:
offset = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_temp_" + 'offset', exc)
offset = 0.0
return (offset + raw) * scale
def humidity_read(self):
prefix_path = self.sensor_dictionnary['humidity']
try:
with open(prefix_path + "in_humidityrelative_" + 'raw', 'r') as f:
raw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_humidityrelative_" + 'raw', exc)
raw = 0.0
try:
with open(prefix_path + "in_humidityrelative_" + 'scale', 'r') as f:
scale = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_humidityrelative_" + 'scale', exc)
scale = 0.0
try:
with open(prefix_path + "in_humidityrelative_" + 'offset', 'r') as f:
offset = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_humidityrelative_" + 'offset', exc)
offset = 0.0
return (offset + raw) * scale
def accelerometer_read(self):
prefix_path = self.sensor_dictionnary['accelerometer']
try:
with open(prefix_path + "in_accel_" + 'scale', 'r') as f:
rscale = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_accel_" + 'scale', exc)
rscale = 0.0
try:
with open(prefix_path + "in_accel_" + 'x_raw', 'r') as f:
xraw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_accel_" + 'x_raw', exc)
xraw = 0.0
accel_x = int(xraw * rscale * 256.0 / 9.81)
try:
with open(prefix_path + "in_accel_" + 'y_raw', 'r') as f:
yraw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_accel_" + 'y_raw', exc)
yraw = 0.0
accel_y = int(yraw * rscale * 256.0 / 9.81)
try:
with open(prefix_path + "in_accel_" + 'z_raw', 'r') as f:
zraw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_accel_" + 'z_raw', exc)
zraw = 0.0
accel_z = int(zraw * rscale * 256.0 / 9.81)
return [ accel_x, accel_y, accel_z]
def gyroscope_read(self):
prefix_path = self.sensor_dictionnary['gyroscope']
try:
with open(prefix_path + "in_anglvel_" + 'scale', 'r') as f:
rscale = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_anglvel_" + 'scale', exc)
rscale = 0.0
try:
with open(prefix_path + "in_anglvel_" + 'x_raw', 'r') as f:
xraw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_anglvel_" + 'x_raw', exc)
xraw = 0.0
gyro_x = int(xraw * rscale * 256.0 / 9.81)
try:
with open(prefix_path + "in_anglvel_" + 'y_raw', 'r') as f:
yraw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_anglvel_" + 'y_raw', exc)
yraw = 0.0
gyro_y = int(yraw * rscale * 256.0 / 9.81)
try:
with open(prefix_path + "in_anglvel_" + 'z_raw', 'r') as f:
zraw = float(f.read())
except Exception as exc:
print("[ERROR] read %s " % prefix_path + "in_anglvel_" + 'z_raw', exc)
zraw = 0.0
gyro_z = int(zraw * rscale * 256.0 / 9.81)
return [ gyro_x, gyro_y, gyro_z]
# -------------------------------------------------------------------
# -------------------------------------------------------------------
class MainUIWindow(Gtk.Window):
def __init__(self):
Gtk.Window.__init__(self, title="Sensor usage")
#self.set_decorated(False)
self.maximize()
self.screen_width = self.get_screen().get_width()
self.screen_height = self.get_screen().get_height()
self.set_default_size(self.screen_width, self.screen_height)
print("[DEBUG] screen size: %dx%d" % (self.screen_width, self.screen_height))
self.set_position(Gtk.WindowPosition.CENTER)
self.connect('destroy', Gtk.main_quit)
# search sensor interface
self.sensors = Sensors()
self.sensors.found_all_sensor_path()
sensor_box = Gtk.VBox(homogeneous=False, spacing=0)
# temperature
temp_label = Gtk.Label()
temp_label.set_markup("Temperature")
self.temp_value_label = Gtk.Label()
self.temp_value_label.set_markup("--.-- °C")
temp_box = Gtk.HBox(homogeneous=False, spacing=0)
temp_box.add(temp_label)
temp_box.add(self.temp_value_label)
sensor_box.add(temp_box)
# humidity
humidity_label = Gtk.Label()
humidity_label.set_markup("Humidity")
self.humidity_value_label = Gtk.Label()
self.humidity_value_label.set_markup("--.-- %c" % '%')
humidity_box = Gtk.HBox(homogeneous=False, spacing=0)
humidity_box.add(humidity_label)
humidity_box.add(self.humidity_value_label)
sensor_box.add(humidity_box)
# Accel
accel_label = Gtk.Label()
accel_label.set_markup("Accelerometer")
self.accel_value_label = Gtk.Label()
self.accel_value_label.set_markup(" [ --.--, --.--, --.--]")
accel_box = Gtk.HBox(homogeneous=False, spacing=0)
accel_box.add(accel_label)
accel_box.add(self.accel_value_label)
sensor_box.add(accel_box)
# Gyroscope
gyro_label = Gtk.Label()
gyro_label.set_markup("Gyroscope")
self.gyro_value_label = Gtk.Label()
self.gyro_value_label.set_markup(" [ --.--, --.--, --.--]")
gyro_box = Gtk.HBox(homogeneous=False, spacing=0)
gyro_box.add(gyro_label)
gyro_box.add(self.gyro_value_label)
sensor_box.add(gyro_box)
self.add(sensor_box)
# Add a timer callback to update
# this takes 2 args: (how often to update in millisec, the method to run)
GLib.timeout_add(TIME_UPATE, self.update_ui)
def destroy(self, widget, data=None):
Gtk.main_quit()
def update_ui(self):
# temperature
temp = self.sensors.temperature_read()
self.temp_value_label.set_markup("%.02f °C" % temp)
# humidity
hum = self.sensors.humidity_read()
self.humidity_value_label.set_markup("%.02f %c" % (hum, '%'))
# accel
accel = self.sensors.accelerometer_read()
self.accel_value_label.set_markup("[ %.02f, %.02f, %.02f]" % (accel[0], accel[1], accel[2]))
# gyro
gyro = self.sensors.gyroscope_read()
self.gyro_value_label.set_markup("[ %.02f, %.02f, %.02f]" % (gyro[0], gyro[1], gyro[2]))
# As this is a timeout function, return True so that it
# continues to get called
return True
# -------------------------------------------------------------------
# -------------------------------------------------------------------
# Main
if __name__ == "__main__":
# add signal to catch CRTL+C
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
win = MainUIWindow()
win.connect("delete-event", Gtk.main_quit)
win.show_all()
Gtk.main()