--本文件中的主机是指I2C主机，具体指Air8000
--本文件中的从机是指I2C从机，具体指AirSHT30_1000配件板上的sht30温湿度传感器芯片

local AirSHT30_1000 = 
{
    -- i2c_id：主机的i2c id；
}   

-- 从机地址为0x44
local slave_addr = 0x44

-- 计算数据表data中所有数据元素的crc8校验值
local function crc8(data)
    local crc = 0xFF
    for i = 1, #data do
        crc = bit.bxor(crc, data[i])
        for j = 1, 8 do
            crc = crc * 2
            if crc >= 0x100 then
                crc = bit.band(bit.bxor(crc, 0x31), 0xff)
            end
        end
    end
    return crc
end


--打开AirSHT30_1000；

--i2c_id：number类型；
--        主机使用的I2C ID，用来控制AirSHT30_1000；
--        取值范围：仅支持0和1；
--        如果没有传入此参数，则默认为0；

--返回值：成功返回true，失败返回false
function AirSHT30_1000.open(i2c_id)
    --如果i2c_id为nil，则赋值为默认值0
    if i2c_id==nil then i2c_id=0 end

    --检查参数的合法性
    if not (i2c_id == 0 or i2c_id == 1) then
        log.error("AirSHT30_1000.open", "invalid i2c_id", i2c_id)
        return false
    end

    AirSHT30_1000.i2c_id = i2c_id
    
    --初始化I2C
    if i2c.setup(i2c_id, i2c.FAST) ~= 1 then
        log.error("AirSHT30_1000.open", "i2c.setup error", i2c_id)
        return false
    end

    return true
end

--读取温湿度数据；

--返回值：失败返回false；
--       成功返回两个值，第一个为摄氏温度值（number类型，例如23.6表示23.6摄氏度），第二个为百分比湿度值（number类型，例如67表示67%的湿度）
function AirSHT30_1000.read()

    -- 发送启动测量命令（高精度）
    i2c.send(AirSHT30_1000.i2c_id, slave_addr, {0x24, 0x00})
        
    -- 等待测量完成（SHT30高精度测量需~15ms）
    sys.wait(20)
    
    -- 读取6字节数据（温度高/低 + CRC，湿度高/低 + CRC）
    local data = i2c.recv(AirSHT30_1000.i2c_id, slave_addr, 6)

    -- 如果没有读取到6字节数据
    if type(data)~="string" or data:len()~=6 then
        log.error("AirSHT30_1000.read", "i2c.recv error")
        return false
    end

    -- log.info("AirSHT30_1000.read", data:toHex())

    --如果校验值正确
    if crc8({data:byte(1), data:byte(2)}) == data:byte(3) and crc8({data:byte(4), data:byte(5)}) == data:byte(6) then 
        -- 提取原始温度值
        local temp_raw = (data:byte(1) << 8) | data:byte(2)
        -- 提取原始湿度值
        local hum_raw = (data:byte(4) << 8) | data:byte(5)
        
        -- 转换为实际值（根据SHT30数据手册公式）
        local temprature = (-45 + 175 * temp_raw / 65535.0)
        local humidity = (100 * hum_raw / 65535.0)
        
        -- 打印输出结果（保留2位小数）
        -- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f ℃", temprature))
        -- log.info("AirSHT30_1000.read", "temprature", string.format("%.2f %%RH", humidity))

        return temprature, humidity
    else
        log.error("AirSHT30_1000.read", "crc error", i2c_id)
        return false
    end
end


--关闭AirSHT30_1000

--返回值：成功返回true，失败返回false
function AirSHT30_1000.close()
    --close接口没有返回值，理论上不会关闭失败
    i2c.close(AirSHT30_1000.i2c_id)

    return true
end


return AirSHT30_1000
