Smart Injection profile format (.injprof)
File format reference for CAN Commander Smart Injection profiles (.injprof).
Mirrored from CAN_Commander_FlipperZero/can_commander/README_SLOT_SET_FORMAT.md in the repository.
This document describes the on-disk format used by the Flipper app to save and load Smart Injection Profiles.
What a Smart Injection profile is
A Smart Injection profile is a saved preset containing:
- A human-readable set name.
- All 5 Smart Injection slot configurations.
- The currently selected slot index.
This is Flipper-side UI/config persistence. Firmware runtime state is separate.
File location and naming
Saved Smart Injection profiles are stored in:
apps_data/can_commander/injection_profiles/
Each profile is saved as:
<safe_name>.injprof
Where safe_name is generated from the entered set name:
- letters/digits are kept (letters lowercased)
- spaces,
_,-,.become_ - repeated separators collapse to one
_ - trailing
_is removed - if empty after sanitization, fallback name is
profile
Examples:
My Horn Set->my_horn_set.injprofSeat-Heat.v1->seat_heat_v1.injprof
Container format
Files use FlipperFormat with this header:
Filetype: CANCommanderInjectionProfileVersion: 1
If header type/version does not match, load fails.
Top-level keys
name(string): display name for the Smart Injection profile.active_slot(uint32): selected slot index,0..4.
Per-slot keys
For each slot N in 1..5, the following string keys are stored:
slotN_nameslotN_usedslotN_busslotN_idslotN_extslotN_maskslotN_valueslotN_xorslotN_muxslotN_mux_startslotN_mux_lenslotN_mux_valueslotN_sigslotN_sig_startslotN_sig_lenslotN_sig_valueslotN_countslotN_interval_ms
Example: for slot 3, keys are slot3_name, slot3_used, etc.
Field meanings
slotN_name: UI name shown for the slot (for exampleHorn).slotN_used:0/1flag used by UI logic to indicate configured/active slot profile.slotN_bus: target bus (can0,can1, orboth).slotN_id: CAN ID hex token used for tracking/injection source frame.slotN_ext: extended-ID flag (0standard 11-bit,1extended 29-bit).slotN_mask: 64-bit mask (hex string) for byte-level masked injection.slotN_value: 64-bit value (hex string) applied withmask.slotN_xor: 64-bit xor mask (hex string) applied after masked set.slotN_mux: mux filter enabled (0/1).slotN_mux_start: mux field start bit.slotN_mux_len: mux field length in bits.slotN_mux_value: mux field compare value.slotN_sig: signal/field injection enabled (0/1).slotN_sig_start: signal field start bit.slotN_sig_len: signal field length in bits.slotN_sig_value: signal field value.slotN_count: inject repeat count for this slot preset.slotN_interval_ms: interval between repeats for this slot preset.
Defaults and backward compatibility
When loading:
- Missing per-slot keys are filled with defaults.
- Missing or invalid
active_slotfalls back to slot index0. - Defaults are also used when any loaded token is empty.
Default slot values are effectively:
name=SlotN,used=0,bus=can0,id=000,ext=0mask=value=xor=0000000000000000mux=0,mux_start=0,mux_len=1,mux_value=0sig=0,sig_start=0,sig_len=1,sig_value=0count=1,interval_ms=0
Example file
Filetype: CANCommanderInjectionProfile
Version: 1
name: track_day
slot1_name: Horn
slot1_used: 1
slot1_bus: can0
slot1_id: 1D5
slot1_ext: 0
slot1_mask: 0000000000000000
slot1_value: 0000000000000000
slot1_xor: 0000000000000000
slot1_mux: 0
slot1_mux_start: 0
slot1_mux_len: 1
slot1_mux_value: 0
slot1_sig: 1
slot1_sig_start: 20
slot1_sig_len: 3
slot1_sig_value: 5
slot1_count: 5
slot1_interval_ms: 100
slot2_name: Slot2
slot2_used: 0
slot2_bus: can0
slot2_id: 000
slot2_ext: 0
slot2_mask: 0000000000000000
slot2_value: 0000000000000000
slot2_xor: 0000000000000000
slot2_mux: 0
slot2_mux_start: 0
slot2_mux_len: 1
slot2_mux_value: 0
slot2_sig: 0
slot2_sig_start: 0
slot2_sig_len: 1
slot2_sig_value: 0
slot2_count: 1
slot2_interval_ms: 0
slot3_name: Slot3
slot3_used: 0
slot3_bus: can0
slot3_id: 000
slot3_ext: 0
slot3_mask: 0000000000000000
slot3_value: 0000000000000000
slot3_xor: 0000000000000000
slot3_mux: 0
slot3_mux_start: 0
slot3_mux_len: 1
slot3_mux_value: 0
slot3_sig: 0
slot3_sig_start: 0
slot3_sig_len: 1
slot3_sig_value: 0
slot3_count: 1
slot3_interval_ms: 0
slot4_name: Slot4
slot4_used: 0
slot4_bus: can0
slot4_id: 000
slot4_ext: 0
slot4_mask: 0000000000000000
slot4_value: 0000000000000000
slot4_xor: 0000000000000000
slot4_mux: 0
slot4_mux_start: 0
slot4_mux_len: 1
slot4_mux_value: 0
slot4_sig: 0
slot4_sig_start: 0
slot4_sig_len: 1
slot4_sig_value: 0
slot4_count: 1
slot4_interval_ms: 0
slot5_name: Slot5
slot5_used: 0
slot5_bus: can0
slot5_id: 000
slot5_ext: 0
slot5_mask: 0000000000000000
slot5_value: 0000000000000000
slot5_xor: 0000000000000000
slot5_mux: 0
slot5_mux_start: 0
slot5_mux_len: 1
slot5_mux_value: 0
slot5_sig: 0
slot5_sig_start: 0
slot5_sig_len: 1
slot5_sig_value: 0
slot5_count: 1
slot5_interval_ms: 0
active_slot: 0
Notes
- Backward compatibility:
- Legacy
.cfgfiles are still loadable. - Legacy folder
apps_data/can_commander/slot_sets/is still scanned. - Legacy filetype
CANCommanderSlotSetis still accepted. - Editing these files manually is supported, but malformed values may be clamped/fallback-filled when loaded.
- The app rewrites normalized slot args on load/save, so formatting/order may change.