1,17 → 1,17 |
#include <xc.h> |
#include "defines.h" |
#include "NEOPIXEL.h" |
|
static NEOPIXEL_DATA* neopixel_data_ptr; |
extern NEOPIXEL_DATA neopixel_data; |
|
void NeoPixel_Init(NEOPIXEL_DATA *data) { |
neopixel_data_ptr = data; |
void NeoPixel_Init(void) { |
|
// Clear buffer |
for (char i = 0; i < NEOPIXEL_LENGTH * 3; i++) { |
neopixel_data_ptr->values[i] = 0x0; |
for (uint8_t i = 0; i < NEOPIXEL_LENGTH * 3; i++) { |
neopixel_data.values[i] = 0x0; |
} |
|
neopixel_data.offset = 0; |
|
// Output pin initially blocked |
NEOPIXEL_TRIS = 1; |
|
34,23 → 34,42 |
NEOPIXEL_TRIS = 0; |
} |
|
void NeoPixel_Set(char index, char R, char G, char B) { |
if (index >= NEOPIXEL_LENGTH) return; |
void NeoPixel_Offet(uint8_t value) { |
neopixel_data.offset = value; |
} |
|
neopixel_data_ptr->values[(index * 3) + 0] = G; |
neopixel_data_ptr->values[(index * 3) + 1] = R; |
neopixel_data_ptr->values[(index * 3) + 2] = B; |
void NeoPixel_Clear(void) { |
// Clear buffer |
for (uint8_t i = 0; i < NEOPIXEL_LENGTH * 3; i++) { |
neopixel_data.values[i] = 0x0; |
} |
} |
|
void NeoPixel_Set(uint8_t index, uint8_t R, uint8_t G, uint8_t B) { |
uint8_t i = ((index + neopixel_data.offset) % NEOPIXEL_LENGTH); |
|
neopixel_data.values[(i * 3) + 0] = G; |
neopixel_data.values[(i * 3) + 1] = R; |
neopixel_data.values[(i * 3) + 2] = B; |
} |
|
void NeoPixel_Or(uint8_t index, uint8_t R, uint8_t G, uint8_t B) { |
uint8_t i = ((index + neopixel_data.offset) % NEOPIXEL_LENGTH); |
|
neopixel_data.values[(i * 3) + 0] |= G; |
neopixel_data.values[(i * 3) + 1] |= R; |
neopixel_data.values[(i * 3) + 2] |= B; |
} |
|
void NeoPixel_Write_All(void) { |
for (char i = 0; i < NEOPIXEL_LENGTH * 3; i++) { |
NeoPixel_Write_One(neopixel_data_ptr->values[i]); |
for (uint8_t i = 0; i < NEOPIXEL_LENGTH * 3; i++) { |
NeoPixel_Write_One(neopixel_data.values[i]); |
} |
// Delay for 50us to latch data |
__delay_us(50); |
} |
|
void NeoPixel_Write_One(char value) { |
void NeoPixel_Write_One(uint8_t value) { |
// Enable timer and wait for it to overflow |
T2CONbits.TMR2ON = 1; |
while (!PIR1bits.TMR2IF); |