--- /dev/null
+/* -*- c -*- */
+/* Arduino rgb led driver */
+/* Copyright (c) 2014 Clinton Ebadi <clinton@unknownlamer.org> */
+/* This program is free software: you can redistribute it and/or modify */
+/* it under the terms of the GNU General Public License as published by */
+/* the Free Software Foundation, either version 3 of the License, or */
+/* (at your option) any later version. */
+
+/* This program is distributed in the hope that it will be useful, */
+/* but WITHOUT ANY WARRANTY; without even the implied warranty of */
+/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */
+/* GNU General Public License for more details. */
+
+/* You should have received a copy of the GNU General Public License */
+/* along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include <avr/pgmspace.h>
+#include "gamma.h"
+
+const int dither_steps = pow (2, DITHER_BITS);
+
+typedef struct rgb_pins
+{
+ int red;
+ int green;
+ int blue;
+} rgb_pins;
+
+const int rgb_banks = 2;
+
+const rgb_pins pins[rgb_banks] = { {10, 9, 11},
+ {5, 6, 3} };
+
+static int led_colors[rgb_banks * 3];
+
+void set_color_x (int r, int g, int b, int dither_step = 0)
+{
+ int offset = dither_step * 256;
+
+ for (int bank = 0; bank < rgb_banks; bank++)
+ {
+ analogWrite (pins[bank].red, pgm_read_byte_near (gammaTable + (r >= 0 ? offset : 0) + r));
+ analogWrite (pins[bank].green, pgm_read_byte_near (gammaTable + (g >= 0 ? offset : 0) + g));
+ analogWrite (pins[bank].blue, pgm_read_byte_near (gammaTable + (b >= 0 ? offset : 0) + b));
+ }
+}
+
+void setup ()
+{
+ Serial.begin (115200);
+ Serial.setTimeout (100000);
+
+ for (int bank = 0; bank < rgb_banks; bank++)
+ {
+ pinMode (pins[bank].red, OUTPUT);
+ pinMode (pins[bank].green, OUTPUT);
+ pinMode (pins[bank].blue, OUTPUT);
+ }
+
+ // Test sequence to confirm wiring
+ set_color_x (255, 255, 255);
+ delay(500);
+ set_color_x (255, 0, 0);
+ delay (500);
+ set_color_x (0, 255, 0);
+ delay (500);
+ set_color_x (0, 0, 255);
+ delay (500);
+}
+
+void loop ()
+{
+ static int r = 192;
+ static int g = 192;
+ static int b = 192;
+ static int step = -1;
+
+ //step = (step + 1) % dither_steps;
+ step = 0; // dithering is bogus/i'm-not-doing-it-right
+
+ if (Serial.available () >= 3)
+ {
+ r = Serial.read ();
+ g = Serial.read ();
+ b = Serial.read ();
+
+ Serial.print ("set color ");
+ Serial.print (r);
+ Serial.print (" ");
+ Serial.print (g);
+ Serial.print (" ");
+ Serial.print (b);
+ Serial.println ();
+
+ set_color_x (r, g, b);
+ }
+
+ set_color_x (r, g, b, step);
+
+}