#include <LiquidCrystal.h>
#include <SD.h>
LiquidCrystal lcd(60,59,58,57,56,55,54);
int controller_used=1;
int pins[] = {69,68, 64,67,65,66, 61,62,63};//AB LUDR
char* myTXTs[]={"log0.txt", "log1.txt", "log2.txt", "log3.txt"};
int p1[] = {38,39,40,41,45,46,20,21};
int p3[] = {47,19,48,18,44,42,43,44};
int p2[] = {22,23,24,25,29,30,34,35};
int p4[] = {31,36,32,37,28,26,27,28};
int invert_controls=0;
int P1=0;
int P2=0;
int tempread;
int cs_pin=53;
int button=0; int last_button;
byte record[4][1200];
int loop_frame=148; int loop_number=3; int repetition=0;
unsigned long time1; unsigned long time2; unsigned long time3; unsigned long time4;
unsigned long time5;
int lag=0;
int mode = -1;
int current_slot = 0; int cursor_position = 0;
int pressed=0; int unpressed=1; int all_unpressed=255;int all_pressed=0;
int F=16656; int frame_count=0;
int n;int i;
void setup() {
lcd.begin(20,4);
Serial.begin(115200);
pinMode(cs_pin,OUTPUT);
if(!SD.begin(cs_pin))
{lcd.setCursor(10,3);lcd.print("error");}
for(n=0;n<9;n++)
{pinMode(pins[n],INPUT); digitalWrite(pins[n],HIGH);}
for(n=0;n<8;n++)
{pinMode(p1[n],OUTPUT);pinMode(p2[n],OUTPUT);
pinMode(p3[n],OUTPUT);pinMode(p4[n],OUTPUT);
digitalWrite(p1[n],unpressed); digitalWrite(p2[n],unpressed);
digitalWrite(p3[n],unpressed);digitalWrite(p4[n],unpressed);}
for(n=0;n<1200;n++){record[0][n]=all_unpressed; record[1][n]=all_unpressed;
record[2][n]=all_unpressed; record[3][n]=all_unpressed;}
}
void dispP1(){
for(n=0;n<8;n++){lcd.setCursor(n,1);lcd.print(bitRead(record[0][current_slot],n));
lcd.setCursor(n+8,1);lcd.print(bitRead(record[2][current_slot],n));}}
void dispP2(){
for(n=0;n<8;n++){lcd.setCursor(n,2);lcd.print(bitRead(record[1][current_slot],n));
lcd.setCursor(n+8,2);lcd.print(bitRead(record[3][current_slot],n));}}
void saveSD (int x, int y) {
SD.remove(myTXTs[x]);
File datafile = SD.open(myTXTs[x],FILE_WRITE);
if(datafile){
for(i=0;i<1200;i++){for(n=0;n<8;n++){
datafile.print(bitRead(record[y][i],n));}}
datafile.close();}}
void loadSD (int x, int y)
{File readfile = SD.open(myTXTs[x]);
if (readfile){while(readfile.available())
{for(i=0;i<1200;i++){
for (n=0;n<8;n++){
tempread=readfile.read();
if(tempread=='0'){bitWrite(record[y][i],n,0);}
if(tempread=='1'){bitWrite(record[y][i],n,1);}
}}}}
readfile.close();}
void loop() {
time2=micros();
if((time2)>(time1+F)) {
//lcd.setCursor(7,3);lcd.print(time2-time1);
time1=micros();
if(mode==1) {time4=micros();
if(P1==1){for(n=0;n<8;n++)
{digitalWrite(p1[n],(bitRead(record[0][frame_count],n)));
digitalWrite(p3[n],(bitRead(record[2][frame_count],n)));}}
if(P2==1){for(n=0;n<8;n++)
{digitalWrite(p2[n],(bitRead(record[1][frame_count],n)));
digitalWrite(p4[n],(bitRead(record[3][frame_count],n)));}}
if((frame_count==loop_frame) && (repetition>0))
{repetition--;frame_count=-1;}
if(frame_count>1199){for(n=0;n<8;n++)
{digitalWrite(p1[n],unpressed); digitalWrite(p2[n],unpressed);
digitalWrite(p3[n],unpressed); digitalWrite(p4[n],unpressed);}
time3=micros();time5=time3-time4;mode=-1;}
}
if(mode==2) {
if(P1==1){for(n=0;n<8;n++){bitWrite(record[0][frame_count],n,digitalRead(p1[n]));
bitWrite(record[2][frame_count],n,digitalRead(p3[n]));}}
if(P2==1){for(n=0;n<8;n++){bitWrite(record[1][frame_count],n,digitalRead(p2[n]));
bitWrite(record[3][frame_count],n,digitalRead(p4[n]));}}
if(frame_count==0){
if((P1==1) && (P2==0) && (record[0][0]==all_unpressed) && (record[2][0]==all_unpressed)){frame_count=-1;}
if((P1==0) && (P2==1) && (record[1][0]==all_unpressed) && (record[3][0]==all_unpressed)){frame_count=-1;}
if((P1==1) && (P2==1) && (record[0][0]==all_unpressed) && (record[2][0]==all_unpressed) &&
(record[1][0]==all_unpressed) && (record[3][0]==all_unpressed)){frame_count=-1;}
}
if(frame_count>1199){mode=-1;}
}
if(mode==0){
if(P1==1){for(n=0;n<8;n++){bitWrite(record[0][current_slot],n,digitalRead(p1[n]));
bitWrite(record[2][current_slot],n,digitalRead(p3[n]));}}
if(P2==1){for(n=0;n<8;n++){bitWrite(record[1][current_slot],n,digitalRead(p2[n]));
bitWrite(record[3][current_slot],n,digitalRead(p4[n]));}}
dispP2();dispP1();
current_slot++;delay(300);
dispP2();
dispP1();
mode=-1;}
if (digitalRead(pins[6])==1){P1=0;}
if (digitalRead(pins[8])==1){P2=0;}
if (digitalRead(pins[6])==0){P1=1;}
if (digitalRead(pins[8])==0){P2=1;}
if(digitalRead(pins[7])==0 && digitalRead(pins[6])==1 && digitalRead(pins[8])==1){P1=1;P2=1;}
button=0;
if(digitalRead(pins[0])==0){button=5;}
if(digitalRead(pins[1])==0){button=7;}
if(digitalRead(pins[2])==0){button=4;}
if(digitalRead(pins[3])==0){button=8;}
if(digitalRead(pins[4])==0){button=2;}
if(digitalRead(pins[5])==0){button=6;}