Skip to content

Commit

Permalink
Merge pull request #208 from Foundation-Devices/PASS1-590-developer-p…
Browse files Browse the repository at this point in the history
…atch

PASS1-590: developer patch
  • Loading branch information
mjg-foundation committed Mar 30, 2023
2 parents 55e5ccc + cdc1ffe commit aa7cd5f
Show file tree
Hide file tree
Showing 18 changed files with 266 additions and 98 deletions.
10 changes: 6 additions & 4 deletions ports/stm32/Justfile
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ compile_commands := join(builddir, "compile_commands.json")
base_cflags := "-DLV_COLOR_DEPTH=16 -DLV_COLOR_16_SWAP -DLV_TICK_CUSTOM=1"
color_cflags := "-DSCREEN_MODE_COLOR -DHAS_FUEL_GAUGE "
mono_cflags := "-DSCREEN_MODE_MONO"
dev_cflags := "-DDEV_BUILD"

# Number of jobs to use when building
jobs := if os() == "macos" {
Expand Down Expand Up @@ -78,17 +79,18 @@ compile-commands screen="mono" ext="":
#
# Build the firmware
build screen="mono" +ext='':
build screen="mono" dev="" +ext='':
@echo {{ if screen == "mono" { "Building with SCREEN_MODE=MONO" } else if screen == "color" { "Building with SCREEN_MODE=COLOR" } else { error("Unsupported screen type. Use 'mono' or 'color'") } }}
make -j{{jobs}} \
LV_CFLAGS='{{base_cflags}} {{ if screen == "mono" { mono_cflags } else { color_cflags } }}' \
LV_CFLAGS='{{base_cflags}} {{ if screen == "mono" { mono_cflags } else { color_cflags } }} {{ if dev == "dev" { dev_cflags } else { "" } }}' \
BOARD=Passport \
SCREEN_MODE={{ uppercase(screen) }} \
FROZEN_MANIFEST={{ if dev == "dev" { 'boards/Passport/manifest_dev.py' } else { 'boards/Passport/manifest.py' } }} \
{{ext}}
# Sign current firmware build with the user.pem key and set specified version
sign version="1.0.0" screen="mono" ext="": (build screen ext)
sign version="1.0.0" screen="mono" dev="" ext="": (build screen dev ext)
#!/usr/bin/env bash
set -e
SCREEN_EXT={{screen}}
Expand Down Expand Up @@ -116,7 +118,7 @@ sign version="1.0.0" screen="mono" ext="": (build screen ext)
echo -e "\nSigning Complete!"
# Build, sign and flash the firmware with the specified version
flash version="1.0.0" screen="mono" ext="": (sign version screen ext) && (reset)
flash version="1.0.0" screen="mono" dev="" ext="": (sign version screen dev ext) && (reset)
#!/usr/bin/env bash
set -euo pipefail
Expand Down
2 changes: 1 addition & 1 deletion ports/stm32/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -807,4 +807,4 @@ $(GEN_CDCINF_FILE): $(CDCINF_TEMPLATE) $(INSERT_USB_IDS) $(USB_IDS_FILE) | $(HEA
include $(TOP)/py/mkrules.mk

check: $(SRC_C)
clang-tidy -checks=cert-* --warnings-as-errors=* $(SRC_C) -- $(CFLAGS)
clang-tidy -checks=cert-* --warnings-as-errors=* $(SRC_C) -- $(CFLAGS)
3 changes: 0 additions & 3 deletions ports/stm32/boards/Passport/manifest.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,6 @@
'flows/change_pin_flow.py',
'flows/delete_account_flow.py',
'flows/delete_multisig_flow.py',
'flows/developer_functions_flow.py',
'flows/envoy_setup_flow.py',

'flows/erase_passport_flow.py',
Expand Down Expand Up @@ -135,7 +134,6 @@
'flows/sign_psbt_microsd_flow.py',
'flows/sign_psbt_qr_flow.py',
'flows/sign_text_file_flow.py',
'flows/spin_delay_flow.py',
'flows/terms_of_use_flow.py',
'flows/update_firmware_flow.py',
'flows/verify_address_flow.py',
Expand All @@ -155,7 +153,6 @@
('pages/__init__.py',
'pages/account_details_page.py',
'pages/backup_code_page.py',
'pages/battery_page.py',
'pages/brandmark_page.py',
'pages/chooser_page.py',
'pages/color_picker_page.py',
Expand Down
15 changes: 15 additions & 0 deletions ports/stm32/boards/Passport/manifest_dev.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# SPDX-FileCopyrightText: © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#

# Keep lists below sorted for easier reference

freeze('$(MPY_DIR)/ports/stm32/boards/Passport/modules',
('developer/__init__.py',
'developer/battery_page.py',
'developer/delete_derived_keys_flow.py',
'developer/developer_functions_flow.py',
'developer/spin_delay_flow.py',
))

include("$(MPY_DIR)/ports/stm32/boards/Passport/manifest.py")
5 changes: 5 additions & 0 deletions ports/stm32/boards/Passport/modpassport.c
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,11 @@ STATIC const mp_rom_map_elem_t passport_module_globals_table[] = {
#else
{MP_ROM_QSTR(MP_QSTR_IS_COLOR), MP_ROM_FALSE},
#endif // SCREEN_MODE_COLOR
#ifdef DEV_BUILD
{MP_ROM_QSTR(MP_QSTR_IS_DEV), MP_ROM_TRUE},
#else
{MP_ROM_QSTR(MP_QSTR_IS_DEV), MP_ROM_FALSE},
#endif
#ifdef HAS_FUEL_GAUGE
{MP_ROM_QSTR(MP_QSTR_HAS_FUEL_GAUGE), MP_ROM_TRUE},
#else
Expand Down
9 changes: 9 additions & 0 deletions ports/stm32/boards/Passport/modules/developer/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# SPDX-FileCopyrightText: © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# __init__.py

from .developer_functions_flow import *
from .spin_delay_flow import *
from .delete_derived_keys_flow import *
from .battery_page import *
42 changes: 42 additions & 0 deletions ports/stm32/boards/Passport/modules/developer/battery_page.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# SPDX-FileCopyrightText: © 2022 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# info_page.py

import lvgl as lv
from pages import StatusPage
import microns


class BatteryPage(StatusPage):
def __init__(self, text=None, card_header={'title': 'Battery'},
statusbar=None, left_micron=None, right_micron=microns.Checkmark):
from common import ui

super().__init__(
show_progress=True,
percent=ui.battery_level,
card_header=card_header,
statusbar=statusbar,
left_micron=left_micron,
right_micron=right_micron)

def update_battery(self):
from common import ui
self.set_progress(ui.battery_level)

def on_timer(self, _t):
self.update_battery()

def attach(self, group):
super().attach(group)

# Create a timer to update the battery
self.timer = lv.timer_create(self.on_timer, 5000, None)

def detach(self):
super().detach()

if self.timer is not None:
self.timer._del()
self.timer = None
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# SPDX-FileCopyrightText: © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# delete_deriveds_key_flow.py - Delete derived keys

from flows import Flow


class DeleteDerivedKeysFlow(Flow):
def __init__(self):
super().__init__(initial_state=self.confirm_delete, name='DeleteDerivedKeysFlow')

async def confirm_delete(self):
from pages import QuestionPage

result = await QuestionPage(text='Delete all Child Keys?').show()

if result:
self.goto(self.do_delete)
else:
self.set_result(False)

async def do_delete(self):
from common import settings
from pages import SuccessPage
settings.remove('derived_keys')
settings.save()
await SuccessPage(text='Keys Deleted').show()
self.set_result(True)
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
# SPDX-FileCopyrightText: © 2022 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# developer_functions_flow.py - Run a named developer function

from flows import Flow


class DeveloperFunctionsFlow(Flow):
def __init__(self, fn_name=None):
super().__init__(initial_state=self.run_function, name='DeveloperFunctionsFlow')
self.fn_name = fn_name
print('DeveloperFunctionsFlow: fn_name={}'.format(self.fn_name))

async def run_function(self):
if self.fn_name == 'dump_settings':
from common import settings
from utils import to_str
print('Current Settings:\n{}'.format(to_str(settings.current)))
self.set_result(True)

elif self.fn_name == 'factory_reset':
from flows import ChangePINFlow
from tasks import erase_passport_task
from utils import spinner_task
from pages import ErrorPage
import common
from common import system

print('Factory Reset!')

result = await ChangePINFlow().run()
if result:
await spinner_task('Factory Reset Passport...', erase_passport_task, args=[True])
common.settings.remove('setup_mode')
system.reset()

self.set_result(True)
else:
await ErrorPage(text='Unable to reset PIN, so not erasing Passport.').show()
self.set_result(False)
29 changes: 29 additions & 0 deletions ports/stm32/boards/Passport/modules/developer/spin_delay_flow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# SPDX-FileCopyrightText: © 2022 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# spin_delay_flow.py - Show a spinner that will display until the given delay has expired.


from flows import Flow


class SpinDelayFlow(Flow):
def __init__(self, delay_ms=5000):
super().__init__(initial_state=self.spin, name='SpinDelayFlow')
self.delay_ms = delay_ms

async def spin(self):
from utils import spinner_task
from tasks import delay_task

(error,) = await spinner_task(
'Delaying for {}ms...'.format(self.delay_ms),
delay_task,
args=[self.delay_ms, True])

self.goto(self.show_success)

async def show_success(self):
from pages import SuccessPage
await SuccessPage(text='Delay Complete').show()
self.set_result(True)
2 changes: 0 additions & 2 deletions ports/stm32/boards/Passport/modules/flows/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
from .change_pin_flow import *
from .delete_account_flow import *
from .delete_multisig_flow import *
from .developer_functions_flow import *
from .erase_passport_flow import *
from .export_multisig_microsd_flow import *
from .export_multisig_qr_flow import *
Expand Down Expand Up @@ -59,7 +58,6 @@
from .sign_psbt_common_flow import *
from .sign_psbt_microsd_flow import *
from .sign_psbt_qr_flow import *
from .spin_delay_flow import *
from .system_test_camera_flow import *
from .system_test_microsd_flow import *
from .system_test_flow import *
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# SPDX-FileCopyrightText: © 2023 Foundation Devices, Inc. <hello@foundationdevices.com>
# SPDX-License-Identifier: GPL-3.0-or-later
#
# delete_deriveds_key_flow.py - Delete derived keys

from flows import Flow


class DeleteDerivedKeysFlow(Flow):
def __init__(self):
super().__init__(initial_state=self.confirm_delete, name='DeleteDerivedKeysFlow')

async def confirm_delete(self):
from pages import QuestionPage

result = await QuestionPage(text='Delete all Child Keys?').show()

if result:
self.goto(self.do_delete)
else:
self.set_result(False)

async def do_delete(self):
from common import settings
from pages import SuccessPage
settings.remove('derived_keys')
settings.save()
await SuccessPage(text='Keys Deleted').show()
self.set_result(True)

This file was deleted.

Loading

0 comments on commit aa7cd5f

Please sign in to comment.