/** \file com_io.c
 * \brief Библиотека ввода-вывода для USART
 * \par
 * Реализует "интерфейс по умолчанию" для функций printf() и т.п.
 * По умлочанию устанавливаетя скорость, задаваемая макросом #BAUD, и модуль USART1 (если их 2)
 * \par
 * \author ARV
 * \note
 * \n Схема:
 * \n \date	05.02.2009 ... 	__.__.2008
 * \par
 * \version 1.0 beta	\n
 * Copyright 2008 © ARV. All rights reserved. </b>
 * \par
 * Для компиляции требуется:\n
 * 	-# WinAVR-20080411 или более новая версия
 *
 */
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "com_io.h"
#include "config.h"
#include <util/setbaud.h>

/// Выводит символ
static int uart_putchar(char c, FILE *stream);
#if ONLY_OUT == 0
static int uart_getchar(FILE *stream);
#endif

/// Структура устройства ввода-вывода
#if ONLY_OUT != 0
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
#else
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, uart_getchar, _FDEV_SETUP_RW);
#endif

/** Вывод одного символа с переводом строки при необходимости (локальная функция)
 *
 * @param c выводимый символ
 * @param stream поток для вывода
 * @return всегда возвращает 0
 */
static int uart_putchar(char c, FILE *stream){
	if (config.debug_on!=ON) return 1; 		// выводим отлаку только если она включена
  if (c == '\n')
	uart_putchar('\r', stream);
  while(bit_is_clear(UCSRA, UDRE))
#if USE_WDT != 0
	  wdt_reset();
#endif
  ;
  //if (config.debug_on==ON) {UDR = c;}		// выводим отлаку только если она включена
  UDR = c;
  return 0;
}

#if ONLY_OUT == 0
static int uart_getchar(FILE *stream){
	while(bit_is_clear(UCSRA, RXC))
#if USE_WDT != 0
	  wdt_reset();
#endif
	;
	return UDR;
}
#endif

void print_line(char c, uint8_t count){
	while(count--)putchar(c);
}


/** Автоматическая инициализация модуля.
 *
 */
/// Функция настройки параметров USART и инициализации ввода-вывода.
__attribute__((naked, section(".init7")))
void init_io(void){
	/// Вызывать из основного модуля эту функцию не нужно.
   UCSRA = 0;
   UCSRB = 8;
#include <util/setbaud.h>
   UBRRH = UBRRH_VALUE;
   UBRRL = UBRRL_VALUE;
#if USE_2X
   UCSRA |= (1 << U2X);
#else
   UCSRA &= ~(1 << U2X);
#endif
   UCSRB |= _BV(TXEN);
#if ONLY_OUT == 0
   UCSRB |= _BV(RXEN);
#endif
   UCSRC = 0x86;

   stdout = &mystdout;
   stdin = stdout;
}




