75 lines
1.7 KiB
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);
|
|
}
|
|
}
|