pi-lights/main.c

88 lines
2.1 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
#define YELLOW true, true, false
#define CYAN false, true, true
#define WHITE true, true, 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;
}
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);
int ch;
while((ch = getchar()) != EOF){
if(ch == 'p') {
changeAllColors(PURPLE);
} else if (ch == 'y') {
changeAllColors(YELLOW);
} else if (ch == 'r') {
changeAllColors(RED);
} else if (ch == 'g') {
changeAllColors(GREEN);
} else if (ch == 'b') {
changeAllColors(BLUE);
} else if (ch == 'o') {
changeAllColors(OFF);
} else if (ch == 'w') {
changeAllColors(WHITE);
} else {
printf("Invalid char");
continue;
}
delay(1000);
}
}