/******************************************************************************/ /* Files to Include */ /******************************************************************************/ #include /* For uint8_t definition */ #include /* For true/false definition */ #include "user.h" /* User funct/params, such as InitApp */ #include "ws2811.h" #include "serial.h" /******************************************************************************/ /* User Global Variable Declaration */ /******************************************************************************/ /* i.e. uint8_t ; */ void RGBWheel(uint16_t pos, uint8_t *r, uint8_t *g, uint8_t *b) { switch (pos / 128) { case 0: *r = (127 - pos % 128); *g = pos % 128; *b = 0; break; case 1: *g = (127 - pos % 128); *b = pos % 128; *r = 0; break; case 2: *b = 127 - pos % 128; *r = pos % 128; *g = 0; break; } } /* connect Fixed Voltage Reference to A2D convertor * input, set Vdd as reference, read value. * (val / 1024) * Vref == Vdd */ bool test_battery(void) { uint16_t volt; // read battery // Read Vdd by sampling FVR FVRCONbits.ADFVR = 0b10; // 2.048v // 1.024v FVRCONbits.FVREN = 1; // enable while (!FVRCONbits.FVRRDY) {}; // wait for it to stabilise ADCON1bits.ADCS = 0b110; // slowest sample clock ADCON1bits.ADFM = 1; // right justify ADCON0bits.CHS = 0b11111; // FVR input ADCON1bits.ADPREF = 0b00; // +ve ref Vdd ADCON0bits.ADON = 1; // enable ADC ADCON0bits.GO = 1; // start conversion while (ADCON0bits.GO) {}; // wait til finished volt = (ADRESH << 8) | ADRESL; // 3.0 V is >= 0x02BB if (volt >= 0x02BB) { unsigned char i; unsigned char *p; // first pixel faint red, rest black // battery below 3.0v p = rgbdata; for (i=0; i> 1) ^ (-(lfsr & 1u) & 0xB400u); return lfsr; } #endif #define CHECK_MSEC 5 // sample key every 5 mS #define PRESS_MSEC 10 // stable before presses #define RELEASE_MSEC 100 // stable before released /* test to see if the button has been pressed */ bool test_button(void) { static bool down = false; static uint8_t count = PRESS_MSEC / CHECK_MSEC; // button was up if (!down) { if (PORTAbits.RA1 == 0) count--; else count = PRESS_MSEC / CHECK_MSEC; // has been down for the count, flip state if (count <= 0) { down = true; count = RELEASE_MSEC / CHECK_MSEC; } } else { if (PORTAbits.RA1 == 1) count--; else count = RELEASE_MSEC / CHECK_MSEC; // has been back up for the count // flip state, and say we saw one cycle if (count <= 0) { down = false; count = PRESS_MSEC / CHECK_MSEC; return true; } } return false; } void clear_all(void) { unsigned char i; /* blank everything */ for (i=0; i0; i--) { RGBWheel(((i-1) * quant / 16) % 384, &r, &g, &b); *(p++) = g/4; *(p++) = r/4; *(p++) = b/4; } return true; } #define RAIN_UNIT 5 unsigned char rain_delay = RAIN_UNIT; bool rainbow_rotate(void) { static unsigned char delay = 0; unsigned char r,g,b; unsigned char *p; unsigned char i; unsigned char t; if ((delay--) > 0) return false; // rotate the colours p = rgbdata; g = p[0]; r = p[1]; b = p[2]; for (i=0; i<15*3; i++) { *p = *(p+3); p++; } *(p++) = g; *(p++) = r; *(p++) = b; // left eye, other direction p += 15 * 3; g = p[0]; r = p[1]; b = p[2]; p += 2; for (i=0; i<15*3; i++) { *p = *(p-3); p--; } *(p--) = b; *(p--) = r; *(p--) = g; delay = rain_delay; return true; } /****** colour bouncing blobs mode */ int8_t rspeed, gspeed, bspeed; #define MAX_SPEED 30; #define MAX_LEN 8 #define MAX_BRIGHT 32 bool bouncer_draw(void) { clear_all(); rspeed = dorand() % MAX_SPEED; gspeed = dorand() % MAX_SPEED; bspeed = dorand() % MAX_SPEED; unsigned char i; // draw rand len red for (i=(dorand() % MAX_LEN)+1; i>0; i--) { rgbdata[(3*i)+1] = MAX_BRIGHT; } // draw rand len green for (i=(dorand() % MAX_LEN)+1; i>0; i--) { rgbdata[(3*i)] = MAX_BRIGHT; } // draw rand len blue for (i=(dorand() % MAX_LEN)+1; i>0; i--) { rgbdata[(3*i)+2] = MAX_BRIGHT; } return true; } bool bouncer_rotate(uint8_t loop) { unsigned char * p; unsigned char i; if (loop % rspeed == 0) { if (rspeed > 0 ) { // moving up if (rgbdata[ (LED_COUNT-1)*3+1 ] == 0) { // still space to move up p = rgbdata + RGB_COUNT - 5; for (i=LED_COUNT-1; i > 0; i--) { p[3] = *p; p-=3; } rgbdata[1] = 0; } else { rspeed = -rspeed; } } else { // moving down if (rgbdata[1] == 0 || (rgbdata[1]!=0 && rgbdata[4]!=0)) { // still space to move down p = rgbdata + 1; for (i=LED_COUNT-1; i>0; i++) { *p = p[3]; p+=3; } rgbdata[RGB_COUNT-2] = 0; } else { rspeed = dorand() % MAX_SPEED; for (i=(dorand() % MAX_LEN)+1; i>0; i--) { rgbdata[(3*i)+1] = MAX_BRIGHT; } } } } if (loop % gspeed == 0) { if (gspeed > 0 ) { // moving up if (rgbdata[ (LED_COUNT-1)*3 ] == 0) { // still space to move up p = rgbdata + RGB_COUNT - 6; for (i=LED_COUNT-1; i > 0; i--) { p[3] = *p; p-=3; } rgbdata[0] = 0; } else { gspeed = -gspeed; } } else { // moving down if (rgbdata[0] == 0 || (rgbdata[0]!=0 && rgbdata[3]!=0)) { // still space to move down p = rgbdata; for (i=LED_COUNT-1; i>0; i++) { *p = p[3]; p+=3; } rgbdata[RGB_COUNT-3] = 0; } else { gspeed = dorand() % MAX_SPEED; // draw rand len green for (i=(dorand() % MAX_LEN)+1; i>0; i--) { rgbdata[(3*i)] = MAX_BRIGHT; } } } } if (loop % bspeed == 0) { if (bspeed > 0 ) { // moving up if (rgbdata[ (LED_COUNT-1)*3+2 ] == 0) { // still space to move up p = rgbdata + RGB_COUNT - 4; for (i=LED_COUNT-1; i > 0; i--) { p[3] = *p; p-=3; } rgbdata[2] = 0; } else { bspeed = -bspeed; } } else { // moving down if (rgbdata[2] == 0 || (rgbdata[2]!=0 && rgbdata[5]!=0)) { // still space to move down p = rgbdata + 2; for (i=LED_COUNT-1; i>0; i++) { *p = p[3]; p+=3; } rgbdata[RGB_COUNT-1] = 0; } else { bspeed = dorand() % MAX_SPEED; // draw rand len blue for (i=(dorand() % MAX_LEN)+1; i>0; i--) { rgbdata[(3*i)+2] = MAX_BRIGHT; } } } } return true; } /* fade in and out mode */ bool glow_draw(uint8_t r, uint8_t g, uint8_t b) { rspeed = r / 8; gspeed = g / 8; bspeed = b / 8; return false; } bool glow_rotate(uint8_t loop) { unsigned char *p; unsigned char i; uint8_t val = loop & 0x7F; if (loop >= 128) val = 128 - val; val /= 2; /* range is now 0-63 */ uint8_t r,g,b; g = (uint16_t)gspeed * val / 64; r = (uint16_t)rspeed * val / 64; b = (uint16_t)bspeed * val / 64; /* draw a rainbow */ p = rgbdata; for (i=0; i