BoskoopBase/embadet/components/onewire/onewire.h
2024-10-13 13:23:46 +02:00

121 lines
No EOL
2.8 KiB
C
Executable file

#ifndef ONEWIRE_H
#define ONEWIRE_H
#include "freertos/FreeRTOS.h"
#include "freertos/semphr.h"
#include "driver/gpio.h"
#include "esp_types.h"
#include "esp_err.h"
#define _ONEWIRE_WRITE1_LOW 6
#define _ONEWIRE_WRITE1_WAIT 64
#define _ONEWIRE_WRITE0_LOW 60
#define _ONEWIRE_WRITE0_WAIT 10
#define _ONEWIRE_READ_WAIT 9
#define _ONEWIRE_READ_RECOVERY 55
#define _ONEWIRE_RESET_WAIT 480
#define _ONEWIRE_PRESENCE_WAIT 70
#define _ONEWIRE_RESET_RECOVERY 410
#define _BLOCK_TIME pdMS_TO_TICKS(1000)
#define _SEMFAIL_MSG "Failed to obtain semaphore. (%s)"
static const char *TAG_ONEWIRE = "ONEWIRE";
typedef enum {
_ROM_READ = 0x33,
_ROM_SEARCH = 0xF0,
_ROM_MATCH = 0x55,
_ROM_SKIP = 0xCC
} onewire_rom_commands_t;
typedef struct {
gpio_num_t pin;
SemaphoreHandle_t mutex;
} onewire_bus_handle_t;
/**
* @brief Configure gpio pins for onewire communication
*
* Set `custom_config` to NULL for default config.
*
* @param pin Bus pin
* @param custom_config Custom gpio config
*
* @retval 1: Success
* @retval 0: Incorrect pin or gpio configuration failed (Logs tells which happened)
*/
uint8_t onewire_configure_gpio(gpio_num_t pin, gpio_config_t *custom_config);
/**
* @brief Initalize onewire bus
*
* Set `custom_config` to NULL for default config.
* @warning MUST be called before any other library function!
*
* @param bus Bus handle
* @param pin Bus pin
* @param custom_config Custom gpio config
*
* @retval 1: Success
* @retval 0: `bus` is NULL or gpio configuration failed (Logs tells which happened)
*/
uint8_t onewire_init(onewire_bus_handle_t *bus, gpio_num_t bus_pin, gpio_config_t *custom_config);
/**
* @brief Send reset pulse
*
* @param bus Bus handle
*
* @retval 1: Success (device sent presence pulse)
* @retval -1: Failed to obtain semaphore for gpio handling
* @retval 0: Device failed to return presence pulse
*/
uint8_t onewire_reset(onewire_bus_handle_t *bus);
/**
* @brief Write bit
*
* @param bus Bus handle
* @param bit Bit to send
*/
void onewire_write_bit(onewire_bus_handle_t *bus, uint8_t bit);
/**
* @brief Write byte
*
* @param bus Bus handle
* @param bit Byte to send
*/
void onewire_write_byte(onewire_bus_handle_t *bus, uint8_t byte);
/**
* @brief Read bit
*
* @param bus Bus handle
*
* @retval 1: Device returned 1
* @retval 0: Device returned 0
* @retval -1: Failed to obtain semaphore for gpio handling
*/
uint8_t onewire_read_bit(onewire_bus_handle_t *bus);
/**
* @brief Read bit
*
* @param bus Bus handle
*
* @return Byte returned by device
*/
uint8_t onewire_read_byte(onewire_bus_handle_t *bus);
/**
* @brief Send command to device
*
* @param bus Bus handle
* @param command Onewire rom command
*
*/
void onewire_send_command(onewire_bus_handle_t *bus, onewire_rom_commands_t command);
#endif