#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; }