pi-lights/main.c

75 lines
1.7 KiB
C

#include <wiringPi.h>
#include <stdio.h>
#include <stdbool.h>
#define LATCH_PIN 2
#define CLOCK_PIN 0
#define DATA_PIN 3
#define OFF false, false, false
#define RED true, false, false
#define GREEN false, true, false
#define BLUE false, false, true
#define PURPLE true, false, true
typedef enum { LEFT, RIGHT } Side_t;
bool colorField[] = {
false, // Left red
false, // Left green
false, // Left blue
false, // Right red
false, // Right green
false, // Right blue
false, // Unused bit
false // Unused bit
};
void write(bool mode) {
delay(10);
digitalWrite(DATA_PIN, mode);
digitalWrite(CLOCK_PIN, true);
digitalWrite(CLOCK_PIN, false);
digitalWrite(DATA_PIN, false);
}
void flushPins() {
digitalWrite(LATCH_PIN, true);
digitalWrite(LATCH_PIN, false);
}
void updateColors() {
flushPins();
for(int i = 0; i < 8; i ++){
write(colorField[i]);
}
flushPins();
}
void changeColor(Side_t side, bool red, bool green, bool blue) {
short shift = 0;
if(side == RIGHT) {
shift = 3;
}
colorField[shift] = red;
colorField[shift + 1] = green;
colorField[shift + 2] = blue;
updateColors();
delay(1000);
}
void changeAllColors(bool red, bool green, bool blue) {
changeColor(LEFT, red, green, blue);
changeColor(RIGHT, red, green, blue);
}
int main(void) {
wiringPiSetup();
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
changeAllColors(OFF);
updateColors();
delay(1000);
for(;;) {
changeColor(LEFT, RED);
changeColor(LEFT, OFF);
changeColor(LEFT, GREEN);
changeColor(LEFT, OFF);
changeColor(LEFT, BLUE);
changeColor(LEFT, OFF);
changeColor(LEFT, PURPLE);
changeColor(LEFT, OFF);
}
}