test with 0.7.5 files, which has an expanded config section
This commit is contained in:
parent
a681a8e6a0
commit
fcb1297139
@ -11,9 +11,9 @@ from gp2040ce_bintools.pico import get_bootsel_endpoints, read
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
STORAGE_BINARY_LOCATION = 0x1FE000
|
STORAGE_BINARY_LOCATION = 0x1FC000
|
||||||
STORAGE_MEMORY_ADDRESS = 0x101FE000
|
STORAGE_MEMORY_ADDRESS = 0x101FC000
|
||||||
STORAGE_SIZE = 8192
|
STORAGE_SIZE = 16384
|
||||||
|
|
||||||
FOOTER_SIZE = 12
|
FOOTER_SIZE = 12
|
||||||
FOOTER_MAGIC = b'\x65\xe3\xf1\xd2'
|
FOOTER_MAGIC = b'\x65\xe3\xf1\xd2'
|
||||||
@ -232,7 +232,7 @@ def visualize():
|
|||||||
group.add_argument('--usb', action='store_true', help="retrieve the config from a Pico board connected over USB "
|
group.add_argument('--usb', action='store_true', help="retrieve the config from a Pico board connected over USB "
|
||||||
"and in BOOTSEL mode")
|
"and in BOOTSEL mode")
|
||||||
group.add_argument('--filename', help=".bin file of a GP2040-CE board's storage section, bytes "
|
group.add_argument('--filename', help=".bin file of a GP2040-CE board's storage section, bytes "
|
||||||
"101FE000-10200000, or of a GP2040-CE's whole board dump "
|
"101FC000-10200000, or of a GP2040-CE's whole board dump "
|
||||||
"if --whole-board is specified")
|
"if --whole-board is specified")
|
||||||
args, _ = parser.parse_known_args()
|
args, _ = parser.parse_known_args()
|
||||||
|
|
||||||
|
@ -28,7 +28,7 @@ def firmware_binary():
|
|||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def storage_dump():
|
def storage_dump():
|
||||||
"""Read in a test storage dump file (101FE000-10200000) of a GP2040-CE board."""
|
"""Read in a test storage dump file (101FC000-10200000) of a GP2040-CE board."""
|
||||||
filename = os.path.join(HERE, 'test-files', 'test-storage-area.bin')
|
filename = os.path.join(HERE, 'test-files', 'test-storage-area.bin')
|
||||||
with open(filename, 'rb') as file:
|
with open(filename, 'rb') as file:
|
||||||
content = file.read()
|
content = file.read()
|
||||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -14,6 +14,7 @@ message GamepadOptions
|
|||||||
optional bool lockHotkeys = 7;
|
optional bool lockHotkeys = 7;
|
||||||
optional bool fourWayMode = 8;
|
optional bool fourWayMode = 8;
|
||||||
optional uint32 profileNumber = 9;
|
optional uint32 profileNumber = 9;
|
||||||
|
optional PS4ControllerType ps4ControllerType = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
message KeyboardMapping
|
message KeyboardMapping
|
||||||
@ -116,6 +117,40 @@ message PinMappings
|
|||||||
optional int32 pinButtonFn = 19;
|
optional int32 pinButtonFn = 19;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message GpioMappings
|
||||||
|
{
|
||||||
|
optional GpioAction pin00 = 1;
|
||||||
|
optional GpioAction pin01 = 2;
|
||||||
|
optional GpioAction pin02 = 3;
|
||||||
|
optional GpioAction pin03 = 4;
|
||||||
|
optional GpioAction pin04 = 5;
|
||||||
|
optional GpioAction pin05 = 6;
|
||||||
|
optional GpioAction pin06 = 7;
|
||||||
|
optional GpioAction pin07 = 8;
|
||||||
|
optional GpioAction pin08 = 9;
|
||||||
|
optional GpioAction pin09 = 10;
|
||||||
|
optional GpioAction pin10 = 11;
|
||||||
|
optional GpioAction pin11 = 12;
|
||||||
|
optional GpioAction pin12 = 13;
|
||||||
|
optional GpioAction pin13 = 14;
|
||||||
|
optional GpioAction pin14 = 15;
|
||||||
|
optional GpioAction pin15 = 16;
|
||||||
|
optional GpioAction pin16 = 17;
|
||||||
|
optional GpioAction pin17 = 18;
|
||||||
|
optional GpioAction pin18 = 19;
|
||||||
|
optional GpioAction pin19 = 20;
|
||||||
|
optional GpioAction pin20 = 21;
|
||||||
|
optional GpioAction pin21 = 22;
|
||||||
|
optional GpioAction pin22 = 23;
|
||||||
|
optional GpioAction pin23 = 24;
|
||||||
|
optional GpioAction pin24 = 25;
|
||||||
|
optional GpioAction pin25 = 26;
|
||||||
|
optional GpioAction pin26 = 27;
|
||||||
|
optional GpioAction pin27 = 28;
|
||||||
|
optional GpioAction pin28 = 29;
|
||||||
|
optional GpioAction pin29 = 30;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
message AlternativePinMappings
|
message AlternativePinMappings
|
||||||
{
|
{
|
||||||
@ -127,6 +162,10 @@ message AlternativePinMappings
|
|||||||
optional int32 pinButtonR1 = 6;
|
optional int32 pinButtonR1 = 6;
|
||||||
optional int32 pinButtonL2 = 7;
|
optional int32 pinButtonL2 = 7;
|
||||||
optional int32 pinButtonR2 = 8;
|
optional int32 pinButtonR2 = 8;
|
||||||
|
optional int32 pinDpadUp = 9;
|
||||||
|
optional int32 pinDpadDown = 10;
|
||||||
|
optional int32 pinDpadLeft = 11;
|
||||||
|
optional int32 pinDpadRight = 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -159,6 +198,7 @@ message DisplayOptions
|
|||||||
optional bool invert = 16;
|
optional bool invert = 16;
|
||||||
|
|
||||||
optional int32 displaySaverTimeout = 17;
|
optional int32 displaySaverTimeout = 17;
|
||||||
|
optional bool turnOffWhenSuspended = 18;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LEDOptions
|
message LEDOptions
|
||||||
@ -195,6 +235,8 @@ message LEDOptions
|
|||||||
optional int32 pledPin3 = 28;
|
optional int32 pledPin3 = 28;
|
||||||
optional int32 pledPin4 = 29;
|
optional int32 pledPin4 = 29;
|
||||||
optional uint32 pledColor = 30;
|
optional uint32 pledColor = 30;
|
||||||
|
|
||||||
|
optional bool turnOffWhenSuspended = 31;
|
||||||
};
|
};
|
||||||
|
|
||||||
// This has to be kept in sync with AnimationOptions in AnimationStation.hpp
|
// This has to be kept in sync with AnimationOptions in AnimationStation.hpp
|
||||||
@ -263,10 +305,17 @@ message AnalogOptions
|
|||||||
{
|
{
|
||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
|
|
||||||
optional int32 analogAdcPinX = 2;
|
optional int32 analogAdc1PinX = 2;
|
||||||
optional int32 analogAdcPinY = 3;
|
optional int32 analogAdc1PinY = 3;
|
||||||
optional bool forced_circularity = 4;
|
optional bool forced_circularity = 4;
|
||||||
optional uint32 analog_deadzone = 5;
|
optional uint32 analog_deadzone = 5;
|
||||||
|
optional int32 analogAdc2PinX = 6;
|
||||||
|
optional int32 analogAdc2PinY = 7;
|
||||||
|
optional DpadMode analogAdc1Mode = 8;
|
||||||
|
optional DpadMode analogAdc2Mode = 9;
|
||||||
|
optional InvertMode analogAdc1Invert = 10;
|
||||||
|
optional InvertMode analogAdc2Invert = 11;
|
||||||
|
optional bool auto_calibrate = 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
message TurboOptions
|
message TurboOptions
|
||||||
@ -298,20 +347,23 @@ message SliderOptions
|
|||||||
{
|
{
|
||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
|
|
||||||
optional int32 pinLS = 2;
|
optional int32 deprecatedPinSliderOne = 2;
|
||||||
optional int32 pinRS = 3;
|
optional int32 deprecatedPinSliderTwo = 3;
|
||||||
|
optional DpadMode deprecatedModeOne = 4;
|
||||||
|
optional DpadMode deprecatedModeTwo = 5;
|
||||||
|
optional DpadMode modeDefault = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SOCDSliderOptions
|
message SOCDSliderOptions
|
||||||
{
|
{
|
||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
|
|
||||||
optional int32 pinOne = 2;
|
optional int32 deprecatedPinOne = 2;
|
||||||
optional int32 pinTwo = 3;
|
optional int32 deprecatedPinTwo = 3;
|
||||||
|
|
||||||
optional SOCDMode modeDefault = 4;
|
optional SOCDMode modeDefault = 4;
|
||||||
optional SOCDMode modeOne = 5;
|
optional SOCDMode deprecatedModeOne = 5;
|
||||||
optional SOCDMode modeTwo = 6;
|
optional SOCDMode deprecatedModeTwo = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message ReverseOptions
|
message ReverseOptions
|
||||||
@ -342,10 +394,10 @@ message DualDirectionalOptions
|
|||||||
{
|
{
|
||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
|
|
||||||
optional int32 upPin = 2;
|
optional int32 deprecatedUpPin = 2;
|
||||||
optional int32 downPin = 3;
|
optional int32 deprecatedDownPin = 3;
|
||||||
optional int32 leftPin = 4;
|
optional int32 deprecatedLeftPin = 4;
|
||||||
optional int32 rightPin = 5;
|
optional int32 deprecatedRightPin = 5;
|
||||||
|
|
||||||
optional DpadMode dpadMode = 6;
|
optional DpadMode dpadMode = 6;
|
||||||
optional uint32 combineMode = 7;
|
optional uint32 combineMode = 7;
|
||||||
@ -358,7 +410,7 @@ message TiltOptions
|
|||||||
|
|
||||||
optional int32 tilt1Pin = 2;
|
optional int32 tilt1Pin = 2;
|
||||||
optional int32 tilt2Pin = 3;
|
optional int32 tilt2Pin = 3;
|
||||||
optional int32 tiltFunctionPin = 4;
|
optional int32 deprecatedTiltFunctionPin = 4;
|
||||||
optional int32 tiltLeftAnalogUpPin = 5;
|
optional int32 tiltLeftAnalogUpPin = 5;
|
||||||
optional int32 tiltLeftAnalogDownPin = 6;
|
optional int32 tiltLeftAnalogDownPin = 6;
|
||||||
optional int32 tiltLeftAnalogLeftPin = 7;
|
optional int32 tiltLeftAnalogLeftPin = 7;
|
||||||
@ -369,6 +421,15 @@ message TiltOptions
|
|||||||
optional int32 tiltRightAnalogRightPin = 12;
|
optional int32 tiltRightAnalogRightPin = 12;
|
||||||
|
|
||||||
optional SOCDMode tiltSOCDMode = 13;
|
optional SOCDMode tiltSOCDMode = 13;
|
||||||
|
|
||||||
|
optional int32 factorTilt1LeftX = 14;
|
||||||
|
optional int32 factorTilt1LeftY = 15;
|
||||||
|
optional int32 factorTilt1RightX = 16;
|
||||||
|
optional int32 factorTilt1RightY = 17;
|
||||||
|
optional int32 factorTilt2LeftX = 18;
|
||||||
|
optional int32 factorTilt2LeftY = 19;
|
||||||
|
optional int32 factorTilt2RightX = 20;
|
||||||
|
optional int32 factorTilt2RightY = 21;
|
||||||
}
|
}
|
||||||
|
|
||||||
message BuzzerOptions
|
message BuzzerOptions
|
||||||
@ -409,13 +470,130 @@ message PS4Options
|
|||||||
optional bytes rsaRN = 12 [(nanopb).max_size = 256];
|
optional bytes rsaRN = 12 [(nanopb).max_size = 256];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
message PSPassthroughOptions
|
||||||
|
{
|
||||||
|
optional bool enabled = 1;
|
||||||
|
optional int32 pinDplus = 2;
|
||||||
|
optional int32 pin5V = 3;
|
||||||
|
}
|
||||||
|
|
||||||
message WiiOptions
|
message WiiOptions
|
||||||
{
|
{
|
||||||
|
message AnalogAxis
|
||||||
|
{
|
||||||
|
optional int32 axisType = 1;
|
||||||
|
optional int32 minRange = 2;
|
||||||
|
optional int32 maxRange = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message StickOptions
|
||||||
|
{
|
||||||
|
optional AnalogAxis x = 1;
|
||||||
|
optional AnalogAxis y = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message NunchukOptions
|
||||||
|
{
|
||||||
|
optional int32 buttonC = 1;
|
||||||
|
optional int32 buttonZ = 2;
|
||||||
|
optional StickOptions stick = 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ClassicOptions
|
||||||
|
{
|
||||||
|
optional int32 buttonA = 1;
|
||||||
|
optional int32 buttonB = 2;
|
||||||
|
optional int32 buttonX = 3;
|
||||||
|
optional int32 buttonY = 4;
|
||||||
|
optional int32 buttonL = 5;
|
||||||
|
optional int32 buttonZL = 6;
|
||||||
|
optional int32 buttonR = 7;
|
||||||
|
optional int32 buttonZR = 8;
|
||||||
|
optional int32 buttonMinus = 9;
|
||||||
|
optional int32 buttonPlus = 10;
|
||||||
|
optional int32 buttonHome = 11;
|
||||||
|
optional int32 buttonUp = 12;
|
||||||
|
optional int32 buttonDown = 13;
|
||||||
|
optional int32 buttonLeft = 14;
|
||||||
|
optional int32 buttonRight = 15;
|
||||||
|
optional StickOptions rightStick = 17;
|
||||||
|
optional StickOptions leftStick = 16;
|
||||||
|
optional AnalogAxis leftTrigger = 18;
|
||||||
|
optional AnalogAxis rightTrigger = 19;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TaikoOptions
|
||||||
|
{
|
||||||
|
optional int32 buttonKatLeft = 1;
|
||||||
|
optional int32 buttonKatRight = 2;
|
||||||
|
optional int32 buttonDonLeft = 3;
|
||||||
|
optional int32 buttonDonRight = 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GuitarOptions
|
||||||
|
{
|
||||||
|
optional int32 buttonRed = 1;
|
||||||
|
optional int32 buttonGreen = 2;
|
||||||
|
optional int32 buttonYellow = 3;
|
||||||
|
optional int32 buttonBlue = 4;
|
||||||
|
optional int32 buttonOrange = 5;
|
||||||
|
optional int32 buttonPedal = 6;
|
||||||
|
optional int32 buttonMinus = 7;
|
||||||
|
optional int32 buttonPlus = 8;
|
||||||
|
optional int32 strumUp = 9;
|
||||||
|
optional int32 strumDown = 10;
|
||||||
|
optional StickOptions stick = 11;
|
||||||
|
optional AnalogAxis whammyBar = 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
message DrumOptions
|
||||||
|
{
|
||||||
|
optional int32 buttonRed = 1;
|
||||||
|
optional int32 buttonGreen = 2;
|
||||||
|
optional int32 buttonYellow = 3;
|
||||||
|
optional int32 buttonBlue = 4;
|
||||||
|
optional int32 buttonOrange = 5;
|
||||||
|
optional int32 buttonPedal = 6;
|
||||||
|
optional int32 buttonMinus = 7;
|
||||||
|
optional int32 buttonPlus = 8;
|
||||||
|
optional StickOptions stick = 9;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TurntableOptions
|
||||||
|
{
|
||||||
|
optional int32 buttonLeftRed = 1;
|
||||||
|
optional int32 buttonLeftGreen = 2;
|
||||||
|
optional int32 buttonLeftBlue = 3;
|
||||||
|
optional int32 buttonRightRed = 4;
|
||||||
|
optional int32 buttonRightGreen = 5;
|
||||||
|
optional int32 buttonRightBlue = 6;
|
||||||
|
optional int32 buttonMinus = 7;
|
||||||
|
optional int32 buttonPlus = 8;
|
||||||
|
optional int32 buttonEuphoria = 9;
|
||||||
|
optional StickOptions stick = 10;
|
||||||
|
optional AnalogAxis leftTurntable = 11;
|
||||||
|
optional AnalogAxis rightTurntable = 12;
|
||||||
|
optional AnalogAxis effects = 13;
|
||||||
|
optional AnalogAxis fader = 14;
|
||||||
|
}
|
||||||
|
|
||||||
|
message ControllerOptions
|
||||||
|
{
|
||||||
|
optional NunchukOptions nunchuk = 1;
|
||||||
|
optional ClassicOptions classic = 2;
|
||||||
|
optional TaikoOptions taiko = 3;
|
||||||
|
optional GuitarOptions guitar = 4;
|
||||||
|
optional DrumOptions drum = 5;
|
||||||
|
optional TurntableOptions turntable = 6;
|
||||||
|
}
|
||||||
|
|
||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
optional int32 i2cBlock = 2;
|
optional int32 i2cBlock = 2;
|
||||||
optional int32 i2cSDAPin = 3;
|
optional int32 i2cSDAPin = 3;
|
||||||
optional int32 i2cSCLPin = 4;
|
optional int32 i2cSCLPin = 4;
|
||||||
optional int32 i2cSpeed = 5;
|
optional int32 i2cSpeed = 5;
|
||||||
|
|
||||||
|
optional ControllerOptions controllers = 6;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SNESOptions
|
message SNESOptions
|
||||||
@ -431,6 +609,7 @@ message KeyboardHostOptions
|
|||||||
optional bool enabled = 1;
|
optional bool enabled = 1;
|
||||||
optional int32 pinDplus = 2;
|
optional int32 pinDplus = 2;
|
||||||
optional KeyboardMapping mapping = 3;
|
optional KeyboardMapping mapping = 3;
|
||||||
|
optional int32 pin5V = 4;
|
||||||
}
|
}
|
||||||
|
|
||||||
message FocusModeOptions
|
message FocusModeOptions
|
||||||
@ -441,6 +620,36 @@ message FocusModeOptions
|
|||||||
optional bool oledLockEnabled = 4;
|
optional bool oledLockEnabled = 4;
|
||||||
optional bool rgbLockEnabled = 5;
|
optional bool rgbLockEnabled = 5;
|
||||||
optional bool buttonLockEnabled = 6;
|
optional bool buttonLockEnabled = 6;
|
||||||
|
optional bool macroLockEnabled = 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MacroInput
|
||||||
|
{
|
||||||
|
optional uint32 buttonMask = 1;
|
||||||
|
optional uint32 duration = 2;
|
||||||
|
optional uint32 waitDuration = 3 [default = 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
message Macro
|
||||||
|
{
|
||||||
|
optional MacroType macroType = 1;
|
||||||
|
optional string macroLabel = 2 [(nanopb).max_length = 64];
|
||||||
|
repeated MacroInput macroInputs = 3 [(nanopb).max_count = 30];
|
||||||
|
optional bool enabled = 4;
|
||||||
|
optional bool useMacroTriggerButton = 5;
|
||||||
|
optional int32 macroTriggerPin = 6 [default = -1];
|
||||||
|
optional uint32 macroTriggerButton = 7;
|
||||||
|
optional bool exclusive = 8 [default = true];
|
||||||
|
optional bool interruptible = 9 [default = true];
|
||||||
|
optional bool showFrames = 10 [default = false];
|
||||||
|
}
|
||||||
|
|
||||||
|
message MacroOptions
|
||||||
|
{
|
||||||
|
optional bool enabled = 1;
|
||||||
|
optional int32 pin = 2;
|
||||||
|
optional bool macroBoardLedEnabled = 4;
|
||||||
|
repeated Macro macroList = 3 [(nanopb).max_count = 6];
|
||||||
}
|
}
|
||||||
|
|
||||||
message AddonOptions
|
message AddonOptions
|
||||||
@ -454,7 +663,7 @@ message AddonOptions
|
|||||||
optional AnalogADS1219Options analogADS1219Options = 7;
|
optional AnalogADS1219Options analogADS1219Options = 7;
|
||||||
optional DualDirectionalOptions dualDirectionalOptions = 8;
|
optional DualDirectionalOptions dualDirectionalOptions = 8;
|
||||||
optional BuzzerOptions buzzerOptions = 9;
|
optional BuzzerOptions buzzerOptions = 9;
|
||||||
optional ExtraButtonOptions extraButtonOptions = 10;
|
optional ExtraButtonOptions deprecatedExtraButtonOptions = 10;
|
||||||
optional PlayerNumberOptions playerNumberOptions = 11;
|
optional PlayerNumberOptions playerNumberOptions = 11;
|
||||||
optional PS4Options ps4Options = 12 [(nanopb).disallow_export = true];
|
optional PS4Options ps4Options = 12 [(nanopb).disallow_export = true];
|
||||||
optional WiiOptions wiiOptions = 13;
|
optional WiiOptions wiiOptions = 13;
|
||||||
@ -463,6 +672,14 @@ message AddonOptions
|
|||||||
optional FocusModeOptions focusModeOptions = 16;
|
optional FocusModeOptions focusModeOptions = 16;
|
||||||
optional KeyboardHostOptions keyboardHostOptions = 17;
|
optional KeyboardHostOptions keyboardHostOptions = 17;
|
||||||
optional TiltOptions tiltOptions = 18;
|
optional TiltOptions tiltOptions = 18;
|
||||||
|
optional PSPassthroughOptions psPassthroughOptions = 19;
|
||||||
|
optional MacroOptions macroOptions = 20;
|
||||||
|
}
|
||||||
|
|
||||||
|
message MigrationHistory
|
||||||
|
{
|
||||||
|
optional bool hotkeysMigrated = 1 [default = false];
|
||||||
|
optional bool gpioMappingsMigrated = 2 [default = false];
|
||||||
}
|
}
|
||||||
|
|
||||||
message Config
|
message Config
|
||||||
@ -471,7 +688,7 @@ message Config
|
|||||||
|
|
||||||
optional GamepadOptions gamepadOptions = 2;
|
optional GamepadOptions gamepadOptions = 2;
|
||||||
optional HotkeyOptions hotkeyOptions = 3;
|
optional HotkeyOptions hotkeyOptions = 3;
|
||||||
optional PinMappings pinMappings = 4;
|
optional PinMappings deprecatedPinMappings = 4;
|
||||||
optional KeyboardMapping keyboardMapping = 5;
|
optional KeyboardMapping keyboardMapping = 5;
|
||||||
optional DisplayOptions displayOptions = 6;
|
optional DisplayOptions displayOptions = 6;
|
||||||
optional LEDOptions ledOptions = 7;
|
optional LEDOptions ledOptions = 7;
|
||||||
@ -479,4 +696,8 @@ message Config
|
|||||||
optional AddonOptions addonOptions = 9;
|
optional AddonOptions addonOptions = 9;
|
||||||
optional ForcedSetupOptions forcedSetupOptions = 10;
|
optional ForcedSetupOptions forcedSetupOptions = 10;
|
||||||
optional ProfileOptions profileOptions = 11;
|
optional ProfileOptions profileOptions = 11;
|
||||||
|
|
||||||
|
optional string boardConfig = 12 [(nanopb).max_length = 63];
|
||||||
|
optional GpioMappings gpioMappings = 13;
|
||||||
|
optional MigrationHistory migrations = 14;
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ enum ButtonLayout
|
|||||||
BUTTON_LAYOUT_FIGHTBOARD_STICK = 10;
|
BUTTON_LAYOUT_FIGHTBOARD_STICK = 10;
|
||||||
BUTTON_LAYOUT_FIGHTBOARD_MIRRORED = 11;
|
BUTTON_LAYOUT_FIGHTBOARD_MIRRORED = 11;
|
||||||
BUTTON_LAYOUT_CUSTOMA = 12;
|
BUTTON_LAYOUT_CUSTOMA = 12;
|
||||||
|
BUTTON_LAYOUT_OPENCORE0WASDA = 13;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ButtonLayoutRight
|
enum ButtonLayoutRight
|
||||||
@ -42,6 +43,9 @@ enum ButtonLayoutRight
|
|||||||
BUTTON_LAYOUT_FIGHTBOARD = 14;
|
BUTTON_LAYOUT_FIGHTBOARD = 14;
|
||||||
BUTTON_LAYOUT_FIGHTBOARD_STICK_MIRRORED = 15;
|
BUTTON_LAYOUT_FIGHTBOARD_STICK_MIRRORED = 15;
|
||||||
BUTTON_LAYOUT_CUSTOMB = 16;
|
BUTTON_LAYOUT_CUSTOMB = 16;
|
||||||
|
BUTTON_LAYOUT_KEYBOARD8B = 17;
|
||||||
|
BUTTON_LAYOUT_OPENCORE0WASDB = 18;
|
||||||
|
BUTTON_LAYOUT_BSS = 99;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SplashMode
|
enum SplashMode
|
||||||
@ -73,6 +77,7 @@ enum OnBoardLedMode
|
|||||||
ON_BOARD_LED_MODE_OFF = 0;
|
ON_BOARD_LED_MODE_OFF = 0;
|
||||||
ON_BOARD_LED_MODE_MODE_INDICATOR = 1;
|
ON_BOARD_LED_MODE_MODE_INDICATOR = 1;
|
||||||
ON_BOARD_LED_MODE_INPUT_TEST = 2;
|
ON_BOARD_LED_MODE_INPUT_TEST = 2;
|
||||||
|
ON_BOARD_LED_MODE_PS_AUTH = 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum InputMode
|
enum InputMode
|
||||||
@ -96,6 +101,16 @@ enum DpadMode
|
|||||||
DPAD_MODE_RIGHT_ANALOG = 2;
|
DPAD_MODE_RIGHT_ANALOG = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum InvertMode
|
||||||
|
{
|
||||||
|
option (nanopb_enumopt).long_names = false;
|
||||||
|
|
||||||
|
INVERT_NONE = 0;
|
||||||
|
INVERT_X = 1;
|
||||||
|
INVERT_Y = 2;
|
||||||
|
INVERT_XY = 3;
|
||||||
|
}
|
||||||
|
|
||||||
enum SOCDMode
|
enum SOCDMode
|
||||||
{
|
{
|
||||||
option (nanopb_enumopt).long_names = false;
|
option (nanopb_enumopt).long_names = false;
|
||||||
@ -107,6 +122,48 @@ enum SOCDMode
|
|||||||
SOCD_MODE_BYPASS = 4; // U+D=UD, L+R=LR (No cleaning applied)
|
SOCD_MODE_BYPASS = 4; // U+D=UD, L+R=LR (No cleaning applied)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum GpioAction
|
||||||
|
{
|
||||||
|
option (nanopb_enumopt).long_names = false;
|
||||||
|
|
||||||
|
// the lowest value is the default, which should be NONE;
|
||||||
|
// reserving some numbers in case we need more not-mapped type values
|
||||||
|
NONE = -10;
|
||||||
|
RESERVED = -5;
|
||||||
|
ASSIGNED_TO_ADDON = 0;
|
||||||
|
BUTTON_PRESS_UP = 1;
|
||||||
|
BUTTON_PRESS_DOWN = 2;
|
||||||
|
BUTTON_PRESS_LEFT = 3;
|
||||||
|
BUTTON_PRESS_RIGHT = 4;
|
||||||
|
BUTTON_PRESS_B1 = 5;
|
||||||
|
BUTTON_PRESS_B2 = 6;
|
||||||
|
BUTTON_PRESS_B3 = 7;
|
||||||
|
BUTTON_PRESS_B4 = 8;
|
||||||
|
BUTTON_PRESS_L1 = 9;
|
||||||
|
BUTTON_PRESS_R1 = 10;
|
||||||
|
BUTTON_PRESS_L2 = 11;
|
||||||
|
BUTTON_PRESS_R2 = 12;
|
||||||
|
BUTTON_PRESS_S1 = 13;
|
||||||
|
BUTTON_PRESS_S2 = 14;
|
||||||
|
BUTTON_PRESS_A1 = 15;
|
||||||
|
BUTTON_PRESS_A2 = 16;
|
||||||
|
BUTTON_PRESS_L3 = 17;
|
||||||
|
BUTTON_PRESS_R3 = 18;
|
||||||
|
BUTTON_PRESS_FN = 19;
|
||||||
|
BUTTON_PRESS_DDI_UP = 20;
|
||||||
|
BUTTON_PRESS_DDI_DOWN = 21;
|
||||||
|
BUTTON_PRESS_DDI_LEFT = 22;
|
||||||
|
BUTTON_PRESS_DDI_RIGHT = 23;
|
||||||
|
SUSTAIN_DP_MODE_DP = 24;
|
||||||
|
SUSTAIN_DP_MODE_LS = 25;
|
||||||
|
SUSTAIN_DP_MODE_RS = 26;
|
||||||
|
SUSTAIN_SOCD_MODE_UP_PRIO = 27;
|
||||||
|
SUSTAIN_SOCD_MODE_NEUTRAL = 28;
|
||||||
|
SUSTAIN_SOCD_MODE_SECOND_WIN = 29;
|
||||||
|
SUSTAIN_SOCD_MODE_FIRST_WIN = 30;
|
||||||
|
SUSTAIN_SOCD_MODE_BYPASS = 31;
|
||||||
|
}
|
||||||
|
|
||||||
enum GamepadHotkey
|
enum GamepadHotkey
|
||||||
{
|
{
|
||||||
option (nanopb_enumopt).long_names = false;
|
option (nanopb_enumopt).long_names = false;
|
||||||
@ -130,6 +187,10 @@ enum GamepadHotkey
|
|||||||
HOTKEY_LOAD_PROFILE_2 = 16;
|
HOTKEY_LOAD_PROFILE_2 = 16;
|
||||||
HOTKEY_LOAD_PROFILE_3 = 17;
|
HOTKEY_LOAD_PROFILE_3 = 17;
|
||||||
HOTKEY_LOAD_PROFILE_4 = 18;
|
HOTKEY_LOAD_PROFILE_4 = 18;
|
||||||
|
HOTKEY_L3_BUTTON = 19;
|
||||||
|
HOTKEY_R3_BUTTON = 20;
|
||||||
|
HOTKEY_TOUCHPAD_BUTTON = 21;
|
||||||
|
HOTKEY_REBOOT_DEFAULT = 22;
|
||||||
}
|
}
|
||||||
|
|
||||||
// This has to be kept in sync with LEDFormat in NeoPico.hpp
|
// This has to be kept in sync with LEDFormat in NeoPico.hpp
|
||||||
@ -167,3 +228,20 @@ enum ForcedSetupMode
|
|||||||
FORCED_SETUP_MODE_LOCK_WEB_CONFIG = 2;
|
FORCED_SETUP_MODE_LOCK_WEB_CONFIG = 2;
|
||||||
FORCED_SETUP_MODE_LOCK_BOTH = 3;
|
FORCED_SETUP_MODE_LOCK_BOTH = 3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum PS4ControllerType
|
||||||
|
{
|
||||||
|
option (nanopb_enumopt).long_names = false;
|
||||||
|
|
||||||
|
PS4_CONTROLLER = 0;
|
||||||
|
PS4_ARCADESTICK = 7;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum MacroType
|
||||||
|
{
|
||||||
|
option (nanopb_enumopt).long_names = false;
|
||||||
|
|
||||||
|
ON_PRESS = 1;
|
||||||
|
ON_HOLD_REPEAT = 2;
|
||||||
|
ON_TOGGLE = 3;
|
||||||
|
};
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -55,13 +55,13 @@ def test_concatenate_to_usb(tmp_path):
|
|||||||
def test_padding_firmware(firmware_binary):
|
def test_padding_firmware(firmware_binary):
|
||||||
"""Test that firmware is padded to the expected size."""
|
"""Test that firmware is padded to the expected size."""
|
||||||
padded = pad_firmware_up_to_storage(firmware_binary)
|
padded = pad_firmware_up_to_storage(firmware_binary)
|
||||||
assert len(padded) == 2088960
|
assert len(padded) == 2080768
|
||||||
|
|
||||||
|
|
||||||
def test_padding_firmware_can_truncate():
|
def test_padding_firmware_can_truncate():
|
||||||
"""Test that firmware is padded to the expected size."""
|
"""Test that firmware is padded to the expected size."""
|
||||||
padded = pad_firmware_up_to_storage(bytearray(b'\x00' * 4 * 1024 * 1024), or_truncate=True)
|
padded = pad_firmware_up_to_storage(bytearray(b'\x00' * 4 * 1024 * 1024), or_truncate=True)
|
||||||
assert len(padded) == 2088960
|
assert len(padded) == 2080768
|
||||||
|
|
||||||
|
|
||||||
def test_firmware_plus_storage(firmware_binary, storage_dump):
|
def test_firmware_plus_storage(firmware_binary, storage_dump):
|
||||||
@ -70,7 +70,7 @@ def test_firmware_plus_storage(firmware_binary, storage_dump):
|
|||||||
# if this is valid, we should be able to find the storage and footer again
|
# if this is valid, we should be able to find the storage and footer again
|
||||||
storage = get_storage_section(whole_board)
|
storage = get_storage_section(whole_board)
|
||||||
footer_size, _, _ = get_config_footer(storage)
|
footer_size, _, _ = get_config_footer(storage)
|
||||||
assert footer_size == 2032
|
assert footer_size == 3309
|
||||||
|
|
||||||
|
|
||||||
def test_firmware_plus_config_binary(firmware_binary, config_binary):
|
def test_firmware_plus_config_binary(firmware_binary, config_binary):
|
||||||
@ -79,7 +79,7 @@ def test_firmware_plus_config_binary(firmware_binary, config_binary):
|
|||||||
# if this is valid, we should be able to find the storage and footer again
|
# if this is valid, we should be able to find the storage and footer again
|
||||||
storage = get_storage_section(whole_board)
|
storage = get_storage_section(whole_board)
|
||||||
footer_size, _, _ = get_config_footer(storage)
|
footer_size, _, _ = get_config_footer(storage)
|
||||||
assert footer_size == 2032
|
assert footer_size == 3309
|
||||||
|
|
||||||
|
|
||||||
def test_chunky_firmware_plus_config_binary(config_binary):
|
def test_chunky_firmware_plus_config_binary(config_binary):
|
||||||
@ -88,7 +88,7 @@ def test_chunky_firmware_plus_config_binary(config_binary):
|
|||||||
# if this is valid, we should be able to find the storage and footer again
|
# if this is valid, we should be able to find the storage and footer again
|
||||||
storage = get_storage_section(whole_board)
|
storage = get_storage_section(whole_board)
|
||||||
footer_size, _, _ = get_config_footer(storage)
|
footer_size, _, _ = get_config_footer(storage)
|
||||||
assert footer_size == 2032
|
assert footer_size == 3309
|
||||||
|
|
||||||
|
|
||||||
def test_replace_config_in_binary(config_binary):
|
def test_replace_config_in_binary(config_binary):
|
||||||
@ -98,7 +98,7 @@ def test_replace_config_in_binary(config_binary):
|
|||||||
# if this is valid, we should be able to find the storage and footer again
|
# if this is valid, we should be able to find the storage and footer again
|
||||||
storage = get_storage_section(whole_board)
|
storage = get_storage_section(whole_board)
|
||||||
footer_size, _, _ = get_config_footer(storage)
|
footer_size, _, _ = get_config_footer(storage)
|
||||||
assert footer_size == 2032
|
assert footer_size == 3309
|
||||||
|
|
||||||
|
|
||||||
def test_replace_config_in_binary_not_big_enough(config_binary):
|
def test_replace_config_in_binary_not_big_enough(config_binary):
|
||||||
@ -108,7 +108,7 @@ def test_replace_config_in_binary_not_big_enough(config_binary):
|
|||||||
# if this is valid, we should be able to find the storage and footer again
|
# if this is valid, we should be able to find the storage and footer again
|
||||||
storage = get_storage_section(whole_board)
|
storage = get_storage_section(whole_board)
|
||||||
footer_size, _, _ = get_config_footer(storage)
|
footer_size, _, _ = get_config_footer(storage)
|
||||||
assert footer_size == 2032
|
assert footer_size == 3309
|
||||||
|
|
||||||
|
|
||||||
def test_padding_firmware_too_big(firmware_binary):
|
def test_padding_firmware_too_big(firmware_binary):
|
||||||
@ -128,15 +128,15 @@ def test_write_new_config_to_whole_board(whole_board_dump, tmp_path):
|
|||||||
board_dump = file.read()
|
board_dump = file.read()
|
||||||
|
|
||||||
config = get_config(get_storage_section(board_dump))
|
config = get_config(get_storage_section(board_dump))
|
||||||
assert config.boardVersion == 'v0.7.2'
|
assert config.boardVersion == 'v0.7.5'
|
||||||
config.boardVersion = 'v0.7.2-COOL'
|
config.boardVersion = 'v0.7.5-COOL'
|
||||||
write_new_config_to_filename(config, tmp_file, inject=True)
|
write_new_config_to_filename(config, tmp_file, inject=True)
|
||||||
|
|
||||||
# read new file
|
# read new file
|
||||||
with open(tmp_file, 'rb') as file:
|
with open(tmp_file, 'rb') as file:
|
||||||
new_board_dump = file.read()
|
new_board_dump = file.read()
|
||||||
config = get_config(get_storage_section(new_board_dump))
|
config = get_config(get_storage_section(new_board_dump))
|
||||||
assert config.boardVersion == 'v0.7.2-COOL'
|
assert config.boardVersion == 'v0.7.5-COOL'
|
||||||
assert len(board_dump) == len(new_board_dump)
|
assert len(board_dump) == len(new_board_dump)
|
||||||
|
|
||||||
|
|
||||||
@ -149,14 +149,14 @@ def test_write_new_config_to_firmware(firmware_binary, tmp_path):
|
|||||||
|
|
||||||
config_pb2 = get_config_pb2()
|
config_pb2 = get_config_pb2()
|
||||||
config = config_pb2.Config()
|
config = config_pb2.Config()
|
||||||
config.boardVersion = 'v0.7.2-COOL'
|
config.boardVersion = 'v0.7.5-COOL'
|
||||||
write_new_config_to_filename(config, tmp_file, inject=True)
|
write_new_config_to_filename(config, tmp_file, inject=True)
|
||||||
|
|
||||||
# read new file
|
# read new file
|
||||||
with open(tmp_file, 'rb') as file:
|
with open(tmp_file, 'rb') as file:
|
||||||
new_board_dump = file.read()
|
new_board_dump = file.read()
|
||||||
config = get_config(get_storage_section(new_board_dump))
|
config = get_config(get_storage_section(new_board_dump))
|
||||||
assert config.boardVersion == 'v0.7.2-COOL'
|
assert config.boardVersion == 'v0.7.5-COOL'
|
||||||
assert len(new_board_dump) == 2 * 1024 * 1024
|
assert len(new_board_dump) == 2 * 1024 * 1024
|
||||||
|
|
||||||
|
|
||||||
@ -166,7 +166,7 @@ def test_write_new_config_to_config_bin(firmware_binary, tmp_path):
|
|||||||
tmp_file = os.path.join(tmp_path, 'config.bin')
|
tmp_file = os.path.join(tmp_path, 'config.bin')
|
||||||
config_pb2 = get_config_pb2()
|
config_pb2 = get_config_pb2()
|
||||||
config = config_pb2.Config()
|
config = config_pb2.Config()
|
||||||
config.boardVersion = 'v0.7.2-COOL'
|
config.boardVersion = 'v0.7.5-COOL'
|
||||||
write_new_config_to_filename(config, tmp_file)
|
write_new_config_to_filename(config, tmp_file)
|
||||||
|
|
||||||
# read new file
|
# read new file
|
||||||
@ -174,7 +174,7 @@ def test_write_new_config_to_config_bin(firmware_binary, tmp_path):
|
|||||||
config_dump = file.read()
|
config_dump = file.read()
|
||||||
config = get_config(config_dump)
|
config = get_config(config_dump)
|
||||||
config_size, _, _ = get_config_footer(config_dump)
|
config_size, _, _ = get_config_footer(config_dump)
|
||||||
assert config.boardVersion == 'v0.7.2-COOL'
|
assert config.boardVersion == 'v0.7.5-COOL'
|
||||||
assert len(config_dump) == config_size + 12
|
assert len(config_dump) == config_size + 12
|
||||||
|
|
||||||
|
|
||||||
@ -188,8 +188,8 @@ def test_write_new_config_to_usb(config_binary):
|
|||||||
write_new_config_to_usb(config, end_out, end_in)
|
write_new_config_to_usb(config, end_out, end_in)
|
||||||
|
|
||||||
# check that it got padded
|
# check that it got padded
|
||||||
assert len(serialized) == 2044
|
assert len(serialized) == 3321
|
||||||
padded_serialized = bytearray(b'\x00' * 2052) + serialized
|
padded_serialized = bytearray(b'\x00' * 775) + serialized
|
||||||
assert mock_write.call_args.args[2] % 4096 == 0
|
assert mock_write.call_args.args[2] % 4096 == 0
|
||||||
assert mock_write.call_args.args[3] == padded_serialized
|
assert mock_write.call_args.args[3] == padded_serialized
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ def test_concatenate_invocation(tmpdir):
|
|||||||
with open(out_filename, 'rb') as out_file, open('tests/test-files/test-storage-area.bin', 'rb') as storage_file:
|
with open(out_filename, 'rb') as out_file, open('tests/test-files/test-storage-area.bin', 'rb') as storage_file:
|
||||||
out = out_file.read()
|
out = out_file.read()
|
||||||
storage = storage_file.read()
|
storage = storage_file.read()
|
||||||
assert out[2088960:2097152] == storage
|
assert out[2080768:2097152] == storage
|
||||||
|
|
||||||
|
|
||||||
def test_storage_dump_invocation():
|
def test_storage_dump_invocation():
|
||||||
@ -52,7 +52,7 @@ def test_storage_dump_invocation():
|
|||||||
result = run(['visualize-storage', '-P', 'tests/test-files/proto-files',
|
result = run(['visualize-storage', '-P', 'tests/test-files/proto-files',
|
||||||
'--filename', 'tests/test-files/test-storage-area.bin'],
|
'--filename', 'tests/test-files/test-storage-area.bin'],
|
||||||
capture_output=True, encoding='utf8')
|
capture_output=True, encoding='utf8')
|
||||||
assert 'boardVersion: "v0.7.2"' in result.stdout
|
assert 'boardVersion: "v0.7.5"' in result.stdout
|
||||||
|
|
||||||
|
|
||||||
def test_debug_storage_dump_invocation():
|
def test_debug_storage_dump_invocation():
|
||||||
@ -60,8 +60,8 @@ def test_debug_storage_dump_invocation():
|
|||||||
result = run(['visualize-storage', '-d', '-P', 'tests/test-files/proto-files',
|
result = run(['visualize-storage', '-d', '-P', 'tests/test-files/proto-files',
|
||||||
'--filename', 'tests/test-files/test-storage-area.bin'],
|
'--filename', 'tests/test-files/test-storage-area.bin'],
|
||||||
capture_output=True, encoding='utf8')
|
capture_output=True, encoding='utf8')
|
||||||
assert 'boardVersion: "v0.7.2"' in result.stdout
|
assert 'boardVersion: "v0.7.5"' in result.stdout
|
||||||
assert 'length of content to look for footer in: 8192' in result.stderr
|
assert 'length of content to look for footer in: 16384' in result.stderr
|
||||||
|
|
||||||
|
|
||||||
def test_storage_dump_json_invocation():
|
def test_storage_dump_json_invocation():
|
||||||
@ -70,4 +70,4 @@ def test_storage_dump_json_invocation():
|
|||||||
'--filename', 'tests/test-files/test-storage-area.bin'],
|
'--filename', 'tests/test-files/test-storage-area.bin'],
|
||||||
capture_output=True, encoding='utf8')
|
capture_output=True, encoding='utf8')
|
||||||
to_dict = json.loads(result.stdout)
|
to_dict = json.loads(result.stdout)
|
||||||
assert to_dict['boardVersion'] == 'v0.7.2'
|
assert to_dict['boardVersion'] == 'v0.7.5'
|
||||||
|
@ -73,12 +73,12 @@ async def test_simple_tree_building():
|
|||||||
"""Test some basics of the config tree being built."""
|
"""Test some basics of the config tree being built."""
|
||||||
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
check_node = pilot.app.query_one(Tree).root.children[2]
|
check_node = pilot.app.query_one(Tree).root.children[3]
|
||||||
assert "boardVersion = 'v0.7.2'" in check_node.label
|
assert "boardVersion = 'v0.7.5'" in check_node.label
|
||||||
parent_config, field_descriptor, field_value = check_node.data
|
parent_config, field_descriptor, field_value = check_node.data
|
||||||
assert parent_config == pilot.app.config
|
assert parent_config == pilot.app.config
|
||||||
assert field_descriptor == pilot.app.config.DESCRIPTOR.fields_by_name['boardVersion']
|
assert field_descriptor == pilot.app.config.DESCRIPTOR.fields_by_name['boardVersion']
|
||||||
assert field_value == 'v0.7.2'
|
assert field_value == 'v0.7.5'
|
||||||
app.exit()
|
app.exit()
|
||||||
|
|
||||||
|
|
||||||
@ -89,7 +89,7 @@ async def test_simple_toggle():
|
|||||||
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
tree = pilot.app.query_one(Tree)
|
tree = pilot.app.query_one(Tree)
|
||||||
display_node = tree.root.children[3]
|
display_node = tree.root.children[5]
|
||||||
invert_node = display_node.children[11]
|
invert_node = display_node.children[11]
|
||||||
|
|
||||||
assert 'False' in invert_node.label
|
assert 'False' in invert_node.label
|
||||||
@ -104,7 +104,7 @@ async def test_simple_edit_via_input_field():
|
|||||||
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
tree = pilot.app.query_one(Tree)
|
tree = pilot.app.query_one(Tree)
|
||||||
display_node = tree.root.children[3]
|
display_node = tree.root.children[5]
|
||||||
i2cspeed_node = display_node.children[10]
|
i2cspeed_node = display_node.children[10]
|
||||||
assert pilot.app.config.displayOptions.i2cSpeed == 400000
|
assert pilot.app.config.displayOptions.i2cSpeed == 400000
|
||||||
|
|
||||||
@ -128,7 +128,7 @@ async def test_simple_edit_via_input_field_enum():
|
|||||||
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
tree = pilot.app.query_one(Tree)
|
tree = pilot.app.query_one(Tree)
|
||||||
gamepad_node = tree.root.children[5]
|
gamepad_node = tree.root.children[7]
|
||||||
dpadmode_node = gamepad_node.children[0]
|
dpadmode_node = gamepad_node.children[0]
|
||||||
assert pilot.app.config.gamepadOptions.dpadMode == 0
|
assert pilot.app.config.gamepadOptions.dpadMode == 0
|
||||||
|
|
||||||
@ -152,8 +152,8 @@ async def test_simple_edit_via_input_field_string():
|
|||||||
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
tree = pilot.app.query_one(Tree)
|
tree = pilot.app.query_one(Tree)
|
||||||
version_node = tree.root.children[2]
|
version_node = tree.root.children[3]
|
||||||
assert pilot.app.config.boardVersion == 'v0.7.2'
|
assert pilot.app.config.boardVersion == 'v0.7.5'
|
||||||
|
|
||||||
tree.select_node(version_node)
|
tree.select_node(version_node)
|
||||||
tree.action_select_cursor()
|
tree.action_select_cursor()
|
||||||
@ -173,7 +173,7 @@ async def test_add_node_to_repeated():
|
|||||||
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
app = ConfigEditor(config_filename=os.path.join(HERE, 'test-files/test-config.bin'))
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
tree = pilot.app.query_one(Tree)
|
tree = pilot.app.query_one(Tree)
|
||||||
profile_node = tree.root.children[10]
|
profile_node = tree.root.children[13]
|
||||||
altpinmappings_node = profile_node.children[0]
|
altpinmappings_node = profile_node.children[0]
|
||||||
|
|
||||||
tree.root.expand_all()
|
tree.root.expand_all()
|
||||||
@ -207,8 +207,8 @@ async def test_save(config_binary, tmp_path):
|
|||||||
|
|
||||||
app = ConfigEditor(config_filename=new_filename)
|
app = ConfigEditor(config_filename=new_filename)
|
||||||
async with app.run_test() as pilot:
|
async with app.run_test() as pilot:
|
||||||
pilot.app.config.boardVersion = 'v0.7.2-bss-wuz-here'
|
pilot.app.config.boardVersion = 'v0.7.5-bss-wuz-here'
|
||||||
await pilot.press('s')
|
await pilot.press('s')
|
||||||
|
|
||||||
config = get_config_from_file(new_filename)
|
config = get_config_from_file(new_filename)
|
||||||
assert config.boardVersion == 'v0.7.2-bss-wuz-here'
|
assert config.boardVersion == 'v0.7.5-bss-wuz-here'
|
||||||
|
@ -96,9 +96,9 @@ def test_exit_xip():
|
|||||||
def test_erase():
|
def test_erase():
|
||||||
"""Test that we can send a command to erase a section of memory."""
|
"""Test that we can send a command to erase a section of memory."""
|
||||||
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
||||||
pico.erase(end_out, end_in, 0x101FE000, 8192)
|
pico.erase(end_out, end_in, 0x101FC000, 8192)
|
||||||
|
|
||||||
payload = struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x3, 8, 0, 0x101FE000, 8192)
|
payload = struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x3, 8, 0, 0x101FC000, 8192)
|
||||||
end_out.write.assert_called_with(payload)
|
end_out.write.assert_called_with(payload)
|
||||||
end_in.read.assert_called_once()
|
end_in.read.assert_called_once()
|
||||||
|
|
||||||
@ -107,12 +107,12 @@ def test_read():
|
|||||||
"""Test that we can read a memory of a BOOTSEL board in a variety of conditions."""
|
"""Test that we can read a memory of a BOOTSEL board in a variety of conditions."""
|
||||||
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
||||||
end_in.read.return_value = array('B', b'\x11' * 256)
|
end_in.read.return_value = array('B', b'\x11' * 256)
|
||||||
content = pico.read(end_out, end_in, 0x101FE000, 256)
|
content = pico.read(end_out, end_in, 0x101FC000, 256)
|
||||||
|
|
||||||
expected_writes = [
|
expected_writes = [
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FE000, 256)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FC000, 256)),
|
||||||
mock.call(b'\xc0'),
|
mock.call(b'\xc0'),
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
||||||
]
|
]
|
||||||
@ -125,12 +125,12 @@ def test_read_shorter_than_chunk():
|
|||||||
"""Test that we can read a memory of a BOOTSEL board in a variety of conditions."""
|
"""Test that we can read a memory of a BOOTSEL board in a variety of conditions."""
|
||||||
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
||||||
end_in.read.return_value = array('B', b'\x11' * 256)
|
end_in.read.return_value = array('B', b'\x11' * 256)
|
||||||
content = pico.read(end_out, end_in, 0x101FE000, 128)
|
content = pico.read(end_out, end_in, 0x101FC000, 128)
|
||||||
|
|
||||||
expected_writes = [
|
expected_writes = [
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FE000, 256)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FC000, 256)),
|
||||||
mock.call(b'\xc0'),
|
mock.call(b'\xc0'),
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
||||||
]
|
]
|
||||||
@ -143,15 +143,15 @@ def test_read_bigger_than_chunk():
|
|||||||
"""Test that we can read a memory of a BOOTSEL board in a variety of conditions."""
|
"""Test that we can read a memory of a BOOTSEL board in a variety of conditions."""
|
||||||
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
||||||
end_in.read.return_value = array('B', b'\x11' * 256)
|
end_in.read.return_value = array('B', b'\x11' * 256)
|
||||||
content = pico.read(end_out, end_in, 0x101FE000, 512)
|
content = pico.read(end_out, end_in, 0x101FC000, 512)
|
||||||
|
|
||||||
expected_writes = [
|
expected_writes = [
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FE000, 256)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FC000, 256)),
|
||||||
mock.call(b'\xc0'),
|
mock.call(b'\xc0'),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FE000+256, 256)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x84, 8, 256, 0x101FC000+256, 256)),
|
||||||
mock.call(b'\xc0'),
|
mock.call(b'\xc0'),
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
||||||
]
|
]
|
||||||
@ -172,13 +172,13 @@ def test_reboot():
|
|||||||
def test_write():
|
def test_write():
|
||||||
"""Test that we can write to a board in BOOTSEL mode."""
|
"""Test that we can write to a board in BOOTSEL mode."""
|
||||||
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
end_out, end_in = mock.MagicMock(), mock.MagicMock()
|
||||||
_ = pico.write(end_out, end_in, 0x101FE000, b'\x00\x01\x02\x03')
|
_ = pico.write(end_out, end_in, 0x101FC000, b'\x00\x01\x02\x03')
|
||||||
|
|
||||||
expected_writes = [
|
expected_writes = [
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 1)),
|
||||||
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
mock.call(struct.pack('<LLBBxxL16x', 0x431fd10b, 1, 0x6, 0, 0)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x3, 8, 0, 0x101FE000, 4)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x3, 8, 0, 0x101FC000, 4)),
|
||||||
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x5, 8, 4, 0x101FE000, 4)),
|
mock.call(struct.pack('<LLBBxxLLL8x', 0x431fd10b, 1, 0x5, 8, 4, 0x101FC000, 4)),
|
||||||
mock.call(b'\x00\x01\x02\x03'),
|
mock.call(b'\x00\x01\x02\x03'),
|
||||||
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
mock.call(struct.pack('<LLBBxxLL12x', 0x431fd10b, 1, 0x1, 1, 0, 0)),
|
||||||
]
|
]
|
||||||
|
@ -26,8 +26,8 @@ def with_pb2s(test, *args, **kwargs):
|
|||||||
def test_config_footer(storage_dump):
|
def test_config_footer(storage_dump):
|
||||||
"""Test that a config footer is identified as expected."""
|
"""Test that a config footer is identified as expected."""
|
||||||
size, crc, magic = storage.get_config_footer(storage_dump)
|
size, crc, magic = storage.get_config_footer(storage_dump)
|
||||||
assert size == 2032
|
assert size == 3309
|
||||||
assert crc == 3799109329
|
assert crc == 2661279683
|
||||||
assert magic == '0x65e3f1d2'
|
assert magic == '0x65e3f1d2'
|
||||||
|
|
||||||
|
|
||||||
@ -76,7 +76,7 @@ def test_get_config_from_file_storage_dump():
|
|||||||
"""Test that we can open a storage dump file and find its config."""
|
"""Test that we can open a storage dump file and find its config."""
|
||||||
filename = os.path.join(HERE, 'test-files', 'test-storage-area.bin')
|
filename = os.path.join(HERE, 'test-files', 'test-storage-area.bin')
|
||||||
config = storage.get_config_from_file(filename)
|
config = storage.get_config_from_file(filename)
|
||||||
assert config.boardVersion == 'v0.7.2'
|
assert config.boardVersion == 'v0.7.5'
|
||||||
assert config.addonOptions.bootselButtonOptions.enabled is False
|
assert config.addonOptions.bootselButtonOptions.enabled is False
|
||||||
assert config.addonOptions.ps4Options.enabled is False
|
assert config.addonOptions.ps4Options.enabled is False
|
||||||
|
|
||||||
@ -86,7 +86,7 @@ def test_get_config_from_file_whole_board_dump():
|
|||||||
"""Test that we can open a storage dump file and find its config."""
|
"""Test that we can open a storage dump file and find its config."""
|
||||||
filename = os.path.join(HERE, 'test-files', 'test-whole-board.bin')
|
filename = os.path.join(HERE, 'test-files', 'test-whole-board.bin')
|
||||||
config = storage.get_config_from_file(filename, whole_board=True)
|
config = storage.get_config_from_file(filename, whole_board=True)
|
||||||
assert config.boardVersion == 'v0.7.2'
|
assert config.boardVersion == 'v0.7.5'
|
||||||
assert config.addonOptions.bootselButtonOptions.enabled is False
|
assert config.addonOptions.bootselButtonOptions.enabled is False
|
||||||
|
|
||||||
|
|
||||||
@ -109,24 +109,27 @@ def test_get_config_from_file_file_not_fonud_raise():
|
|||||||
def test_config_parses(storage_dump):
|
def test_config_parses(storage_dump):
|
||||||
"""Test that we need the config_pb2 to exist/be compiled for reading the config to work."""
|
"""Test that we need the config_pb2 to exist/be compiled for reading the config to work."""
|
||||||
config = storage.get_config(storage_dump)
|
config = storage.get_config(storage_dump)
|
||||||
assert config.boardVersion == 'v0.7.2'
|
assert config.boardVersion == 'v0.7.5'
|
||||||
assert config.hotkeyOptions.hotkey01.dpadMask == 1
|
assert config.hotkeyOptions.hotkey01.dpadMask == 0
|
||||||
|
assert config.hotkeyOptions.hotkey02.dpadMask == 1
|
||||||
|
|
||||||
|
|
||||||
@with_pb2s
|
@with_pb2s
|
||||||
def test_config_from_whole_board_parses(whole_board_dump):
|
def test_config_from_whole_board_parses(whole_board_dump):
|
||||||
"""Test that we can read in a whole board and still find the config section."""
|
"""Test that we can read in a whole board and still find the config section."""
|
||||||
config = storage.get_config(storage.get_storage_section(whole_board_dump))
|
config = storage.get_config(storage.get_storage_section(whole_board_dump))
|
||||||
assert config.boardVersion == 'v0.7.2'
|
assert config.boardVersion == 'v0.7.5'
|
||||||
assert config.hotkeyOptions.hotkey01.dpadMask == 1
|
assert config.hotkeyOptions.hotkey01.dpadMask == 0
|
||||||
|
assert config.hotkeyOptions.hotkey02.dpadMask == 1
|
||||||
|
|
||||||
|
|
||||||
@with_pb2s
|
@with_pb2s
|
||||||
def test_serialize_config_with_footer(storage_dump):
|
def test_serialize_config_with_footer(storage_dump, config_binary):
|
||||||
"""Test that reserializing a read in config matches the original."""
|
"""Test that reserializing a read in config matches the original."""
|
||||||
config = storage.get_config(storage_dump)
|
config = storage.get_config(storage_dump)
|
||||||
assert config.boardVersion == 'v0.7.2'
|
assert config.boardVersion == 'v0.7.5'
|
||||||
reserialized = storage.serialize_config_with_footer(config)
|
reserialized = storage.serialize_config_with_footer(config)
|
||||||
|
assert config_binary == reserialized
|
||||||
assert storage_dump[-12:] == reserialized[-12:]
|
assert storage_dump[-12:] == reserialized[-12:]
|
||||||
|
|
||||||
|
|
||||||
@ -134,7 +137,7 @@ def test_serialize_config_with_footer(storage_dump):
|
|||||||
def test_serialize_modified_config_with_footer(storage_dump):
|
def test_serialize_modified_config_with_footer(storage_dump):
|
||||||
"""Test that we can serialize a modified config."""
|
"""Test that we can serialize a modified config."""
|
||||||
config = storage.get_config(storage_dump)
|
config = storage.get_config(storage_dump)
|
||||||
config.boardVersion == 'v0.7.2-cool'
|
config.boardVersion = 'v0.7.5-cool'
|
||||||
serialized = storage.serialize_config_with_footer(config)
|
serialized = storage.serialize_config_with_footer(config)
|
||||||
config_size, _, _ = storage.get_config_footer(serialized)
|
config_size, _, _ = storage.get_config_footer(serialized)
|
||||||
assert config_size == config.ByteSize()
|
assert config_size == config.ByteSize()
|
||||||
@ -144,7 +147,7 @@ def test_serialize_modified_config_with_footer(storage_dump):
|
|||||||
def test_pad_config_to_storage(config_binary):
|
def test_pad_config_to_storage(config_binary):
|
||||||
"""Test that we can properly pad a config section to the correct storage section size."""
|
"""Test that we can properly pad a config section to the correct storage section size."""
|
||||||
storage_section = storage.pad_config_to_storage_size(config_binary)
|
storage_section = storage.pad_config_to_storage_size(config_binary)
|
||||||
assert len(storage_section) == 8192
|
assert len(storage_section) == 16384
|
||||||
|
|
||||||
|
|
||||||
def test_pad_config_to_storage_raises(config_binary):
|
def test_pad_config_to_storage_raises(config_binary):
|
||||||
@ -167,5 +170,5 @@ def test_get_config_from_usb(config_binary):
|
|||||||
config, _, _ = storage.get_config_from_usb()
|
config, _, _ = storage.get_config_from_usb()
|
||||||
|
|
||||||
mock_get.assert_called_once()
|
mock_get.assert_called_once()
|
||||||
mock_read.assert_called_with(mock_out, mock_in, 0x101FE000, 8192)
|
mock_read.assert_called_with(mock_out, mock_in, 0x101FC000, 16384)
|
||||||
assert config == storage.get_config(config_binary)
|
assert config == storage.get_config(config_binary)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user