Inkycal/inkycal/main.py

153 lines
3.9 KiB
Python

#!/usr/bin/python3
# -*- coding: utf-8 -*-
"""
Main class for inkycal Project
Copyright by aceisace
"""
from inkycal.display import Display
from inkycal.custom import *
import os
import traceback
import logging
import arrow
import time
import json
try:
from PIL import Image
except ImportError:
print('Pillow is not installed! Please install with:')
print('pip3 install Pillow')
try:
import numpy
except ImportError:
print('numpy is not installed! Please install with:')
print('pip3 install numpy')
filename = os.path.basename(__file__).split('.py')[0]
logger = logging.getLogger(filename)
logger.setLevel(level=logging.ERROR)
class Inkycal:
"""Inkycal main class"""
def __init__(self, settings_path, render=True):
"""Initialise Inkycal
settings_path = str -> location/folder of settings file
render = bool -> show something on the ePaper?
"""
self._release = '2.0.0'
# Check if render was set correctly
if render not in [True, False]:
raise Exception('render must be True or False, not "{}"'.format(render))
self.render = render
# load settings file - throw an error if file could not be found
try:
with open(settings_path) as file:
settings = json.load(file)
self.settings = settings
except FileNotFoundError:
print('No settings file found in specified location')
print('Please double check your path')
# Option to use epaper image optimisation
self.optimize = True
# Load drivers if image should be rendered
if self.render == True:
# Init Display class with model in settings file
from inkycal.display import Display
self.Display = Display(settings["model"])
# check if colours can be rendered
self.supports_colour = True if 'colour' in settings['model'] else False
# init calibration state
self._calibration_state = False
# WIP
for module in settings['modules']:
try:
loader = f'from inkycal.modules import {module["name"]}'
print(loader)
conf = module["config"]
#size, conf = module_data['size'], module_data['config']
setup = f'self.{module} = {module}(size, conf)'
exec(loader)
exec(setup)
logger.debug(('{}: size: {}, config: {}'.format(module, size, conf)))
# If a module was not found, print an error message
except ImportError:
print(
'Could not find module: "{}". Please try to import manually.'.format(
module))
except Exception as e:
print(str(e))
# Give an OK message
print('loaded inkycal')
def countdown(self, interval_mins=None):
"""Returns the remaining time in seconds until next display update"""
# Validate update interval
allowed_intervals = [10, 15, 20, 30, 60]
# Check if empty, if empty, use value from settings file
if interval_mins == None:
interval_mins = self.settings.update_interval
# Check if integer
if not isinstance(interval_mins, int):
raise Exception('Update interval must be an integer -> 60')
# Check if value is supported
if interval_mins not in allowed_intervals:
raise Exception('Update interval is {}, but should be one of: {}'.format(
interval_mins, allowed_intervals))
# Find out at which minutes the update should happen
now = arrow.now()
update_timings = [(60 - int(interval_mins)*updates) for updates in
range(60//int(interval_mins))][::-1]
# Calculate time in mins until next update
minutes = [_ for _ in update_timings if _>= now.minute][0] - now.minute
# Print the remaining time in mins until next update
print('{0} Minutes left until next refresh'.format(minutes))
# Calculate time in seconds until next update
remaining_time = minutes*60 + (60 - now.second)
# Return seconds until next update
return remaining_time
if __name__ == '__main__':
print('running {0} in standalone/debug mode'.format(filename))