/**
******************************************************************************
* @file    onewire.h
* @brief   This file contains all the constants parameters for the OneWire
******************************************************************************
*/
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef ONEWIRE_H
#define ONEWIRE_H

#ifdef __cplusplus
 extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "ow_port.h"

/* Driver Selection ----------------------------------------------------------*/
//#define LL_Driver
//#define CMSIS_Driver
/* OneWire Timings -----------------------------------------------------------*/
#define ONEWIRE_RESET_PULSE_US      480   // Длительность импульса сброса
#define ONEWIRE_PRESENCE_WAIT_US    70    // Ожидание ответа от датчика
#define ONEWIRE_PRESENCE_DURATION_US 410  // Длительность сигнала присутствия

#define ONEWIRE_WRITE_1_US          8     // Длительность записи "1"
#define ONEWIRE_WRITE_0_US          57    // Длительность записи "0"
#define ONEWIRE_READ_CMD_US         2     // Время комманды чтения бита
#define ONEWIRE_READ_DELAY_US       6    // Задержка перед считыванием бита
#define ONEWIRE_COMMAND_SLOT_US     58    // Общее время комманды OneWire
#define ONEWIRE_RECOVERY_TIME_US    1     // Восстановление перед следующим слотом
/* Common Register -----------------------------------------------------------*/
#define ONEWIRE_CMD_SEARCHROM			0xF0
#define ONEWIRE_CMD_READROM				0x33
#define ONEWIRE_CMD_MATCHROM			0x55
#define ONEWIRE_CMD_SKIPROM				0xCC

/* Data Structure ------------------------------------------------------------*/
typedef enum
{
	Input,
	Output
} PinMode;

typedef struct
{
	uint8_t 		LastDiscrepancy;
	uint8_t 		LastFamilyDiscrepancy;
	uint8_t 		LastDeviceFlag;
	uint8_t			RomByte[8];
	uint8_t 		RomCnt;
	uint16_t		DataPin;
	GPIO_TypeDef	*DataPort;
} OneWire_t;

/* External Function ---------------------------------------------------------*/
void OneWire_Init(OneWire_t* OW);
uint8_t OneWire_Search(OneWire_t* OW, uint8_t Cmd);
void OneWire_GetDevRom(OneWire_t* OW, uint8_t *dev);
uint8_t OneWire_Reset(OneWire_t* OW);
uint8_t OneWire_ReadBit(OneWire_t* OW);
uint8_t OneWire_ReadByte(OneWire_t* OW);
void OneWire_WriteByte(OneWire_t* OW, uint8_t byte);
void OneWire_MatchROM(OneWire_t* OW, uint8_t *Rom);
void OneWire_Skip(OneWire_t* OW);
uint8_t OneWire_CRC8(uint8_t *addr, uint8_t len);

void OneWire_Pin_Mode(OneWire_t* OW, PinMode Mode);
void OneWire_Pin_Level(OneWire_t* OW, uint8_t Level);
uint8_t OneWire_Pin_Read(OneWire_t* OW);
void OneWire_WriteBit(OneWire_t* OW, uint8_t bit);

#ifdef __cplusplus
}
#endif

#endif /* ONEWIRE_H */
