纸飞机调试助手文档 ComAssistant Docs

Lua数据处理

Lua数据处理

Lua介绍

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

功能介绍

纸飞机通过集成Lua脚本,可以在不损失性能的情况下,更灵活的让用户自定义的处理数据。这在曲线滤波、文本数据更换(增删改)等场合下特别适用。同时,经过笔者评估,Lua的学习并不难,因为大多数情况下,我们还是只用到了常见的那几个Lua语法。 把本文喂给AI,可让AI直接帮你写Lua脚本

功能演示

功能使能

我们可通过以下路径打开Lua功能 在这里插入图片描述 打开后,纸飞机会自动在软件目录下新建:

  • 快速教程文件:lua_quick_manual.html
  • Lua脚本文件:ComAssistant.lua
  • 脚本日志文件:ComAssistant.lua.log
  • 在这里插入图片描述 在这里插入图片描述

    快速教程文件

    Luau快速教程文件是笔者为方便降低大家学习Lua的门槛,亲自整理的一个文档,只覆盖了常用的Lua语法,大约只需要翻6次屏幕就可以阅读完,用浏览器即可打开,这里不再展开赘述

    在这里插入图片描述

    Lua脚本文件

    该文件是整个功能的核心,里面主要是内置了一些预定义函数和预定义变量,纸飞机会调用这些函数或变量。

    --[[
    
        # Lua教程:纸飞机在软件目录下释放了简短的入门教程文件,您也可以访问https://www.runoob.com/lua/lua-tutorial.html进行系统的学习
        # 所有下划线__开头的变量会被纸飞机调用:
            不可修改/删除名字和值;
        # 所有下划线__开头的函数会被纸飞机调用:
            不可修改、删除函数名称;
            不可修改参数顺序、个数
            不可修改返回值类型、个数;
            但你可修改函数内部的实现,也可以添加自定义的函数
        # 任何语法错误会导致脚本整体失效,请认真检查您的脚本
        # 本文件的编码格式约定为UTF-8,使用LF作为换行符
    --]]
    
    -- 脚本文件版本
    __version = 1
    
    -- 函数功能:初始化函数,打开Lua功能后会执行一次
    function __init()
        io.output(io.open('ComAssistant.lua.log', 'a'))   -- 重定向输出到文件,用于调试
    end
    
    -- 函数功能:反初始化函数,关闭Lua功能后会执行一次
    function __deinit()
        io.close()
    end
    
    -- 函数功能:该函数打印调试日志,日志会被打印到ComAssistant.lua.log文件
    function print(data)
        io.write(os.date("%Y-%m-%d %H:%M:%S ") .. data .. "\n")
        io.flush()
    end
    
    -- 函数功能:该函数实现自动应答功能
    -- 输入参数data:纸飞机收到的原始数据
    -- 返回参数:当ackData不为空时,纸飞机会将它发送出去
    function __auto_reply(data)
        ackData = ""
        return ackData
    end
    
    -- 函数功能:该函数对发送的数据进行处理
    -- 输入参数data:纸飞机计划发送出去的数据
    -- 返回参数:纸飞机即将发送出去的数据
    function __before_send(data)
        return data
    end
    
    -- 函数功能:该函数对即将显示到绘图器上的数据进行处理
    -- 输入参数window: 当前数据所属的窗口,类型为字符串
    -- 输入参数data:即将显示到绘图器窗口的曲线数据,类型为数组
    -- 返回参数:纸飞机将使用返回的数据显示到绘图器上,类型为数组
    function __before_plotter_window(window, data)
        return data
    end
    
    -- 函数功能:该函数对即将显示到频谱仪上的数据进行处理
    -- 输入参数window: 当前数据所属的窗口,类型为字符串
    -- 输入参数data:即将显示到频谱仪的曲线数据,类型为数组
    -- 返回参数:纸飞机将使用返回的数据进行FFT运算,类型为数组
    function __before_fft_window(window, data)
        return data
    end
    
    -- 函数功能:该函数对即将显示到过滤器上的数据进行处理
    -- 输入参数window: 当前数据所属的窗口,类型为字符串
    -- 输入参数data:即将显示到过滤器窗口的一行数据,类型为字符串
    -- 返回参数:纸飞机将使用返回的数据显示到过滤器上,类型为字符串
    function __before_filter_window(window, data)
        return data
    end
    
    -- 函数功能:该函数对即将显示到数据分窗器上的数据进行处理
    -- 输入参数window: 当前数据所属的窗口,类型为字符串
    -- 输入参数data:即将显示到数据分窗窗口的一行数据,类型为字符串
    -- 返回参数:纸飞机将使用返回的数据显示到数据分窗器上,类型为字符串
    function __before_spliter_window(window, data)
        return data
    end

    用户需要理解这段代码,但简单来讲,其实就是对应的功能在显示前额外执行了一个钩子函数,方便我们对数据进行预处理,大概数据流图如下:

    数据接收 ---> 数据提取/解析 ---> lua脚本 ---> 数据显示

    假设我们要对[[04-filter数据过滤]]的数据增加前缀HELLO_PREFIX:,那么其对应的脚本钩子函数为

    __before_filter_window,我们可以重新修改其实现

    -- 函数功能:该函数对即将显示到过滤器上的数据进行处理
    -- 输入参数window: 当前数据所属的窗口,类型为字符串
    -- 输入参数data:即将显示到过滤器窗口的一行数据,类型为字符串
    -- 返回参数:纸飞机将使用返回的数据显示到过滤器上,类型为字符串
    function __before_filter_window(window, data)
    	-- 使用两个点..来进行字符串拼接
        return "HELLO_PREFIX:"..data
    end

    那么Lua处理效果如下

    在这里插入图片描述 在这里插入图片描述

    可以看到,main窗口收到的数据是没有HELLO_PREFIX:信息的,但是filter窗口会多出这么一个数据,正是Lua脚本在起作用。