diff --git a/README.md b/README.md index f6d14e2c..d75b8581 100644 --- a/README.md +++ b/README.md @@ -142,7 +142,7 @@ Description=Seedsigner [Service] User=pi -WorkingDirectory=/home/pi/seedsigner +WorkingDirectory=/home/pi/seedsigner/src/ ExecStart=/usr/bin/python3 main.py Restart=always diff --git a/main.py b/main.py deleted file mode 100644 index 3b1f387d..00000000 --- a/main.py +++ /dev/null @@ -1,12 +0,0 @@ -import sys -sys.path.append('./views') -sys.path.append('./models') -sys.path.append('./helpers') - -from controller import Controller -import time - -DEBUG = True - -controller = Controller() -controller.start(DEBUG) \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 00000000..1bb2a4b2 --- /dev/null +++ b/src/main.py @@ -0,0 +1,12 @@ +import configparser +import sys +import time + +from seedsigner.controller import Controller + + +config = configparser.ConfigParser() +config.read("settings.ini") + +controller = Controller(config) +controller.start() diff --git a/controller.py b/src/seedsigner/controller.py similarity index 95% rename from controller.py rename to src/seedsigner/controller.py index 847dd43e..af6a82f8 100644 --- a/controller.py +++ b/src/seedsigner/controller.py @@ -4,28 +4,23 @@ from multiprocessing import Process, Queue from subprocess import call # Internal file class dependencies -from view import View -from menu_view import MenuView -from seed_tools_view import SeedToolsView -from signing_tools_view import SigningToolsView -from settings_tools_view import SettingsToolsView -from io_test_view import IOTestView -from buttons import Buttons, B -from camera_process import CameraProcess -from path import Path -from seed_storage import SeedStorage -from specter_desktop_multisig_wallet import SpecterDesktopMultisigWallet -from blue_vault_wallet import BlueVaultWallet -from sparrow_multisig_wallet import SparrowMultiSigWallet -from generic_ur2_wallet import GenericUR2Wallet +from .views import (View, MenuView, SeedToolsView,SigningToolsView, + SettingsToolsView, IOTestView) +from .helpers import Buttons, B, CameraProcess,Path +from .models import (SeedStorage, SpecterDesktopMultisigWallet, BlueVaultWallet, + SparrowMultiSigWallet, GenericUR2Wallet) + class Controller: VERSION = "0.4.1" - def __init__(self) -> None: + def __init__(self, config) -> None: controller = self + # settings + self.DEBUG = config.getboolean("system", "DEBUG") + # Input Buttons self.buttons = Buttons() @@ -48,14 +43,15 @@ class Controller: p = Process(target=CameraProcess.start, args=(self.from_camera_queue, self.to_camera_queue)) p.start() - return - def start(self, debug = False) -> None: - - if debug == False: - crash_cnt = 0 + def start(self) -> None: + if self.DEBUG: + # Let Exceptions halt execution + self.show_main_menu() + else: # Handle Unexpected crashes by restarting up to 3 times + crash_cnt = 0 while True: try: self.show_main_menu() @@ -70,8 +66,7 @@ class Controller: crash_cnt += 1 self.menu_view.draw_modal(["Crashed ..."], "", "requires hard restart") - else: - self.show_main_menu() + ### Menu ### Menu View handles navigation within the menu diff --git a/helpers/ST7789.py b/src/seedsigner/helpers/ST7789.py similarity index 100% rename from helpers/ST7789.py rename to src/seedsigner/helpers/ST7789.py diff --git a/src/seedsigner/helpers/__init__.py b/src/seedsigner/helpers/__init__.py new file mode 100644 index 00000000..242c25db --- /dev/null +++ b/src/seedsigner/helpers/__init__.py @@ -0,0 +1,5 @@ +from .buttons import * +from .camera_process import * +from .path import * +from .qr import * +from .ST7789 import * \ No newline at end of file diff --git a/helpers/bcur.py b/src/seedsigner/helpers/bcur.py similarity index 100% rename from helpers/bcur.py rename to src/seedsigner/helpers/bcur.py diff --git a/helpers/buttons.py b/src/seedsigner/helpers/buttons.py similarity index 100% rename from helpers/buttons.py rename to src/seedsigner/helpers/buttons.py diff --git a/helpers/camera_process.py b/src/seedsigner/helpers/camera_process.py similarity index 100% rename from helpers/camera_process.py rename to src/seedsigner/helpers/camera_process.py diff --git a/helpers/path.py b/src/seedsigner/helpers/path.py similarity index 100% rename from helpers/path.py rename to src/seedsigner/helpers/path.py diff --git a/helpers/qr.py b/src/seedsigner/helpers/qr.py similarity index 100% rename from helpers/qr.py rename to src/seedsigner/helpers/qr.py diff --git a/helpers/ur2/LICENSE b/src/seedsigner/helpers/ur2/LICENSE similarity index 100% rename from helpers/ur2/LICENSE rename to src/seedsigner/helpers/ur2/LICENSE diff --git a/helpers/ur2/__init__.py b/src/seedsigner/helpers/ur2/__init__.py similarity index 100% rename from helpers/ur2/__init__.py rename to src/seedsigner/helpers/ur2/__init__.py diff --git a/helpers/ur2/bytewords.py b/src/seedsigner/helpers/ur2/bytewords.py similarity index 100% rename from helpers/ur2/bytewords.py rename to src/seedsigner/helpers/ur2/bytewords.py diff --git a/helpers/ur2/cbor_lite.py b/src/seedsigner/helpers/ur2/cbor_lite.py similarity index 100% rename from helpers/ur2/cbor_lite.py rename to src/seedsigner/helpers/ur2/cbor_lite.py diff --git a/helpers/ur2/constants.py b/src/seedsigner/helpers/ur2/constants.py similarity index 100% rename from helpers/ur2/constants.py rename to src/seedsigner/helpers/ur2/constants.py diff --git a/helpers/ur2/crc32.py b/src/seedsigner/helpers/ur2/crc32.py similarity index 100% rename from helpers/ur2/crc32.py rename to src/seedsigner/helpers/ur2/crc32.py diff --git a/helpers/ur2/fountain_decoder.py b/src/seedsigner/helpers/ur2/fountain_decoder.py similarity index 100% rename from helpers/ur2/fountain_decoder.py rename to src/seedsigner/helpers/ur2/fountain_decoder.py diff --git a/helpers/ur2/fountain_encoder.py b/src/seedsigner/helpers/ur2/fountain_encoder.py similarity index 100% rename from helpers/ur2/fountain_encoder.py rename to src/seedsigner/helpers/ur2/fountain_encoder.py diff --git a/helpers/ur2/fountain_utils.py b/src/seedsigner/helpers/ur2/fountain_utils.py similarity index 100% rename from helpers/ur2/fountain_utils.py rename to src/seedsigner/helpers/ur2/fountain_utils.py diff --git a/helpers/ur2/random_sampler.py b/src/seedsigner/helpers/ur2/random_sampler.py similarity index 100% rename from helpers/ur2/random_sampler.py rename to src/seedsigner/helpers/ur2/random_sampler.py diff --git a/helpers/ur2/ur.py b/src/seedsigner/helpers/ur2/ur.py similarity index 100% rename from helpers/ur2/ur.py rename to src/seedsigner/helpers/ur2/ur.py diff --git a/helpers/ur2/ur_decoder.py b/src/seedsigner/helpers/ur2/ur_decoder.py similarity index 100% rename from helpers/ur2/ur_decoder.py rename to src/seedsigner/helpers/ur2/ur_decoder.py diff --git a/helpers/ur2/ur_encoder.py b/src/seedsigner/helpers/ur2/ur_encoder.py similarity index 100% rename from helpers/ur2/ur_encoder.py rename to src/seedsigner/helpers/ur2/ur_encoder.py diff --git a/helpers/ur2/utils.py b/src/seedsigner/helpers/ur2/utils.py similarity index 100% rename from helpers/ur2/utils.py rename to src/seedsigner/helpers/ur2/utils.py diff --git a/helpers/ur2/xoshiro256.py b/src/seedsigner/helpers/ur2/xoshiro256.py similarity index 100% rename from helpers/ur2/xoshiro256.py rename to src/seedsigner/helpers/ur2/xoshiro256.py diff --git a/src/seedsigner/models/__init__.py b/src/seedsigner/models/__init__.py new file mode 100644 index 00000000..9a39404b --- /dev/null +++ b/src/seedsigner/models/__init__.py @@ -0,0 +1,7 @@ +from .wallet import * # base class has to be first +from .blue_vault_wallet import * +from .generic_ur2_wallet import * +from .seed_storage import * +from .sparrow_multisig_wallet import * +from .specter_desktop_multisig_wallet import * +from .specter_desktop_single_sig_wallet import * diff --git a/models/blue_vault_wallet.py b/src/seedsigner/models/blue_vault_wallet.py similarity index 96% rename from models/blue_vault_wallet.py rename to src/seedsigner/models/blue_vault_wallet.py index 25955487..daf2ae9c 100644 --- a/models/blue_vault_wallet.py +++ b/src/seedsigner/models/blue_vault_wallet.py @@ -1,5 +1,7 @@ -from wallet import Wallet -from qr import QR +from . import Wallet +from seedsigner.helpers import QR +from seedsigner.helpers.bcur import (bcur_decode, cbor_decode, bc32decode, + bc32encode, cbor_encode, bcur_encode) # External Dependencies from embit.bip39 import mnemonic_to_bytes @@ -12,7 +14,6 @@ from embit.networks import NETWORKS from embit import ec from io import BytesIO from binascii import unhexlify, hexlify, a2b_base64, b2a_base64 -from bcur import bcur_decode, cbor_decode, bc32decode, bc32encode, cbor_encode, bcur_encode import re class BlueVaultWallet(Wallet): diff --git a/models/generic_ur2_wallet.py b/src/seedsigner/models/generic_ur2_wallet.py similarity index 93% rename from models/generic_ur2_wallet.py rename to src/seedsigner/models/generic_ur2_wallet.py index 7dab9ecf..9896e9d3 100644 --- a/models/generic_ur2_wallet.py +++ b/src/seedsigner/models/generic_ur2_wallet.py @@ -1,9 +1,12 @@ -from wallet import Wallet -from buttons import Buttons, B -from camera_process import CameraProcess -from camera_process import CameraPoll -from view import View -from qr import QR +from . import Wallet + +from seedsigner.helpers import Buttons, B, CameraProcess, CameraPoll, QR +from seedsigner.helpers.bcur import bcur_decode, cbor_decode, bc32decode, bc32encode, cbor_encode, bcur_encode +from seedsigner.helpers.ur2.ur_decoder import URDecoder +from seedsigner.helpers.ur2.ur_encoder import UREncoder +from seedsigner.helpers.ur2.cbor_lite import CBOREncoder +from seedsigner.helpers.ur2.ur import UR +from seedsigner.views import View # External Dependencies import time @@ -17,11 +20,6 @@ from embit.networks import NETWORKS from embit import ec from io import BytesIO from binascii import unhexlify, hexlify, a2b_base64, b2a_base64 -from bcur import bcur_decode, cbor_decode, bc32decode, bc32encode, cbor_encode, bcur_encode -from ur2.ur_decoder import URDecoder -from ur2.ur_encoder import UREncoder -from ur2.cbor_lite import CBOREncoder -from ur2.ur import UR import re import textwrap diff --git a/models/seed_storage.py b/src/seedsigner/models/seed_storage.py similarity index 97% rename from models/seed_storage.py rename to src/seedsigner/models/seed_storage.py index 1a9a865a..ebb08eac 100644 --- a/models/seed_storage.py +++ b/src/seedsigner/models/seed_storage.py @@ -1,6 +1,5 @@ # External Dependencies -from embit.bip39 import mnemonic_to_bytes -from embit.bip39 import mnemonic_from_bytes +from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes from embit import bip39 class SeedStorage: diff --git a/models/sparrow_multisig_wallet.py b/src/seedsigner/models/sparrow_multisig_wallet.py similarity index 92% rename from models/sparrow_multisig_wallet.py rename to src/seedsigner/models/sparrow_multisig_wallet.py index 5f880938..a735b552 100644 --- a/models/sparrow_multisig_wallet.py +++ b/src/seedsigner/models/sparrow_multisig_wallet.py @@ -1,27 +1,21 @@ -from wallet import Wallet -from buttons import Buttons, B -from camera_process import CameraProcess -from camera_process import CameraPoll -from view import View -from qr import QR +from . import Wallet + +from seedsigner.helpers import Buttons, B, CameraProcess, CameraPoll, QR +from seedsigner.helpers.bcur import (bcur_decode, cbor_decode, bc32decode, + bc32encode, cbor_encode, bcur_encode) +from seedsigner.helpers.ur2.ur_decoder import URDecoder +from seedsigner.helpers.ur2.ur_encoder import UREncoder +from seedsigner.helpers.ur2.cbor_lite import CBOREncoder +from seedsigner.helpers.ur2.ur import UR +from seedsigner.views import View # External Dependencies import time -from embit.bip39 import mnemonic_to_bytes -from embit.bip39 import mnemonic_from_bytes -from embit import bip39 -from embit import script -from embit import bip32 -from embit import psbt +from embit import bip32, bip39, ec, script, psbt +from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes from embit.networks import NETWORKS -from embit import ec from io import BytesIO from binascii import unhexlify, hexlify, a2b_base64, b2a_base64 -from bcur import bcur_decode, cbor_decode, bc32decode, bc32encode, cbor_encode, bcur_encode -from ur2.ur_decoder import URDecoder -from ur2.ur_encoder import UREncoder -from ur2.cbor_lite import CBOREncoder -from ur2.ur import UR import re import textwrap diff --git a/models/specter_desktop_multisig_wallet.py b/src/seedsigner/models/specter_desktop_multisig_wallet.py similarity index 93% rename from models/specter_desktop_multisig_wallet.py rename to src/seedsigner/models/specter_desktop_multisig_wallet.py index 80061828..4ef19d43 100644 --- a/models/specter_desktop_multisig_wallet.py +++ b/src/seedsigner/models/specter_desktop_multisig_wallet.py @@ -1,15 +1,10 @@ -from wallet import Wallet -from qr import QR +from . import Wallet +from seedsigner.helpers import QR # External Dependencies -from embit.bip39 import mnemonic_to_bytes -from embit.bip39 import mnemonic_from_bytes -from embit import bip39 -from embit import script -from embit import bip32 -from embit import psbt +from embit import bip32, bip39, ec, psbt, script +from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes from embit.networks import NETWORKS -from embit import ec from io import BytesIO from binascii import unhexlify, hexlify, a2b_base64, b2a_base64 import re diff --git a/models/specter_desktop_single_sig_wallet.py b/src/seedsigner/models/specter_desktop_single_sig_wallet.py similarity index 77% rename from models/specter_desktop_single_sig_wallet.py rename to src/seedsigner/models/specter_desktop_single_sig_wallet.py index b7feddcd..725ac9ec 100644 --- a/models/specter_desktop_single_sig_wallet.py +++ b/src/seedsigner/models/specter_desktop_single_sig_wallet.py @@ -1,15 +1,10 @@ -from specter_desktop_multisig_wallet import SpecterDesktopMultisigWallet -from wallet import Wallet +from . import SpecterDesktopMultisigWallet +from . import Wallet # External Dependencies -from embit.bip39 import mnemonic_to_bytes -from embit.bip39 import mnemonic_from_bytes -from embit import bip39 -from embit import script -from embit import bip32 -from embit import psbt +from embit import bip32, bip39, ec, psbt, script +from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes from embit.networks import NETWORKS -from embit import ec from io import BytesIO from binascii import unhexlify, hexlify, a2b_base64, b2a_base64 import re diff --git a/models/wallet.py b/src/seedsigner/models/wallet.py similarity index 97% rename from models/wallet.py rename to src/seedsigner/models/wallet.py index c4680114..3ace2df4 100644 --- a/models/wallet.py +++ b/src/seedsigner/models/wallet.py @@ -1,19 +1,12 @@ # Internal Dependencies -from buttons import Buttons, B -from camera_process import CameraProcess -from camera_process import CameraPoll -from view import View +from seedsigner.helpers import Buttons, B, CameraProcess, CameraPoll +from seedsigner.views import View # External Dependencies import time -from embit.bip39 import mnemonic_to_bytes -from embit.bip39 import mnemonic_from_bytes -from embit import bip39 -from embit import script -from embit import bip32 -from embit import psbt +from embit import bip32, bip39, ec, psbt, script +from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes from embit.networks import NETWORKS -from embit import ec from io import BytesIO from binascii import unhexlify, hexlify, a2b_base64, b2a_base64 import textwrap diff --git a/src/seedsigner/views/__init__.py b/src/seedsigner/views/__init__.py new file mode 100644 index 00000000..47932cd0 --- /dev/null +++ b/src/seedsigner/views/__init__.py @@ -0,0 +1,6 @@ +from .view import * # base class has to be first +from .io_test_view import * +from .menu_view import * +from .seed_tools_view import * +from .settings_tools_view import * +from .signing_tools_view import * diff --git a/views/io_test_view.py b/src/seedsigner/views/io_test_view.py similarity index 98% rename from views/io_test_view.py rename to src/seedsigner/views/io_test_view.py index 887792d1..c69f6a47 100644 --- a/views/io_test_view.py +++ b/src/seedsigner/views/io_test_view.py @@ -3,9 +3,9 @@ import threading from threading import Timer # Internal file class dependencies -from view import View -from buttons import B -from camera_process import CameraPoll +from . import View +from seedsigner.helpers import B, CameraPoll + class IOTestView(View): diff --git a/views/menu_view.py b/src/seedsigner/views/menu_view.py similarity index 99% rename from views/menu_view.py rename to src/seedsigner/views/menu_view.py index 9667cbe6..da210a22 100644 --- a/views/menu_view.py +++ b/src/seedsigner/views/menu_view.py @@ -1,8 +1,7 @@ # Internal file class dependencies -from view import View -from buttons import B -from path import Path -from seed_storage import SeedStorage +from . import View +from seedsigner.helpers import B, Path +from seedsigner.models import SeedStorage # External Dependencies import time diff --git a/views/seed_tools_view.py b/src/seedsigner/views/seed_tools_view.py similarity index 99% rename from views/seed_tools_view.py rename to src/seedsigner/views/seed_tools_view.py index 36f265a5..e6551090 100644 --- a/views/seed_tools_view.py +++ b/src/seedsigner/views/seed_tools_view.py @@ -1,12 +1,12 @@ # External Dependencies -from embit.bip39 import mnemonic_to_bytes -from embit.bip39 import mnemonic_from_bytes from embit import bip39 +from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes import time # Internal file class dependencies -from view import View -from buttons import B +from . import View +from seedsigner.helpers import B + class SeedToolsView(View): diff --git a/views/settings_tools_view.py b/src/seedsigner/views/settings_tools_view.py similarity index 97% rename from views/settings_tools_view.py rename to src/seedsigner/views/settings_tools_view.py index 6d0f545a..110f798e 100644 --- a/views/settings_tools_view.py +++ b/src/seedsigner/views/settings_tools_view.py @@ -1,7 +1,7 @@ # SeedSigner file class dependencies -from view import View -from qr import QR -from buttons import B +from . import View +from seedsigner.helpers import B, QR + class SettingsToolsView(View): diff --git a/views/signing_tools_view.py b/src/seedsigner/views/signing_tools_view.py similarity index 98% rename from views/signing_tools_view.py rename to src/seedsigner/views/signing_tools_view.py index 5b925af3..61954d83 100644 --- a/views/signing_tools_view.py +++ b/src/seedsigner/views/signing_tools_view.py @@ -1,10 +1,11 @@ # Internal file class dependencies -from view import View -from buttons import Buttons, B +from . import View +from seedsigner.helpers import Buttons, B # External Dependencies import time + class SigningToolsView(View): def __init__(self, controller, seed_storage) -> None: diff --git a/views/view.py b/src/seedsigner/views/view.py similarity index 97% rename from views/view.py rename to src/seedsigner/views/view.py index 5f46cf70..04d07564 100644 --- a/views/view.py +++ b/src/seedsigner/views/view.py @@ -1,11 +1,10 @@ # External Dependencies -from PIL import Image -from PIL import ImageDraw -from PIL import ImageFont -import ST7789 +from PIL import Image, ImageDraw, ImageFont import spidev as SPI from multiprocessing import Queue +from seedsigner.helpers import ST7789 + ### Generic View Class to Instatiate Display ### Static Class variables are used for display ### Designed to be inherited for other view classes, but not required @@ -58,7 +57,7 @@ class View: # 240x240 display with hardware SPI: View.bus = 0 View.device = 0 - View.disp = ST7789.ST7789(SPI.SpiDev(View.bus, View.device),View.RST, View.DC, View.BL) + View.disp = ST7789(SPI.SpiDev(View.bus, View.device),View.RST, View.DC, View.BL) View.disp.Init() self.queue = Queue() diff --git a/src/settings.ini b/src/settings.ini new file mode 100644 index 00000000..d1da9ba6 --- /dev/null +++ b/src/settings.ini @@ -0,0 +1,7 @@ +[system] +DEBUG = True +DEFAULT_LANGUAGE = en + +[display] +BACKGROUND_COLOR = #000 +TEXT_COLOR = orange