#include "Arduino.h"

#define INPUTS 8
byte touchOut=0; //binary encoded sensors
uint16_t rawIn[INPUTS];

uint16_t countedLow[INPUTS]; //count the times input was below threshold (touched)
#define TOUCHTHRESHOLD 700 //below which value input counts as touched. 0<x<1024
#define COUNTEDLOWTHRESHOLD 10 //how many times input has to be sampled as low in a row to count as real touch. 
// Inputdelay is given by: COUNTEDLOWTHRESHOLD*ADCREADINTERVAL

unsigned long last_adcmicros=0;
#define ADCREADINTERVAL 2000 //in microseconds. interval to read all adc values

unsigned long last_send=0;
#define MINIMUMSENDDELAY 10 //in milliseconds. minimum delay between serial sends

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  pinMode(A0, INPUT);
  pinMode(A1, INPUT);
  pinMode(A2, INPUT);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
  pinMode(A6, INPUT);
  pinMode(A7, INPUT);
  Serial.begin(115200);
}

void loop() {
  unsigned long loopmillis=millis();

  // ## Sampling and Touch Filtering ##
  if (micros()-last_adcmicros>=ADCREADINTERVAL) 
  {
    last_adcmicros=micros();
    //Sample all analog Inputs
    rawIn[0]=analogRead(A0);
    rawIn[1]=analogRead(A1);
    rawIn[2]=analogRead(A2);
    rawIn[3]=analogRead(A3);
    rawIn[4]=analogRead(A4);
    rawIn[5]=analogRead(A5);
    rawIn[6]=analogRead(A6);
    rawIn[7]=analogRead(A7);
    //Serial.print(analogRead(A1));
    //Serial.print(": ");
    //Serial.println(micros()-mic);

    for (uint8_t i=0;i<INPUTS;i++){ //for all inputs
      if (rawIn[i]<=TOUCHTHRESHOLD) { //touch detected (input low at this sample)
        countedLow[i]++; //increase counter
        if (countedLow[i]>=COUNTEDLOWTHRESHOLD) { //upper limit
          countedLow[i]=COUNTEDLOWTHRESHOLD; //upper limit. prevent overflow
        }
      }else{ //released or not pressed hard enough
        countedLow[i]=0; //reset counter
      }
    }

    //Serial.print("A0="); Serial.println(rawIn[0]);
    
  }

  // ## Calculate Byte ##
  byte newTouch=0;
  for (uint8_t i=0;i<INPUTS;i++){ //for all keys
    if (countedLow[i]>=COUNTEDLOWTHRESHOLD) { //key pressed/touched
      newTouch^=1<<i;
    }
  }

  digitalWrite(LED_BUILTIN, newTouch!=0); //Show touch on led
  

  // ## Send to Raspberry ##
  if (loopmillis-last_send>MINIMUMSENDDELAY) //delay between last send long enough
  { 
    if (newTouch!=touchOut) { //touched keys have changed
      touchOut=newTouch; //update
      last_send=loopmillis;
      //Serial.println(touchOut, BIN); //Debug output
      Serial.write(touchOut); //Send byte
      
    }
  }

  
}
