Skip to content
Draft
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
3 changes: 2 additions & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ endif()
if(DEFINED ENV{GP2040_BOARDCONFIG})
set(GP2040_BOARDCONFIG $ENV{GP2040_BOARDCONFIG})
elseif(NOT DEFINED GP2040_BOARDCONFIG)
set(GP2040_BOARDCONFIG Pico)
set(GP2040_BOARDCONFIG Haute42COSMOX)
endif()

# check for existing cmake files in the event of changing PICO_BOARD or PICO_PLATFORM
Expand Down Expand Up @@ -286,6 +286,7 @@ src/addons/reverse.cpp
src/addons/drv8833_rumble.cpp
src/addons/turbo.cpp
src/addons/slider_socd.cpp
src/addons/slider_profile.cpp
src/addons/wiiext.cpp
src/addons/input_macro.cpp
src/addons/snes_input.cpp
Expand Down
40 changes: 40 additions & 0 deletions headers/addons/slider_profile.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
#ifndef _SliderProfile_H
#define _SliderProfile_H

#include "gpaddon.h"
#include "types.h"

#ifndef SLIDER_PROFILE_ENABLED
#define SLIDER_PROFILE_ENABLED 0
#endif

#ifndef SLIDER_PROFILE_NUM_POSITIONS
#define SLIDER_PROFILE_NUM_POSITIONS 2
#endif

#ifndef SLIDER_PROFILE_DEFAULT_PROFILE
#define SLIDER_PROFILE_DEFAULT_PROFILE 1
#endif

#define MAX_PROFILE_SLIDER_POSITIONS 8

// Slider Module Name
#define SliderProfileName "SliderProfile"

class SliderProfileInput : public GPAddon {
public:
virtual bool available();
virtual void setup(); // SliderProfile Button Setup
virtual void reinit();
virtual void preprocess() {}
virtual void process(); // SliderProfile process
virtual void postprocess(bool sent) {}
virtual std::string name() { return SliderProfileName; }
private:
uint32_t read();

Mask_t positionMasks[MAX_PROFILE_SLIDER_POSITIONS] = {0};
uint32_t numPositions = 0;
};

#endif // _SliderProfile_H
8 changes: 8 additions & 0 deletions headers/display/ui/screens/PinViewerScreen.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,14 @@ class PinViewerScreen : public GPScreen {
{GpioAction::SUSTAIN_SOCD_MODE_SECOND_WIN, "SOCD-2W"},
{GpioAction::SUSTAIN_SOCD_MODE_FIRST_WIN, "SOCD-1W"},
{GpioAction::SUSTAIN_SOCD_MODE_BYPASS, "SOCD-BP"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_1, "PROF1"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_2, "PROF2"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_3, "PROF3"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_4, "PROF4"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_5, "PROF5"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_6, "PROF6"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_7, "PROF7"},
{GpioAction::SUSTAIN_PROFILE_SLIDER_POSITION_8, "PROF8"},
{GpioAction::BUTTON_PRESS_TURBO, "TRB"},
{GpioAction::BUTTON_PRESS_MACRO, "M"},
{GpioAction::BUTTON_PRESS_MACRO_1, "M1"},
Expand Down
7 changes: 4 additions & 3 deletions pico_sdk_import.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ if (NOT PICO_SDK_PATH)
get_filename_component(FETCHCONTENT_BASE_DIR "${PICO_SDK_FETCH_FROM_GIT_PATH}" REALPATH BASE_DIR "${CMAKE_SOURCE_DIR}")
endif ()
FetchContent_Declare(
pico_sdk
GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG}
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
pico_sdk
GIT_REPOSITORY https://github.com/raspberrypi/pico-sdk
GIT_TAG ${PICO_SDK_FETCH_FROM_GIT_TAG}
)

if (NOT pico_sdk)
Expand Down Expand Up @@ -95,6 +95,7 @@ if (NOT PICO_SDK_PATH)
SUBBUILD_DIR ${FETCHCONTENT_BASE_DIR}/pico_sdk-subbuild
)
endif ()

set(PICO_SDK_PATH ${pico_sdk_SOURCE_DIR})
endif ()
set(FETCHCONTENT_BASE_DIR ${FETCHCONTENT_BASE_DIR_SAVE})
Expand Down
9 changes: 9 additions & 0 deletions proto/config.proto
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,14 @@ message SOCDSliderOptions
optional SOCDMode deprecatedModeTwo = 6 [deprecated = true];
}

message ProfileSliderOptions
{
optional bool enabled = 1;
optional uint32 numPositions = 2;
optional uint32 defaultProfile = 3;
repeated uint32 profileAssignments = 4 [(nanopb).max_count = 8];
}

message ReverseOptions
{
optional bool enabled = 1;
Expand Down Expand Up @@ -916,6 +924,7 @@ message AddonOptions
optional GamepadUSBHostOptions gamepadUSBHostOptions = 28;
optional TG16Options tg16Options = 29;
optional HETriggerOptions heTriggerOptions = 30;
optional ProfileSliderOptions profileSliderOptions = 31;
}

message MigrationHistory
Expand Down
8 changes: 8 additions & 0 deletions proto/enums.proto
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,14 @@ enum GpioAction
MODE_WHEEL_PEDAL_GAS = 128;
MODE_WHEEL_PEDAL_BRAKE = 129;
MODE_WHEEL_PEDAL_CLUTCH = 130;
SUSTAIN_PROFILE_SLIDER_POSITION_1 = 131;
SUSTAIN_PROFILE_SLIDER_POSITION_2 = 132;
SUSTAIN_PROFILE_SLIDER_POSITION_3 = 133;
SUSTAIN_PROFILE_SLIDER_POSITION_4 = 134;
SUSTAIN_PROFILE_SLIDER_POSITION_5 = 135;
SUSTAIN_PROFILE_SLIDER_POSITION_6 = 136;
SUSTAIN_PROFILE_SLIDER_POSITION_7 = 137;
SUSTAIN_PROFILE_SLIDER_POSITION_8 = 138;
}

enum GpioDirection
Expand Down
84 changes: 84 additions & 0 deletions src/addons/slider_profile.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
#include "addons/slider_profile.h"

#include "enums.pb.h"
#include "storagemanager.h"
#include "types.h"

bool SliderProfileInput::available() {
const ProfileSliderOptions& options = Storage::getInstance().getAddonOptions().profileSliderOptions;
return options.enabled;
}

void SliderProfileInput::setup()
{
const ProfileSliderOptions& options = Storage::getInstance().getAddonOptions().profileSliderOptions;
numPositions = options.numPositions;

// Clear all masks
for (int i = 0; i < MAX_PROFILE_SLIDER_POSITIONS; i++) {
positionMasks[i] = 0;
}

// Build masks for each position based on GPIO mappings
GpioMappingInfo* pinMappings = Storage::getInstance().getProfilePinMappings();
for (Pin_t pin = 0; pin < (Pin_t)NUM_BANK0_GPIOS; pin++)
{
switch (pinMappings[pin].action) {
case SUSTAIN_PROFILE_SLIDER_POSITION_1: positionMasks[0] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_2: positionMasks[1] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_3: positionMasks[2] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_4: positionMasks[3] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_5: positionMasks[4] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_6: positionMasks[5] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_7: positionMasks[6] |= 1 << pin; break;
case SUSTAIN_PROFILE_SLIDER_POSITION_8: positionMasks[7] |= 1 << pin; break;
default: break;
}
}
}

uint32_t SliderProfileInput::read() {
const ProfileSliderOptions& options = Storage::getInstance().getAddonOptions().profileSliderOptions;
Mask_t values = Storage::getInstance().GetGamepad()->debouncedGpio;

// Check each position mask in order
for (uint32_t i = 0; i < numPositions && i < MAX_PROFILE_SLIDER_POSITIONS; i++) {
if (values & positionMasks[i]) {
// Return the profile number for this position (1-indexed)
if (i < options.profileAssignments_count) {
return options.profileAssignments[i];
}
// Default to position index + 1 if no assignment exists
return i + 1;
}
}

// No GPIO position matched, return default profile
if (options.defaultProfile > 0) {
return options.defaultProfile;
}
// Fallback: stay at current profile
return Storage::getInstance().GetGamepad()->getOptions().profileNumber;
}

/**
* Reinitialize masks.
*/
void SliderProfileInput::reinit()
{
for (int i = 0; i < MAX_PROFILE_SLIDER_POSITIONS; i++) {
positionMasks[i] = 0;
}
this->setup();
}

void SliderProfileInput::process()
{
// Get Slider State
uint32_t profileNumber = read();

Gamepad * gamepad = Storage::getInstance().GetGamepad();
if (gamepad->getOptions().profileNumber != profileNumber) {
Storage::getInstance().setProfile(profileNumber);
}
}
6 changes: 6 additions & 0 deletions src/config_utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include "addons/reactiveleds.h"
#include "addons/reverse.h"
#include "addons/slider_socd.h"
#include "addons/slider_profile.h"
#include "addons/spi_analog_ads1256.h"
#include "addons/turbo.h"
#include "addons/wiiext.h"
Expand Down Expand Up @@ -662,6 +663,11 @@ void ConfigUtils::initUnsetPropertiesWithDefaults(Config& config)
INIT_UNSET_PROPERTY(config.addonOptions.socdSliderOptions, deprecatedModeOne, SLIDER_SOCD_SLOT_ONE);
INIT_UNSET_PROPERTY(config.addonOptions.socdSliderOptions, deprecatedModeTwo, SLIDER_SOCD_SLOT_TWO);

// addonOptions.profileSliderOptions
INIT_UNSET_PROPERTY(config.addonOptions.profileSliderOptions, enabled, !!SLIDER_PROFILE_ENABLED);
INIT_UNSET_PROPERTY(config.addonOptions.profileSliderOptions, numPositions, SLIDER_PROFILE_NUM_POSITIONS);
INIT_UNSET_PROPERTY(config.addonOptions.profileSliderOptions, defaultProfile, SLIDER_PROFILE_DEFAULT_PROFILE);

// addonOptions.analogADS1219Options
INIT_UNSET_PROPERTY(config.addonOptions.analogADS1219Options, enabled, !!I2C_ANALOG1219_ENABLED);
INIT_UNSET_PROPERTY(config.addonOptions.analogADS1219Options, deprecatedI2cBlock, (I2C_ANALOG1219_BLOCK == i2c0) ? 0 : 1)
Expand Down
2 changes: 2 additions & 0 deletions src/gp2040.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include "addons/gamepad_usb_host.h"
#include "addons/he_trigger.h"
#include "addons/tg16_input.h"
#include "addons/slider_profile.h"

// Pico includes
#include "pico/bootrom.h"
Expand Down Expand Up @@ -116,6 +117,7 @@ void GP2040::setup() {
addons.LoadAddon(new WiiExtensionInput());
addons.LoadAddon(new SNESpadInput());
addons.LoadAddon(new SliderSOCDInput());
addons.LoadAddon(new SliderProfileInput());
addons.LoadAddon(new TiltInput());
addons.LoadAddon(new RotaryEncoderInput());
addons.LoadAddon(new PCF8575Addon());
Expand Down
22 changes: 22 additions & 0 deletions src/webconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1741,6 +1741,19 @@ std::string setAddonOptions()
docToValue(socdSliderOptions.enabled, doc, "SliderSOCDInputEnabled");
docToValue(socdSliderOptions.modeDefault, doc, "sliderSOCDModeDefault");

ProfileSliderOptions& profileSliderOptions = Storage::getInstance().getAddonOptions().profileSliderOptions;
docToValue(profileSliderOptions.enabled, doc, "SliderProfileInputEnabled");
docToValue(profileSliderOptions.numPositions, doc, "sliderProfileNumPositions");
docToValue(profileSliderOptions.defaultProfile, doc, "sliderProfileDefaultProfile");
// Handle profile assignments array
if (doc.containsKey("sliderProfileAssignments")) {
JsonArray profileArray = doc["sliderProfileAssignments"];
profileSliderOptions.profileAssignments_count = std::min(static_cast<size_t>(8), profileArray.size());
for (size_t i = 0; i < profileSliderOptions.profileAssignments_count; i++) {
profileSliderOptions.profileAssignments[i] = profileArray[i];
}
}

OnBoardLedOptions& onBoardLedOptions = Storage::getInstance().getAddonOptions().onBoardLedOptions;
docToValue(onBoardLedOptions.mode, doc, "onBoardLedMode");
docToValue(onBoardLedOptions.enabled, doc, "BoardLedAddonEnabled");
Expand Down Expand Up @@ -2189,6 +2202,15 @@ std::string getAddonOptions()
writeDoc(doc, "sliderSOCDModeDefault", socdSliderOptions.modeDefault);
writeDoc(doc, "SliderSOCDInputEnabled", socdSliderOptions.enabled);

const ProfileSliderOptions& profileSliderOptions = Storage::getInstance().getAddonOptions().profileSliderOptions;
writeDoc(doc, "SliderProfileInputEnabled", profileSliderOptions.enabled);
writeDoc(doc, "sliderProfileNumPositions", profileSliderOptions.numPositions);
writeDoc(doc, "sliderProfileDefaultProfile", profileSliderOptions.defaultProfile);
JsonArray profileAssignmentsArray = doc.createNestedArray("sliderProfileAssignments");
for (size_t i = 0; i < profileSliderOptions.profileAssignments_count; i++) {
profileAssignmentsArray.add(profileSliderOptions.profileAssignments[i]);
}

const OnBoardLedOptions& onBoardLedOptions = Storage::getInstance().getAddonOptions().onBoardLedOptions;
writeDoc(doc, "onBoardLedMode", onBoardLedOptions.mode);
writeDoc(doc, "BoardLedAddonEnabled", onBoardLedOptions.enabled);
Expand Down
Loading