// Copyright 2012 Emilie Gillet.
//
// Author: Emilie Gillet (emilie.o.gillet@gmail.com)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

#ifndef GRIDS_HARDWARE_CONFIG_H_
#define GRIDS_HARDWARE_CONFIG_H_

#include "avrlib/base.h"
#include "avrlib/gpio.h"
#include "avrlib/parallel_io.h"
#include "avrlib/serial.h"
#include "avrlib/spi.h"

namespace grids {

enum AdcChannel {
  ADC_CHANNEL_X_CV,
  ADC_CHANNEL_Y_CV,
  ADC_CHANNEL_RANDOMNESS_CV,
  ADC_CHANNEL_BD_DENSITY_CV,
  ADC_CHANNEL_SD_DENSITY_CV,
  ADC_CHANNEL_HH_DENSITY_CV,
  ADC_CHANNEL_TEMPO,
  ADC_CHANNEL_LAST
};

enum LedBits {
  LED_CLOCK = 1,
  LED_BD = 8,
  LED_SD = 4,
  LED_HH = 2,
  LED_ALL = LED_CLOCK | LED_BD | LED_SD | LED_HH
};

enum InputBits {
  INPUT_CLOCK = 2,
  INPUT_RESET = 4,
  INPUT_SW_RESET = 8
};

using avrlib::Gpio;
using avrlib::ParallelPort;
using avrlib::PortB;
using avrlib::PortD;
using avrlib::Serial;
using avrlib::SerialPort0;
using avrlib::SpiMaster;

typedef ParallelPort<PortD, avrlib::PARALLEL_NIBBLE_HIGH> Leds;
typedef ParallelPort<PortD, avrlib::PARALLEL_NIBBLE_LOW> Inputs;
typedef SpiMaster<Gpio<PortB, 2>, avrlib::MSB_FIRST, 2> ShiftRegister;
typedef Serial<SerialPort0, 31250, avrlib::POLLED, avrlib::DISABLED> MidiInput;
}  // namespace grids

#endif  // GRIDS_HARDWARE_CONFIG_H_
