/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    sts_aq_sht3x.c		            								   *
  * @author  Yunhorn (r) Technology Limited Application Team	               *
  * @brief   Yunhorn (r) SmarToilets (r) Product configuration file.		   *
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2025 Yunhorn Technology Limited.
  * Copyright (c) 2025 Shenzhen Yunhorn Technology Co., Ltd.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */


#include "sensirion_common.h"
#include "sensirion_i2c_hal.h"
#include "sht3x_i2c.h"
#include <stdio.h>  // printf

#define sensirion_hal_sleep_us sensirion_i2c_hal_sleep_usec

int uut_sht3x_main(void) {
    int16_t error = NO_ERROR;
    sensirion_i2c_hal_init();
    sht3x_init(SHT30_I2C_ADDR_44);

    sht3x_stop_measurement();
    sensirion_hal_sleep_us(1000);
    sht3x_soft_reset();
    sensirion_hal_sleep_us(100000);
    uint16_t a_status_register = 0u;
    error = sht3x_read_status_register(&a_status_register);
    if (error != NO_ERROR) {
        printf("error executing read_status_register(): %d\n", error);
        return error;
    }
    printf("a_status_register: %02x\n", a_status_register);
    int32_t a_temperature = 0;
    int32_t a_humidity = 0;
    uint16_t repetition = 0;
    for (repetition = 0; repetition < 50; repetition++) {
        error = sht3x_measure_single_shot(REPEATABILITY_MEDIUM, false,
                                          &a_temperature, &a_humidity);
        if (error != NO_ERROR) {
            printf("error executing measure_single_shot(): %d\n", error);
            continue;
        }
        printf("a_temperature  [milli degC]: %li ", a_temperature);
        printf("a_humidity  [milli RH]: %li\n", a_humidity);
    }

    return NO_ERROR;
}


/*
 * THIS FILE IS AUTOMATICALLY GENERATED
 *
 * Generator:     sensirion-driver-generator 0.33.0
 * Product:       sht3x
 * Model-Version: 2.0.0
 */
/*
 * Copyright (c) 2023, Sensirion AG
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * * Redistributions of source code must retain the above copyright notice, this
 *   list of conditions and the following disclaimer.
 *
 * * Redistributions in binary form must reproduce the above copyright notice,
 *   this list of conditions and the following disclaimer in the documentation
 *   and/or other materials provided with the distribution.
 *
 * * Neither the name of Sensirion AG nor the names of its
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */
#if 0
#include "sensirion_common.h"
#include "sensirion_i2c_hal.h"
#include "sht3x_i2c.h"
#include <stdio.h>  // printf

#define sensirion_hal_sleep_us sensirion_i2c_hal_sleep_usec

int main(void) {
    int16_t error = NO_ERROR;
    sensirion_i2c_hal_init();
    sht3x_init(SHT30_I2C_ADDR_44);

    sht3x_stop_measurement();
    sensirion_hal_sleep_us(1000);
    sht3x_soft_reset();
    sensirion_hal_sleep_us(100000);
    uint16_t a_status_register = 0u;
    error = sht3x_read_status_register(&a_status_register);
    if (error != NO_ERROR) {
        printf("error executing read_status_register(): %i\n", error);
        return error;
    }
    printf("a_status_register: %02x\n", a_status_register);
    error = sht3x_start_periodic_measurement(REPEATABILITY_MEDIUM,
                                             MPS_ONE_PER_SECOND);
    if (error != NO_ERROR) {
        printf("error executing start_periodic_measurement(): %i\n", error);
        return error;
    }
    int32_t a_temperature = 0.0;
    int32_t a_humidity = 0.0;
    uint16_t repetition = 0;
    for (repetition = 0; repetition < 50; repetition++) {
        error = sht3x_blocking_read_measurement(&a_temperature, &a_humidity);
        if (error != NO_ERROR) {
            printf("error executing blocking_read_measurement(): %i\n", error);
            continue;
        }
        printf("a_temperature [milli degC]: %li ", a_temperature);
        printf("a_humidity [milli RH]: %li\n", a_humidity);
    }

    error = sht3x_stop_measurement();
    if (error != NO_ERROR) {
        return error;
    }

    return NO_ERROR;
}
#endif


#if 0
#include "sht3x.h"
#include "usart.h"
#include "stdio.h"
#include "i2c.h"
#include "stm32f0xx_hal_i2c.h"
#include "system.h"

#define SHT3x_ADDR_WRITE      0x44<<1         //10001000
#define SHT3x_ADDR_READ      (0x44<<1)+1      //10001011

/* 描述:向SHT30发送一条16bit指令 
 * 参数cmd:SHT30指令(在SHT30_MODE中枚举定义)
 * 返回值:发送成功返回0,发送失败返回1 		*/
static uint8_t SHT3x_Send_Cmd(SHT3X_CMD cmd)
{
  uint8_t cmd_buffer[2];
  cmd_buffer[0] = cmd >> 8;
  cmd_buffer[1] = cmd;
  return HAL_I2C_Master_Transmit(&hi2c1, SHT3x_ADDR_WRITE, (uint8_t* )cmd_buffer, 2, 0xFFFF);
}
/**
 * @brief   复位SHT30
 * @param   none
 * @retval  none
*/
void SHT3x_Reset(void)
{
    SHT3x_Send_Cmd(SOFT_RESET_CMD);
    HAL_Delay(20);
}

/* 描述:SHT3x初始化函数,并将其设置为周期测量模式
 * 参数:无
 * 返回值:初始化成功返回0,初始化失败返回1 */
uint8_t SHT3x_Init(void)
{
	uint8_t ret;
  ret = SHT3x_Send_Cmd(MEDIUM_2_CMD);
	return ret;

}

/* 描述:数据CRC校验
 * 参数message:需要校验的数据
 * 参数initial_value:crc初始值
 * 返回值:计算得到的CRC码 */
#define CRC8_POLYNOMIAL 0x31
uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value)
{
	  uint8_t  remainder;	    //余数
    uint8_t  i = 0, j = 0;  //循环变量

    /* 初始化 */
    remainder = initial_value;
    for(j = 0; j < 2;j++)
    {
        remainder ^= message[j];
        /* 从最高位开始依次计算  */
        for (i = 0; i < 8; i++)
        {
            if (remainder & 0x80)
                remainder = (remainder << 1)^CRC8_POLYNOMIAL;
            else
                remainder = (remainder << 1);
        }
    }
    /* 返回计算的CRC码 */
    return remainder;
}

/* 描述:温湿度数据获取函数,周期读取,注意,需要提前设置周期模式   
 * 参数Tem_val:存储温度数据的指针, 温度单位为°C
 * 参数Hum_val:存储湿度数据的指针, 温度单位为%
 * 返回值:0-读取成功,1-读取失败
********************************************************************/
uint8_t SHT3x_Get_Humiture_periodic(double *Tem_val,double *Hum_val)
{
	uint8_t ret=0;
	uint8_t buff[6]={0};
	uint16_t tem,hum;
	double Temperature=0;
	double Humidity=0;
	
  ret=SHT3x_Send_Cmd(READOUT_FOR_PERIODIC_MODE);	
	
  //Delay_us(4);
	LL_mDelay(50);
	
  ret=HAL_I2C_Master_Receive(&hi2c1, SHT3x_ADDR_READ, buff, 6, 0xFFFF);

	
	
	
	/* 校验温度数据和湿度数据是否接收正确 */
	if(CheckCrc8(buff, 0xFF) != buff[2] || CheckCrc8(&buff[3], 0xFF) != buff[5])
	{	
		printf("CRC_ERROR,ret = 0x%x\r\n",ret);
		return 1;
	}
		
	/* 转换温度数据 */
	tem = (((uint16_t)buff[0]<<8) | buff[1]);//温度数据拼接
	Temperature= (175.0*(double)tem/65535.0-45.0) ;	// T = -45 + 175 * tem / (2^16-1)
	
	/* 转换湿度数据 */
	hum = (((uint16_t)buff[3]<<8) | buff[4]);//湿度数据拼接
	Humidity= (100.0*(double)hum/65535.0);			// RH = hum*100 / (2^16-1)
	
	/* 过滤错误数据 */
	if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))
	{
		*Tem_val = Temperature;
		*Hum_val = Humidity;
		
		return 0;
	}
	else
		return 1;
}

/* 描述:温湿度数据获取函数,单次获取
 * 参数Tem_val:存储温度数据的指针, 温度单位为°C
 * 参数Hum_val:存储湿度数据的指针, 温度单位为%
 * 返回值:0-读取成功,1-读取失败
********************************************************************/
uint8_t SHT3x_Get_Humiture_single(double *Tem_val,double *Hum_val)
{
	uint8_t ret=0;
	uint8_t buff[6];
	uint16_t tem,hum;
	double Temperature=0;
	double Humidity=0;

	
	SHT3x_Send_Cmd(HIGH_ENABLED_CMD);
	HAL_Delay(50);
  ret=HAL_I2C_Master_Receive(&hi2c1, SHT3x_ADDR_READ, buff, 6, 0xFFFF);
	

	
	/* 校验温度数据和湿度数据是否接收正确 */
	if(CheckCrc8(buff, 0xFF) != buff[2] || CheckCrc8(&buff[3], 0xFF) != buff[5])
	{	
		printf("CRC_ERROR,ret = 0x%x\r\n",ret);
		return 1;
	}
		
	/* 转换温度数据 */
	tem = (((uint16_t)buff[0]<<8) | buff[1]);//温度数据拼接
	Temperature= (175.0*(double)tem/65535.0-45.0) ;	// T = -45 + 175 * tem / (2^16-1)
	
	/* 转换湿度数据 */
	hum = (((uint16_t)buff[3]<<8) | buff[4]);//湿度数据拼接
	Humidity= (100.0*(double)hum/65535.0);			// RH = hum*100 / (2^16-1)
	
	/* 过滤错误数据 */
	if((Temperature>=-20)&&(Temperature<=125)&&(Humidity>=0)&&(Humidity<=100))
	{
		*Tem_val = Temperature;
		*Hum_val = Humidity;
		return 0;
	}
	else
		return 1;
}
#endif