-------------------------------------------------------

-- This library was written for the Texas Instruments 
-- HDC1000 temperature and humidity sensor. 
-- It should work for the HDC1008 too.
-- Written by Francesco Truzzi (francesco@truzzi.me)
-- Released under GNU GPL v2.0 license.

-------------------------------------------------------

-------------- NON-DEFAULT CONFIG VALUES --------------
------------- config() optional arguments -------------

--	HDC1000_HEAT_OFF			0x00	(heater)
--	HDC1000_TEMP_11BIT			0x40	(resolution)
-- 	HDC1000_HUMI_11BIT			0x01 	(resolution)
--	HDC1000_HUMI_8BIT			0x20 	(resolution)

-------------------------------------------------------

local modname = ...
local M = {}
_G[modname] = M

local id = 0
local i2c = i2c
local delay = 20000
local _drdyn_pin

local HDC1000_ADDR = 0x40

local HDC1000_TEMP = 0x00
local HDC1000_HUMI = 0x01
local HDC1000_CONFIG = 0x02

local HDC1000_HEAT_ON = 0x20
local HDC1000_TEMP_HUMI_14BIT = 0x00

-- reads 16bits from the sensor
local function read16()
	i2c.start(id)
	i2c.address(id, HDC1000_ADDR, i2c.RECEIVER)
	data_temp = i2c.read(0, 2)
	i2c.stop(id)
	data = bit.lshift(string.byte(data_temp, 1, 1), 8) + string.byte(data_temp, 2, 2)
	return data
end

-- sets the register to read next
local function setReadRegister(register)
	i2c.start(id)
	i2c.address(id, HDC1000_ADDR, i2c.TRANSMITTER)
	i2c.write(id, register)
	i2c.stop(id)
end

-- writes the 2 configuration bytes
local function writeConfig(config)
	i2c.start(id)
	i2c.address(id, HDC1000_ADDR, i2c.TRANSMITTER)
	i2c.write(id, HDC1000_CONFIG, config, 0x00)
	i2c.stop(id)
end

-- returns true if battery voltage is < 2.7V, false otherwise
function M.batteryDead()
	setReadRegister(HDC1000_CONFIG)
	return(bit.isset(read16(), 11))

end

-- initalize i2c
function M.init(sda, scl, drdyn_pin)
	_drdyn_pin = drdyn_pin
	i2c.setup(id, sda, scl, i2c.SLOW)
end

function M.config(addr, resolution, heater)
	-- default values are set if the function is called with no arguments
	HDC1000_ADDR = addr or HDC1000_ADDR
	resolution = resolution or HDC1000_TEMP_HUMI_14BIT
	heater = heater or HDC1000_HEAT_ON
	writeConfig(bit.bor(resolution, heater))
end

-- outputs temperature in Celsius degrees
function M.getHumi()
	setReadRegister(HDC1000_HUMI)
	if(_drdyn_pin ~= false) then
		gpio.mode(_drdyn_pin, gpio.INPUT)
		while(gpio.read(_drdyn_pin)==1) do
	end
	else tmr.delay(delay) end
	return(read16()/65535.0*100)
end

-- outputs humidity in %RH
function M.getTemp()
	setReadRegister(HDC1000_TEMP)
	if(_drdyn_pin ~= false) then
		gpio.mode(_drdyn_pin, gpio.INPUT)
		while(gpio.read(_drdyn_pin)==1) do
	end
	else tmr.delay(delay) end
	return(read16()/65535.0*165-40)
end

return M