/*
 * Copyright (c) 2021 Thomas Stranger
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#ifndef ZEPHYR_DRIVERS_SENSOR_SHTCX_SHTCX_H_
#define ZEPHYR_DRIVERS_SENSOR_SHTCX_SHTCX_H_

#include <device.h>
#include <devicetree.h>
#include <kernel.h>
#include <drivers/gpio.h>

/* common cmds */
#define SHTCX_CMD_READ_ID		0xEFC8
#define SHTCX_CMD_SOFT_RESET		0x805D
/* shtc3 only: */
#define SHTCX_CMD_SLEEP			0xB098
#define SHTCX_CMD_WAKEUP		0x3517

#define SHTCX_POWER_UP_TIME_US		240U
/* Soft reset time is 230us for shtc1 and 240us for shtc3 */
#define SHTCX_SOFT_RESET_TIME_US	240U

#define SHTCX_MAX_READ_LEN		6
#define SHTCX_WORD_LEN			2
#define SHTCX_CRC8_LEN			1

#define SHTC3_ID_MASK			0x083F
#define SHTC3_ID_VALUE			0x0807
#define SHTC1_ID_MASK			0x083F
#define SHTC1_ID_VALUE			0x0007

/* defines matching the related enums DT_ENUM_IDX: */
#define CHIP_SHTC1		0
#define CHIP_SHTC3		1
#define MEASURE_MODE_NORMAL	0
#define MEASURE_MODE_LOW_POWER	1

enum shtcx_chip {
	SHTC1 = CHIP_SHTC1,
	SHTC3 = CHIP_SHTC3,
};

enum shtcx_measure_mode {
	NORMAL = MEASURE_MODE_NORMAL,
	LOW_POWER = MEASURE_MODE_LOW_POWER,
};

struct shtcx_sample {
	uint16_t temp;
	uint16_t humidity;
} __packed __aligned(2);

struct shtcx_config {
	const struct device *bus;
	uint8_t base_address;
	enum shtcx_chip chip;
	enum shtcx_measure_mode measure_mode;
	bool clock_stretching;
};

struct shtcx_data {
	struct shtcx_sample sample;
};

static inline uint8_t shtcx_i2c_address(const struct device *dev)
{
	const struct shtcx_config *dcp = dev->config;

	return dcp->base_address;
}

static inline const struct device *shtcx_i2c_bus(const struct device *dev)
{
	const struct shtcx_config *dcp = dev->config;

	return dcp->bus;
}

#endif /* ZEPHYR_DRIVERS_SENSOR_SHTCX_SHTCX_H_ */
