From c8b3250f15ac75d60991b3ad2562209e853cc6f4 Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Fri, 1 Jan 2021 13:12:17 -0600 Subject: 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 --- led_gradient.c | 214 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 214 insertions(+) create mode 100644 led_gradient.c (limited to 'led_gradient.c') 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 +#include +#include +#include +#include +#include +#include + +#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; +} -- cgit v1.2.3