/* -------------------------------------------- */
/* ---------- Included header files ----------- */
/* -------------------------------------------- */
#include <ME218_C32.h>
#include <timers12.h>
#include <stdio.h>
#include <ADS12.h>
#include "shooter.h"


/* -------------------------------------------- */
/* -------------- Defined values -------------- */
/* -------------------------------------------- */
#define TRIGGER1_IN 0x08
#define TRIGGER2_IN 0x10
#define GUN1_OUT 0x20
#define GUN2_OUT 0x40
#define COOLDOWN1_TIMER 0
#define COOLDOWN2_TIMER 1
//#define GUN_COOLDOWN 300
#define FIRE1_TIMER 2
#define FIRE2_TIMER 3
#define FIRE_TIME 150
#define VIBRATE1_TIMER 6
#define VIBRATE2_TIMER 7
#define VIBRATE_TIME 500
#define SCORE1_OUT 0x10
#define SCORE2_OUT 0x20
#define DIFFICULTY_IN 6

#define MAX_COOLDOWN 450
#define MIN_COOLDOWN 0
#define MIN_COOLDOWN_INPUT 10
#define MAX_INPUT 1023

/* -------------------------------------------- */
/* --------- Static module variables ---------- */
/* -------------------------------------------- */
static unsigned int gun_cooldown;
static unsigned char trigger1_released;
static unsigned char trigger2_released;

/* -------------------------------------------- */
/* ---------- Function definitions ------------ */
/* -------------------------------------------- */

void initShooter(void) {
   unsigned int input;

   // Initialize Guns/vibrates as off
   PTT &= ~GUN1_OUT;
   PTT &= ~GUN2_OUT;
   PTM &= ~SCORE1_OUT;
   PTM &= ~SCORE2_OUT;
   
   // Set input and output pins accordingly
   DDRT |= GUN1_OUT;
   DDRT |= GUN2_OUT;
   DDRT &= (~TRIGGER1_IN);
   DDRT &= (~TRIGGER2_IN);
   DDRM |= SCORE1_OUT;
   DDRM |= SCORE2_OUT;  

   // Initialize Guns/vibrates as off
   PTT &= ~GUN1_OUT;
   PTT &= ~GUN2_OUT;
   PTM &= ~SCORE1_OUT;
   PTM &= ~SCORE2_OUT;
   
   // Start all timers so they are expired
   TMRS12_InitTimer(FIRE1_TIMER,1);	  
   TMRS12_InitTimer(FIRE2_TIMER,1);	  
   TMRS12_InitTimer(COOLDOWN1_TIMER,1);
   TMRS12_InitTimer(COOLDOWN2_TIMER,1);

   // Initialize cooldown timers by difficulty
   input = ADS12_ReadADPin(DIFFICULTY_IN);
   printf("Cooldown input is: %d\r\n",input);
   if(input > MIN_COOLDOWN_INPUT)
      gun_cooldown = MIN_COOLDOWN + ((((input-MIN_COOLDOWN_INPUT)/10)*((MAX_COOLDOWN-MIN_COOLDOWN)/10))/(MAX_INPUT - MIN_COOLDOWN_INPUT))*100;
   else
      gun_cooldown = MIN_COOLDOWN;

   printf("Gun cooldown is: %d ms\r\n",gun_cooldown);

   trigger1_released = 1;
   trigger2_released = 1;
}


unsigned char checkTrigger1(void) {
  unsigned char trigger;
  trigger = PTT & TRIGGER1_IN;
  
  if(!trigger)
    trigger1_released = 1;

  if(trigger && TMRS12_IsTimerExpired(COOLDOWN1_TIMER))
    return 1; 
  return 0;  
}

unsigned char checkTrigger2(void) {
  unsigned char trigger;
  trigger = PTT & TRIGGER2_IN;

  if(!trigger)
    trigger1_released = 1;

  if(trigger && TMRS12_IsTimerExpired(COOLDOWN2_TIMER))
    return 1; 
  return 0;  
}

unsigned char checkShooter1(void) {
   return TMRS12_IsTimerExpired(FIRE1_TIMER);
}

unsigned char checkShooter2(void) {
   return TMRS12_IsTimerExpired(FIRE2_TIMER);
}

void fireShooter1(void) {
  TMRS12_InitTimer(FIRE1_TIMER,FIRE_TIME);
  TMRS12_InitTimer(COOLDOWN1_TIMER,FIRE_TIME+gun_cooldown);
  PTT |= GUN1_OUT;
  
  //If there is a gun cooldown, set the trigger_released boolean
  if(gun_cooldown > MIN_COOLDOWN)
    trigger1_released = 0;		
}

void fireShooter2(void) {
  TMRS12_InitTimer(FIRE2_TIMER,FIRE_TIME);
  TMRS12_InitTimer(COOLDOWN2_TIMER,FIRE_TIME+gun_cooldown);
  PTT |= GUN2_OUT;

  if(gun_cooldown > MIN_COOLDOWN)
    trigger2_released = 0;		
}

void turnOffShooter1(void) {
  PTT &= (~GUN1_OUT);
  TMRS12_ClearTimerExpired(FIRE1_TIMER);
}

void turnOffShooter2(void) {
  PTT &= (~GUN2_OUT);
  TMRS12_ClearTimerExpired(FIRE2_TIMER);
}

unsigned char isFiring1(void) {
   return TMRS12_IsTimerActive(FIRE1_TIMER);
}

unsigned char isFiring2(void) {
   return TMRS12_IsTimerActive(FIRE2_TIMER);
}

void vibrate1(void) 
{
    TMRS12_InitTimer(VIBRATE1_TIMER,VIBRATE_TIME);
    PTM |= SCORE1_OUT;
}

void vibrate2(void) 
{
    TMRS12_InitTimer(VIBRATE2_TIMER,VIBRATE_TIME);
    PTM |= SCORE2_OUT;
}

unsigned char checkVibrate1(void) 
{
    return TMRS12_IsTimerExpired(VIBRATE1_TIMER);
}

unsigned char checkVibrate2(void) 
{
    return TMRS12_IsTimerExpired(VIBRATE2_TIMER);
}

void turnOffVibrate1(void) 
{
    PTM &= (~SCORE1_OUT);
    TMRS12_ClearTimerExpired(VIBRATE1_TIMER);
}

void turnOffVibrate2(void) 
{
    PTM &= (~SCORE2_OUT);
    TMRS12_ClearTimerExpired(VIBRATE2_TIMER);
}

void endShooter(void) {
   turnOffShooter1();
   turnOffShooter2();
   
   turnOffVibrate1();
   turnOffVibrate2();
}