"""Actual RP2040 UF2/BIN application evidence, without PlatformIO or hardware.""" from pathlib import Path import json import os import shlex import struct import subprocess import sys import tempfile import unittest ROOT = Path(__file__).resolve().parents[1] sys.path.insert(0, str(ROOT / 'scripts')) from rp2040_application import FLASH_BASE, FLASH_END, read_application CAPABILITY = 'companion.picow.combined' MARKER = b'meshcore.capability.companion.picow.combined.v1' def uf2(application, padding=255): count = (len(application) + 255) // 256 payload = application + bytes([padding]) * (count * 256 - len(application)) blocks = [] for index in range(count): block = bytearray(512) struct.pack_into('<8I', block, 0, 0x0A324655, 0x9E5D5157, 0x2000, FLASH_BASE + index * 256, 256, index, count, 0xE48BFF56) block[32:288] = payload[index * 256:(index + 1) * 256] struct.pack_into('&2; return 99; } PIO_BUILD_DIR_OVERRIDE=@BUILD@ OUTPUT_DIR=@OUTPUT@ BUILD_PROFILE_FOR_TARGET=auto BUILD_RECIPE_SHA256=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa BUILD_CAPABILITIES=() BUILD_REDUCTIONS=() BUILD_EXPECTATIONS=() BUILD_APPLICATION_EXPECTATIONS=('companion.picow.combined=meshcore.capability.companion.picow.combined.v1') write_build_capability_manifest PicoW_companion_radio RP2040_PLATFORM PicoW_companion_radio fixture ''' program = program.replace('@BUILD@', shlex.quote(str(self.path / 'build'))).replace('@OUTPUT@', shlex.quote(str(output))) result = subprocess.run(['bash', '-c', program], cwd=ROOT, capture_output=True, text=True) self.assertEqual(result.returncode, 0, result.stdout + result.stderr) manifest = json.loads((output / 'fixture.capabilities.json').read_text()) self.assertTrue(manifest['verified']) self.assertIn(CAPABILITY, manifest['capabilities']) self.assertEqual(manifest['ota_update_methods'], []) if __name__ == '__main__': unittest.main()