#include <Arduino.h>

#define PIN_PRESSURE_SENSOR A0 // Pressure analog value where: (v - 152) / 67 = pressure in bars
// On 328 based microcontrollers only pin 2, 3 can be used as interrupt pins.
#define PIN_FLOW_SENSOW_1 2 // Flow pulse characteristics (6*Q-8) Q=L/Min±5%
#define PIN_FLOW_SENSOW_2 3 // Flow pulse characteristics (6*Q-8) Q=L/Min±5%

#define REPEAT_MS 1000

void pciSetup(byte pin);
void flowChanged1();
void flowChanged2();

byte sequence = 0;
unsigned long lastCycleStartTime = 0;
volatile int flowCount1 = 0;
volatile int flowCount2 = 0;

void setup() 
{
  Serial.begin(9600);
  Serial.println();
  Serial.println("Starting up...");

  pinMode(8, INPUT); // Legacy pin
  pinMode(9, INPUT); // Legacy pin
  pinMode(PIN_FLOW_SENSOW_1, INPUT);
  pinMode(PIN_FLOW_SENSOW_2, INPUT);
//  pciSetup(PIN_FLOW_SENSOW_1);
  attachInterrupt(digitalPinToInterrupt(PIN_FLOW_SENSOW_1), flowChanged1, CHANGE);
  attachInterrupt(digitalPinToInterrupt(PIN_FLOW_SENSOW_2), flowChanged2, CHANGE);

  Serial.println(F("Ready."));
}

/*
void pciSetup(byte pin)
{
   *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
   PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
   PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}

ISR (PCINT0_vect) // handle pin change interrupt for D8 to D13 here
{
  flowCount1 += 1;
}
*/

void flowChanged1()
{
  flowCount1 += 1;
}

void flowChanged2()
{
  flowCount2 += 1;
}

void loop() 
{
  int pressure = analogRead(PIN_PRESSURE_SENSOR);
  int actFlowCount1 = flowCount1;
  flowCount1 = 0;
  int actFlowCount2 = flowCount2;
  flowCount2 = 0;

  Serial.print("#");
  Serial.print(sequence);
  Serial.print(" ");
  Serial.print(pressure);
  Serial.print(" ");
  Serial.print(actFlowCount1);
  Serial.print(" ");
  Serial.print(actFlowCount2);
  Serial.println();

  sequence += 1;

  while((millis() - lastCycleStartTime) < REPEAT_MS)
  {
    delayMicroseconds(100);
  }
  lastCycleStartTime += REPEAT_MS;
}
