lua文件

#!/usr/bin/lua

function getparam_normal(io,port,value)
    return io..','..port..','..value
end

function getparam_X(io,port,value,str1,str2)
    return (io==0 and "IN" or "OUT")..'.'..str1..'.'..port..'.'..str2..','..value
end


transformation_list=
{
    [1]={k3name="~01@DETAIL-TIMING",param=function(io,port,value) return '6,'..io..','..port..','..value end },
    [2]={k3name="~01@DETAIL-TIMING",param=function(io,port,value) return '7,'..io..','..port..','..value end },
    [3]={k3name="~01@DETAIL-TIMING",param=function(io,port,value) return '8,'..io..','..port..','..value end },
    [4]={k3name="~01@DETAIL-TIMING",param=function(io,port,value) return '9,'..io..','..port..','..value end },
    [5]={k3name="~01@DETAIL-TIMING",param=function(io,port,value) return '10,'..io..','..port..','..value end },
    [6]={k3name="~01@EXT-PCMODE",param=getparam_normal},
    [7]={k3name="~01@EXT-COMPENSATION",param=getparam_normal },
    [8]={k3name="~01@HDCP-MOD",    param=getparam_normal},
    [9]={
                k3name="~01@SIG-TYPE",
                param=function(io,port,value) 
                        if value==1 then 
                                value=2 
                        elseif value==2 then 
                                value=1
                        else
                                value=7 --0.auto
                        end

                        return io..','..port..','..value end 
        },
    [10]={k3name="~01@EXT-VID-CS",param=getparam_normal},
    [11]={k3name="~01@EXT-VID-DC",param=getparam_normal},
    [12]={k3name="~01@VID-PATTERN",param=getparam_normal},

    [97]={k3name="~01@AUD-DELAY",param=getparam_normal},
    [98]={k3name="~01@X-AUD-EMB",param=function(io,port,value) return (io==0 and "IN" or "OUT")..'.HDMI.'..port..'.AUDIO.1,'..value end },
}


--[[
    151~...use key [subfunc_id:boardtype:io]
--]]

    --[18]=VGAA

    transformation_list['152:18:0']={k3name="~01@X-VGA-OFFSET",param=function(io,port,value) return (io==0 and "IN" or "OUT")..'.HDMI.'..port..'.VIDEO.1,'..value end };
    transformation_list['152:18:1']={k3name="~01@X-VGA-SYNC",  param=function(io,port,value) return (io==0 and "IN" or "OUT")..'.HDMI.'..port..'.VIDEO.1,'..value end };


    transformation_list['158:41:*']={k3name="~01@X-AUD-EMB",param=function(io,port,value) return (io==0 and "IN" or "OUT")..'.ANALOG_AUDIO.'..port..'.AUDIO.1,'..value end };
    transformation_list['158:42:*']=transformation_list['158:41:*'];
    transformation_list['158:46:*']=transformation_list['158:41:*'];

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

function transformation_liga_to_k3000(subfunc,boardtype,io,port,value)
        local key =subfunc
        if key>150
        then
                key=subfunc..':'..boardtype..':'..io
                if transformation_list[key]==nil
                then
                        key=subfunc..':'..boardtype..':*'
                end
        end
        if transformation_list[key]==nil
        then
                return nil
        end
        return transformation_list[key].k3name.." "..transformation_list[key].param(io,port,value)
end


--[[
-- test
for key=1 ,256,1 
do
        for btype=0,(key>150 and 256 or 0),1
        do
                local res;

            res=transformation_liga_to_k3000(key,btype,0,1,0)
                if res~=nil
                then 
                        print('index=['..key..':'..btype..']',res)
                end

            res=transformation_liga_to_k3000(key,btype,1,1,0)
                if res~=nil
                then 
                        print('index=['..key..':'..btype..']',res)
                end

            res=transformation_liga_to_k3000(key,btype,0,1,1)
                if res~=nil
                then 
                        print('index=['..key..':'..btype..']',res)
                end

            res=transformation_liga_to_k3000(key,btype,1,1,125)
                if res~=nil
                then 
                        print('index=['..key..':'..btype..']',res)
                end
        end
end
--]]

C接口


int lig_prtl_liga80_2_k3_init(void)
{
    m_lua_handle = luaL_newstate();
    luaopen_base(m_lua_handle); //
    luaopen_table(m_lua_handle); //
    luaopen_package(m_lua_handle); //
    luaopen_io(m_lua_handle); //
    luaopen_string(m_lua_handle); //
    luaL_openlibs(m_lua_handle); //打开以上所有的lib

    if (luaL_dofile(m_lua_handle,LUA_CONFIG_FILE))
    {
        printf("Failed to run lua code %s\n",LUA_CONFIG_FILE);
        return -1;
    }

    return 0;

}
int lig_prtl_liga80_2_k3_destroy(void)
{
    lua_close(m_lua_handle);
    return 0;
}

int lig_prtl_liga80_2_k3(OBJ_LIG_A_FUNCID * funcinfo,char * buff,size_t bufflen)
{

    //funcinfo->func_id+funcinfo->type=buff;


    //luaL_dostring 等同于luaL_loadstring() || lua_pcall()
    //注意:在能够调用Lua函数之前必须执行Lua脚本,否则在后面实际调用Lua函数时会报错,
    //错误信息为:"attempt to call a nil value."


    //function transformation_liga_to_k3000(subfunc,boardtype,io,port,value)
    lua_getglobal(m_lua_handle,LUA_GLOBAL_GET_K3);

    lua_pushinteger(m_lua_handle,funcinfo->func_id);
    lua_pushinteger(m_lua_handle,funcinfo->type);
    lua_pushinteger(m_lua_handle,funcinfo->io);
    lua_pushinteger(m_lua_handle,funcinfo->port);
    lua_pushinteger(m_lua_handle,funcinfo->func_value);

    //下面的第二个参数表示带调用的lua函数存在两个参数。
    //第三个参数表示即使带调用的函数存在多个返回值,那么也只有一个在执行后会被压入栈中。
    //lua_pcall调用后,虚拟栈中的函数参数和函数名均被弹出。
    if (lua_pcall(m_lua_handle,5,1,0))
    {
        printf("error is %s.\n",lua_tostring(m_lua_handle,-1));
        return -1;
    }
    //此时结果已经被压入栈中。
    if (!lua_isstring(m_lua_handle,-1))
    {
        printf("function must return a string.\n");
        return -1;
    }
    char * ret = lua_tostring(m_lua_handle,-1);

    lua_pop(m_lua_handle,-1); //弹出返回值。

    if(bufflen>=strlen(ret)+1)
        strncpy(buff,ret,strlen(ret)+1);
    else
        return -2;

    return strlen(buff);
}

results matching ""

    No results matching ""