// counting on one coil needs to finished before moving to another one. First coil has separate trigger. Added screen.

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
long chamberTime[6];
long baseTime [6] = {0,3500,3000,1500,0,0}; //original was 26260,3699,3074,2803,2562,2326
long offDelay =0;
int batStatus = 0;
bool sensorFlag = true;
bool noAmmo = false;

void setup(){
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,INPUT);
  pinMode(9,INPUT);
  pinMode(10,INPUT);
  pinMode(11,INPUT);
  pinMode(12,INPUT);
  pinMode(13,INPUT);
  pinMode(14,INPUT);
  pinMode(15,INPUT);
  pullDown();
  //Serial.begin(9600);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  drawScreen();
  pullDown();
}


void loop(){
  if (digitalRead(15)==HIGH){
    shoot();
    pullDown();
  }  
  pullDown();
  //drawScreen();
}

void shoot(){
  
  long startTimer = micros();
  long timer = micros();
  long safeTime = 100000;
  long entranceTime = micros();
   while(digitalRead(9) == HIGH){
      if(timer - startTimer > safeTime) {
        noAmmo = true;
        digitalWrite(2,LOW);
        chamberTime[0] = micros() - entranceTime;
        break;
      }
      digitalWrite(2, HIGH);
      timer = micros();
    }
    digitalWrite(2,LOW);
    chamberTime[0] = micros() - entranceTime;
  

  for(int i = 1; i < 5; i++){
    if(noAmmo == true) break;
    digitalWrite(i+2,HIGH);
    timer = micros();
    while(micros()- timer < baseTime[i]-offDelay){
      if (digitalRead(i+9) == LOW) break;  
    }
    digitalWrite(i+2,LOW);
    //while(digitalRead(i+9) == HIGH){}
    //chamberTime[i] = micros()-timer;
  }

  if(noAmmo == false){
    while(digitalRead(13) == HIGH){}
    timer = micros();
    while(digitalRead(14) == HIGH){}
    chamberTime[5]= micros() - timer;
  }
  
  drawScreen();
  noAmmo = false;
  
  //pullDown();
  //delay(100);
  /*for(int j = 0; j < 6; j++){
    Serial.print("coil ");
    Serial.print(j);
    Serial.print(": ");
    Serial.print(chamberTime[j]);
    Serial.print(" | ");
  }
  Serial.println();
  */
  while(digitalRead(15)==HIGH){}
  delay(20);
}

void pullDown(){
 for(int j = 0; j < 6; j++){
   digitalWrite(j+2,LOW);  
  } 
}


void drawScreen(){
  int batShift = 8;
  
  display.clearDisplay();
  display.drawLine(100,0,100,64,WHITE);
  //display.drawLine(45,0,45,64,WHITE);
  display.drawRect(97+batShift,5,23,53,WHITE);
  
  //battery
  
  display.drawPixel(97+batShift,5,BLACK);
  display.drawPixel(119+batShift,5,BLACK);
  display.drawPixel(97+batShift,57,BLACK);
  display.drawPixel(119+batShift,57,BLACK);
  
  display.drawPixel(98+batShift,6,WHITE);
  display.drawPixel(118+batShift,6,WHITE);
  display.drawPixel(98+batShift,56,WHITE);
  display.drawPixel(118+batShift,56,WHITE);
  
  //top of battery
  display.drawPixel(104+batShift,4,WHITE);
  display.drawPixel(112+batShift,4,WHITE);
  display.drawPixel(105+batShift,3,WHITE);
  display.drawPixel(111+batShift,3,WHITE);
  display.drawLine(105+batShift,2,111+batShift,2,WHITE);
  display.drawLine(99+batShift,56,118+batShift,56,WHITE);
  
  //text
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Coil 0:");
  display.println("Coil 1:");
  display.println("Coil 2:");
  display.println("Coil 3:");
  display.println("Coil 4:");
  display.println("Coil 5:");
  
  for(int k = 0; k < 6; k++){
    display.setCursor(42,k*8);
    display.print(chamberTime[k]);
    display.println("us");
  }
  
  if(noAmmo == true){
    display.setTextSize(2);
    display.setCursor(0,50);
    display.println("NO AMMO!");
  }
  
  //battery acitve part
  batStatus = map(analogRead(3),700,860,49,0);
  if(batStatus > 49) batStatus = 49;
  display.fillRect(98+batShift,7,21,49,WHITE);
  display.fillRect(98+batShift,7,21,batStatus,BLACK);
   
  display.display(); 
}
