Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PASS1-590: developer patch #208

Merged
merged 8 commits into from
Mar 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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