implemented info plugin
This commit is contained in:
parent
47303cdec8
commit
8ad0a39651
|
@ -1,15 +1,13 @@
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
|
import time
|
||||||
|
from importlib import import_module
|
||||||
from icecream import ic
|
from icecream import ic
|
||||||
from time import sleep
|
|
||||||
from menu import Menu, MenuItem, MenuType
|
from menu import Menu, MenuItem, MenuType
|
||||||
from cinput import ControlInput
|
from cinput import ControlInput
|
||||||
from graphics import Graphics
|
from graphics import Graphics
|
||||||
|
|
||||||
menu_config = [
|
menu_config = [
|
||||||
MenuItem("Information",
|
|
||||||
MenuType.PLUGIN,
|
|
||||||
{"plugin": "info"}),
|
|
||||||
MenuItem("Apps",
|
MenuItem("Apps",
|
||||||
MenuType.SUB_MENU,
|
MenuType.SUB_MENU,
|
||||||
{"sub_menu": [
|
{"sub_menu": [
|
||||||
|
@ -17,6 +15,9 @@ menu_config = [
|
||||||
MenuType.PLUGIN,
|
MenuType.PLUGIN,
|
||||||
{"plugin": "chess"}),
|
{"plugin": "chess"}),
|
||||||
]}),
|
]}),
|
||||||
|
MenuItem("Information",
|
||||||
|
MenuType.PLUGIN,
|
||||||
|
{"plugin": "info"}),
|
||||||
MenuItem("Reboot",
|
MenuItem("Reboot",
|
||||||
MenuType.EXIT_CMD,
|
MenuType.EXIT_CMD,
|
||||||
{"command": "sudo reboot"}),
|
{"command": "sudo reboot"}),
|
||||||
|
@ -39,7 +40,18 @@ signal.signal(signal.SIGTERM, program_exit)
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
item = menu.get_selection()
|
item = menu.get_selection()
|
||||||
if item.menu_type == MenuType.EXIT_CMD:
|
ic(item)
|
||||||
|
if item.menu_type == MenuType.PLUGIN:
|
||||||
|
try:
|
||||||
|
plugin = import_module("plugin." + item.data["plugin"])
|
||||||
|
ic(plugin)
|
||||||
|
plugin.execute(cinput, graphics)
|
||||||
|
except:
|
||||||
|
graphics.clear()
|
||||||
|
graphics.text("Plugin error!", 0, 0, 1)
|
||||||
|
graphics.show()
|
||||||
|
time.sleep(3)
|
||||||
|
elif item.menu_type == MenuType.EXIT_CMD:
|
||||||
os.system(item.data["command"])
|
os.system(item.data["command"])
|
||||||
program_exit()
|
program_exit()
|
||||||
except Exception as e:
|
except Exception as e:
|
|
@ -1,7 +1,7 @@
|
||||||
import board
|
import board
|
||||||
from digitalio import DigitalInOut, Direction, Pull
|
from digitalio import DigitalInOut, Direction, Pull
|
||||||
from enum import Enum, auto
|
from enum import Enum, auto
|
||||||
from time import sleep
|
import time
|
||||||
|
|
||||||
class Button(Enum):
|
class Button(Enum):
|
||||||
BTN_A = auto()
|
BTN_A = auto()
|
||||||
|
@ -30,12 +30,15 @@ class ControlInput:
|
||||||
self._buttons[button].direction = Direction.INPUT
|
self._buttons[button].direction = Direction.INPUT
|
||||||
self._buttons[button].pull = Pull.UP
|
self._buttons[button].pull = Pull.UP
|
||||||
|
|
||||||
def get_one_shot(self):
|
def get_one_shot(self, timeout = 0):
|
||||||
|
started = time.time()
|
||||||
while True:
|
while True:
|
||||||
|
time.sleep(0.05)
|
||||||
for button in self._buttons:
|
for button in self._buttons:
|
||||||
if not self._buttons[button].value and not button in self._pressed:
|
if not self._buttons[button].value and not button in self._pressed:
|
||||||
self._pressed.add(button)
|
self._pressed.add(button)
|
||||||
return button
|
return button
|
||||||
elif self._buttons[button].value:
|
elif self._buttons[button].value:
|
||||||
self._pressed.discard(button)
|
self._pressed.discard(button)
|
||||||
|
if timeout > 0 and time.time() - started > timeout:
|
||||||
|
return None
|
||||||
|
|
|
@ -7,6 +7,7 @@ class Graphics:
|
||||||
OLED_HEIGHT = 64
|
OLED_HEIGHT = 64
|
||||||
OLED_ADDR = 0x3C
|
OLED_ADDR = 0x3C
|
||||||
LINE_HEIGHT = 9
|
LINE_HEIGHT = 9
|
||||||
|
CHAR_WIDTH = 6
|
||||||
MAX_LINES = 7
|
MAX_LINES = 7
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
@ -18,7 +19,7 @@ class Graphics:
|
||||||
self._display.fill(0)
|
self._display.fill(0)
|
||||||
|
|
||||||
def text(self, text, x, y, c):
|
def text(self, text, x, y, c):
|
||||||
self._display.text(text, x, y, c)
|
self._display.text(text, x * self.CHAR_WIDTH, y * self.LINE_HEIGHT, c)
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
self._display.show()
|
self._display.show()
|
||||||
|
|
2
menu.py
2
menu.py
|
@ -37,7 +37,7 @@ class Menu:
|
||||||
if idx >= len(items):
|
if idx >= len(items):
|
||||||
break
|
break
|
||||||
marker = "> " if idx == self._selected_index else " "
|
marker = "> " if idx == self._selected_index else " "
|
||||||
self._graphics.text(marker + items[idx].display, 0, (idx - self._top_index) * Graphics.LINE_HEIGHT, 1)
|
self._graphics.text(marker + items[idx].display, 0, (idx - self._top_index), 1)
|
||||||
|
|
||||||
self._graphics.show()
|
self._graphics.show()
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
# plugins
|
|
@ -0,0 +1,32 @@
|
||||||
|
import subprocess
|
||||||
|
from cinput import ControlInput, Button
|
||||||
|
from graphics import Graphics
|
||||||
|
|
||||||
|
def execute(cinput: ControlInput, graphics: Graphics):
|
||||||
|
graphics.clear()
|
||||||
|
graphics.text("Loading details...", 0, 0, 1)
|
||||||
|
graphics.show()
|
||||||
|
|
||||||
|
while True:
|
||||||
|
cmd = "hostname -I | cut -d' ' -f1"
|
||||||
|
ip = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||||
|
cmd = "top -bn 2 |grep \"Cpu(s)\" | awk '{print $2+$4+$6+$10+$12+$14+$16 \"%\"}' | tail -n1"
|
||||||
|
cpu = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||||
|
cmd = "free | grep Mem | awk '{print int($3/$2 * 100.0 +0.5) \"%\"}'"
|
||||||
|
mem = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||||
|
cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%d GB %s\", $3,$2,$5}'"
|
||||||
|
disk = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||||
|
cmd = "uptime | awk '{print $3}' | sed 's/,$//'"
|
||||||
|
up = subprocess.check_output(cmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
graphics.clear()
|
||||||
|
graphics.text("IP: " + ip, 0, 0, 1)
|
||||||
|
graphics.text("CPU: " + cpu, 0, 1, 1)
|
||||||
|
graphics.text("Memory: " + mem, 0, 2, 1)
|
||||||
|
graphics.text(disk, 0, 3, 1)
|
||||||
|
graphics.text("Uptime: " + up, 0, 4, 1)
|
||||||
|
graphics.show()
|
||||||
|
|
||||||
|
key = cinput.get_one_shot(5)
|
||||||
|
if key == Button.BTN_A:
|
||||||
|
return
|
Reference in New Issue