Skip to content

Commit 4d133f0

Browse files
authored
separate all analog settings per stick (#1401)
* separate all analog settings per stick * remove old variables * align toggles * merge fix
1 parent 9fceeac commit 4d133f0

7 files changed

Lines changed: 482 additions & 256 deletions

File tree

headers/addons/analog.h

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,30 +47,58 @@
4747
#define FORCED_CIRCULARITY_ENABLED 0
4848
#endif
4949

50+
#ifndef FORCED_CIRCULARITY2_ENABLED
51+
#define FORCED_CIRCULARITY2_ENABLED 0
52+
#endif
53+
5054
#ifndef DEFAULT_INNER_DEADZONE
5155
#define DEFAULT_INNER_DEADZONE 5
5256
#endif
5357

58+
#ifndef DEFAULT_INNER_DEADZONE2
59+
#define DEFAULT_INNER_DEADZONE2 5
60+
#endif
61+
5462
#ifndef DEFAULT_OUTER_DEADZONE
5563
#define DEFAULT_OUTER_DEADZONE 95
5664
#endif
5765

66+
#ifndef DEFAULT_OUTER_DEADZONE2
67+
#define DEFAULT_OUTER_DEADZONE2 95
68+
#endif
69+
5870
#ifndef AUTO_CALIBRATE_ENABLED
5971
#define AUTO_CALIBRATE_ENABLED 0
6072
#endif
6173

74+
#ifndef AUTO_CALIBRATE2_ENABLED
75+
#define AUTO_CALIBRATE2_ENABLED 0
76+
#endif
77+
6278
#ifndef ANALOG_SMOOTHING_ENABLED
6379
#define ANALOG_SMOOTHING_ENABLED 0
6480
#endif
6581

82+
#ifndef ANALOG_SMOOTHING2_ENABLED
83+
#define ANALOG_SMOOTHING2_ENABLED 0
84+
#endif
85+
6686
#ifndef SMOOTHING_FACTOR
6787
#define SMOOTHING_FACTOR 5
6888
#endif
6989

90+
#ifndef SMOOTHING_FACTOR2
91+
#define SMOOTHING_FACTOR2 5
92+
#endif
93+
7094
#ifndef ANALOG_ERROR
7195
#define ANALOG_ERROR 1000
7296
#endif
7397

98+
#ifndef ANALOG_ERROR2
99+
#define ANALOG_ERROR2 1000
100+
#endif
101+
74102
// Analog Module Name
75103
#define AnalogName "Analog"
76104

@@ -93,6 +121,13 @@ typedef struct
93121
DpadMode analog_dpad;
94122
float x_ema;
95123
float y_ema;
124+
bool ema_option;
125+
float ema_smoothing;
126+
float error_rate;
127+
float in_deadzone;
128+
float out_deadzone;
129+
bool auto_calibration;
130+
bool forced_circularity;
96131
} adc_instance;
97132

98133
class AnalogInput : public GPAddon {
@@ -105,19 +140,12 @@ class AnalogInput : public GPAddon {
105140
virtual void reinit() {}
106141
virtual std::string name() { return AnalogName; }
107142
private:
108-
float readPin(Pin_t pin, uint16_t center);
109-
float emaCalculation(float ema_value, float ema_previous);
143+
float readPin(int stick_num, Pin_t pin, uint16_t center);
144+
float emaCalculation(int stick_num, float ema_value, float ema_previous);
110145
uint16_t map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max);
111-
float magnitudeCalculation(adc_instance & adc_inst);
112-
void radialDeadzone(adc_instance & adc_inst);
146+
float magnitudeCalculation(int stick_num, adc_instance & adc_inst);
147+
void radialDeadzone(int stick_num, adc_instance & adc_inst);
113148
adc_instance adc_pairs[ADC_COUNT];
114-
bool ema_option;
115-
float ema_smoothing;
116-
float error_rate;
117-
float in_deadzone;
118-
float out_deadzone;
119-
bool auto_calibration;
120-
bool forced_circularity;
121149
};
122150

123151
#endif // _Analog_H_

proto/config.proto

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -411,6 +411,13 @@ message AnalogOptions
411411
optional bool analog_smoothing = 14;
412412
optional float smoothing_factor = 15;
413413
optional uint32 analog_error = 16;
414+
optional bool analog_smoothing2 = 17;
415+
optional float smoothing_factor2 = 18;
416+
optional uint32 analog_error2 = 19;
417+
optional uint32 inner_deadzone2 = 20;
418+
optional uint32 outer_deadzone2 = 21;
419+
optional bool auto_calibrate2 = 22;
420+
optional bool forced_circularity2 = 23;
414421
}
415422

416423
message TurboOptions

src/addons/analog.cpp

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,25 @@ void AnalogInput::setup() {
2626
adc_pairs[0].y_pin = analogOptions.analogAdc1PinY;
2727
adc_pairs[0].analog_invert = analogOptions.analogAdc1Invert;
2828
adc_pairs[0].analog_dpad = analogOptions.analogAdc1Mode;
29+
adc_pairs[0].ema_option = analogOptions.analog_smoothing;
30+
adc_pairs[0].ema_smoothing = analogOptions.smoothing_factor / 1000.0f;
31+
adc_pairs[0].error_rate = analogOptions.analog_error / 1000.0f;
32+
adc_pairs[0].in_deadzone = analogOptions.inner_deadzone / 100.0f;
33+
adc_pairs[0].out_deadzone = analogOptions.outer_deadzone / 100.0f;
34+
adc_pairs[0].auto_calibration = analogOptions.auto_calibrate;
35+
adc_pairs[0].forced_circularity = analogOptions.forced_circularity;
2936
adc_pairs[1].x_pin = analogOptions.analogAdc2PinX;
3037
adc_pairs[1].y_pin = analogOptions.analogAdc2PinY;
3138
adc_pairs[1].analog_invert = analogOptions.analogAdc2Invert;
3239
adc_pairs[1].analog_dpad = analogOptions.analogAdc2Mode;
40+
adc_pairs[1].ema_option = analogOptions.analog_smoothing2;
41+
adc_pairs[1].ema_smoothing = analogOptions.smoothing_factor2 / 1000.0f;
42+
adc_pairs[1].error_rate = analogOptions.analog_error2 / 1000.0f;
43+
adc_pairs[1].in_deadzone = analogOptions.inner_deadzone2 / 100.0f;
44+
adc_pairs[1].out_deadzone = analogOptions.outer_deadzone2 / 100.0f;
45+
adc_pairs[1].auto_calibration = analogOptions.auto_calibrate2;
46+
adc_pairs[1].forced_circularity = analogOptions.forced_circularity2;
47+
3348

3449
// Setup defaults and helpers
3550
for (int i = 0; i < ADC_COUNT; i++) {
@@ -48,28 +63,19 @@ void AnalogInput::setup() {
4863
for (int i = 0; i < ADC_COUNT; i++) {
4964
if(isValidPin(adc_pairs[i].x_pin)) {
5065
adc_gpio_init(adc_pairs[i].x_pin);
51-
if (analogOptions.auto_calibrate) {
66+
if (adc_pairs[i].auto_calibration) {
5267
adc_select_input(adc_pairs[i].x_pin - ADC_PIN_OFFSET);
5368
adc_pairs[i].x_center = adc_read();
5469
}
5570
}
5671
if(isValidPin(adc_pairs[i].y_pin)) {
5772
adc_gpio_init(adc_pairs[i].y_pin);
58-
if (analogOptions.auto_calibrate) {
73+
if (adc_pairs[i].auto_calibration) {
5974
adc_select_input(adc_pairs[i].y_pin - ADC_PIN_OFFSET);
6075
adc_pairs[i].y_center = adc_read();
6176
}
6277
}
6378
}
64-
65-
// Read options from Analog Options
66-
ema_option = analogOptions.analog_smoothing;
67-
ema_smoothing = analogOptions.smoothing_factor / 1000.0f;
68-
error_rate = analogOptions.analog_error / 1000.0f;
69-
in_deadzone = analogOptions.inner_deadzone / 100.0f;
70-
out_deadzone = analogOptions.outer_deadzone / 100.0f;
71-
auto_calibration = analogOptions.auto_calibrate;
72-
forced_circularity = analogOptions.forced_circularity;
7379
}
7480

7581
void AnalogInput::process() {
@@ -83,35 +89,35 @@ void AnalogInput::process() {
8389
for(int i = 0; i < ADC_COUNT; i++) {
8490
// Read X-Axis
8591
if (isValidPin(adc_pairs[i].x_pin)) {
86-
adc_pairs[i].x_value = readPin(adc_pairs[i].x_pin_adc, adc_pairs[i].x_center);
92+
adc_pairs[i].x_value = readPin(i, adc_pairs[i].x_pin_adc, adc_pairs[i].x_center);
8793
if (adc_pairs[i].analog_invert == InvertMode::INVERT_X ||
8894
adc_pairs[i].analog_invert == InvertMode::INVERT_XY) {
8995
adc_pairs[i].x_value = ANALOG_MAX - adc_pairs[i].x_value;
9096
}
91-
if (ema_option) {
92-
adc_pairs[i].x_value = emaCalculation(adc_pairs[i].x_value, adc_pairs[i].x_ema);
97+
if (adc_pairs[i].ema_option) {
98+
adc_pairs[i].x_value = emaCalculation(i, adc_pairs[i].x_value, adc_pairs[i].x_ema);
9399
adc_pairs[i].x_ema = adc_pairs[i].x_value;
94100
}
95101
}
96102
// Read Y-Axis
97103
if (isValidPin(adc_pairs[i].y_pin)) {
98-
adc_pairs[i].y_value = readPin(adc_pairs[i].y_pin_adc, adc_pairs[i].y_center);
104+
adc_pairs[i].y_value = readPin(i, adc_pairs[i].y_pin_adc, adc_pairs[i].y_center);
99105
if (adc_pairs[i].analog_invert == InvertMode::INVERT_Y ||
100106
adc_pairs[i].analog_invert == InvertMode::INVERT_XY) {
101107
adc_pairs[i].y_value = ANALOG_MAX - adc_pairs[i].y_value;
102108
}
103-
if (ema_option) {
104-
adc_pairs[i].y_value = emaCalculation(adc_pairs[i].y_value, adc_pairs[i].y_ema);
109+
if (adc_pairs[i].ema_option) {
110+
adc_pairs[i].y_value = emaCalculation(i, adc_pairs[i].y_value, adc_pairs[i].y_ema);
105111
adc_pairs[i].y_ema = adc_pairs[i].y_value;
106112
}
107113
}
108114
// Look for dead-zones and circularity
109-
adc_pairs[i].xy_magnitude = magnitudeCalculation(adc_pairs[i]);
110-
if (adc_pairs[i].xy_magnitude < in_deadzone) {
115+
adc_pairs[i].xy_magnitude = magnitudeCalculation(i, adc_pairs[i]);
116+
if (adc_pairs[i].xy_magnitude < adc_pairs[i].in_deadzone) {
111117
adc_pairs[i].x_value = ANALOG_CENTER;
112118
adc_pairs[i].y_value = ANALOG_CENTER;
113119
} else {
114-
radialDeadzone(adc_pairs[i]);
120+
radialDeadzone(i, adc_pairs[i]);
115121
}
116122

117123
if (adc_pairs[i].analog_dpad == DpadMode::DPAD_MODE_LEFT_ANALOG) {
@@ -134,10 +140,10 @@ void AnalogInput::process() {
134140
}
135141
}
136142

137-
float AnalogInput::readPin(Pin_t pin_adc, uint16_t center) {
143+
float AnalogInput::readPin(int stick_num, Pin_t pin_adc, uint16_t center) {
138144
adc_select_input(pin_adc);
139145
uint16_t adc_value = adc_read();
140-
if (auto_calibration) {
146+
if (adc_pairs[stick_num].auto_calibration) {
141147
if (adc_value > center) {
142148
adc_value = map(adc_value, center, ADC_MAX, ADC_MAX / 2, ADC_MAX);
143149
} else if (adc_value == center) {
@@ -149,23 +155,23 @@ float AnalogInput::readPin(Pin_t pin_adc, uint16_t center) {
149155
return ((float)adc_value) / ADC_MAX;
150156
}
151157

152-
float AnalogInput::emaCalculation(float ema_value, float ema_previous) {
153-
return (ema_smoothing * ema_value) + ((1.0f - ema_smoothing) * ema_previous);
158+
float AnalogInput::emaCalculation(int stick_num, float ema_value, float ema_previous) {
159+
return (adc_pairs[stick_num].ema_smoothing * ema_value) + ((1.0f - adc_pairs[stick_num].ema_smoothing) * ema_previous);
154160
}
155161

156162
uint16_t AnalogInput::map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) {
157163
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
158164
}
159165

160-
float AnalogInput::magnitudeCalculation(adc_instance & adc_inst) {
166+
float AnalogInput::magnitudeCalculation(int stick_num, adc_instance & adc_inst) {
161167
adc_inst.x_magnitude = adc_inst.x_value - ANALOG_CENTER;
162168
adc_inst.y_magnitude = adc_inst.y_value - ANALOG_CENTER;
163-
return error_rate * std::sqrt((adc_inst.x_magnitude * adc_inst.x_magnitude) + (adc_inst.y_magnitude * adc_inst.y_magnitude));
169+
return adc_pairs[stick_num].error_rate * std::sqrt((adc_inst.x_magnitude * adc_inst.x_magnitude) + (adc_inst.y_magnitude * adc_inst.y_magnitude));
164170
}
165171

166-
void AnalogInput::radialDeadzone(adc_instance & adc_inst) {
167-
float scaling_factor = (adc_inst.xy_magnitude - in_deadzone) / (out_deadzone - in_deadzone);
168-
if (forced_circularity == true) {
172+
void AnalogInput::radialDeadzone(int stick_num, adc_instance & adc_inst) {
173+
float scaling_factor = (adc_inst.xy_magnitude - adc_pairs[stick_num].in_deadzone) / (adc_pairs[stick_num].out_deadzone - adc_pairs[stick_num].in_deadzone);
174+
if (adc_pairs[stick_num].forced_circularity == true) {
169175
scaling_factor = std::fmin(scaling_factor, ANALOG_CENTER);
170176
}
171177
adc_inst.x_value = ((adc_inst.x_magnitude / adc_inst.xy_magnitude) * scaling_factor) + ANALOG_CENTER;

src/config_utils.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,13 @@ void ConfigUtils::initUnsetPropertiesWithDefaults(Config& config)
609609
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, analog_smoothing, !!ANALOG_SMOOTHING_ENABLED);
610610
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, smoothing_factor, !!SMOOTHING_FACTOR);
611611
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, analog_error, ANALOG_ERROR);
612+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, analog_smoothing2, !!ANALOG_SMOOTHING2_ENABLED);
613+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, smoothing_factor2, !!SMOOTHING_FACTOR2);
614+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, analog_error2, ANALOG_ERROR2);
615+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, inner_deadzone2, DEFAULT_INNER_DEADZONE2);
616+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, outer_deadzone2, DEFAULT_OUTER_DEADZONE2);
617+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, auto_calibrate2, !!AUTO_CALIBRATE2_ENABLED);
618+
INIT_UNSET_PROPERTY(config.addonOptions.analogOptions, forced_circularity2, !!FORCED_CIRCULARITY2_ENABLED);
612619

613620
// addonOptions.turboOptions
614621
INIT_UNSET_PROPERTY(config.addonOptions.turboOptions, enabled, !!TURBO_ENABLED);

src/webconfig.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1508,12 +1508,19 @@ std::string setAddonOptions()
15081508
docToValue(analogOptions.analogAdc2Mode, doc, "analogAdc2Mode");
15091509
docToValue(analogOptions.analogAdc2Invert, doc, "analogAdc2Invert");
15101510
docToValue(analogOptions.forced_circularity, doc, "forced_circularity");
1511+
docToValue(analogOptions.forced_circularity2, doc, "forced_circularity2");
15111512
docToValue(analogOptions.inner_deadzone, doc, "inner_deadzone");
1513+
docToValue(analogOptions.inner_deadzone2, doc, "inner_deadzone2");
15121514
docToValue(analogOptions.outer_deadzone, doc, "outer_deadzone");
1515+
docToValue(analogOptions.outer_deadzone2, doc, "outer_deadzone2");
15131516
docToValue(analogOptions.auto_calibrate, doc, "auto_calibrate");
1517+
docToValue(analogOptions.auto_calibrate2, doc, "auto_calibrate2");
15141518
docToValue(analogOptions.analog_smoothing, doc, "analog_smoothing");
1519+
docToValue(analogOptions.analog_smoothing2, doc, "analog_smoothing2");
15151520
docToValue(analogOptions.smoothing_factor, doc, "smoothing_factor");
1521+
docToValue(analogOptions.smoothing_factor2, doc, "smoothing_factor2");
15161522
docToValue(analogOptions.analog_error, doc, "analog_error");
1523+
docToValue(analogOptions.analog_error2, doc, "analog_error2");
15171524
docToValue(analogOptions.enabled, doc, "AnalogInputEnabled");
15181525

15191526
BootselButtonOptions& bootselButtonOptions = Storage::getInstance().getAddonOptions().bootselButtonOptions;
@@ -1930,12 +1937,19 @@ std::string getAddonOptions()
19301937
writeDoc(doc, "analogAdc2Mode", analogOptions.analogAdc2Mode);
19311938
writeDoc(doc, "analogAdc2Invert", analogOptions.analogAdc2Invert);
19321939
writeDoc(doc, "forced_circularity", analogOptions.forced_circularity);
1940+
writeDoc(doc, "forced_circularity2", analogOptions.forced_circularity2);
19331941
writeDoc(doc, "inner_deadzone", analogOptions.inner_deadzone);
1942+
writeDoc(doc, "inner_deadzone2", analogOptions.inner_deadzone2);
19341943
writeDoc(doc, "outer_deadzone", analogOptions.outer_deadzone);
1944+
writeDoc(doc, "outer_deadzone2", analogOptions.outer_deadzone2);
19351945
writeDoc(doc, "auto_calibrate", analogOptions.auto_calibrate);
1946+
writeDoc(doc, "auto_calibrate2", analogOptions.auto_calibrate2);
19361947
writeDoc(doc, "analog_smoothing", analogOptions.analog_smoothing);
1948+
writeDoc(doc, "analog_smoothing2", analogOptions.analog_smoothing2);
19371949
writeDoc(doc, "smoothing_factor", analogOptions.smoothing_factor);
1950+
writeDoc(doc, "smoothing_factor2", analogOptions.smoothing_factor2);
19381951
writeDoc(doc, "analog_error", analogOptions.analog_error);
1952+
writeDoc(doc, "analog_error2", analogOptions.analog_error2);
19391953
writeDoc(doc, "AnalogInputEnabled", analogOptions.enabled);
19401954

19411955
const BootselButtonOptions& bootselButtonOptions = Storage::getInstance().getAddonOptions().bootselButtonOptions;

www/server/app.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,12 +460,19 @@ app.get('/api/getAddonsOptions', (req, res) => {
460460
analogAdc2Mode: 2,
461461
analogAdc2Invert: 0,
462462
forced_circularity: 0,
463+
forced_circularity2: 0,
463464
inner_deadzone: 5,
465+
inner_deadzone2: 5,
464466
outer_deadzone: 95,
467+
outer_deadzone2: 95,
465468
auto_calibrate: 0,
469+
auto_calibrate2: 0,
466470
analog_smoothing: 0,
471+
analog_smoothing2: 0,
467472
smoothing_factor: 5,
473+
smoothing_factor2: 5,
468474
analog_error: 1000,
475+
analog_error2: 1000,
469476
bootselButtonMap: 0,
470477
buzzerPin: -1,
471478
buzzerEnablePin: -1,

0 commit comments

Comments
 (0)