开源改变世界!!

连接新插件的框图是什么? #43

推推 grbl 2年前 (2023-02-08) 154次浏览
关闭
5ocworkshop 开了这个issue 2021 年 7 月 25 日 · 13条评论
关闭

连接新插件的框图是什么?#43

5ocworkshop 开了这个issue 2021 年 7 月 25 日 · 13条评论

评论

连接新插件的框图是什么? #43

我已经使用 my_plugin 示例以及 fans.c 作为参考编写了一个基本插件。

在状态变化时,它应该根据状态将辅助输出引脚设置为高电平或低电平。

我在 my_machine.h 中添加了一个启用定义,并且在 driver.c 中添加了一行以包含我的插件的头文件。在头文件中,我调用了 init 函数。该插件似乎从未被调用过。

有没有办法通过串行控制台查看加载了哪些插件及其版本(我从 fan.c 复制了版本报告)。我相当确定插件没有被触发,但我无法确定原因。

任何指导将不胜感激。

谢谢。

连接新插件的框图是什么? #43
贡献者

有没有办法通过串行控制台查看加载了哪些插件及其版本(我从 fan.c 复制了版本报告)。我相当确定插件没有被触发,但我无法确定原因。

$I 将列出所有加载的插件。您可以将插件名称和版本信息放入 onReportOptions()

连接新插件的框图是什么? #43
作者

嗯,我认为 $I 就是这种情况。不仅我的插件没有出现,而且我也没有看到 odomoeter 出现。不久将以全新的眼光再次审视它。

连接新插件的框图是什么? #43
贡献者

在头文件中,我调用了 init 函数。

根据您包含头文件的位置,它可能永远不会被调用。它应该在driver.cdriver_init()中的函数末尾调用。如果插件供您私人使用,您可以命名 init 函数,然后它会自动调用 – 根本不需要修改任何下载的文件。my_plugin_init()

不仅我的插件没有出现,而且我也没有看到 odomoeter 出现。

您正在为哪个驱动程序开发?SAM3X8E(Arduino 到期)?
请注意,如果闪存用于设置存储、需要 EEPROM 或 FRAM,则里程计插件将拒绝自行安装。

如果不使用调试器,开发有时会有些棘手。如果将调试(或启动)消息写入 USB 流,它们可能会丢失,因为在写入消息之前可能无法连接到 USB 流。一些驱动程序可能会缓冲它们直到建立连接,而其他驱动程序则不会。在使用消息进行调试时,我更喜欢使用 UART 流,因为它可以随时连接。

连接新插件的框图是什么? #43
作者

根据您包含头文件的位置,它可能永远不会被调用。它应该在driver.cdriver_init()中的函数末尾调用。如果插件供您私人使用,您可以命名 init 函数,然后它会自动调用 – 根本不需要修改任何下载的文件。my_plugin_init()

我会重命名它并尝试这样做。

您正在为哪个驱动程序开发?SAM3X8E(Arduino 到期)?

这是新的基于 Teensy 4.1 的 GrblHAL2000 开发板。

在使用消息进行调试时,我更喜欢使用 UART 流,因为它可以随时连接。

优秀的点。我将在 UART 上设置一个 Pi,这样我就可以通过这种方式查看调试消息。

连接新插件的框图是什么? #43
作者

随处可用的各种文件之间是否存在图形关系?

直观地理解这些关系会很好。

我正在寻找 driver_init() 函数,因为我看到多个地方都在谈论启用插件,但还没有找到对 my_plugin_init() 的引用。

我知道在结构上的大量思考和工作已经融入了所有这一切,而且潜力似乎是巨大的——所以感谢你在这方面所做的所有工作。我将尽我所能尝试记录为我之后的新人连接插件的过程。

连接新插件的框图是什么? #43
作者
5oc工作坊 评论了 2021 年 7 月 26 日  

我相信我现在了解链条:

drivers.c(在开发板的顶级目录中)包含函数 driver_init(),后者又包含 grbl/plugins_init.h。

对 my_plugin_init() 的调用包含在 grbl/plugins_init.h 中

默认模板,为了避免示例被调用,在示例初始化结构前面有一个“x”,将被删除以启用它。

所以大概合适的路径是使用这种结构将插件开发为私有插件,并且当它全部工作时讨论一旦提交它将如何以及在何处连接?

现在就去试试。

连接新插件的框图是什么? #43
作者

在构建中我看到了这个:

src\my_plugin.c:225:8: 警告:返回类型默认为 ‘int’ [-Wimplicit-int]
static my_plugin_init ()
^
src\my_plugin.c:225:8: 警告:’my_plugin_init’
src\的类型冲突my_plugin.c:225:8: 错误:’my_plugin_init’ 的静态声明遵循非静态声明
在包含自 src\grbl/settings.h:29:0 的文件中,
来自 src\grbl/core_handlers.h:30,
来自 src \grbl/hal.h:30,
来自 src\grbl/driver_opts.h:30,
来自 src\driver.h:37,
来自 src\my_plugin.c:12:
src\grbl/plugins.h:188:13:注意:’my_plugin_init’ 的先前声明在这里
extern void my_plugin_init (void) attribute ((weak));
^
src\my_plugin.c:196:13: 警告:’output_warning’ 已定义但未使用 [-Wunused-function]
static void output_warning (uint_fast16_t state)
^
src\my_plugin.c:202:13: 警告:’output_port’ 已定义但未使用 [-Wunused-function]
static void output_port (uint_fast16_t state)
^
src\my_plugin.c:225:8: warning: ‘my_plugin_init’ 已定义但未使用 [-Wunused-function]
static my_plugin_init ()

连接新插件的框图是什么? #43
作者

我的初始化函数如下所示:

static my_plugin_init ()
{
    if(hal.port.num_digital_out >= 3) {

        hal.port.num_digital_out -= 3;
        base_port = hal.port.num_digital_out;

        if(hal.port.set_pin_description) {
            uint32_t idx = 0;
            do {
                hal.port.set_pin_description(true, true, base_port + idx, rgb[idx]);
                if (idx == 0) { red_port = idx; } else
                if (idx == 1) { blue_port = idx; } else
                if (idx == 3) { green_port = idx; }
                idx++;                
            } while(idx <= 2);
        }

        // memcpy(&user_mcode, &hal.user_mcode, sizeof(user_mcode_ptrs_t));  // Commeneted as may be used to allow mcodes in future

        // hal.user_mcode.check = userMCodeCheck;
        // hal.user_mcode.validate = userMCodeValidate;
        // hal.user_mcode.execute = userMCodeExecute;

        driver_reset = hal.driver_reset;
        hal.driver_reset = driverReset;

        on_report_options = grbl.on_report_options;
        grbl.on_report_options = onReportOptions;

        on_state_change = grbl.on_state_change;         // Subscribe to the state changed event by saving away the original
        grbl.on_state_change = onStateChanged;          // function pointer and adding ours to the chain.

        //on_program_completed = grbl.on_program_completed;
        //grbl.on_program_completed = onProgramCompleted;

    } else
        protocol_enqueue_rt_command(warning_msg);
}
连接新插件的框图是什么? #43
作者

目录树中的什么地方my_plugin.c意味着生活?

我看到下面有一个占位符grbl/my_plugin.c 。您是否打算将其替换为您构建的模板代码,该代码位于其上方的 board 目录的根目录中?

连接新插件的框图是什么? #43
作者

我将我的代码移开并重命名了我的 init 函数。

iMXRT1062/grblHAL_Teensy4/src/my_plugin.c从 my_plugin_unit 函数的前面取出并删除了 x,构建并刷新了图像。$I 不报告插件已加载。

因为有一个名为 my_plugin.c 的附加文件位于core/my_plugin.c 我尝试将该文件从驱动程序目录移动到核心目录,构建和闪烁。这在使用 $I 时也没有产生预期的报告消息。

激活/挂钩未修改的 my_plugin.c 代码作为起点的正确方法是什么?

连接新插件的框图是什么? #43
作者

好的,我终于有我的插件报告加载。我想我绕着圈子试图追查这个。

似乎可以安全地忽略关于 plugins_init.h 冲突的第 188 行的警告?

如果我用模板/我的代码替换 my_plugin.c文件grbl/my_plugin.c并确认my_plugin.c命名了 init 函数my_plugin_init()(因此删除示例前面的“x”)我可以编译警告并运行代码。

连接新插件的框图是什么? #43
贡献者

my_plugin.c 在目录树中的哪个位置?

随心所欲,但最佳做法是将代码添加到与其他插件所在位置相同的子目录中。

由于在 core/my_plugin.c 中有一个名为 my_plugin.c 的附加文件,因此我尝试将该文件从驱动程序目录移动到核心目录,进行构建和闪烁。

不要那样做,它的定义很弱,会被你的实现覆盖。

似乎可以安全地忽略关于 plugins_init.h 冲突的第 188 行的警告?

是的,但很容易修复。没有声明返回类型的 C 函数默认为int,将其设置为void并且警告消失。

连接新插件的框图是什么? #43
作者

是的,但很容易修复。没有声明返回类型的 C 函数默认为int,将其设置为void并且警告消失。

会做的,谢谢。关闭问题,因为它已完全解决。