//  Arduino pro micro, Arduino leonardo (Atmega 32u4)
//  HUB, ,   Amp,  
#include <AH_MCP41xxx.h>
#include <SPI.h>

int ACCPin = A1; //  
int RearCamIn = A2; //  
int FrontCamIn = A3; //   
int analogPin=A0; //      (  6(4))

#define pinAmp 7 //     Amp
#define pinHUB 5 //    HUB
#define pinTablet 6 //    
#define pinCam 8 //   
#define pinRear 9//    
#define MOSI  16   //uno MOSI   //IC SI
#define SCLK 15   //uno SCK    //IC SCK
#define CHIPSELECT 10   //uno ss     //IC CS

//****************   /*************************
#define ONHUB 100 //   HUB
#define ONTablet 3000 //   
#define ONAmp 8000 //    AMP  
#define OFFHUB 5000 //   HUB
#define OFFTablet 3000 //   
#define OFFAmp 1000 //    AMP  
//**************        ***************
int release_button = 1023; //    
int button_release_range = 50; //   + -   
int button_range = 5; //    + -
int time_holding = 500; //      
int time_tinkling = 10; //      
int vol_up = 893; //    
int vol_down = 832; //    
int mode = 457; //       Mode
int next = 665; //       Next
int previous = 571; //       Previous
int play_pause = 172; //       Play/Pause     Mute  int off1 = 171; //       Off   


//*******************************************************************************************
unsigned long duration, millisold, off = 0;
boolean stateACC, relestate1, relestate2, relestate3 = 0;

int data;
unsigned long flag = 0;
unsigned long eventTime = 0;
unsigned long eventTime1 = 0;
unsigned long pauseMillis = 0;
AH_MCP41xxx mcp41100;

void setup()
{
  pinMode(ACCPin, INPUT);
  pinMode(RearCamIn, INPUT);
  pinMode(FrontCamIn, INPUT);
  pinMode(pinHUB, OUTPUT); 
  pinMode(pinTablet, OUTPUT);
  pinMode(pinAmp, OUTPUT);
  pinMode(pinCam, OUTPUT);
  pinMode(pinRear, OUTPUT);
  analogReference(DEFAULT); //    AVCC   AREF ( ) 
  Keyboard.begin();
  Serial.begin(115200);
 

 mcp41100.init_MCP41xxx(CHIPSELECT);  //spi pins initialisation
 mcp41100.reset();
 delay (10);
 mcp41100.setValue(255);
 Serial.begin(115200);

}


void loop()
{
  Power();
  Knopki();
  PowerEasyCap();
  VideoChange();
  delay(10);
}

void Power()
 {
  if (!digitalRead(ACCPin)&&stateACC) 
    {
    stateACC=0;
    duration = millis();
    }
  if (digitalRead(ACCPin)&&!stateACC) 
    {
    stateACC=1;
    off = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC && millis ()-duration > ONHUB)
    {
    digitalWrite(pinHUB, HIGH);
    relestate1 = 1;
    millisold = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC &&  millis ()-duration > ONAmp)
    {
    digitalWrite(pinAmp, HIGH);
    relestate2 = 1;
    millisold = millis();
    }
  if(!digitalRead(ACCPin) && !stateACC &&  millis ()-duration > ONTablet)
    {
    digitalWrite(pinTablet, HIGH);
    relestate3 = 1;
    millisold = millis();
    }
  if(digitalRead(ACCPin) && stateACC && millis () -off> OFFHUB)
    {
    digitalWrite(pinHUB, LOW);
    relestate1 = 0;
    millisold = millis();
    Serial.end();
    delay(100);
    }
  if(digitalRead(ACCPin) && stateACC &&  millis ()-off > OFFAmp)
    {
    digitalWrite(pinAmp, LOW);
    relestate2 = 0;
    millisold = millis();     
    } 
  if(digitalRead(ACCPin) && stateACC &&  millis ()-off > OFFTablet)
    {
    digitalWrite(pinTablet, LOW);
    relestate3 = 0;
    millisold = millis();     
    }  
}

void PowerEasyCap()
{
   if (digitalRead(FrontCamIn) == LOW || digitalRead(RearCamIn) == LOW) 
{
digitalWrite(pinCam, HIGH);
} else {
digitalWrite(pinCam, LOW); 
}
}
void VideoChange()
{
if(digitalRead(RearCamIn) == LOW) 
{
digitalWrite(pinRear, HIGH);
} else {
digitalWrite(pinRear, LOW);
}
}

void Knopki()
{ 
data=analogRead(analogPin);  
Serial.println(data);
if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 0)  eventTime=millis(); 

//**********************  + ************************************ 

if(millis()-eventTime>time_tinkling && data >= vol_up - button_range && data <= vol_up + button_range && flag == 0) 
  {  
     mcp41100.setValue(40);
    flag = 1; 
  }  

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 1)  
  {  
    mcp41100.setValue(255);  
    flag = 0;   
  }    

//**********************  - ************************************ 

if(millis()-eventTime>time_tinkling && data >= vol_down - button_range && data <= vol_down + button_range && flag == 0) 
  {  
    mcp41100.setValue(55);
    flag = 2; 
  }  

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 2)  
  {  
    mcp41100.setValue(255);
    flag = 0;   
  }     

//********************** MODE ************************************   

if(millis()-eventTime>time_tinkling && data >= mode - button_range && data <= mode + button_range && flag == 0) 
  {  
    mcp41100.setValue(6);
    flag = 3; 
  }  

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3)  
  {  
    mcp41100.setValue(255);
    flag = 0;   
  }  
//********************** Next ************************************   

if(millis()-eventTime>time_tinkling && data >= next - button_range && data <= next + button_range && flag == 0) 
  {  
    mcp41100.setValue(23);
    flag = 4; 
  }  

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 4)  
  {  
    mcp41100.setValue(255);
    flag = 0;   
  }  
//********************** Previous ************************************   

if(millis()-eventTime>time_tinkling && data >= previous - button_range && data <= previous + button_range && flag == 0) 
  {  
    mcp41100.setValue(31);
    flag = 5; 
  }  

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5)  
  {  
    mcp41100.setValue(255);
    flag = 0;   
  } 

//********************** Play/pause + Mute ************************************  
{
if(millis()-time_tinkling && millis()-eventTime<time_holding-1 && data >= play_pause - button_range && data <= play_pause + button_range) //     10  499  (  millis()-time_tinkling && millis()-eventTime<time_holding-1) 
{  
flag = 6; 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6) //     ,  /  
{ 
Remote.play_pause();  
flag = 0; 
delay(10); 
Remote.clear(); 
} 

if(millis()-eventTime>time_holding && data >= play_pause - button_range && data <= play_pause + button_range && flag == 6) //    500  ?  (  millis()-eventTime>time_holding) 
{  
Remote.mute(); //    ,  
flag = 0;
delay(10);
Remote.clear(); 
} 

if(data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 3 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 5 || data>=release_button - button_release_range && data<=release_button + button_release_range && flag == 6) //     
{ 
flag = 0; 
}  
}
}
 
