/********************************* (C) РОТЕК ***********************************
 * @module  onewire
 * @file    onewire.h
 * @version 1.0.0
 * @date    XX.XX.XXXX
 * $brief   DS18B20 temperature sensor driver
 *******************************************************************************
 * @history     Version  Author         Comment
 * XX.XX.XXXX   1.0.0    Telenkov D.A.  First release.
 *******************************************************************************
 */

#ifndef ONEWIRE_H
#define ONEWIRE_H

#include <stdint.h>
#include "common_config.h"

//#define DALLAS_TWO_LINE_SWITCH  //двупроводное подключение

/* Первый параметр функции OW_Send */
#define DALLAS_SEND_RESET 1
#define DALLAS_NO_RESET   2

/* Статус возврата функций */
#define DALLAS_OK         1
#define DALLAS_ERROR      2
#define DALLAS_NO_DEVICE  3

#define DALLAS_NO_READ    0xff
#define DALLAS_READ_SLOT  0xff

/**
  * @brief  Настройка USART
  */
void DALLAS_Init();

/**
  * @brief  Настройка DMA
  */
void DALLAS_DmaInit(void);

/**
  * @brief  Сброс и проверка наличия устройства на шине 1-wire 
  */
uint8_t DALLAS_SensorReset(t_sensor_list_t sensor);

/**
  * @brief  Настроить TX пин как питающий выход
  */
void DALLAS_OutSetAsPower(t_sensor_list_t sensor);

/**
  * @brief  Настроить TX пин как передатчик
  */
void DALLAS_OutSetAsTX(t_sensor_list_t sensor);

/**
  * @brief   Отправка и прием данных
  * @param   sendReset посылать RESET в начале общения.
  *          OW_SEND_RESET
  *          OW_NO_RESET
  * @param   *command - массив байт, отсылаемых в шину. 
  *          Если нужно чтение - отправляем OW_READ_SLOTH
  * @param   cLen - длина буфера команд, столько байт отошлется в шину
  * @param   *data - если требуется чтение, то ссылка на буфер для чтения
  * @param   dLen - длина буфера для чтения. Прочитается не более этой длины
  * @param   readStart - с какого символа передачи начинать чтение (нумеруются с 0)
  *          можно указать OW_NO_READ, тогда можно не задавать data и dLen
  */
uint8_t DALLAS_Send(t_sensor_list_t sensor, uint8_t sendReset, uint8_t *command,
                    uint8_t cLen, uint8_t *data, uint8_t dLen, uint8_t readStart);

/**
  * @brief  Функция преобразует один байт в восемь, для передачи через USART
  * @param  ow_byte - байт, который надо преобразовать
  * @param  ow_bits - ссылка на буфер, размером не менее 8 байт
  */
void DALLAS_ToBits(uint8_t ow_byte, uint8_t *ow_bits);

/**
  * @brief  Обратное преобразование - из того, что получено через USART опять собирается байт
  * @param  ow_bits - ссылка на буфер, размером не менее 8 байт
  * @param  ow_byte - собранный байт данных
  */
uint8_t DALLAS_ToByte(uint8_t *ow_bits);

#endif /* ONEWIRE_H */
