嵌入式linux之go语言开发(九)关于嵌入式GUI

简介: 嵌入式linux之go语言开发(九)关于嵌入式GUI

go语言没有官方的GUI。


其实怎么说呢,这一块儿的需求也不怎么迫切。毕竟每个语言都有自己擅长的领域。


在电脑上开发界面还是C#或QT或java的swing来的快。没必要非用go吧,更多的是在电脑上基于web的BS架构的模式。


在嵌入式上呢?笔者考察了好多GUI,目前没有发现太满意的。


如QT,LittlevGL,Guilite,awtk,Nuklear等。


这些GUI怎么说呢?要么太庞大,要么依赖一大堆,要么环境就要倒弄很久。有的需要花不少精力去投入学习成本。


但是对我们的嵌入式应用来说,界面不多,有的界面很简单啊,不需要花太多精力在界面上面。用这些就显得划不来了。


有最基础的画点,画线,画圆,图片展示就够了。


UCGUI这个GUI,搞嵌入式的基本都知道吧,比较常见,开源,且使用简单。单片机上都能用。


因此,我把UCGUI和汉字字库做了个go语言的封装。


使用起来也很简单。想要啥界面,自己画呗,反正又不多,界面也不花哨。


有人说都自己实现太花时间了吧,比如选用其他的如ZLG的awtk,或者QT,或者littlegl,或者GTK等。但是我要说,不花这时间花那时间,其实最终花的时间都差不多,甚至还没有自己画的来的快。但若界面很复杂花哨,那还是考虑其他GUI吧,自己画太难了。


简单快速的实现功能就是最好。你倒腾那些GUI就不花时间了吗。除非实在是实现不了或得不偿失了,可以考虑。


ucGUI也有诸如BUTTON,窗口之类的界面控件。但是结合我们的使用情况来说,那些几乎是摆设没有用到。


还是用的显示汉字,图片,点,线的功能多。


我对ucGUI的调用,使用go做了个封装。然后使用起来很简单,有多简单?


例如:


func main() {
  fmt.Println("Hello Go")
  GUI_Init()
  GUI_SetBkColor(0x954816)
  GUI_Clear()
  GUI_SetFont(&C.GUI_FontHZ20x20)
  GUI_DispStringAt("PRICE", 60, 156)
  GUI_DispStringAt("票价", 60, 120)
  name := ""
  fmt.Println("over!press any key to continue: ")
  fmt.Scanln(&name)
}


封装ucGUI的过程如下:


package drivers
/*
#cgo CFLAGS: -Iinclude/header
#cgo LDFLAGS: -Llib -lucgui -lm
#include <stdlib.h>
#include "GUI.h"
//extern const GUI_FONT GUI_FontHZ12;
extern const GUI_FONT GUI_FontHZ20x20;
extern const GUI_FONT GUI_FontHZ32x32;
extern const GUI_FONT GUI_FontHZ76x76;
extern void GUIcache2fb(void);
extern int setGUIcache(unsigned char sta);
extern unsigned char getGUIcache(void);
*/
import "C"
import "unsafe"
import (
  "github.com/axgle/mahonia"
)
var (
  //GUI_FontHZ12    C.GUI_FONT
  GUI_FontHZ20x20 *C.GUI_FONT
  GUI_FontHZ32x32 *C.GUI_FONT
  GUI_FontHZ76x76 *C.GUI_FONT
  GUI_FONT_8_ASCII *C.GUI_FONT
  GUI_FONT_8_1        *C.GUI_FONT
  GUI_FONT_10S_ASCII  *C.GUI_FONT
  GUI_FONT_10S_1      *C.GUI_FONT
  GUI_FONT_10_ASCII   *C.GUI_FONT
  GUI_FONT_10_1       *C.GUI_FONT
  GUI_FONT_13_ASCII   *C.GUI_FONT
  GUI_FONT_13_1       *C.GUI_FONT
  GUI_FONT_13B_ASCII  *C.GUI_FONT
  GUI_FONT_13B_1      *C.GUI_FONT
  GUI_FONT_13H_ASCII  *C.GUI_FONT
  GUI_FONT_13H_1      *C.GUI_FONT
  GUI_FONT_13HB_ASCII *C.GUI_FONT
  GUI_FONT_13HB_1     *C.GUI_FONT
  GUI_FONT_16_ASCII   *C.GUI_FONT
  GUI_FONT_16_1       *C.GUI_FONT
  GUI_FONT_16_HK      *C.GUI_FONT
  GUI_FONT_16_1HK     *C.GUI_FONT
  GUI_FONT_16B_ASCII  *C.GUI_FONT
  GUI_FONT_16B_1      *C.GUI_FONT
  // GUI_FONT_20_ASCII   *C.GUI_FONT
  // GUI_FONT_20_1       *C.GUI_FONT
  // GUI_FONT_20B_ASCII  *C.GUI_FONT
  // GUI_FONT_20B_1      *C.GUI_FONT
  GUI_FONT_24_ASCII  *C.GUI_FONT
  GUI_FONT_24_1      *C.GUI_FONT
  GUI_FONT_24B_ASCII *C.GUI_FONT
  GUI_FONT_24B_1     *C.GUI_FONT
  GUI_FONT_32_ASCII  *C.GUI_FONT
  GUI_FONT_32_1      *C.GUI_FONT
  GUI_FONT_32B_ASCII *C.GUI_FONT
  GUI_FONT_32B_1     *C.GUI_FONT
  GUI_FontD48 *C.GUI_FONT
  Rect C.GUI_RECT
)
const (
  //================
  GUI_TEXTMODE_NORMAL C.int = C.GUI_TEXTMODE_NORMAL
  GUI_TEXTMODE_XOR    C.int = C.GUI_TEXTMODE_XOR
  GUI_TEXTMODE_TRANS  C.int = C.GUI_TEXTMODE_TRANS
  GUI_TEXTMODE_REV    C.int = C.GUI_TEXTMODE_REV
  GUI_TM_NORMAL       C.int = C.GUI_TM_NORMAL
  GUI_TM_XOR          C.int = C.GUI_TM_XOR
  GUI_TM_TRANS        C.int = C.GUI_TM_TRANS
  GUI_TM_REV          C.int = C.GUI_TM_REV
  //===================
  /* Text alignment flags, horizontal */
  GUI_TA_HORIZONTAL C.int = C.GUI_TA_HORIZONTAL
  GUI_TA_LEFT       C.int = C.GUI_TA_LEFT
  GUI_TA_RIGHT      C.int = C.GUI_TA_RIGHT
  GUI_TA_CENTER     C.int = C.GUI_TA_CENTER
  GUI_TA_HCENTER    C.int = C.GUI_TA_CENTER /* easier to remember :-)  */
  /* Text alignment flags, vertical */
  GUI_TA_VERTICAL C.int = C.GUI_TA_VERTICAL
  GUI_TA_TOP      C.int = C.GUI_TA_TOP
  GUI_TA_BOTTOM   C.int = C.GUI_TA_BOTTOM
  GUI_TA_BASELINE C.int = C.GUI_TA_BASELINE
  GUI_TA_VCENTER  C.int = C.GUI_TA_VCENTER
  //===================
  GUI_BLUE         C.uint = C.GUI_BLUE
  GUI_GREEN        C.uint = C.GUI_GREEN
  GUI_RED          C.uint = C.GUI_RED
  GUI_CYAN         C.uint = C.GUI_CYAN
  GUI_MAGENTA      C.uint = C.GUI_MAGENTA
  GUI_YELLOW       C.uint = C.GUI_YELLOW
  GUI_LIGHTBLUE    C.uint = C.GUI_LIGHTBLUE
  GUI_LIGHTGREEN   C.uint = C.GUI_LIGHTGREEN
  GUI_LIGHTRED     C.uint = C.GUI_LIGHTRED
  GUI_LIGHTCYAN    C.uint = C.GUI_LIGHTCYAN
  GUI_LIGHTMAGENTA C.uint = C.GUI_LIGHTMAGENTA
  GUI_LIGHTYELLOW  C.uint = C.GUI_LIGHTYELLOW
  GUI_DARKBLUE     C.uint = C.GUI_DARKBLUE
  GUI_DARKGREEN    C.uint = C.GUI_DARKGREEN
  GUI_DARKRED      C.uint = C.GUI_DARKRED
  GUI_DARKCYAN     C.uint = C.GUI_DARKCYAN
  GUI_DARKMAGENTA  C.uint = C.GUI_DARKMAGENTA
  GUI_DARKYELLOW   C.uint = C.GUI_DARKYELLOW
  GUI_WHITE        C.uint = C.GUI_WHITE
  GUI_LIGHTGRAY    C.uint = C.GUI_LIGHTGRAY
  GUI_GRAY         C.uint = C.GUI_GRAY
  GUI_DARKGRAY     C.uint = C.GUI_DARKGRAY
  GUI_BLACK        C.uint = C.GUI_BLACK
  GUI_BROWN        C.uint = C.GUI_BROWN
  GUI_ORANGE       C.uint = C.GUI_ORANGE
  GUI_TRANSPARENT  C.uint = C.GUI_TRANSPARENT
  TOP_BAR_COLOR C.uint = 0x501f08
  GUI_IdleColor C.uint = 0x954816
)
func init() {
  //GUI_FontHZ12 = C.GUI_FontHZ12
  GUI_FontHZ20x20 = &C.GUI_FontHZ20x20
  GUI_FontHZ32x32 = &C.GUI_FontHZ32x32
  GUI_FontHZ76x76 = &C.GUI_FontHZ76x76
  GUI_FONT_8_1 = &C.GUI_Font8_1
  GUI_FONT_10S_ASCII = &C.GUI_Font10S_ASCII
  GUI_FONT_10S_1 = &C.GUI_Font10S_1
  GUI_FONT_10_ASCII = &C.GUI_Font10_ASCII
  GUI_FONT_10_1 = &C.GUI_Font10_1
  GUI_FONT_13_ASCII = &C.GUI_Font13_ASCII
  GUI_FONT_13_1 = &C.GUI_Font13_1
  GUI_FONT_13B_ASCII = &C.GUI_Font13B_ASCII
  GUI_FONT_13B_1 = &C.GUI_Font13B_1
  GUI_FONT_13H_ASCII = &C.GUI_Font13H_ASCII
  GUI_FONT_13H_1 = &C.GUI_Font13H_1
  GUI_FONT_13HB_ASCII = &C.GUI_Font13HB_ASCII
  GUI_FONT_13HB_1 = &C.GUI_Font13HB_1
  GUI_FONT_16_ASCII = &C.GUI_Font16_ASCII
  GUI_FONT_16_1 = &C.GUI_Font16_1
  GUI_FONT_16_HK = &C.GUI_Font16_HK
  GUI_FONT_16_1HK = &C.GUI_Font16_1HK
  GUI_FONT_16B_ASCII = &C.GUI_Font16B_ASCII
  GUI_FONT_16B_1 = &C.GUI_Font16B_1
  //GUI_FONT_20_ASCII   = &C.GUI_Font20_ASCII
  //GUI_FONT_20_1       = &C.GUI_Font20_1
  //GUI_FONT_20B_ASCII  = &C.GUI_Font20B_ASCII
  //GUI_FONT_20B_1      = &C.GUI_Font20B_1
  GUI_FONT_24_ASCII = &C.GUI_Font24_ASCII
  GUI_FONT_24_1 = &C.GUI_Font24_1
  GUI_FONT_24B_ASCII = &C.GUI_Font24B_ASCII
  GUI_FONT_24B_1 = &C.GUI_Font24B_1
  GUI_FONT_32_ASCII = &C.GUI_Font32_ASCII
  GUI_FONT_32_1 = &C.GUI_Font32_1
  GUI_FONT_32B_ASCII = &C.GUI_Font32B_ASCII
  GUI_FONT_32B_1 = &C.GUI_Font32B_1
  GUI_FontD48 = &C.GUI_FontD48
}
func GUI_Init() {
  C.GUI_Init()
}
func GUI_Clear() {
  C.GUI_Clear()
}
func GUI_SetColor(val C.uint) {
  C.GUI_SetColor(C.ulong(val))
}
func GUI_SetBkColor(val C.uint) {
  C.GUI_SetBkColor(C.ulong(val))
}
func GUI_SetFont(val *C.struct_GUI_FONT) {
  C.GUI_SetFont(val)
}
//注:go中的编码为utf-8,GUI显示汉字使用的GB2312
func GUI_DispStringAt(str string, x, y int) {
  enc := mahonia.NewEncoder("gbk")
  gbk := enc.ConvertString(str)
  cs := C.CString(gbk)
  defer C.free(unsafe.Pointer(cs))
  C.GUI_DispStringAt(cs, C.int(x), C.int(y))
}
func GUI_DispStringHCenterAt(str string, x, y int) {
  enc := mahonia.NewEncoder("gbk")
  gbk := enc.ConvertString(str)
  cs := C.CString(gbk)
  defer C.free(unsafe.Pointer(cs))
  C.GUI_DispStringHCenterAt(cs, C.int(x), C.int(y))
}
func GUI_FillRect(x0, y0, x1, y1 int) {
  C.GUI_FillRect(C.int(x0), C.int(y0), C.int(x1), C.int(y1))
}
func SetRectAera(x0, y0, x1, y1 int) C.GUI_RECT {
  var rClient C.GUI_RECT
  rClient.x0 = C.short(x0)
  rClient.y0 = C.short(y0)
  rClient.x1 = C.short(x1)
  rClient.y1 = C.short(y1)
  return rClient
}
func GUI_DispStringInRect(str string, rect *C.GUI_RECT, align C.int) {
  enc := mahonia.NewEncoder("gbk")
  gbk := enc.ConvertString(str)
  cs := C.CString(gbk)
  defer C.free(unsafe.Pointer(cs))
  C.GUI_DispStringInRect(cs, rect, align)
}
func GUI_SetTextMode(mode C.int) {
  C.GUI_SetTextMode(mode)
}
func GUIcache2fb() {
  C.GUIcache2fb()
}
func SetGUIcache(sta int) {
  C.setGUIcache(C.uchar(sta))
}
func GetGUIcache() int {
  return int(C.getGUIcache())
}
/*
func main() {
  fmt.Println("Hello Go")
  GUI_Init()
  GUI_SetBkColor(0x954816)
  GUI_Clear()
  GUI_SetFont(&C.GUI_FontHZ20x20)
  GUI_DispStringAt("PRICE", 60, 156)
  GUI_DispStringAt("票价", 60, 120)
  name := ""
  fmt.Println("over!press any key to continue: ")
  fmt.Scanln(&name)
}
*/


最后再说下,如何使用呢?其他人要用的话,肯定跑不起来,因为根本找不到ucgui.so这个库文件。


那么这个库文件哪来的呢?


根据自己的平台和需求,交叉编译ucgui的源码吧,编译为ucgui.so。缺少的字库也自己打包进去即可。

相关文章
|
15天前
|
开发框架 Go 计算机视觉
纯Go语言开发人脸检测、瞳孔/眼睛定位与面部特征检测插件-助力GoFly快速开发框架
开发纯go插件的原因是因为目前 Go 生态系统中几乎所有现有的人脸检测解决方案都是纯粹绑定到一些 C/C++ 库,如 OpenCV 或 dlib,但通过 cgo 调用 C 程序会引入巨大的延迟,并在性能方面产生显著的权衡。此外,在许多情况下,在各种平台上安装 OpenCV 是很麻烦的。使用纯Go开发的插件不仅在开发时方便,在项目部署和项目维护也能省很多时间精力。
|
1月前
|
Go 数据安全/隐私保护 开发者
Go语言开发
【10月更文挑战第26天】Go语言开发
38 3
|
1月前
|
Java 程序员 Go
Go语言的开发
【10月更文挑战第25天】Go语言的开发
32 3
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
108 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
3月前
|
存储 Linux 开发工具
如何进行Linux内核开发【ChatGPT】
如何进行Linux内核开发【ChatGPT】
|
4月前
|
Java Linux API
Linux设备驱动开发详解2
Linux设备驱动开发详解
52 6
|
4月前
|
消息中间件 算法 Unix
Linux设备驱动开发详解1
Linux设备驱动开发详解
56 5
|
4月前
|
NoSQL Linux C语言
嵌入式GDB调试Linux C程序或交叉编译(开发板)
【8月更文挑战第24天】本文档介绍了如何在嵌入式环境下使用GDB调试Linux C程序及进行交叉编译。调试步骤包括:编译程序时加入`-g`选项以生成调试信息;启动GDB并加载程序;设置断点;运行程序至断点;单步执行代码;查看变量值;继续执行或退出GDB。对于交叉编译,需安装对应架构的交叉编译工具链,配置编译环境,使用工具链编译程序,并将程序传输到开发板进行调试。过程中可能遇到工具链不匹配等问题,需针对性解决。
124 3
|
4月前
|
传感器 人工智能 网络协议
:嵌入式 Linux 及其用途
【8月更文挑战第24天】
212 0
|
29天前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
73 8