/**
 * Copyright (c) 2013 Arduino LLC. All right reserved.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library 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
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

/**
 * Defines for 16 bit timers used with  Servo library
 *
 * If _useTimerX is defined then TimerX is a 32 bit timer on the current board
 * timer16_Sequence_t enumerates the sequence that the timers should be allocated
 * _Nbr_16timers indicates how many timers are available.
 */

/**
 * SAM Only definitions
 * --------------------
 */

// For SAM3X:
//!#define _useTimer1
//!#define _useTimer2
#define _useTimer3
//!#define _useTimer4
#define _useTimer5

#define TRIM_DURATION             2   // compensation ticks to trim adjust for digitalWrite delays
#define SERVO_TIMER_PRESCALER     32  // timer prescaler

/*
  TC0, chan 0 => TC0_Handler
  TC0, chan 1 => TC1_Handler
  TC0, chan 2 => TC2_Handler
  TC1, chan 0 => TC3_Handler
  TC1, chan 1 => TC4_Handler
  TC1, chan 2 => TC5_Handler
  TC2, chan 0 => TC6_Handler
  TC2, chan 1 => TC7_Handler
  TC2, chan 2 => TC8_Handler
 */

#ifdef _useTimer1
  #define TC_FOR_TIMER1       TC1
  #define CHANNEL_FOR_TIMER1  0
  #define ID_TC_FOR_TIMER1    ID_TC3
  #define IRQn_FOR_TIMER1     TC3_IRQn
  #define HANDLER_FOR_TIMER1  TC3_Handler
#endif
#ifdef _useTimer2
  #define TC_FOR_TIMER2       TC1
  #define CHANNEL_FOR_TIMER2  1
  #define ID_TC_FOR_TIMER2    ID_TC4
  #define IRQn_FOR_TIMER2     TC4_IRQn
  #define HANDLER_FOR_TIMER2  TC4_Handler
#endif
#ifdef _useTimer3
  #define TC_FOR_TIMER3       TC1
  #define CHANNEL_FOR_TIMER3  2
  #define ID_TC_FOR_TIMER3    ID_TC5
  #define IRQn_FOR_TIMER3     TC5_IRQn
  #define HANDLER_FOR_TIMER3  TC5_Handler
#endif
#ifdef _useTimer4
  #define TC_FOR_TIMER4       TC0
  #define CHANNEL_FOR_TIMER4  2
  #define ID_TC_FOR_TIMER4    ID_TC2
  #define IRQn_FOR_TIMER4     TC2_IRQn
  #define HANDLER_FOR_TIMER4  TC2_Handler
#endif
#ifdef _useTimer5
  #define TC_FOR_TIMER5       TC0
  #define CHANNEL_FOR_TIMER5  0
  #define ID_TC_FOR_TIMER5    ID_TC0
  #define IRQn_FOR_TIMER5     TC0_IRQn
  #define HANDLER_FOR_TIMER5  TC0_Handler
#endif

typedef enum : unsigned char {
  #ifdef _useTimer1
    _timer1,
  #endif
  #ifdef _useTimer2
    _timer2,
  #endif
  #ifdef _useTimer3
    _timer3,
  #endif
  #ifdef _useTimer4
    _timer4,
  #endif
  #ifdef _useTimer5
    _timer5,
  #endif
  _Nbr_16timers
} timer16_Sequence_t;
