/*
  AtTiny84 pinout:
  6: arduino pin 7 = header pin 2 = pin_a
  7: arduino pin 6 = mosi = header pin 4 = pot 2
  8: arduino pin 5 = miso = header pin 9 = slider
  9 arduino pin 4 = sck = header pin 1 = switch
  10: arduino pin 3 = header pin 5 = pot 1
  11: arduino pin 2 = header pin 7 = pot 3
  13: arduino pin 0 = txd = header pin 3 = pin b
*/

#include <SoftwareSerial.h>

SoftwareSerial mySerial(0, 1); // RX, TX (unused)

int pot_1 = 3;
int pot_2 = 6;
int pot_3 = 2;
int slider = 5;
int rot_enc_a = 0;
int rot_enc_b = 7;
int rot_enc_switch = 4;

float slider_val = 0;

double rot_enc_val = 0; 
int rot_a_state = 0;
int rot_b_state = 0;
int rot_a_state_prev = 0;  
int rot_switch_state = 0;
int rot_switch_state_prev = 0;

int analog_pins[] = {pot_1, pot_2, pot_3, slider};
int digital_pins[] = {rot_enc_a, rot_enc_b, rot_enc_switch};

void setup() {
  mySerial.begin(9600);
  
  rot_a_state_prev = digitalRead(digital_pins[0]);     
  
  for (int i = 0; i < 3; i++) {
    pinMode(digital_pins[i], INPUT_PULLUP);
  }

}

void loop() {
  //pot 1
  mySerial.print(1023 - analogRead(analog_pins[0]));
  mySerial.print(" ");

  // pot 2
  mySerial.print(1023 - analogRead(analog_pins[1]));
  mySerial.print(" ");

  // pot 3
  mySerial.print(1023 - analogRead(analog_pins[2]));
  mySerial.print(" ");

  // slider
  slider_val = analogRead(analog_pins[3]);
  
  if (slider_val <= 521){
    slider_val = (slider_val - 5) / 516 * 511;
  } else {
    slider_val = ((slider_val - 522) / 501 * 511) + 512;
  }
  
  if (slider_val < 0){
    slider_val = 0;
  }
  
  mySerial.print(slider_val);
  mySerial.print(" ");

  // rotary encoder
  rot_a_state = digitalRead(digital_pins[0]);

  // if the current & previous states of rot_a are different, a pulse has occurred
  if (rot_a_state != rot_a_state_prev) {
    rot_b_state = digitalRead(digital_pins[1]);

    if (rot_a_state == rot_b_state) {
      rot_enc_val = rot_enc_val + 0.5; // if a & b are the same, increment
    } else {
      rot_enc_val = rot_enc_val - 0.5; // if a & b are the different, decrement
    }

    rot_a_state_prev = rot_a_state;
  }
  
  mySerial.print(rot_enc_val);
  mySerial.print(" ");
  
  // switch
  rot_switch_state = 1 - digitalRead(digital_pins[2]);
  
  if (rot_switch_state != rot_switch_state_prev) {
    rot_switch_state_prev = rot_switch_state;
  }
  
  mySerial.print(float(rot_switch_state));
  mySerial.print(" ");

  // newline
  mySerial.println();
}

