Skip to content
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
500 changes: 402 additions & 98 deletions headers/addons/he_trigger.h

Large diffs are not rendered by default.

8 changes: 6 additions & 2 deletions proto/config.proto
Original file line number Diff line number Diff line change
Expand Up @@ -869,8 +869,12 @@ message HETriggerInfo
optional GpioAction action = 1;
optional int32 active = 2;
optional int32 idle = 3;
optional int32 max = 4;
optional int32 polarity = 5;
optional int32 pressed = 4;
optional int32 polarity = 5 [deprecated = true];
optional int32 release = 6;
optional int32 noise = 7;
optional bool rapidTrigger = 8;
optional bool is_polarized = 9;
}

message HETriggerOptions
Expand Down
35 changes: 34 additions & 1 deletion src/addons/he_trigger.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@ void HETriggerAddon::setup() {
lastADCSelected = muxPinArray[mux];
}
emaSmoothingReads[i] = adc_read();
lastIncrement[i] = adc_read();
triggerActive[i] = false;
}
emaSmoothingFactor = (float)options.smoothingFactor / 100.f; // 99 = max smoothing factor
}
Expand Down Expand Up @@ -106,15 +108,46 @@ void HETriggerAddon::preprocess() {
adc_select_input(muxPinArray[mux]-26);
lastADCSelected = muxPinArray[mux];
}

value = adc_read();
activationThreshold = (uint16_t)options.triggers[he].active;
releaseThreshold = (uint16_t)options.triggers[he].active;

if ( options.triggers[he].rapidTrigger ) {
releaseThreshold = (uint16_t)options.triggers[he].release;
}

// EMA Smoothing
if ( options.emaSmoothing == 1 ) {
value = emaSmoothing(value, emaSmoothingReads[he]);
emaSmoothingReads[he] = value;
}

if (value >= options.triggers[he].active) {
if (options.triggers[he].is_polarized) {
// effectively inverting value and thresholds
value = ADC_MAX - value;
activationThreshold = ADC_MAX - activationThreshold;
releaseThreshold = ADC_MAX - releaseThreshold;
}

if (!options.triggers[he].rapidTrigger) {
// no rapid trigger
triggerActive[he] = value > activationThreshold;
} else {
// chad rapid trigger
bool pressing = (value > lastIncrement[he]) && (value - lastIncrement[he]) > options.triggers[he].noise;
bool releasing = (lastIncrement[he] > value) && (lastIncrement[he] - value) > options.triggers[he].noise;
if (pressing || releasing) {
lastIncrement[he] = value;
}

if ( !triggerActive[he] && pressing && value >= activationThreshold) {
triggerActive[he] = true;
} else if (triggerActive[he] && releasing && value <= releaseThreshold) {
triggerActive[he] = false;
}
}
if (triggerActive[he]) {
switch (options.triggers[he].action) {
case GpioAction::BUTTON_PRESS_UP: gamepad->state.dpad |= GAMEPAD_MASK_UP; break;
case GpioAction::BUTTON_PRESS_DOWN: gamepad->state.dpad |= GAMEPAD_MASK_DOWN; break;
Expand Down
224 changes: 160 additions & 64 deletions src/config_utils.cpp

Large diffs are not rendered by default.

32 changes: 19 additions & 13 deletions src/webconfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1471,8 +1471,8 @@ static uint32_t calibrationSmoothingFactor = 0;
static float ema_smoothing;
static uint32_t smoothingRead = 0;

// Get the HE Trigger Calibration using our manual GPIO input and everything
std::string setHETriggerCalibration()
// Get the HE Trigger Options using our manual GPIO input and everything
std::string setHETriggerOptions()
{
DynamicJsonDocument doc = get_post_data();
calibrationMuxChannels = doc["muxChannels"];
Expand Down Expand Up @@ -1516,7 +1516,7 @@ uint16_t emaCalculation(uint16_t value, uint16_t previous) {
}

// Get the HE Trigger Calibration using our manual GPIO input and everything
std::string getHETriggerCalibration()
std::string getHETriggerVoltage()
{
DynamicJsonDocument postDoc = get_post_data();
uint32_t id = postDoc["targetId"];
Expand Down Expand Up @@ -1589,7 +1589,7 @@ std::string getHETriggerCalibration()
return serialize_json(doc);
}

std::string getHETriggerOptions()
std::string getHETriggerCalibrations()
{
const size_t capacity = JSON_OBJECT_SIZE(500);
DynamicJsonDocument doc(capacity);
Expand All @@ -1602,15 +1602,18 @@ std::string getHETriggerOptions()
trigger["action"] = heTriggers[i].action;
trigger["idle"] = heTriggers[i].idle;
trigger["active"] = heTriggers[i].active;
trigger["max"] = heTriggers[i].max;
trigger["polarity"] = heTriggers[i].polarity;
trigger["pressed"] = heTriggers[i].pressed;
trigger["is_polarized"] = heTriggers[i].is_polarized;
trigger["release"] = heTriggers[i].release;
trigger["noise"] = heTriggers[i].noise;
trigger["rapidTrigger"] = heTriggers[i].rapidTrigger;
}

return serialize_json(doc);
}

// Set Hall Effect Trigger Options
std::string setHETriggerOptions()
// Set Hall Effect Trigger Calibrations
std::string setHETriggerCalibrations()
{
DynamicJsonDocument doc = get_post_data();
HETriggerInfo * heTriggers = Storage::getInstance().getAddonOptions().heTriggerOptions.triggers;
Expand All @@ -1619,8 +1622,11 @@ std::string setHETriggerOptions()
heTriggers[i].action = doc["triggers"][i]["action"];
heTriggers[i].idle = doc["triggers"][i]["idle"];
heTriggers[i].active = doc["triggers"][i]["active"];
heTriggers[i].max = doc["triggers"][i]["max"];
heTriggers[i].polarity = doc["triggers"][i]["polarity"];
heTriggers[i].pressed = doc["triggers"][i]["pressed"];
heTriggers[i].is_polarized = doc["triggers"][i]["is_polarized"];
heTriggers[i].release = doc["triggers"][i]["release"];
heTriggers[i].noise = doc["triggers"][i]["noise"];
heTriggers[i].rapidTrigger = doc["triggers"][i]["rapidTrigger"];
}

Storage::getInstance().getAddonOptions().heTriggerOptions.triggers_count = 32;
Expand Down Expand Up @@ -2685,10 +2691,10 @@ static const std::pair<const char*, HandlerFuncPtr> handlerFuncs[] =
{ "/api/getI2CPeripheralMap", getI2CPeripheralMap },
{ "/api/setExpansionPins", setExpansionPins },
{ "/api/getExpansionPins", getExpansionPins },
{ "/api/setHETriggerCalibrations", setHETriggerCalibrations },
{ "/api/getHETriggerCalibrations", getHETriggerCalibrations },
{ "/api/getHETriggerVoltage", getHETriggerVoltage },
{ "/api/setHETriggerOptions", setHETriggerOptions },
{ "/api/getHETriggerOptions", getHETriggerOptions },
{ "/api/getHETriggerCalibration", getHETriggerCalibration },
{ "/api/setHETriggerCalibration", setHETriggerCalibration },
{ "/api/setReactiveLEDs", setReactiveLEDs },
{ "/api/getReactiveLEDs", getReactiveLEDs },
{ "/api/setKeyMappings", setKeyMappings },
Expand Down
56 changes: 50 additions & 6 deletions www/server/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -609,16 +609,60 @@ app.get('/api/getExpansionPins', (req, res) => {
});
});

app.get('/api/getHETriggerOptions', (req, res) => {
app.get('/api/getHETriggerCalibrations', (req, res) => {
var triggers = [];
triggers.push({ action: 2, idle: 120, max: 3500, active: 1500, polarity: 0 });
for(var i = 1; i < 32; i++) {
triggers.push(
{
action: 2,
idle: 120,
pressed: 3500,
active: 1500,
is_polarized: false,
release: 1500,
noise: 50,
rapidTrigger: false
},
{
action: 3,
idle: 3500,
pressed: 120,
active: 1500,
is_polarized: true,
release: 1500,
noise: 50,
rapidTrigger: false
},
{
action: 4,
idle: 120,
pressed: 3500,
active: 1500,
is_polarized: false,
release: 2000,
noise: 50,
rapidTrigger: true
},
{
action: 5,
idle: 3500,
pressed: 120,
active: 2000,
is_polarized: true,
release: 1500,
noise: 50,
rapidTrigger: true
},
);
for(var i = 4; i < 32; i++) {
triggers.push({
action: -10,
idle: 100,
active: 2000,
max: 3500,
polarity: 0
pressed: 3500,
is_polarized: false,
release: 1500,
noise: 50,
rapidTrigger: false,
});
}
return res.send({triggers});
Expand Down Expand Up @@ -876,7 +920,7 @@ app.get('/api/abortGetHeldPins', async (req, res) => {
return res.send();
});

app.post('/api/getHETriggerCalibration', (req, res) => {
app.post('/api/getHETriggerVoltage', (req, res) => {
return res.send({
voltage: 0.0,
debug: true
Expand Down
8 changes: 4 additions & 4 deletions www/src/Addons/HETrigger.scss
Original file line number Diff line number Diff line change
@@ -1,27 +1,27 @@
.action-grid-HE-trigger-16 {
display: grid;
grid-auto-flow: column;
grid-auto-flow: row;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(8, auto);
}

.action-grid-HE-trigger-8 {
display: grid;
grid-auto-flow: column;
grid-auto-flow: row;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(4, auto);
}

.action-grid-HE-trigger-4 {
display: grid;
grid-auto-flow: column;
grid-auto-flow: row;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(4, auto);
}

.action-grid-HE-trigger-1 {
display: grid;
grid-auto-flow: column;
grid-auto-flow: row;
grid-template-columns: 1fr 1fr;
grid-template-rows: repeat(1, auto);
}
Expand Down
17 changes: 10 additions & 7 deletions www/src/Addons/HETrigger.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -222,11 +222,8 @@ const TriggerActionsForm = ({
setHETrigger(
{
id: parseInt(key),
...triggers[key],
action: change?.value === undefined ? -10 : change.value,
idle: triggers[key].idle,
active: triggers[key].active,
max: triggers[key].max,
polarity: triggers[key].polarity
}
)
}
Expand Down Expand Up @@ -286,8 +283,11 @@ const TriggerActionsForm = ({
<th>{t('HETrigger:channel-label')}</th>
<th>{t('HETrigger:voltage-table-idle-text')}</th>
<th>{t('HETrigger:voltage-table-trigger-text')}</th>
<th>{t('HETrigger:voltage-table-max-text')}</th>
<th>{t('HETrigger:voltage-table-pressed-text')}</th>
<th>{t('HETrigger:voltage-table-polarity-text')}</th>
<th>{t('HETrigger:voltage-table-rapid-trigger-text')}</th>
<th>{t('HETrigger:voltage-table-release-text')}</th>
<th>{t('HETrigger:voltage-table-noise-text')}</th>
</tr>
</thead>
<tbody>
Expand All @@ -298,8 +298,11 @@ const TriggerActionsForm = ({
<td>{index} {triggers[key].action===-10?t('HETrigger:voltage-table-disabled-label'):''}</td>
<td>{triggers[key].idle}</td>
<td>{triggers[key].active}</td>
<td>{triggers[key].max}</td>
<td>{triggers[key].polarity == 1 ? 'S' : 'N'}</td>
<td>{triggers[key].pressed}</td>
<td>{triggers[key].is_polarized ? 'S' : 'N'}</td>
<td>{triggers[key].rapidTrigger ? 'Enabled' : 'Disabled'}</td>
<td>{triggers[key].rapidTrigger ? triggers[key].release : 'N/A'}</td>
<td>{triggers[key].rapidTrigger ? triggers[key].noise : 'N/A'}</td>
</tr>
))}
</tbody>
Expand Down
Loading