@@ -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
7581void 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
156162uint16_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 ;
0 commit comments