Add LED Speed option

This commit is contained in:
Derek Jamison 2023-11-26 11:09:43 -06:00
parent b875cb8103
commit e517031c7c
4 changed files with 43 additions and 9 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -38,6 +38,7 @@ typedef struct {
uint8_t led_pin_index; // The index of the pin we are using to control the LEDs
uint32_t led_count; // The number of LEDs
uint8_t led_pattern_index; // The pattern index
int8_t led_divisor; // The speed divisor (1-4, -1 = stopped)
uint8_t led_max_brightness; // The maximum brightness (0-100)
uint8_t timer_counter; // The current timer counter (used for auto-scrolling)
bool enable_5v; // Enable 5V output
@ -183,7 +184,7 @@ static void led_tester_setting_led_count_change(VariableItem* item) {
// Settings for configuring which LED pattern to use.
static const char* setting_led_pattern_config_label = "LED Pattern";
static char* setting_led_pattern_names[] =
{"Red", "Green", "Blue", "White", "RGBW", "GBWR", "BWRG", "WRGB", "Rotate"};
{"Red", "Green", "Blue", "White", "RGBW", "GBWR", "BWRG", "WRGB"};
static void led_tester_setting_led_pattern_change(VariableItem* item) {
LedTesterApp* app = variable_item_get_context(item);
LedTesterModel* model = app->model;
@ -193,6 +194,19 @@ static void led_tester_setting_led_pattern_change(VariableItem* item) {
led_tester_settings_updated(app);
}
// Settings for configuring which LED speed to use.
static const char* setting_led_speed_config_label = "LED Speed";
static int16_t setting_led_speed_values[] = {-1, 3, 2, 1};
static char* setting_led_speed_names[] = {"Stopped", "Slow", "Medium", "Fast"};
static void led_tester_setting_led_speed_change(VariableItem* item) {
LedTesterApp* app = variable_item_get_context(item);
LedTesterModel* model = app->model;
uint8_t index = variable_item_get_current_value_index(item);
variable_item_set_current_value_text(item, setting_led_speed_names[index]);
model->led_divisor = setting_led_speed_values[index];
led_tester_settings_updated(app);
}
// Settings for configuring the LED brightness.
static const char* setting_led_brightness_config_label = "LED Brightness";
static uint16_t setting_led_brightness_values[] = {1, 2, 3, 5, 10, 20, 25, 50, 75, 100};
@ -238,6 +252,10 @@ static bool led_tester_custom_event_callback(void* context, uint32_t event) {
app->model->timer_counter++;
}
uint8_t offset = (app->model->led_divisor == -1) ?
0 :
(app->model->timer_counter / app->model->led_divisor) & 0x3;
uint32_t rgb[4] = {0};
switch(app->model->led_pattern_index) {
case 0: // RED
@ -288,16 +306,20 @@ static bool led_tester_custom_event_callback(void* context, uint32_t event) {
rgb[2] = 0x00FF00;
rgb[3] = 0x0000FF;
break;
case 8: // Rotate
rgb[(app->model->timer_counter + 0) & 0x3] = 0xFFFFFF;
rgb[(app->model->timer_counter + 1) & 0x3] = 0xFF0000;
rgb[(app->model->timer_counter + 2) & 0x3] = 0x00FF00;
rgb[(app->model->timer_counter + 3) & 0x3] = 0x0000FF;
break;
default:
break;
}
// Rotate the pattern
for(int i = 0; i < offset; i++) {
uint32_t tmp = rgb[3];
rgb[3] = rgb[2];
rgb[2] = rgb[1];
rgb[1] = rgb[0];
rgb[0] = tmp;
}
// If deinit, turn off the LEDs
if(event == LedTesterEventDeinit) {
rgb[0] = 0;
rgb[1] = 0;
@ -343,7 +365,7 @@ void led_tester_enter_leds_callback(void* _context) {
// Hack, we use a global to access the app object.
LedTesterApp* app = (LedTesterApp*)global_app;
app->timer = furi_timer_alloc(led_tester_timer_callback, FuriTimerTypePeriodic, app);
furi_timer_start(app->timer, 500);
furi_timer_start(app->timer, 250);
view_dispatcher_send_custom_event(app->view_dispatcher, LedTesterEventInitialized);
}
@ -441,6 +463,18 @@ static LedTesterApp* led_tester_app_alloc() {
item, setting_led_pattern_names[setting_led_pattern_index]);
app->model->led_pattern_index = setting_led_pattern_index;
// Speed
item = variable_item_list_add(
app->variable_item_list,
setting_led_speed_config_label,
COUNT_OF(setting_led_speed_names),
led_tester_setting_led_speed_change,
app);
uint8_t setting_led_speed_index = 0;
variable_item_set_current_value_index(item, setting_led_speed_index);
variable_item_set_current_value_text(item, setting_led_speed_names[setting_led_speed_index]);
app->model->led_divisor = setting_led_speed_values[setting_led_speed_index];
// Brightness
item = variable_item_list_add(
app->variable_item_list,

View File

@ -3,7 +3,7 @@ App(
name="WS2812B LED Tester App",
apptype=FlipperAppType.EXTERNAL,
entry_point="ws2812b_led_tester_app",
fap_version=(1, 2),
fap_version=(1, 3),
stack_size=4 * 1024,
requires=[
"gui",