/**
 ******************************************************************************
 * @addtogroup OpenPilotSystem OpenPilot System
 * @{
 * @addtogroup OpenPilotCore OpenPilot Core
 * @{
 * @file       pios_board.h
 * @author     The OpenPilot Team, http://www.openpilot.org Copyright (C) 2012.
 * @brief      Defines board hardware for the OpenPilot Version 1.1 hardware.
 * @see        The GNU Public License (GPL) Version 3
 *
 *****************************************************************************/
/*
 * 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, write to the Free Software Foundation, Inc.,
 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
 */

#ifndef PIOS_BOARD_H
#define PIOS_BOARD_H

/**
 * glue macros for file IO
 **/
#define FILEINFO FILE *
#define PIOS_FOPEN_READ(filename, file)                 (file = fopen((char *)filename, "r")) == NULL
#define PIOS_FOPEN_WRITE(filename, file)                (file = fopen((char *)filename, "w")) == NULL
#define PIOS_FREAD(file, bufferadr, length, resultadr)  (*resultadr = fread((uint8_t *)bufferadr, 1, length, *file)) != length
#define PIOS_FWRITE(file, bufferadr, length, resultadr) *resultadr = fwrite((uint8_t *)bufferadr, 1, length, *file)
#define PIOS_FCLOSE(file)                               fclose(file)
#define PIOS_FUNLINK(file)                              unlink((char *)filename)

// ------------------------
// Timers and Channels Used
// ------------------------
/*
   Timer | Channel 1 | Channel 2 | Channel 3 | Channel 4
   ------+-----------+-----------+-----------+----------
   TIM1  |           |           |           |
   TIM2  | --------------- PIOS_DELAY -----------------
   TIM3  |           |           |           |
   TIM4  |           |           |           |
   TIM5  |           |           |           |
   TIM6  |           |           |           |
   TIM7  |           |           |           |
   TIM8  |           |           |           |
   ------+-----------+-----------+-----------+----------
 */

// ------------------------
// DMA Channels Used
// ------------------------
/* Channel 1  -                                 */
/* Channel 2  - SPI1 RX                         */
/* Channel 3  - SPI1 TX                         */
/* Channel 4  - SPI2 RX                         */
/* Channel 5  - SPI2 TX                         */
/* Channel 6  -                                 */
/* Channel 7  -                                 */
/* Channel 8  -                                 */
/* Channel 9  -                                 */
/* Channel 10 -                                 */
/* Channel 11 -                                 */
/* Channel 12 -                                 */

// ------------------------
// BOOTLOADER_SETTINGS
// ------------------------
// #define BOARD_READABLE	true
// #define BOARD_WRITABLE	true
// #define MAX_DEL_RETRYS	3


// ------------------------
// PIOS_LED
// ------------------------
#define PIOS_LED_NUM       3
#define PIOS_LED_HEARTBEAT 0
#define PIOS_LED_ALARM     1

// ------------------------
// PIOS_SPI
// See also pios_board.c
// ------------------------
// #define PIOS_SPI_MAX_DEVS        3

// ------------------------
// PIOS_WDG
// ------------------------
#define PIOS_WATCHDOG_TIMEOUT  250
// #define PIOS_WDG_REGISTER        RTC_BKP_DR4
#define PIOS_WDG_ACTUATOR      0x0001
#define PIOS_WDG_STABILIZATION 0x0002
#define PIOS_WDG_ATTITUDE      0x0004
#define PIOS_WDG_MANUAL        0x0008
#define PIOS_WDG_SENSORS       0x0010

// ------------------------
// PIOS_I2C
// See also pios_board.c
// ------------------------
// #define PIOS_I2C_MAX_DEVS			3
// extern uint32_t pios_i2c_mag_adapter_id;
// #define PIOS_I2C_MAIN_ADAPTER			(pios_i2c_mag_adapter_id)

// -------------------------
// PIOS_USART
//
// See also pios_board.c
// -------------------------
// #define PIOS_USART_MAX_DEVS             5

// -------------------------
// PIOS_COM
//
// See also pios_board.c
// -------------------------
#define PIOS_COM_MAX_DEVS 25
extern uint32_t pios_com_telem_rf_id;
extern uint32_t pios_com_gps_id;
extern uint32_t pios_com_aux_id;
extern uint32_t pios_com_telem_usb_id;
extern uint32_t pios_com_bridge_id;
extern uint32_t pios_com_vcp_id;
#define PIOS_COM_AUX            (pios_com_aux_id)
#define PIOS_COM_GPS            (pios_com_gps_id)
#define PIOS_COM_TELEM_USB      (pios_com_telem_usb_id)
#define PIOS_COM_TELEM_RF       (pios_com_telem_rf_id)
#define PIOS_COM_BRIDGE         (pios_com_bridge_id)
#define PIOS_COM_VCP            (pios_com_vcp_id)
#define PIOS_COM_DEBUG          PIOS_COM_AUX

// ------------------------
// TELEMETRY
// ------------------------
#define TELEM_QUEUE_SIZE        20
#define PIOS_TELEM_STACK_SIZE   624

#define PIOS_COM_BUFFER_SIZE    1024
#define PIOS_UDP_RX_BUFFER_SIZE PIOS_COM_BUFFER_SIZE
#define PIOS_UDP_TX_BUFFER_SIZE PIOS_COM_BUFFER_SIZE

// -------------------------
// System Settings
//
// See also System_stm32f4xx.c
// -------------------------
// These macros are deprecated
// please use PIOS_PERIPHERAL_APBx_CLOCK According to the table below
// #define PIOS_MASTER_CLOCK
// #define PIOS_PERIPHERAL_CLOCK
// #define PIOS_PERIPHERAL_CLOCK

#define PIOS_SYSCLK 168000000
// Peripherals that belongs to APB1 are:
// DAC			|PWR				|CAN1,2
// I2C1,2,3		|UART4,5			|USART3,2
// I2S3Ext		|SPI3/I2S3		|SPI2/I2S2
// I2S2Ext		|IWDG				|WWDG
// RTC/BKP reg
// TIM2,3,4,5,6,7,12,13,14

// Calculated as SYSCLK / APBPresc * (APBPre == 1 ? 1 : 2)
// Default APB1 Prescaler = 4
// #define PIOS_PERIPHERAL_APB1_CLOCK					(PIOS_SYSCLK / 2)

// Peripherals belonging to APB2
// SDIO			|EXTI				|SYSCFG			|SPI1
// ADC1,2,3
// USART1,6
// TIM1,8,9,10,11
//
// Default APB2 Prescaler = 2
//
// #define PIOS_PERIPHERAL_APB2_CLOCK					PIOS_SYSCLK


// -------------------------
// Interrupt Priorities
// -------------------------
// #define PIOS_IRQ_PRIO_LOW                       12              // lower than RTOS
// #define PIOS_IRQ_PRIO_MID                       8               // higher than RTOS
// #define PIOS_IRQ_PRIO_HIGH                      5               // for SPI, ADC, I2C etc...
// #define PIOS_IRQ_PRIO_HIGHEST                   4               // for USART etc...

// ------------------------
// PIOS_RCVR
// See also pios_board.c
// ------------------------
#define PIOS_RCVR_MAX_DEVS     3
#define PIOS_RCVR_MAX_CHANNELS 12

// -------------------------
// Receiver PPM input
// -------------------------
// #define PIOS_PPM_MAX_DEVS            1
// #define PIOS_PPM_NUM_INPUTS          12

// -------------------------
// Receiver PWM input
// -------------------------
// #define PIOS_PWM_MAX_DEVS            1
// #define PIOS_PWM_NUM_INPUTS          8

// -------------------------
// Receiver SPEKTRUM input
// -------------------------
// #define PIOS_SPEKTRUM_MAX_DEVS       2
// #define PIOS_SPEKTRUM_NUM_INPUTS     12

// -------------------------
// Receiver S.Bus input
// -------------------------
// #define PIOS_SBUS_MAX_DEVS           1
// #define PIOS_SBUS_NUM_INPUTS         (16+2)

// -------------------------
// Receiver DSM input
// -------------------------
// #define PIOS_DSM_MAX_DEVS			2
// #define PIOS_DSM_NUM_INPUTS			12

// -------------------------
// Servo outputs
// -------------------------
// #define PIOS_SERVO_UPDATE_HZ                    50
// #define PIOS_SERVOS_INITIAL_POSITION            0 /* dont want to start motors, have no pulse till settings loaded */
#define PIOS_SERVO_NUM_OUTPUTS 8
#define PIOS_SERVO_NUM_TIMERS  PIOS_SERVO_NUM_OUTPUTS
// --------------------------
// Timer controller settings
// --------------------------
// #define PIOS_TIM_MAX_DEVS			6

// -------------------------
// ADC
// None.
// -------------------------

// -------------------------
// USB
// -------------------------
// #define PIOS_USB_MAX_DEVS                       1
// #define PIOS_USB_ENABLED                        1 /* Should remove all references to this */
// #define PIOS_USB_HID_MAX_DEVS                   1

#endif /* PIOS_BOARD_H */

/**
 * @}
 * @}
 */