78 lines
2.3 KiB
C
78 lines
2.3 KiB
C
// Module for interfacing with adc hardware
|
|
|
|
#include "module.h"
|
|
#include "lauxlib.h"
|
|
#include "platform.h"
|
|
|
|
|
|
// Lua: config( adc_id, bits )
|
|
static int adc_set_width( lua_State *L )
|
|
{
|
|
int adc_id = luaL_checkinteger( L, 1 );
|
|
MOD_CHECK_ID( adc, adc_id );
|
|
int bits = luaL_checkinteger( L, 2 );
|
|
|
|
if (!platform_adc_set_width( adc_id, bits ))
|
|
luaL_error( L, "adc_set_width failed" );
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Lua: setup( adc_id, channel, atten )
|
|
static int adc_setup( lua_State *L )
|
|
{
|
|
int adc_id = luaL_checkinteger( L, 1 );
|
|
MOD_CHECK_ID( adc, adc_id );
|
|
int channel = luaL_checkinteger( L, 2 );
|
|
if (!platform_adc_channel_exists( adc_id, channel ))
|
|
luaL_error( L, "channel %d does not exist in ADC%d", ( unsigned )channel, ( unsigned )adc_id );
|
|
|
|
int atten = luaL_checkinteger( L, 3 );
|
|
|
|
if (!platform_adc_setup( adc_id, channel, atten ))
|
|
luaL_error( L, "adc_setup failed" );
|
|
|
|
return 0;
|
|
}
|
|
|
|
// Lua: read( adc_id, channel )
|
|
static int adc_read( lua_State *L )
|
|
{
|
|
int adc_id = luaL_checkinteger( L, 1 );
|
|
MOD_CHECK_ID( adc, adc_id );
|
|
int channel = luaL_checkinteger( L, 2 );
|
|
if (!platform_adc_channel_exists( adc_id, channel ))
|
|
luaL_error( L, "channel %d does not exist in ADC%d", ( unsigned )channel, ( unsigned )adc_id );
|
|
|
|
int sample = platform_adc_read( adc_id, channel );
|
|
if (sample == -1)
|
|
luaL_error( L, "adc_read failed" );
|
|
lua_pushinteger( L, ( lua_Integer ) sample );
|
|
return 1;
|
|
}
|
|
|
|
// Lua: read_hall_sensor( )
|
|
static int read_hall_sensor( lua_State *L )
|
|
{
|
|
int sample = platform_adc_read_hall_sensor( );
|
|
lua_pushinteger( L, ( lua_Integer ) sample );
|
|
return 1;
|
|
}
|
|
|
|
// Module function map
|
|
static const LUA_REG_TYPE adc_map[] =
|
|
{
|
|
{ LSTRKEY( "setwidth" ), LFUNCVAL( adc_set_width ) },
|
|
{ LSTRKEY( "setup" ), LFUNCVAL( adc_setup ) },
|
|
{ LSTRKEY( "read" ), LFUNCVAL( adc_read ) },
|
|
{ LSTRKEY( "read_hall_sensor" ), LFUNCVAL( read_hall_sensor ) },
|
|
{ LSTRKEY( "ATTEN_0db" ), LNUMVAL( PLATFORM_ADC_ATTEN_0db ) },
|
|
{ LSTRKEY( "ATTEN_2_5db" ), LNUMVAL( PLATFORM_ADC_ATTEN_2_5db ) },
|
|
{ LSTRKEY( "ATTEN_6db" ), LNUMVAL( PLATFORM_ADC_ATTEN_6db ) },
|
|
{ LSTRKEY( "ATTEN_11db" ), LNUMVAL( PLATFORM_ADC_ATTEN_11db ) },
|
|
{ LSTRKEY( "ADC1" ), LNUMVAL( 1 ) },
|
|
{ LNILKEY, LNILVAL }
|
|
};
|
|
|
|
NODEMCU_MODULE(ADC, "adc", adc_map, NULL);
|