Skip to content

Commit e110c02

Browse files
committed
Added modes with exponential, logarithmic, square and square root.
1 parent 7714ae3 commit e110c02

File tree

3 files changed

+192
-80
lines changed

3 files changed

+192
-80
lines changed

FTController.ino

+162-67
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,18 @@
55
#include "chars.h"
66
#include <LiquidCrystal.h>
77

8-
int16_t joysticks[4];
8+
//Global objects
99
LiquidCrystal lcd(LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
10-
1110
static InputDebounce button;
11+
1212
uint8_t menu = MENU_HIDDEN;
1313

1414
uint8_t mode;
1515
uint8_t display_mode;
1616

17+
int16_t joysticks[4];
18+
int16_t output_val[4];
19+
1720
void setup()
1821
{
1922

@@ -28,7 +31,7 @@ void setup()
2831
//Override read modes
2932
//mode = MODE_DIGITAL;
3033
//mode = MODE_ANALOG;
31-
display_mode = DISPLAY_OUT;
34+
display_mode = DISPLAY_VOLT;
3235

3336
button.registerCallbacks(button_pressedCallback, button_releasedCallback, button_pressedDurationCallback);
3437
button.setup(SW_L);
@@ -51,8 +54,17 @@ void loop()
5154
case MODE_ANALOG:
5255
mode_analog();
5356
break;
54-
case MODE_ANALOG2:
55-
mode_analog2();
57+
case MODE_EXP:
58+
mode_exp();
59+
break;
60+
case MODE_SQUARE:
61+
mode_square();
62+
break;
63+
case MODE_LN:
64+
mode_log();
65+
break;
66+
case MODE_SQRT:
67+
mode_sqrt();
5668
break;
5769
default:
5870
break;
@@ -65,6 +77,10 @@ void loop()
6577
//delay(100);
6678
}
6779

80+
81+
/*********************************************
82+
* DISPLAY
83+
**********************************************/
6884
void update_display()
6985
{
7086
static long lasttime = millis();
@@ -85,30 +101,98 @@ void update_display()
85101
case DISPLAY_VOLT:
86102
display_volt();
87103
break;
104+
case DISPLAY_OUT:
105+
display_out();
106+
break;
88107
}
89108

90109
lasttime = millis();
91110
}
92111
}
93112

113+
114+
115+
inline void display_input()
116+
{
117+
//lcd.clear();
118+
lcd.setCursor(0, 0);
119+
lcd.print(joysticks[JOYSTICK_LX]);
120+
lcd.setCursor(4, 0);
121+
lcd.print(joysticks[JOYSTICK_LY]);
122+
lcd.setCursor(0, 1);
123+
lcd.print(joysticks[JOYSTICK_RX]);
124+
lcd.setCursor(4, 1);
125+
lcd.print(joysticks[JOYSTICK_RY]);
126+
}
127+
128+
void display_volt()
129+
{
130+
//Input Voltage
131+
lcd.setCursor(0, 0);
132+
lcd.print(F("IN:"));
133+
uint16_t val = read_input_volt();
134+
if (val < 10000) //Insert space if only one digit
135+
lcd.print(" ");
136+
lcd.print(val / 1000.0, 1);
137+
lcd.setCursor(7, 0);
138+
lcd.print(F("V"));
139+
140+
//5V Voltage
141+
lcd.setCursor(0, 1);
142+
lcd.print(F("5V:"));
143+
val = read_MCU_volt();
144+
if (val < 10000) //Insert space if only one digit
145+
lcd.print(" ");
146+
lcd.print(val / 1000.0, 1);
147+
lcd.setCursor(7, 1);
148+
lcd.print(F("V"));
149+
}
150+
151+
void display_out()
152+
{
153+
lcd.print(output_val[JOYSTICK_LX]);
154+
lcd.setCursor(4, 0);
155+
lcd.print(output_val[JOYSTICK_LY]);
156+
lcd.setCursor(0, 1);
157+
lcd.print(output_val[JOYSTICK_RX]);
158+
lcd.setCursor(4, 1);
159+
lcd.print(output_val[JOYSTICK_RY]);
160+
}
161+
162+
/*******************************************
163+
* MENU
164+
*******************************************/
165+
94166
inline void show_menu()
95167
{
96168
static char lx_laststate = 0;
97169
static char lx_action = 0;
98170
static long lasttime = millis();
99171

100-
lcd.print("MODE:");
172+
lcd.print(F("MODE:"));
101173
lcd.setCursor(0, 1);
102174
switch (mode)
103175
{
176+
case MODE_NOTHING:
177+
lcd.print(F("None"));
178+
break;
104179
case MODE_DIGITAL:
105180
lcd.print(F("Digital"));
106181
break;
107182
case MODE_ANALOG:
108183
lcd.print(F("Linear"));
109184
break;
110-
case MODE_ANALOG2:
111-
lcd.print(F("Analog2"));
185+
case MODE_EXP:
186+
lcd.print(F("Exp"));
187+
break;
188+
case MODE_SQUARE:
189+
lcd.print(F("Square"));
190+
break;
191+
case MODE_LN:
192+
lcd.print(F("Log"));
193+
break;
194+
case MODE_SQRT:
195+
lcd.print(F("Sqrt"));
112196
break;
113197
default:
114198
lcd.print(F("UNKNOWN"));
@@ -143,18 +227,9 @@ inline void show_menu()
143227
}
144228
}
145229

146-
inline void display_input()
147-
{
148-
//lcd.clear();
149-
lcd.setCursor(0, 0);
150-
lcd.print(joysticks[JOYSTICK_LX]);
151-
lcd.setCursor(4, 0);
152-
lcd.print(joysticks[JOYSTICK_LY]);
153-
lcd.setCursor(0, 1);
154-
lcd.print(joysticks[JOYSTICK_RX]);
155-
lcd.setCursor(4, 1);
156-
lcd.print(joysticks[JOYSTICK_RY]);
157-
}
230+
/********************************************
231+
* MODE HANDLING
232+
*********************************************/
158233

159234
inline void mode_digital()
160235
{
@@ -200,14 +275,61 @@ inline void mode_analog()
200275
motor_output_analog(MOTOR_RY, joysticks[JOYSTICK_RY]);
201276
}
202277

203-
inline void mode_analog2()
278+
inline void mode_exp()
204279
{
205-
//motor_output_analog(MOTOR_LX, joysticks[JOYSTICK_LX]);
206-
motor_output_analog_table(MOTOR_LY, joysticks[JOYSTICK_LY], TABLE_SQUARE);
207-
//motor_output_analog(MOTOR_RX, joysticks[JOYSTICK_RX]);
208-
//motor_output_analog(MOTOR_RY, joysticks[JOYSTICK_RY]);
280+
output_val[JOYSTICK_LX] = map_joy_with_table(joysticks[JOYSTICK_LX], TABLE_EXP);
281+
output_val[JOYSTICK_LY] = map_joy_with_table(joysticks[JOYSTICK_LY], TABLE_EXP);
282+
output_val[JOYSTICK_RX] = map_joy_with_table(joysticks[JOYSTICK_RX], TABLE_EXP);
283+
output_val[JOYSTICK_RY] = map_joy_with_table(joysticks[JOYSTICK_RY], TABLE_EXP);
284+
285+
motor_output_analog_raw(MOTOR_LX ,output_val[JOYSTICK_LX]);
286+
motor_output_analog_raw(MOTOR_LY, output_val[JOYSTICK_LY]);
287+
motor_output_analog_raw(MOTOR_RX, output_val[JOYSTICK_RX]);
288+
motor_output_analog_raw(MOTOR_RY, output_val[JOYSTICK_RY]);
209289
}
210290

291+
inline void mode_square()
292+
{
293+
output_val[JOYSTICK_LX] = map_joy_with_table(joysticks[JOYSTICK_LX], TABLE_SQUARE);
294+
output_val[JOYSTICK_LY] = map_joy_with_table(joysticks[JOYSTICK_LY], TABLE_SQUARE);
295+
output_val[JOYSTICK_RX] = map_joy_with_table(joysticks[JOYSTICK_RX], TABLE_SQUARE);
296+
output_val[JOYSTICK_RY] = map_joy_with_table(joysticks[JOYSTICK_RY], TABLE_SQUARE);
297+
298+
motor_output_analog_raw(MOTOR_LX, output_val[JOYSTICK_LX]);
299+
motor_output_analog_raw(MOTOR_LY, output_val[JOYSTICK_LY]);
300+
motor_output_analog_raw(MOTOR_RX, output_val[JOYSTICK_RX]);
301+
motor_output_analog_raw(MOTOR_RY, output_val[JOYSTICK_RY]);
302+
}
303+
304+
inline void mode_log()
305+
{
306+
output_val[JOYSTICK_LX] = map_joy_with_table(joysticks[JOYSTICK_LX], TABLE_LOG);
307+
output_val[JOYSTICK_LY] = map_joy_with_table(joysticks[JOYSTICK_LY], TABLE_LOG);
308+
output_val[JOYSTICK_RX] = map_joy_with_table(joysticks[JOYSTICK_RX], TABLE_LOG);
309+
output_val[JOYSTICK_RY] = map_joy_with_table(joysticks[JOYSTICK_RY], TABLE_LOG);
310+
311+
motor_output_analog_raw(MOTOR_LX, output_val[JOYSTICK_LX]);
312+
motor_output_analog_raw(MOTOR_LY, output_val[JOYSTICK_LY]);
313+
motor_output_analog_raw(MOTOR_RX, output_val[JOYSTICK_RX]);
314+
motor_output_analog_raw(MOTOR_RY, output_val[JOYSTICK_RY]);
315+
}
316+
317+
inline void mode_sqrt()
318+
{
319+
output_val[JOYSTICK_LX] = map_joy_with_table(joysticks[JOYSTICK_LX], TABLE_SQRT);
320+
output_val[JOYSTICK_LY] = map_joy_with_table(joysticks[JOYSTICK_LY], TABLE_SQRT);
321+
output_val[JOYSTICK_RX] = map_joy_with_table(joysticks[JOYSTICK_RX], TABLE_SQRT);
322+
output_val[JOYSTICK_RY] = map_joy_with_table(joysticks[JOYSTICK_RY], TABLE_SQRT);
323+
324+
motor_output_analog_raw(MOTOR_LX, output_val[JOYSTICK_LX]);
325+
motor_output_analog_raw(MOTOR_LY, output_val[JOYSTICK_LY]);
326+
motor_output_analog_raw(MOTOR_RX, output_val[JOYSTICK_RX]);
327+
motor_output_analog_raw(MOTOR_RY, output_val[JOYSTICK_RY]);
328+
}
329+
330+
/******************************************************
331+
* HELPER FUNCTIONS
332+
******************************************************/
211333
void read_joysticks()
212334
{
213335
//Calculate
@@ -239,48 +361,6 @@ void startup_banner()
239361
lcd.clear();
240362
}
241363

242-
uint16_t update_volt()
243-
{
244-
lcd.setCursor(0, 0);
245-
lcd.print("V: ");
246-
lcd.print(read_MCU_volt());
247-
}
248-
249-
void display_volt()
250-
{
251-
//Input Voltage
252-
lcd.setCursor(0, 0);
253-
lcd.print(F("IN:"));
254-
uint16_t val = read_input_volt();
255-
if (val < 10000) //Insert space if only one digit
256-
lcd.print(" ");
257-
lcd.print(val / 1000.0, 1);
258-
lcd.setCursor(7, 0);
259-
lcd.print(F("V"));
260-
261-
//5V Voltage
262-
lcd.setCursor(0, 1);
263-
lcd.print(F("5V:"));
264-
val = read_MCU_volt();
265-
if (val < 10000) //Insert space if only one digit
266-
lcd.print(" ");
267-
lcd.print(val / 1000.0, 1);
268-
lcd.setCursor(7, 1);
269-
lcd.print(F("V"));
270-
}
271-
272-
void button_pressedCallback()
273-
{
274-
if (menu == MENU_SHOW) //Toggle menu visibility
275-
{
276-
menu = MENU_HIDDEN;
277-
eeprom_save();
278-
}
279-
else
280-
menu = MENU_SHOW;
281-
}
282-
283-
284364
void eeprom_save()
285365
{
286366
//Save Mode
@@ -305,6 +385,21 @@ void read_eeprom()
305385
display_mode = tmp;
306386
}
307387

388+
/***************************************************
389+
* BUTTON HANDLERS
390+
****************************************************/
391+
392+
void button_pressedCallback()
393+
{
394+
if (menu == MENU_SHOW) //Toggle menu visibility
395+
{
396+
menu = MENU_HIDDEN;
397+
eeprom_save();
398+
}
399+
else
400+
menu = MENU_SHOW;
401+
}
402+
308403
void button_releasedCallback()
309404
{
310405

helpers.cpp

+18-8
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ void motor_output_analog(uint8_t motor, int16_t val)
128128
}
129129
}
130130

131-
void motor_output_analog_no_thre(uint8_t motor, int16_t val)
131+
void motor_output_analog_raw(uint8_t motor, int16_t val)
132132
{
133133
uint16_t m1, m2;
134134
switch (motor)
@@ -153,17 +153,15 @@ void motor_output_analog_no_thre(uint8_t motor, int16_t val)
153153

154154
if (val > 0)
155155
{
156-
val = map(val, TOLERANCE_P, MAXIMUM_P, 0, 300);
157156
if (val > 255) val = 255;
158157
SoftPWMSet(m1, val);
159158
SoftPWMSet(m2, 0);
160159
}
161160
else if (val < 0)
162161
{
163-
val = map(val, TOLERANCE_N, MAXIMUM_N, 0, 300);
164-
if (val > 255) val = 255;
162+
if (val < -255) val = -255;
165163
SoftPWMSet(m1, 0);
166-
SoftPWMSet(m2, val);
164+
SoftPWMSet(m2, -val);
167165
}
168166
else
169167
{
@@ -229,11 +227,23 @@ int16_t map_joy_with_table(int16_t val, const uint8_t table[25])
229227
if (val < 0 && val > TOLERANCE_N)
230228
return 0;
231229

232-
uint8_t index = abs(val) / 10;
230+
int16_t pwm;
231+
if (val > 0)
232+
{
233+
pwm = map(val, TOLERANCE_P, MAXIMUM_P, 0, 300);
234+
}
235+
else if (val < 0)
236+
{
237+
pwm = map(val, TOLERANCE_N, MAXIMUM_N, 0, 300);
238+
}
233239

240+
if (pwm > 255) pwm = 255;
241+
242+
uint8_t index = pwm / 10;
243+
234244
if (val > 0)
235-
return table[index];
245+
return pgm_read_byte(&(table[index]));
236246
else
237-
return -table[index];
247+
return - pgm_read_byte(&(table[index]));
238248
}
239249

0 commit comments

Comments
 (0)