/*  Program to measure the frequenncy of a input, on digital pin 8
 *  Made by Oyvind Skaaden
 */
#include <FreqMeasure.h>  // Library for measuring the frequency
#define r_in 8 // Pinnen som brukes til å lese frekvensen

// Pinner som skal skrives til
#define u_out 6
#define b_out 7

// Frekvensene som blir brukt til demodulering
const unsigned int f0 = 325;
const unsigned int f1 = 750;

// Diverse kalkulasjoner for å kompensere for at frekvensen kan leses 
// eller være feil på
const float offs = 0.05;
const float lowB = 1 - offs;
const float highB = 1 + offs;

// Hvor mange målinger som skal snittes
const unsigned int maxCount = 10;

// #### Globale verdier ####
double sum = 0;
unsigned int count = 0;

// Variabel for en timeoutfunksjon
unsigned long mesTime = 0;

void setup() {
  // Starter en seriel kommunikasjonsport for å kunne bruke det 
  // demodulerte signalet gjennom feks en data
  Serial.begin(9600);
  // Start opp måling av frekvenser på pinne 8
  FreqMeasure.begin();

  // Setter pinmode til utgangspinnene
  pinMode(u_out, OUTPUT);
  pinMode(b_out, OUTPUT);
}

void loop() {
  // Dersom biblioteket kan lese frekvenser...
  if (FreqMeasure.available()) {
    // Time-out funksjonen
    mesTime = millis();
    
    // Summer sammen målinger for å snitte dem
    sum = sum + FreqMeasure.read();
    count = count + 1;
    if (count > maxCount) {
      // Snitt målingene for å gi en bedre måling
      float freq = FreqMeasure.countToFrequency(sum / count);

      // Her er grensene for hva som er lav og høy bit på FSK signalet.
      if (freq > f0 * lowB && freq < f0 * highB) {
        digitalWrite(b_out, LOW);
        digitalWrite(u_out, HIGH);
        Serial.print("LOW  : ");
      }
      else if (freq > f1 * lowB && freq < f1 * highB) {
        digitalWrite(b_out, HIGH);
        digitalWrite(u_out, HIGH);
        Serial.print("HIGH : ");
      }
      else {
        digitalWrite(b_out, LOW);
        digitalWrite(u_out, LOW);
        Serial.print("OFF  : ");
      }
      Serial.println(freq);
      sum = 0;
      count = 0;
    }
  }
  else{
    // Time-out funksjonen, dersom du ikke får noe signal på 10 ms, 
    // sett alle utganger til LOW
    if (millis() - mesTime > 10){
      digitalWrite(b_out, LOW);
      digitalWrite(u_out, LOW);
      Serial.println("OFF");
      delay(10);
    }
  } 
}
