menuconfig界面二次开发--Apple的学习笔记

一,前言

之前我已经研究过飞控PX4用的rtos是nuttx,它主要是基于单片机的,而且stm32f4是主推的,所以我学习了下,那么今天开始我要学习的是menuconfig配置界面,关于linux通过界面很快可以生成.config配置文件。网上我以前看过menuconfig命令到最后展开就是用ncurses图形库生成的程序运行的。那么nuttx是单片机的,也做成了menuconfig的界面,我很好奇,也想定制一个。

二,kconfig-frontends

nuttx中这个menuconfig的界面程序名字叫kconfig-frontends,它其实也是copy linux开源代码然后移植的。由于我也想定制自己的menuconfig,所以简单的学习了下ncurses库的API,然后安装了kconfig-frontends源码及编译,目的是先用起来,然后基于源码进行二次开发。
找到了kconfig-frontends在window上的设置后,能自己基于MinGW编译kconfig-frontends.exe。简单说下步骤

  1. 安装MinGW
    运行mingw-get-setup.exe后仅选mingw32-base和mingw32-gcc-g++。添加环境变量C:\MinGW\bin
  2. 安装GnuWin32
    2.1 运行GetGnuWin32-0.6.3.exe后,路径选xxx\GetGnuWin32。
    2.2 双击download.bat,一路回车
    2.3 双击install.bat,一路回车
    2.4 最后我将GetGnuWin32文件夹copy到了c盘。添加环境变量C:\GetGnuWin32\gnuwin32\bin,C:\GetGnuWin32\gnuwin32\include和C:\GetGnuWin32\gnuwin32\lib
  3. 编译
    源码我实际上一开始先从github下载过了,直接创建build文件夹进行cmake配置和make编译了。一把通过。
git clone http://github.com/uvc-ingenieure/kconfig-frontends
cd kconfig-frontends
mkdir build
cd build
cmake -G "MinGW Makefiles" ..
make

三,运行界面

image.png

image.png

生成的.config正确

#
# Automatically generated file; DO NOT EDIT.
# RootMenu
#
CONFIG_EXPERIMENTAL=y
# CONFIG_DEFAULT_SMALL is not set
CONFIG_DEFAULT_TASK_STACKSIZE=1024
# CONFIG_HOST_LINUX is not set
# CONFIG_HOST_MACOS is not set
CONFIG_HOST_WINDOWS=y
# CONFIG_HOST_OTHER is not set
# CONFIG_TOOLCHAIN_WINDOWS is not set

四,问题解决及轻度定制

我先要学习了curses的API,所以找到了\libs\pdcurses-3.4\demos文件夹中中curses的demo code,pdcurses-3.4里的win32文件夹中的README告我我如何编译这些demo,方法为make -f mingwin32.mak WIDE=Y。然后就生成了8个exe。这些demo中我主要看的是和边框设置相关的,所以选中了testcurs.c看了,然后基本上知道box边框的绘制API。
通过搜索关键API后,我定位到原因是F:\kconfig-frontends-master\libs\lxdialog\util.c中的draw_box函数,里面就是一点一点绘制边框。但是源码编译后在win10上是乱码,所以我尝试了用wborder和box设置,同样是乱码。最后进入wborder函数灵感就来了,发现了关键的乱码原因应该就是底层解析。解决方案如下,字符l到n改成了"*"。

/* VT100-compatible symbols -- box chars */
#if 0
#define ACS_ULCORNER  ACS_PICK('l', '+')
#define ACS_LLCORNER  ACS_PICK('m', '+')
#define ACS_URCORNER  ACS_PICK('k', '+')
#define ACS_LRCORNER  ACS_PICK('j', '+')
#define ACS_RTEE      ACS_PICK('u', '+')
#define ACS_LTEE      ACS_PICK('t', '+')
#define ACS_BTEE      ACS_PICK('v', '+')
#define ACS_TTEE      ACS_PICK('w', '+')
#define ACS_HLINE     ACS_PICK('q', '-')
#define ACS_VLINE     ACS_PICK('x', '|')
#define ACS_PLUS      ACS_PICK('n', '+')
#else  /* modify by apple for fix code display */
#define ACS_ULCORNER  ACS_PICK('*', '+')
#define ACS_LLCORNER  ACS_PICK('*', '+')
#define ACS_URCORNER  ACS_PICK('*', '+')
#define ACS_LRCORNER  ACS_PICK('*', '+')
#define ACS_RTEE      ACS_PICK('*', '+')
#define ACS_LTEE      ACS_PICK('*', '+')
#define ACS_BTEE      ACS_PICK('*', '+')
#define ACS_TTEE      ACS_PICK('*', '+')
#define ACS_HLINE     ACS_PICK('*', '-')
#define ACS_VLINE     ACS_PICK('*', '|')
#define ACS_PLUS      ACS_PICK('*', '+')
#endif

然后我又搜索RootMenu关键字改成了AppleCai_Menu。最后定制效果如下


image.png

五,总结

简单menuconfig自定义界面二次开发完成,我没跑偏,curses是个古老的GUI库。一个是好奇基于单片机怎么也能做出个menuconfig,现在这么看,我也可以做一个了,而且还是基于win10的,很实用呀,将来配合stm32自制的makefile就可以用界面配置了,感觉很高级!
将来分享给别人用的时候,不需要编译的话,运行exe只依赖3个dll即可。比如设置环境变量路径为C:\GetGnuWin32\gnuwin32\bin,只要copy3个dll[libintl3.dll,regex2,libiconv2.dll]到bin文件路径即可。
另外的用途就是谁要学习Kconfig语法,就可以用这个win10上的小工具啦~

你可能感兴趣的:(menuconfig界面二次开发--Apple的学习笔记)