#include "sr_sunrise.h"

#define SC7A20_ADDRESS 0x19 // 从机地址
// 寄存器地址
#define SC7A20_REG_WHO_AM_I 0x0F
#define SC7A20_REG_CTRL1 0x20
#define SC7A20_REG_CTRL2 0x21
#define SC7A20_REG_CTRL3 0x22
#define SC7A20_REG_CTRL4 0x23
#define SC7A20_REG_X_L 0x28
#define SC7A20_REG_X_H 0x29
#define SC7A20_REG_Y_L 0x2A
#define SC7A20_REG_Y_H 0x2B
#define SC7A20_REG_Z_L 0x2C
#define SC7A20_REG_Z_H 0x2D
#define SC7A20_REG_STATUS 0x27

#define SC7A20_CHIP_ID 0x11

// 读写SC7A20 三轴传感器的寄存器
// cmd：  i2c_example [id]
static int i2c_example(int argc, char *argv[])
{
	uint8_t i2cId = SR_I2C0;
	SR_DEVICE_T *i2cDev = SR_NULL;
	uint8_t chipId = 0, regValue = 0;
	int ret = -1;

	uint8_t curValue = 0, newValue = 0;

	if (argc >= 2)
	{
		switch (argv[1][0])
		{
		case '0':
			i2cId = SR_I2C0;
			break;

		case '1':
			i2cId = SR_I2C1;
			break;
		}
	}

	SR_LOG(INFO,"i2c id=%d",i2cId);

	// 根据i2cId获取i2c接口句柄
	i2cDev = SR_HalI2cOpen(i2cId);
	if (!i2cDev)
		return -1;

	// 读取器件ID
	ret = SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_WHO_AM_I, &chipId, 1);
	SR_LOG(INFO, "[I2C] SC7A20 real id = 0x%x, read id = 0x%x, return = %s", SC7A20_CHIP_ID, chipId, ret ? "SR_FAIL" : "SR_OK");

	// 设置CTRL13寄存器
	regValue = 0x02;
	SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL3, &curValue, 1);		// 先获取当前值
	ret = SR_HalI2cWriteReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL3, &regValue, 1); // 写入新值
	SR_LOG(INFO, "[I2C] write return = %s", ret ? "SR_FAIL" : "SR_OK");
	osDelay(10);
	SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL3, &newValue, 1); // 再读取修改后的值
	SR_LOG(INFO, "[I2C] SC7A20 write 0x%02X to CTRL3, curValue = 0x%02X, newValue = 0x%02X", regValue, curValue, newValue);

	// 设置CTRL1寄存器
	regValue = 0x47;
	SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL1, &curValue, 1);		// 先获取当前值
	ret = SR_HalI2cWriteReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL1, &regValue, 1); // 写入新值
	SR_LOG(INFO, "[I2C] write return = %s", ret ? "SR_FAIL" : "SR_OK");
	osDelay(10);
	SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL1, &newValue, 1); // 再读取修改后的值
	SR_LOG(INFO, "[I2C] SC7A20 write 0x%02X to CTRL1, curValue = 0x%02X, newValue = 0x%02X", regValue, curValue, newValue);

	// 关闭接口
	SR_HalI2cClose(i2cDev);
}
SR_SHELL_CMD_EXPORT(i2c_exmp, i2c_example);

#if 0

/*************************************************************************************************************************
 *函数        	:	int SC7A20_ReadAcceleration(SC7A20_HANDLE* pHandle, int16_t* pXa, int16_t* pYa, int16_t* pZa)
 *功能        	:	SC7A20读取加速度值
 *参数        	:	pHandle:句柄；pXa，pYa,pZa 三轴加速度值
 *返回        	:	0:成功；-1:失败
 *依赖			: 	底层宏定义
 *作者       		:	cp1300@139.com
 *时间     		:	2022-07-01
 *最后修改时间		:	2022-07-01
 *说明        	:
 *************************************************************************************************************************/
int SC7A20_ReadAcceleration(SR_DEVICE_T *dev, int16_t *pXa, int16_t *pYa, int16_t *pZa)
{
	uint8_t buff[6] = {0};
	uint8_t i;
	int16_t temp;

	memset(buff, 0, 6);
	if (SR_HalI2cReadReg(dev, SC7A20_ADDRESS, 0, SC7A20_REG_X_L | 0x80, buff, 6) != 0)
	{
		return -1;
	}
	else
	{
		SR_HalI2cReadReg(dev, SC7A20_ADDRESS, 0, 0x27, &i, 1);

		// X轴
		*pXa = buff[1];
		*pXa <<= 8;
		*pXa |= buff[0];
		*pXa >>= 4; // 取12bit精度

		// Y轴
		*pYa = buff[3];
		*pYa <<= 8;
		*pYa |= buff[2];
		*pYa >>= 4; // 取12bit精度

		// Z轴
		*pZa = buff[5];
		*pZa <<= 8;
		*pZa |= buff[4];
		*pZa >>= 4; // 取12bit精度

		return 0;
	}
}

void sc7a20_thread_example(void *args)
{
	SR_DEVICE_T *i2cDev = SR_NULL;
	uint8_t chipId = 0;

	uint8_t regValue = 0;

	int16_t Xa, Ya, Za;

	int ret;

	// 获取i2c接口句柄
	i2cDev = SR_HalI2cOpen(SR_I2C0);
	if (!i2cDev)
	{
		SR_LOG(INFO, "[I2C] i2cDev get fail");
		goto _END;
	}

	// 读取器件ID
	ret = SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_WHO_AM_I, &chipId, 1);
	SR_LOG(INFO, "[I2C] SC7A20 real id=0x%x, read id=0x%x return=%d", SC7A20_CHIP_ID, chipId, ret);

	regValue = 0x47;
	ret = SR_HalI2cWriteReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL1, &regValue, 1); // 50Hz+正常模式xyz使能
	SR_LOG(INFO, "[I2C] SC7A20  write CTRL1, return=%d", ret);

	regValue = 0x00;
	SR_HalI2cWriteReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL2, &regValue, 1); // 关闭滤波器，手册上面没有滤波器截止频率设置说明，开启后无法测量静止状态下的重力加速度
	SR_LOG(INFO, "[I2C] SC7A20  write CTRL2, return=%d", ret);

	regValue = 0x00;
	SR_HalI2cWriteReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL3, &regValue, 1); // 关闭中断
	SR_LOG(INFO, "[I2C] SC7A20  write CTRL3, return=%d", ret);

	regValue = 0x88;
	SR_HalI2cWriteReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_CTRL4, &regValue, 1); // 读取完成再更新，小端模式，2g+正常模式，高精度模式
	SR_LOG(INFO, "[I2C] SC7A20  write CTRL4, return=%d", ret);

	while (gShellThreadRun)
	{

		Xa = Ya = Za = 0;
		ret = SC7A20_ReadAcceleration(i2cDev, &Xa, &Ya, &Za);
		SR_LOG(INFO, "[ACC] read acc ,return=%d, Xa(%d) Ya(%d) Za(%d)\r\n", ret, Xa, Ya, Za);

		osDelay(1000);
	}

	// 关闭接口
	SR_HalI2cClose(i2cDev);

_END:
	osThreadExit();
}

static int sc7a20_example(int argc, char *argv[])
{
	osThreadId_t accThread = SR_NULL;

	gShellThreadRun = 1;

	accThread = osThreadNew(sc7a20_thread_example, SR_NULL, SR_NULL);

	return 0;
}
SR_SHELL_CMD_EXPORT(sc7a20_example, sc7a20_example);

static int sr_i2cread_example(int argc, char *argv[])
{
	SR_DEVICE_T *i2cDev = SR_NULL;
	uint8_t chipId = 0;
	int ret = -1;

	// 获取i2c接口句柄
	i2cDev = SR_HalI2cOpen(SR_I2C0);
	if (!i2cDev)
	{
		SR_LOG(INFO, "[I2C] i2cDev get fail");
		return -1;
	}

	// 读取器件ID
	ret = SR_HalI2cReadReg(i2cDev, SC7A20_ADDRESS, 0, SC7A20_REG_WHO_AM_I, &chipId, 1);
	SR_LOG(INFO, "[I2C] SC7A20 real id=0x%x, read id=0x%x return=%d", SC7A20_CHIP_ID, chipId, ret);

	// 关闭接口
	SR_HalI2cClose(i2cDev);

	return 0;
}
SR_SHELL_CMD_EXPORT(sr_i2cread, sr_i2cread_example);

#include "luat_i2c.h"
#include "sr_osal.h"
static int hz_i2cread_example(int argc, char *argv[])
{
	SR_DEVICE_T *i2cDev = SR_NULL;
	uint8_t chipId[1];
	int ret, ret2 = -1;
	uint8_t reg[1];

	// 获取i2c接口句柄

	ret = luat_i2c_setup(0, 1);

	if (ret != 0)
	{
		SR_LOG(INFO, "[I2C] i2cDev set fail");
		return -1;
	}

	// 读取器件ID
	// ret = SR_HalI2cReadReg(i2cDev,SC7A20_ADDRESS,0, SC7A20_REG_WHO_AM_I, &chipId, 1);

	reg[0] = SC7A20_REG_WHO_AM_I;
	// ret = luat_i2c_transfer(0, SC7A20_ADDRESS, reg, 1, &chipId, 1);
	ret = luat_i2c_send(0, SC7A20_ADDRESS, reg, 1, 0);
	ret2 = luat_i2c_recv(0, SC7A20_ADDRESS, chipId, 1);
	SR_LOG(INFO, "[I2C] SC7A20 real id=0x%x, read id=0x%x ret=%d ret2=%d", SC7A20_CHIP_ID, chipId[0], ret, ret2);

	// 关闭接口
	luat_i2c_close(0);

	return 0;
}
SR_SHELL_CMD_EXPORT(hz_i2cread, hz_i2cread_example);

int SC7A20_Write(uint8_t SlaveAddr, uint8_t RegAddr, uint8_t *pDataBuff, uint16_t ByteNum)
{
	uint8_t *pWriteData = NULL;
	pWriteData = (uint8_t *)SR_OsMalloc(ByteNum + 1); // 分配内存空间
	pWriteData[0] = RegAddr;
	for (int i = 0; i < ByteNum; i++)
	{
		pWriteData[i + 1] = pDataBuff[i];
	}

	luat_i2c_send(0, SlaveAddr, pWriteData, ByteNum + 1, 0);

	SR_OsFree(pWriteData);
}

static int hz_i2cwrite_example(int argc, char *argv[])
{
	SR_DEVICE_T *i2cDev = SR_NULL;
	uint8_t chipId[1];
	int ret, ret2 = -1;
	uint8_t reg[1];

	// 获取i2c接口句柄

	ret = luat_i2c_setup(0, 1);

	if (ret != 0)
	{
		SR_LOG(INFO, "[I2C] i2cDev set fail");
		return -1;
	}

	// 写取器件ID

	reg[0] = 0x47;
	ret = SC7A20_Write(SC7A20_ADDRESS, SC7A20_REG_CTRL1, reg, 1); // 50Hz+正常模式xyz使能
	SR_LOG(INFO, "[I2C] SC7A20  write CTRL1, return=%d", ret);

	// 关闭接口
	luat_i2c_close(0);

	return 0;
}
SR_SHELL_CMD_EXPORT(hz_i2cwrite, hz_i2cwrite_example);

static int hz2_i2cread_example(int argc, char *argv[])
{
	SR_DEVICE_T *i2cDev = SR_NULL;
	uint8_t chipId[1];
	int ret, ret2 = -1;
	uint8_t reg[1];

	// 获取i2c接口句柄

	ret = luat_i2c_setup(0, 1);

	if (ret != 0)
	{
		SR_LOG(INFO, "[I2C] i2cDev set fail");
		return -1;
	}

	// 读取器件ID
	// ret = SR_HalI2cReadReg(i2cDev,SC7A20_ADDRESS,0, SC7A20_REG_WHO_AM_I, &chipId, 1);

	reg[0] = SC7A20_REG_WHO_AM_I;
	ret = luat_i2c_transfer(0, SC7A20_ADDRESS, reg, 1, chipId, 1);
	// ret = luat_i2c_send(0, SC7A20_ADDRESS, reg, 1, 0);
	// ret2 = luat_i2c_recv(0, SC7A20_ADDRESS, chipId, 1);
	SR_LOG(INFO, "[I2C] SC7A20 real id=0x%x, read id=0x%x ret=%d", SC7A20_CHIP_ID, chipId[0], ret, ret2);

	// 关闭接口
	luat_i2c_close(0);

	return 0;
}
SR_SHELL_CMD_EXPORT(hz2_i2cread, hz2_i2cread_example);

#endif
