diff options
author | Brett Weiland <techcrazybsw@gmail.com> | 2021-01-01 13:12:17 -0600 |
---|---|---|
committer | Brett Weiland <techcrazybsw@gmail.com> | 2021-01-01 13:12:17 -0600 |
commit | c8b3250f15ac75d60991b3ad2562209e853cc6f4 (patch) | |
tree | 3064f3d49cfc0874df29d20c9ac4c4298447755d /led_gradient.c |
new file: gradient.h
new file: led_clear.c
new file: led_gradient.c
new file: led_info.h
new file: led_test.c
new file: makefile
new file: push.sh
new file: shit.c
Diffstat (limited to 'led_gradient.c')
-rw-r--r-- | led_gradient.c | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/led_gradient.c b/led_gradient.c new file mode 100644 index 0000000..40c3fc5 --- /dev/null +++ b/led_gradient.c @@ -0,0 +1,214 @@ +#include <stdio.h> +#include <unistd.h> +#include <stdlib.h> +#include <ws2811/ws2811.h> +#include <string.h> +#include <ncurses.h> +#include <wchar.h> + +#include "led_info.h" +#include "gradient.h" + +void refresh_strip(ws2811_t *ledstring, segment_t *segments, unsigned int segment_amount) { + unsigned int s = 0; + unsigned int led; + for(; s < segment_amount; s++) { + for(; led < segments[s].size; led++) { + ledstring->channel[0].leds[led] = segments[s].color; + } + } + if(led < (LED_COUNT - 1)) { + for(; led < LED_COUNT; led++) { + ledstring->channel[0].leds[led] = segments[s].color; + } + } + ws2811_render(ledstring); +} + +unsigned int find_starting_pos(segment_t *segments, unsigned int index) { + unsigned int position = 0; + for(int i = 0; i < position; i++) position += segments[i].size; + return(position); +} + +int main() { + + segment_t *segments = malloc(sizeof(segment_t)); //just start with one + segments[0].size = LED_COUNT - 1; + + int prev_program_state = VIEW_MODE; + int program_state = VIEW_MODE; + int ui_selection = 0; + unsigned int i; + unsigned int starting_pos; + unsigned int segment_selection = 0; + unsigned int segment_quanity = 1; + + + + int selection_state = 0; //just for asthetics + + int user_key; + + char *main_msg = "Press the arrow keys to select the segment, and enter to edit it.\nTo create new segments, select the segment you want to divide.\n"; + char *modification_menu[6] = { + "Change red", + "Change green", + "Change blue", + "Change size", + "Subdivide (create segment)", + "Go back" + }; + int modification_menu_items = 6; + + for(;;) { + if(prev_program_state != program_state) { + switch(program_state) { + case MODIFY_MODE: + for(i = 0; i < modification_menu_items; i++) { + cbreak(); + if(ui_selection = i) attron(A_STANDOUT); + printw("%s\n", modification_menu); + if(ui_selection = i) attroff(A_STANDOUT); + } + refresh(); + break; + case MODIFY_R: + printw("Modifying red value.\n"); + refresh(); + break; + case MODIFY_G: + printw("Modifying green value.\n"); + refresh(); + break; + case MODIFY_B: + printw("Modifying blue value.\n"); + refresh(); + break; + case MODIFY_SIZE: + printw("Modifying size.\n"); + refresh(); + break; + case VIEW_MODE: + cbreak(); + break; + case SELECT_MODE: + halfdelay(1); + break; + case EXITED: + for(i = 0; i < LED_COUNT; i++) { + ledstring.channel[0].leds[i] = 0; + } + ws2811_render(&ledstring); + ws2811_fini(&ledstring); + clear(); + endwin(); + printf("goodbye\n"); + return 0; + break; + default: + break; + } + } + + if((user_key = getch()) != ERR) { + switch(user_key) { + + case KEY_LEFT: + switch(program_state) { + case VIEW_MODE: + program_state = SELECT_MODE; + segment_selection = segment_quanity; + break; + case SELECT_MODE: + if(segment_selection < segment_quanity) segment_selection++; + break; + default: + break; + } + break; + + case KEY_RIGHT: + switch(program_state) { + case VIEW_MODE: + program_state = SELECT_MODE; + segment_selection = 0; + break; + case SELECT_MODE: + if(segment_selection > 0) segment_selection--; + break; + default: + break; + } + break; + + case KEY_UP: + switch(program_state) { + case MODIFY_R: + if ((segments[segment_selection].color >> 16) < 0xff) segments[segment_selection].color += 0x10000; + break; + case MODIFY_G: + if ((segments[segment_selection].color >> 8 & 0xff) < 0xff) segments[segment_selection].color += 0x100; + break; + case MODIFY_B: + if ((segments[segment_selection].color & 0xff) < 0xff) segments[segment_selection].color += 1; + break; + case MODIFY_SIZE: + default: + break; + } + break; + + case KEY_DOWN: + switch(program_state) { + default: + break; + } + break; + + case KEY_ENTER: + switch(program_state) { + case VIEW_MODE: + program_state = SELECT_MODE; + default: + break; + } + break; + + case 'q': + switch(program_state) { + case VIEW_MODE: + program_state = EXITED; + break; + case SELECT_MODE: + program_state = VIEW_MODE; + break; + case MODIFY_MODE: + program_state = SELECT_MODE; + break; + case MODIFY_R: + case MODIFY_G: + case MODIFY_B: + case MODIFY_SIZE: + program_state = MODIFY_MODE; + default: + break; + } + break; + + default: + break; + } + prev_program_state = program_state; + } + else if(program_state = SELECT_MODE) { + starting_pos = find_starting_pos(segments, segment_selection); + for(i = starting_pos; i <= starting_pos + segments[segment_selection].size; i++) { + ledstring.channel[0].leds[i] = (selection_state ? (i % 2) : ((i+1) % 2)) ? 0xffffff : 0; + } + selection_state ? 0 : 1; + ws2811_render(&ledstring); + } + } + return 0; +} |