summaryrefslogtreecommitdiff
path: root/led_gradient.c
diff options
context:
space:
mode:
authorBrett Weiland <techcrazybsw@gmail.com>2021-01-01 13:12:17 -0600
committerBrett Weiland <techcrazybsw@gmail.com>2021-01-01 13:12:17 -0600
commitc8b3250f15ac75d60991b3ad2562209e853cc6f4 (patch)
tree3064f3d49cfc0874df29d20c9ac4c4298447755d /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.c214
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;
+}