From ed31980cb89579b381cf4b9647e7755ea59beba1 Mon Sep 17 00:00:00 2001 From: James Snyder Date: Sat, 4 Jul 2009 17:10:41 +0000 Subject: [PATCH] Forgot to commit this. --- src/modules/can.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/modules/can.c diff --git a/src/modules/can.c b/src/modules/can.c new file mode 100644 index 00000000..5e8483b1 --- /dev/null +++ b/src/modules/can.c @@ -0,0 +1,84 @@ +// Module for interfacing Lua code with a Controller Area Network (CAN) + +#include "lua.h" +#include "lualib.h" +#include "lauxlib.h" +#include "platform.h" +#include "auxmods.h" +#include "lrotable.h" + +// Lua: setup( id, clock ) +static int can_setup( lua_State* L ) +{ + unsigned id; + u32 clock, res; + + id = luaL_checkinteger( L, 1 ); + MOD_CHECK_ID( can, id ); + clock = luaL_checkinteger( L, 2 ); + res = platform_can_setup( id, clock ); + lua_pushinteger( L, res ); + return 1; +} + +// Lua: send( id, canid, canidtype, message ) +static int can_send( lua_State* L ) +{ + size_t len; + int id, canid, idtype; + const char *data; + + id = luaL_checkinteger( L, 1 ); + MOD_CHECK_ID( can, id ); + canid = luaL_checkinteger( L, 2 ); + idtype = luaL_checkinteger( L, 3 ); + data = luaL_checklstring (L, 4, &len); + if ( len > PLATFORM_CAN_MAXLEN ) + return luaL_error( L, "message exceeds max length" ); + + platform_can_send( id, canid, idtype, len, ( const u8 * )data ); + + return 0; +} + +// Lua: canid, canidtype, message = recv( id ) +static int can_recv( lua_State* L ) +{ + u8 len; + int id; + u32 canid; + u8 idtype, data[ 8 ]; + + id = luaL_checkinteger( L, 1 ); + MOD_CHECK_ID( can, id ); + + platform_can_recv( id, &canid, &idtype, &len, data ); + lua_pushinteger( L, canid ); + lua_pushinteger( L, idtype ); + lua_pushlstring (L, ( const char * )data, ( size_t )len); + + return 3; +} + + +// Module function map +#define MIN_OPT_LEVEL 2 +#include "lrodefs.h" +const LUA_REG_TYPE can_map[] = +{ + { LSTRKEY( "setup" ), LFUNCVAL( can_setup ) }, + { LSTRKEY( "send" ), LFUNCVAL( can_send ) }, + { LSTRKEY( "recv" ), LFUNCVAL( can_recv ) }, + { LNILKEY, LNILVAL } +}; + +LUALIB_API int luaopen_can( lua_State *L ) +{ +#if LUA_OPTIMIZE_MEMORY > 0 + return 0; +#else // #if LUA_OPTIMIZE_MEMORY > 0 + luaL_register( L, AUXLIB_CAN, can_map ); + + return 1; +#endif // #if LUA_OPTIMIZE_MEMORY > 0 +}