CanFestival是一个CANOpen开源C库,其自带对象字典编辑器,但是得用Python2来打开,其界面库用的也是老版本的wxPython,使用起来非常不方便。
本人复制了一份对象字典编辑器源码并为其单独创建了一个仓库,然后经过辛苦的修改,终于可以使用Python3和最新的wxPython来运行了。
代码在https://github.com/happybruce/objdictgen
一 下载源码
执行下面语句下载源码,
git clone https://github.com/happybruce/objdictgen.git
二 运行对象字典编辑器
Windows下
运行前要先安装wxPython,
pip install -U wxpython
安装完后就可以运行了,本人用的wxPython版本是4.2.1
python objdictedit.py
运行后显示如下,
点击File可以新建对象字典工程或者打开已有的对象字典工程,也可以导入EDS文件,
Linux下
本人用的Debian11,直接用pip安装wxPython会安装失败,这是因为在Linux下wxPython需要依赖GTK库,这个库专门用来做显示用的。
还好wxPython已经帮用户考虑到了这个问题,它们提供了带GTK的wxPython版本,打开https://extras.wxpython.org/wxPython4/extras/linux/,显示如下,
然后点击gtk3,里面会显示对应各种Linux版本的目录,这里选择debian11,如果是Ubuntu就选择Ubuntu的版本目录,
进入后,点击最新版本的whl文件进行下载,
下载完后拷贝到Linux下,然后执行下面命令进行安装,
pip install wxPython-4.2.1-cp39-cp39-linux_x86_64.whl
注意:这里的cp39是指Python的版本,Debian11里默认安装的Python3版本是3.9
安装完毕后,再去运行objdictedit.py就可以打开界面了,
三 主要做的工作
这里总结一下主要做的适配工作以及采用的方法
- 把Python2的代码格式转为Python3,使用Python3自带的2to3.py工具来实现转换(位于Python安装目录下的Tools\scripts里)
- 把使用到的老版wxPython API替换成新版的API,这里主要是针对新版已经不再支持的API,需要到wxPython官网API文档中逐个查找
- 把加载和保存对象字典文件的库使用Python自带的pickle库代替,原本使用的是Gnosis库,但是这个库非常老而且只能Python2使用。经过本人阅读源码,原作者使用Gnosis主要是为了序列化和反序列化,所以这里使用pickle代替。
- 对生成对象字典.c/h文件的python代码进行一定的优化
- 删除翻译库的使用,源码里自带英文翻中文功能,会根据操作系统的语言自动翻译界面的英文,但是翻译出来的中文不忍直视,索性还是删了。
这里要注意:pickle和Gnosis生成和加载的文件格式不一样,前者是二进制字节序列,后者是xml,所以源码里自带的examples目录下的对象字典文件是无法导入的,不过使用pickle新生成的对象字典文件是可以导入的,pickle比Gnosis更加高效。
四 后续工作
后续会在Linux下使用CanFestival源码结合对象字典编辑器生成的源码来搭建工程进行进一步的验证,如果一切OK,再往STM32上移植。