Skip to content

Commit

Permalink
Finalized button LED modes
Browse files Browse the repository at this point in the history
  • Loading branch information
veroxzik committed Sep 26, 2020
1 parent 37c31d2 commit ee49486
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 15 deletions.
65 changes: 56 additions & 9 deletions roxy/button_leds.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,16 @@

#define NUM_STEPS 20

enum LedMode {
Standard = 0,
StandardInvert,
FadeOut,
FadeOutInvert,
Pwm
};

class Button_Leds {
private:
enum Mode {
FadeOut,
Pwm
};
uint32_t ramp_down_cycles; // Converted to timer cycles
float ramp_down_slope;
bool led_on_req[NUM_BUTTONS];
Expand All @@ -24,7 +28,7 @@ class Button_Leds {
uint32_t led_current_period[NUM_BUTTONS];
uint32_t led_percentage[NUM_BUTTONS];
uint32_t cycle_count[NUM_BUTTONS];
Mode led_mode[NUM_BUTTONS];
LedMode led_mode[NUM_BUTTONS];


const uint8_t gamma_input[NUM_STEPS] = {100, 30, 20, 10, 0};
Expand All @@ -46,11 +50,17 @@ class Button_Leds {
ramp_down_slope = -100.0f / (float)ramp_down_cycles;
}

void set_mode(uint8_t index, LedMode mode) {
if(index >= NUM_BUTTONS) {
return;
}
led_mode[index] = mode;
}

void set_led(uint8_t index, bool state) {
if(index >= NUM_BUTTONS) {
return;
}
led_mode[index] = Mode::FadeOut;

if(state) {
led_on_req[index] = true;
Expand All @@ -69,7 +79,7 @@ class Button_Leds {
if(percentage == led_percentage[index]) {
return;
}
led_mode[index] = Mode::Pwm;
led_mode[index] = LedMode::Pwm;

led_percentage[index] = percentage;
led_current_period[index] = 0;
Expand All @@ -83,7 +93,23 @@ class Button_Leds {
uint32_t cur_time = Time::time();
for(int i=0; i<NUM_BUTTONS; i++) {
switch(led_mode[i]) {
case Mode::FadeOut:
case LedMode::Standard:
if(led_on_req[i]) {
button_leds[i].on();
} else {
button_leds[i].off();
}
break;

case LedMode::StandardInvert:
if(led_on_req[i]) {
button_leds[i].off();
} else {
button_leds[i].on();
}
break;

case LedMode::FadeOut:
if(led_on_req[i]) {
button_leds[i].on();
} else if((cur_time - led_release_time[i]) >= (ramp_down_cycles * 20)) { // Convert cycles to ms
Expand All @@ -104,7 +130,28 @@ class Button_Leds {
}
break;

case Mode::Pwm:
case LedMode::FadeOutInvert:
if(led_on_req[i]) {
button_leds[i].off();
} else if((cur_time - led_release_time[i]) >= (ramp_down_cycles * 20)) { // Convert cycles to ms
button_leds[i].on();
} else {
uint32_t elapsed = 20 * (cur_time - led_release_time[i]); // Get elapsed cycles
// Set percentage based on elapsed cycles
led_percentage[i] = ramp_down_slope * (float)elapsed + 100;
if(led_current_period[i] < led_percentage[i]) {
button_leds[i].off();
} else {
button_leds[i].on();
}
led_current_period[i]++;
if(led_current_period[i] >= led_set_period[i]) {
led_current_period[i] = 0;
}
}
break;

case LedMode::Pwm:
if(led_current_period[i] < led_percentage[i]) {
button_leds[i].on();
} else {
Expand Down
8 changes: 7 additions & 1 deletion roxy/config.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,14 @@ struct config_t {
struct mapping_config_t {
uint8_t button_kb_map[12]; // Keycodes for each button
uint8_t axes_kb_map[4]; // Keycodes for the axes (Overrides Flag bit 6)
uint8_t button_joy_map[12]; // Remapped joystick buttons if they are not the default
uint8_t button_joy_map[6]; // Remapped joystick buttons if they are not the default
// 1 nibble per button
uint8_t button_led_mode[6]; // 1 nibble per button
// 0 = Standard
// 1 = Standard (Invert)
// 2 = Fade out
// 3 = Fade out (Invert)
uint16_t button_led_fade_time; // Time in ms
};

#endif
9 changes: 4 additions & 5 deletions roxy/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,6 @@ class HID_arcin : public USB_HID {

last_led_time = Time::time();
for (int i = 0; i < NUM_BUTTONS; i++) {
// button_leds[i].set(((report->leds) >> i & 0x1) ^ ((config.flags >> 7) & 0x1));
button_led_manager.set_led(i, ((report->leds) >> i & 0x1) ^ ((config.flags >> 7) & 0x1));
}

Expand All @@ -239,8 +238,7 @@ class HID_arcin : public USB_HID {
tlc59711.schedule_dma();
break;
}
// button_led_manager.set_pwm(0, report->r1 * 100 / 255);


return true;
}

Expand Down Expand Up @@ -569,14 +567,16 @@ int main() {
uint32_t button_time[12];
bool last_state[12];

for (int i = 0; i < NUM_BUTTONS; i++) {
for (uint8_t i = 0; i < NUM_BUTTONS; i++) {
button_inputs[i].set_mode(Pin::Input);
button_inputs[i].set_pull(Pin::PullUp);

button_leds[i].set_mode(Pin::Output);

button_time[i] = Time::time();
last_state[i] = button_inputs[i].get();

button_led_manager.set_mode(i, (LedMode)((mapping_config.button_led_mode[i / 2] >> ((i % 2) * 4)) & 0xF));
}

button_led_manager.init(500);
Expand Down Expand Up @@ -838,7 +838,6 @@ int main() {

if(Time::time() - last_led_time > 1000) {
for (int i = 0; i < NUM_BUTTONS; i++) {
//button_leds[i].set((buttons >> i & 0x1) ^ ((config.flags >> 7) & 0x1));
button_led_manager.set_led(i, (buttons >> i & 0x1) ^ ((config.flags >> 7) & 0x1));
}

Expand Down

0 comments on commit ee49486

Please sign in to comment.