123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /*
- * tsl2561.c
- *
- * Created on: Aug 21, 2015
- * Author: Michael Lucas (Aeprox @github)
- */
- #include "module.h"
- #include "lauxlib.h"
- #include "platform.h"
- #include "../tsl2561/tsl2561.h"
- static uint16_t ch0;
- static uint16_t ch1;
- /* Initialises the device on pins sdapin and sclpin
- * Lua: status = tsl2561.init(sdapin, sclpin, address(optional), package(optional))
- */
- static int ICACHE_FLASH_ATTR tsl2561_init(lua_State* L) {
- uint32_t sda;
- uint32_t scl;
- // check parameters
- if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2)) {
- return luaL_error(L, "wrong arg range");
- }
- sda = luaL_checkinteger(L, 1);
- scl = luaL_checkinteger(L, 2);
- if (scl == 0 || sda == 0) {
- return luaL_error(L, "no i2c for D0");
- }
- // init I2C
- uint8_t error = tsl2561Init(sda, scl);
- // Parse optional parameters
- if (lua_isnumber(L, 3)) {
- uint8_t address = luaL_checkinteger(L, 3);
- if (!((address == TSL2561_ADDRESS_GND) || (address == TSL2561_ADDRESS_FLOAT) || (address == TSL2561_ADDRESS_VDD))) {
- return luaL_error(L, "Invalid argument: address");
- }
- else{
- tsl2561SetAddress(address);
- }
- }
- if (lua_isnumber(L, 4)) {
- uint8_t package = luaL_checkinteger(L, 4);
- if (!((package == TSL2561_PACKAGE_T_FN_CL) || (package == TSL2561_PACKAGE_CS))) {
- return luaL_error(L, "Invalid argument: package");
- }
- else{
- tsl2561SetPackage(package);
- }
- }
- lua_pushinteger(L, error);
- return 1;
- }
- /* Sets the integration time and gain settings of the device
- * Lua: status = tsl2561.settiming(integration, gain)
- */
- static int ICACHE_FLASH_ATTR tsl2561_lua_settiming(lua_State* L) {
- // check variables
- if (!lua_isnumber(L, 1) || !lua_isnumber(L, 2)) {
- return luaL_error(L, "wrong arg range");
- }
- uint8_t integration = luaL_checkinteger(L, 1);
- if (!((integration == TSL2561_INTEGRATIONTIME_13MS) || (integration == TSL2561_INTEGRATIONTIME_101MS) || (integration == TSL2561_INTEGRATIONTIME_402MS))) {
- return luaL_error(L, "Invalid argument: integration");
- }
- uint8_t gain = luaL_checkinteger(L, 2);
- if (!((gain == TSL2561_GAIN_16X) || (gain == TSL2561_GAIN_1X))) {
- return luaL_error(L, "Invalid argument: gain");
- }
- lua_pushinteger(L, tsl2561SetTiming(integration, gain));
- return 1;
- }
- /* Reads sensor values from device and return calculated lux
- * Lua: lux, status = tsl2561.getlux()
- */
- static int ICACHE_FLASH_ATTR tsl2561_lua_calclux(lua_State* L) {
- uint8_t error = tsl2561GetLuminosity(&ch0, &ch1);
- if (error) {
- lua_pushinteger(L, 0);
- lua_pushinteger(L, error);
- } else {
- lua_pushinteger(L, tsl2561CalculateLux(ch0, ch1));
- lua_pushinteger(L, error);
- }
- return 2;
- }
- /* Reads sensor values from device and returns them
- * Lua: ch0, ch1, status = tsl2561.getrawchannels()
- */
- static int ICACHE_FLASH_ATTR tsl2561_lua_getchannels(lua_State* L) {
- uint8_t error = tsl2561GetLuminosity(&ch0, &ch1);
- lua_pushinteger(L, ch0);
- lua_pushinteger(L, ch1);
- lua_pushinteger(L, error);
- return 3;
- }
- // Module function map
- LROT_BEGIN(tsl2561, NULL, 0)
- LROT_FUNCENTRY( settiming, tsl2561_lua_settiming )
- LROT_FUNCENTRY( getlux, tsl2561_lua_calclux )
- LROT_FUNCENTRY( getrawchannels, tsl2561_lua_getchannels )
- LROT_FUNCENTRY( init, tsl2561_init )
- LROT_NUMENTRY( TSL2561_OK, TSL2561_ERROR_OK )
- LROT_NUMENTRY( TSL2561_ERROR_I2CINIT, TSL2561_ERROR_I2CINIT )
- LROT_NUMENTRY( TSL2561_ERROR_I2CBUSY, TSL2561_ERROR_I2CBUSY )
- LROT_NUMENTRY( TSL2561_ERROR_NOINIT, TSL2561_ERROR_NOINIT )
- LROT_NUMENTRY( TSL2561_ERROR_LAST, TSL2561_ERROR_LAST )
- LROT_NUMENTRY( INTEGRATIONTIME_13MS, TSL2561_INTEGRATIONTIME_13MS )
- LROT_NUMENTRY( INTEGRATIONTIME_101MS, TSL2561_INTEGRATIONTIME_101MS )
- LROT_NUMENTRY( INTEGRATIONTIME_402MS, TSL2561_INTEGRATIONTIME_402MS )
- LROT_NUMENTRY( GAIN_1X, TSL2561_GAIN_1X )
- LROT_NUMENTRY( GAIN_16X, TSL2561_GAIN_16X )
- LROT_NUMENTRY( PACKAGE_CS, TSL2561_PACKAGE_CS )
- LROT_NUMENTRY( PACKAGE_T_FN_CL, TSL2561_PACKAGE_T_FN_CL )
- LROT_NUMENTRY( ADDRESS_GND, TSL2561_ADDRESS_GND )
- LROT_NUMENTRY( ADDRESS_FLOAT, TSL2561_ADDRESS_FLOAT )
- LROT_NUMENTRY( ADDRESS_VDD, TSL2561_ADDRESS_VDD )
- LROT_END(tsl2561, NULL, 0)
- NODEMCU_MODULE(TSL2561, "tsl2561", tsl2561, NULL);
|