/*
 * sht4x.c
 *
 *  Created on: Jun 8, 2021
 *      Author: user
 */

#include "sht4x.h"
#include "main.h" /* for uart_disable_interrupts() */

int8_t sht4x_send_cmd(sht4x_cmd_t cmd)
{
	return SHT4X_OK;
}

int8_t sht4x_read_data(uint8_t *buffer, int len)
{
	return SHT4X_OK;
}

int8_t sht4x_measure(int16_t *temperature, uint16_t *relative_humidity)
{
	uint8_t buffer[32];
	int result;

	/* disable interrupts to prevent modbus/i2c conflict */
	uart_disable_interrupts();
	// start measurement
	buffer[0] = SHT4X_START_MEAS_HIGH_PRECISION;
	result = i2c_transmit(SHT4X_I2C_ADDRESS<<1, buffer, 1);
	if (result != I2C_OK) {
		return SHT4X_ERROR;
	}
	uart_enable_interrupts();
	LL_mDelay(10); /* 10 ms should be enough */
	uart_disable_interrupts();
	/* read out */
	result = i2c_receive(SHT4X_I2C_ADDRESS<<1, buffer, 6);
	uart_enable_interrupts();
	if (result != I2C_OK) {
		return SHT4X_ERROR;
	}
	/* Convert to T and RH; taken directly from pseudocode in SHT4x datasheet, page 3 */
	uint32_t t_ticks = (buffer[0] << 8) + buffer[1];
	uint8_t t_crc = buffer[2];
	uint32_t rh_ticks = (buffer[3] << 8) + buffer[4];
	uint8_t rh_crc = buffer[5];
	/* check CRC-8 checksum */
	uint8_t crc_correct = crc8_calculate(buffer, 2) == t_crc;
	crc_correct &= crc8_calculate(buffer + 3, 2) == rh_crc;
	if (!crc_correct) {
		return SHT4X_CRC8_ERROR;
	}
	/* copy data to output variables */
	int t_degC = -450 + 10 * 175 * t_ticks / 65535; /* temperature * 10 */
	int rh_pRH = -6 + 125 * rh_ticks / 65535;
	if (rh_pRH > 100) {
			rh_pRH = 100;
	}
	if (rh_pRH < 0) {
		rh_pRH = 0;
	}
	*temperature = t_degC;
	*relative_humidity = rh_pRH;

	return SHT4X_OK;
}
