OctoPrint-Tentacles
import enum
from . import actions
# Each mode has a seperate action
# Mode -1: Uninitialized, tentacles have no actions
# Mode 0: Printer is printing
# Mode 1: Control mode, printer is on and not printing *default
class Mode(int, enum.Enum):
UNINITIALIZED = -2
PRINTING = -1
MENU = 0 # Any mode greater than 0 will be shown in menu
CONTROL = 1
PLOTTER = 2
#MAINTENANCE = 3
@classmethod
def MAX(cls):
max_mode = max(list(cls))
return cls(max_mode)
class Menu:
def __init__(self, printer, menu_start, menu_end):
self._printer = printer
self._start = menu_start
self._end = menu_end
self._selected = None
def start_menu(self, mode):
self._entry = mode
self._selected = mode
self._display_menu()
return Mode.MENU
def change_menu(self, opt='next'):
if opt == 'next':
new_mode = self._selected + 1
elif opt == 'prev':
new_mode = self._selected - 1
if self._start <= new_mode <= self._end:
self._selected = Mode(new_mode)
self._display_menu()
def set_menu(self):
name = self._format_name(select_char=None)
self._printer.commands(f"M117 >{name}<")
return self._selected
def _display_menu(self):
name = self._format_name()
if self._start < self._selected < self._end:
self._printer.commands(f"M117 <{name}>")
elif self._start == self._selected < self._end:
self._printer.commands(f"M117 [{name}>")
elif self._start < self._selected == self._end:
self._printer.commands(f"M117 <{name}]")
elif self._start == self._selected == self._end:
self._printer.commands(f"M117 [{name}]")
else:
self._printer.commands(f"M117 MENU ERROR: {self._selected}")
def _format_name(self, length=18, pad_char=' ', select_char='~'):
if select_char and (self._selected == self._entry):
padding = select_char
length -= 1
else:
padding = ''
padding += (pad_char * (length - len(self._selected.name)))
return pad_char + self._selected.name.title() + padding