嵌入式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。缺少的字庫也自己打包進去即可。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章