+ unsigned char buttons = buttons_read();
+
+ if ((buttons & (IN_ROCKERA | IN_ROCKERB))) {
+ if (buttons & IN_PUSHBTN) {
+ if (!fast) {
+ incolor_time = 0;
+ fade_time = 0;
+ fast = 1;
+ } else
+ fast = 0;
+ }
+
+ if (fade_time) {
+ red += fadestep_red;
+ grn += fadestep_grn;
+ blu += fadestep_blu;
+ //wht += fadestep_wht;
+ rgb_set(red, grn, blu, 0); // wht);
+ fade_time--;
+ } else if (incolor_time)
+ incolor_time--;
+ else /* fade_time == 0 && incolor_time == 0 */ {
+ unsigned char newr, newg, newb, neww;
+
+ /* Determine next color state */
+ newr = random_rgb();
+ newg = random_rgb();
+ newb = random_rgb();
+ //neww = random_rgb();
+
+ /* Calculate new incolor_time and fade_time */
+ if (buttons & IN_ROCKERA) {
+ incolor_time = 1 + random_time();
+ fade_time = 1;
+ } else /* (buttons & IN_ROCKERB) */ {
+ incolor_time = min_incolor_time() + random_time() / 2;
+ fade_time = min_fade_time() + random_time() / 2;
+ }
+
+ if (fast) {
+ incolor_time = 1 + incolor_time / 8;
+ fade_time = 1 + fade_time / 8;
+ }
+
+ fadestep_red = ((int)newr - red) / fade_time;
+ fadestep_grn = ((int)newg - red) / fade_time;
+ fadestep_blu = ((int)newb - red) / fade_time;
+ //fadestep_wht = ((int)neww - red) / fade_time;
+ }
+ __delay_ms(10);
+ } else {
+ rgb_off();
+ buttons_sleep();
+ incolor_time = 0;
+ fade_time = 0;
+ rgb_on();
+ }