//HC-12 messenger send/receive
//autor Tom Heylen tomtomheylen.com

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); //RX, TX

int lostLedPin = 12;
int moveLedPin = 11;
int buzzerPin = 10;
boolean hasDebug = false;
boolean lostState = true;
boolean moveState = false;

int gyro_x_dmax, gyro_y_dmax;

int maxGyro = 6000;

unsigned long last = millis();//set timer
unsigned long lastGyroAlarm = millis();


void setup() {
  pinMode(lostLedPin, OUTPUT);
  pinMode(moveLedPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  moveAlarmOFF();
  lostAlarmOFF();
  if (hasDebug) Serial.begin(9600);
  if (hasDebug) Serial.println("START!!!");
  mySerial.begin(2400);
}

void lostAlarmON() {
  lostState = true;
  digitalWrite(lostLedPin, HIGH);
  digitalWrite(buzzerPin, HIGH);
}

void lostAlarmOFF() {
  digitalWrite(lostLedPin, LOW);
  buzzerAlarmOFF();
}

void moveAlarmON() {
  moveState = true;
  digitalWrite(moveLedPin, HIGH);
  digitalWrite(buzzerPin, HIGH);
}

void moveAlarmOFF() {
  moveState = false;
  digitalWrite(moveLedPin, LOW);
  buzzerAlarmOFF();
}

void buzzerAlarmOFF() {
  if (!moveState && !lostState) {
       digitalWrite(buzzerPin, LOW);  
    }
}

  
void loop() {
  
  if(mySerial.available() > 1){
    char inputArray[35];
    String input = mySerial.readString();
    input.toCharArray(inputArray, 35);
    if (hasDebug) Serial.print(input);
    //sscanf(inputArray, "[gmX%6d|gmY%6d|gmZ%6d|aX%6d|aY%6d|aZ%6d|T:%s]", &gyro_x_dmax, &gyro_y_dmax, &gyro_z_dmax , &acc_x, &acc_y, &acc_z, &timeSent);
    char timeSent[12];
    sscanf(inputArray, "[gmX%6d|gmY%6d|T:%12s]", &gyro_x_dmax, &gyro_y_dmax, &timeSent);
    if (hasDebug) {
      Serial.print(" xD:");
      Serial.print(gyro_x_dmax);
      Serial.print(" yD:");
      Serial.print(gyro_y_dmax);
      Serial.print(" T:");
      Serial.print(timeSent);
    }
    last = millis();//reset timer 
    if (hasDebug) Serial.print(" <-IN at T:");
    if (hasDebug) Serial.println(TimeToString(last/100));
    if (lostState) {
                      lostState = false;
                      lostAlarmOFF();
                    }
    if(millis() - lastGyroAlarm > 15000 ) moveAlarmOFF();
    checkGyro();
  } else if(millis() - last > 5000 ) {
    lostAlarmON();
    if (hasDebug) {
      Serial.print("ALARM - SIGNAL LOST!!!! T:");
      Serial.println(TimeToString(millis()/100));
    }
    delay(500);
  }
  delay(20);
}


void checkGyro() {
  if (gyro_x_dmax > maxGyro || gyro_y_dmax > maxGyro ) {
    moveAlarmON();
    if (hasDebug) {
      Serial.print("ALARM - MOVEMENT!!!! T:");
      Serial.println(TimeToString(millis()/100));
    }
    lastGyroAlarm = millis();
  }
}

  
// t is time in seconds = millis()/1000;
char * TimeToString(unsigned long ten)
{
 long t = ten / 10;
 int ts = ten % 10;
 static char str[12];
 long h = t / 3600;
 t = t % 3600;
 int m = t / 60;
 int s = t % 60;
 sprintf(str, "%02ld:%02d:%02d:%01d", h, m, s, ts);
 return str;
}

