//Vibrations sensor med 801S. Karoly.S Okt. 2015

#define LEDOUT GPIO.F4
#define TRIGIN GPIO.F2
#define TRIGG1 GPIO.F0
#define TRIGG2 GPIO.F1
#define OUT GPIO.F5

long int k=0;
int n=0;
int j=0;
int i=0;

//Initiering för main, ADC/komparator av
void initMain(){
    TRISIO=0b00000111;
    ANSEL=0b00000000;
    CMCON=0b00000111;
    OUT=1;
    LEDOUT=1;
    delay_ms(10000);
    }

//Funktion för när vibration uppstår, utgång och led aktiveras sålänge
//trigg är aktiv. Varibel n används för att larma max 2ggr i rad om inte
//tändning slås på emellan. Tex om bilen står på en båt.
void Alarm(){
    if((TRIGIN==1)&&(TRIGG1==0)&&(TRIGG2==0)){
       delay_us(5);
       if(TRIGIN==1){
         n++;
         }
       while(TRIGIN==1){
             LEDOUT=1;
             OUT=0;
             delay_ms(2000);
             }
       }
}

//Funktion för att tända led
void BlinkMode(){
    LEDOUT=1;
    Delay_ms(50);
    if(n>=2){
       LEDOUT=0;
       Delay_ms(50);
       LEDOUT=1;
       Delay_ms(50);
       }
    if(k==90000){
       k=0;
       }
}

//Leavetime sätter hur lång tid man har på sig att lämna fordon innan larmet
//går i bevakningsläge. Int i sätter tiden som är ca 5min.
void LeaveTime(){
    LEDOUT=1;
    for(i=0; i<300; i++){
       delay_ms(1000);
       }
}

void Main() {
initMain();

//Logiska funktioner för när och hur larmet skall aktiveras
while(1){
     k++;
     if(k==90000){
        BlinkMode();
        }
     if((TRIGIN==1)&&(TRIGG1==0)&&(TRIGG2==0)&&(n<2)){
        Alarm();
        }
     if((TRIGG1==1)||(TRIGG2==1)){
        j=0;
//Medan tänding är på skall laremt inte kunna aktiveras. Direkt tändning slås
//av sätter Leavetime() en delay så man hinner lämna fordon för att sedan sätta
//larmet i bevakningsläge.
        while((TRIGG1==1)||(TRIGG2==1)){
              LEDOUT=0;
              delay_ms(100);
              LEDOUT=1;
              delay_ms(100);
              OUT=1;
              }
        LeaveTime();
        n=0;
        }
     LEDOUT=0;
     OUT=1;
     }
}