99 lines
2.3 KiB
C
99 lines
2.3 KiB
C
#include <wiringPi.h>
|
|
#include <stdio.h>
|
|
#include <stdbool.h>
|
|
#define LATCH_PIN 2
|
|
#define CLOCK_PIN 3
|
|
#define DATA_PIN 0
|
|
#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;
|
|
colorField[6] = red;
|
|
colorField[7] = green;
|
|
}
|
|
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;
|
|
//ch = 'w';
|
|
printf("Starting main loop\n");
|
|
while((ch = getchar()) != EOF){
|
|
if (ch == 'r') {
|
|
changeAllColors(RED);
|
|
} else if (ch == 'g') {
|
|
changeAllColors(GREEN);
|
|
} else if (ch == 'b') {
|
|
changeAllColors(BLUE);
|
|
} else if(ch == 'p') {
|
|
changeAllColors(PURPLE);
|
|
} else if (ch == 'y') {
|
|
changeAllColors(YELLOW);
|
|
} else if (ch == 'c') {
|
|
changeAllColors(CYAN);
|
|
} else if (ch == 'o') {
|
|
changeAllColors(OFF);
|
|
} else if (ch == 'w') {
|
|
changeAllColors(WHITE);
|
|
} else {
|
|
printf("Invalid char\n");
|
|
continue;
|
|
}
|
|
printf("Changing to color: %c\n", ch);
|
|
updateColors();
|
|
delay(1000);
|
|
}
|
|
changeAllColors(OFF);
|
|
updateColors();
|
|
}
|
|
// vim: ts=2
|