Skip to content

Commit eb5827c

Browse files
committed
feat: native as lib
1 parent 6e25d44 commit eb5827c

39 files changed

+8806
-551
lines changed

.vscode/settings.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
{
2-
"tailwindCSS.classFunctions": ["cva", "cx"]
2+
"tailwindCSS.classFunctions": [
3+
"cva",
4+
"cx"
5+
],
6+
"cmake.sourceDirectory": "/workspaces/ymjk/jetkvm-native"
37
}

Makefile

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ GO_LDFLAGS := \
2020
-X $(PROMETHEUS_TAG).Revision=$(REVISION) \
2121
-X $(KVM_PKG_NAME).builtTimestamp=$(BUILDTS)
2222

23-
GO_ARGS := GOOS=linux GOARCH=arm GOARM=7
23+
GO_ARGS := GOOS=linux GOARCH=arm GOARM=7 ARCHFLAGS="-arch arm"
2424
# if BUILDKIT_PATH exists, use buildkit to build
2525
ifneq ($(wildcard $(BUILDKIT_PATH)),)
2626
GO_ARGS := $(GO_ARGS) \
27-
CGO_CFLAGS="-I$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/include -I$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/sysroot/usr/include" \
28-
CGO_LDFLAGS="-L$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/lib -L$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/sysroot/usr/lib" \
27+
CGO_CFLAGS="-Ijetkvm-native -Ijetkvm-native/ui -I$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/include -I$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/sysroot/usr/include" \
28+
CGO_LDFLAGS="-Ljetkvm-native/build -Ljetkvm-native/build/lib -L$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/lib -L$(BUILDKIT_PATH)/$(BUILDKIT_FLAVOR)/sysroot/usr/lib -ljknative -lrockit -lrockchip_mpp -lrga -lpthread -lm -llvgl" \
2929
CC="$(BUILDKIT_PATH)/bin/$(BUILDKIT_FLAVOR)-gcc" \
3030
LD="$(BUILDKIT_PATH)/bin/$(BUILDKIT_FLAVOR)-ld" \
3131
CGO_ENABLED=1
@@ -37,15 +37,16 @@ BIN_DIR := $(shell pwd)/bin
3737

3838
TEST_DIRS := $(shell find . -name "*_test.go" -type f -exec dirname {} \; | sort -u)
3939

40-
hash_resource:
41-
@shasum -a 256 resource/jetkvm_native | cut -d ' ' -f 1 > resource/jetkvm_native.sha256
40+
build_native:
41+
@echo "Building native..."
42+
cd internal/native/cgo && ./ui_index.gen.sh && ./build.sh
4243

43-
build_dev: hash_resource
44+
build_dev: build_native
4445
@echo "Building..."
4546
$(GO_CMD) build \
4647
-ldflags="$(GO_LDFLAGS) -X $(KVM_PKG_NAME).builtAppVersion=$(VERSION_DEV)" \
4748
$(GO_RELEASE_BUILD_ARGS) \
48-
-o $(BIN_DIR)/jetkvm_app cmd/main.go
49+
-o $(BIN_DIR)/jetkvm_app -v cmd/main.go
4950

5051
build_afpacket:
5152
@echo "Building..."

display.go

Lines changed: 30 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import (
99
"time"
1010
)
1111

12-
var currentScreen = "ui_Boot_Screen"
12+
var currentScreen = "boot_screen"
1313
var backlightState = 0 // 0 - NORMAL, 1 - DIMMED, 2 - OFF
1414

1515
var (
@@ -22,120 +22,55 @@ const (
2222
backlightControlClass string = "/sys/class/backlight/backlight/brightness"
2323
)
2424

25-
func switchToScreen(screen string) {
26-
_, err := CallCtrlAction("lv_scr_load", map[string]interface{}{"obj": screen})
27-
if err != nil {
28-
displayLogger.Warn().Err(err).Str("screen", screen).Msg("failed to switch to screen")
29-
return
30-
}
31-
currentScreen = screen
32-
}
33-
34-
var displayedTexts = make(map[string]string)
35-
36-
func lvObjSetState(objName string, state string) (*CtrlResponse, error) {
37-
return CallCtrlAction("lv_obj_set_state", map[string]interface{}{"obj": objName, "state": state})
38-
}
39-
40-
func lvObjAddFlag(objName string, flag string) (*CtrlResponse, error) {
41-
return CallCtrlAction("lv_obj_add_flag", map[string]interface{}{"obj": objName, "flag": flag})
42-
}
43-
44-
func lvObjClearFlag(objName string, flag string) (*CtrlResponse, error) {
45-
return CallCtrlAction("lv_obj_clear_flag", map[string]interface{}{"obj": objName, "flag": flag})
46-
}
47-
48-
func lvObjHide(objName string) (*CtrlResponse, error) {
49-
return lvObjAddFlag(objName, "LV_OBJ_FLAG_HIDDEN")
50-
}
51-
52-
func lvObjShow(objName string) (*CtrlResponse, error) {
53-
return lvObjClearFlag(objName, "LV_OBJ_FLAG_HIDDEN")
54-
}
55-
56-
func lvObjSetOpacity(objName string, opacity int) (*CtrlResponse, error) { // nolint:unused
57-
return CallCtrlAction("lv_obj_set_style_opa_layered", map[string]interface{}{"obj": objName, "opa": opacity})
58-
}
59-
60-
func lvObjFadeIn(objName string, duration uint32) (*CtrlResponse, error) {
61-
return CallCtrlAction("lv_obj_fade_in", map[string]interface{}{"obj": objName, "time": duration})
62-
}
63-
64-
func lvObjFadeOut(objName string, duration uint32) (*CtrlResponse, error) {
65-
return CallCtrlAction("lv_obj_fade_out", map[string]interface{}{"obj": objName, "time": duration})
66-
}
67-
68-
func lvLabelSetText(objName string, text string) (*CtrlResponse, error) {
69-
return CallCtrlAction("lv_label_set_text", map[string]interface{}{"obj": objName, "text": text})
70-
}
71-
72-
func lvImgSetSrc(objName string, src string) (*CtrlResponse, error) {
73-
return CallCtrlAction("lv_img_set_src", map[string]interface{}{"obj": objName, "src": src})
74-
}
75-
76-
func lvDispSetRotation(rotation string) (*CtrlResponse, error) {
77-
return CallCtrlAction("lv_disp_set_rotation", map[string]interface{}{"rotation": rotation})
78-
}
79-
80-
func updateLabelIfChanged(objName string, newText string) {
81-
if newText != "" && newText != displayedTexts[objName] {
82-
_, _ = lvLabelSetText(objName, newText)
83-
displayedTexts[objName] = newText
84-
}
85-
}
86-
87-
func switchToScreenIfDifferent(screenName string) {
88-
if currentScreen != screenName {
89-
displayLogger.Info().Str("from", currentScreen).Str("to", screenName).Msg("switching screen")
90-
switchToScreen(screenName)
91-
}
92-
}
93-
9425
var (
9526
cloudBlinkLock sync.Mutex = sync.Mutex{}
9627
cloudBlinkStopped bool
9728
cloudBlinkTicker *time.Ticker
9829
)
9930

10031
func updateDisplay() {
101-
updateLabelIfChanged("ui_Home_Content_Ip", networkState.IPv4String())
32+
nativeInstance.UpdateLabelIfChanged("home_info_ipv4_addr", networkState.IPv4String())
33+
nativeInstance.UpdateLabelIfChanged("home_info_ipv6_addr", networkState.IPv6String())
34+
35+
nativeInstance.UpdateLabelIfChanged("home_info_mac_addr", networkState.MACString())
36+
10237
if usbState == "configured" {
103-
updateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Connected")
104-
_, _ = lvObjSetState("ui_Home_Footer_Usb_Status_Label", "LV_STATE_DEFAULT")
38+
nativeInstance.UpdateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Connected")
39+
_, _ = nativeInstance.ObjSetState("ui_Home_Footer_Usb_Status_Label", "LV_STATE_DEFAULT")
10540
} else {
106-
updateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Disconnected")
107-
_, _ = lvObjSetState("ui_Home_Footer_Usb_Status_Label", "LV_STATE_USER_2")
41+
nativeInstance.UpdateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Disconnected")
42+
_, _ = nativeInstance.ObjSetState("ui_Home_Footer_Usb_Status_Label", "LV_STATE_USER_2")
10843
}
10944
if lastVideoState.Ready {
110-
updateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Connected")
111-
_, _ = lvObjSetState("ui_Home_Footer_Hdmi_Status_Label", "LV_STATE_DEFAULT")
45+
nativeInstance.UpdateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Connected")
46+
_, _ = nativeInstance.ObjSetState("ui_Home_Footer_Hdmi_Status_Label", "LV_STATE_DEFAULT")
11247
} else {
113-
updateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Disconnected")
114-
_, _ = lvObjSetState("ui_Home_Footer_Hdmi_Status_Label", "LV_STATE_USER_2")
48+
nativeInstance.UpdateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Disconnected")
49+
_, _ = nativeInstance.ObjSetState("ui_Home_Footer_Hdmi_Status_Label", "LV_STATE_USER_2")
11550
}
116-
updateLabelIfChanged("ui_Home_Header_Cloud_Status_Label", fmt.Sprintf("%d active", actionSessions))
51+
nativeInstance.UpdateLabelIfChanged("ui_Home_Header_Cloud_Status_Label", fmt.Sprintf("%d active", actionSessions))
11752

11853
if networkState.IsUp() {
119-
switchToScreenIfDifferent("ui_Home_Screen")
54+
nativeInstance.SwitchToScreenIf("home_screen", []string{"no_network_screen", "boot_screen"})
12055
} else {
121-
switchToScreenIfDifferent("ui_No_Network_Screen")
56+
nativeInstance.SwitchToScreenIf("no_network_screen", []string{"home_screen", "boot_screen"})
12257
}
12358

12459
if cloudConnectionState == CloudConnectionStateNotConfigured {
125-
_, _ = lvObjHide("ui_Home_Header_Cloud_Status_Icon")
60+
_, _ = nativeInstance.ObjHide("ui_Home_Header_Cloud_Status_Icon")
12661
} else {
127-
_, _ = lvObjShow("ui_Home_Header_Cloud_Status_Icon")
62+
_, _ = nativeInstance.ObjShow("ui_Home_Header_Cloud_Status_Icon")
12863
}
12964

13065
switch cloudConnectionState {
13166
case CloudConnectionStateDisconnected:
132-
_, _ = lvImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud_disconnected.png")
67+
_, _ = nativeInstance.ImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud_disconnected.png")
13368
stopCloudBlink()
13469
case CloudConnectionStateConnecting:
135-
_, _ = lvImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud.png")
70+
_, _ = nativeInstance.ImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud.png")
13671
startCloudBlink()
13772
case CloudConnectionStateConnected:
138-
_, _ = lvImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud.png")
73+
_, _ = nativeInstance.ImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud.png")
13974
stopCloudBlink()
14075
}
14176
}
@@ -159,9 +94,9 @@ func startCloudBlink() {
15994
if cloudConnectionState != CloudConnectionStateConnecting {
16095
continue
16196
}
162-
_, _ = lvObjFadeOut("ui_Home_Header_Cloud_Status_Icon", 1000)
97+
_, _ = nativeInstance.ObjFadeOut("ui_Home_Header_Cloud_Status_Icon", 1000)
16398
time.Sleep(1000 * time.Millisecond)
164-
_, _ = lvObjFadeIn("ui_Home_Header_Cloud_Status_Icon", 1000)
99+
_, _ = nativeInstance.ObjFadeIn("ui_Home_Header_Cloud_Status_Icon", 1000)
165100
time.Sleep(1000 * time.Millisecond)
166101
}
167102
}()
@@ -205,20 +140,20 @@ func waitCtrlAndRequestDisplayUpdate(shouldWakeDisplay bool) {
205140
waitDisplayUpdate.Lock()
206141
defer waitDisplayUpdate.Unlock()
207142

208-
waitCtrlClientConnected()
143+
// nativeInstance.WaitCtrlClientConnected()
209144
requestDisplayUpdate(shouldWakeDisplay)
210145
}
211146

212147
func updateStaticContents() {
213148
//contents that never change
214-
updateLabelIfChanged("ui_Home_Content_Mac", networkState.MACString())
149+
nativeInstance.UpdateLabelIfChanged("ui_Home_Content_Mac", networkState.MACString())
215150
systemVersion, appVersion, err := GetLocalVersion()
216151
if err == nil {
217-
updateLabelIfChanged("ui_About_Content_Operating_System_Version_ContentLabel", systemVersion.String())
218-
updateLabelIfChanged("ui_About_Content_App_Version_Content_Label", appVersion.String())
152+
nativeInstance.UpdateLabelIfChanged("ui_About_Content_Operating_System_Version_ContentLabel", systemVersion.String())
153+
nativeInstance.UpdateLabelIfChanged("ui_About_Content_App_Version_Content_Label", appVersion.String())
219154
}
220155

221-
updateLabelIfChanged("ui_Status_Content_Device_Id_Content_Label", GetDeviceID())
156+
nativeInstance.UpdateLabelIfChanged("ui_Status_Content_Device_Id_Content_Label", GetDeviceID())
222157
}
223158

224159
// setDisplayBrightness sets /sys/class/backlight/backlight/brightness to alter
@@ -379,10 +314,9 @@ func startBacklightTickers() {
379314

380315
func initDisplay() {
381316
go func() {
382-
waitCtrlClientConnected()
383317
displayLogger.Info().Msg("setting initial display contents")
384318
time.Sleep(500 * time.Millisecond)
385-
_, _ = lvDispSetRotation(config.DisplayRotation)
319+
_, _ = nativeInstance.DispSetRotation(config.DisplayRotation)
386320
updateStaticContents()
387321
displayInited = true
388322
displayLogger.Info().Msg("display inited")

internal/native/cgo/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
build
2+
ui_index.c

internal/native/cgo/CMakeLists.txt

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
cmake_minimum_required(VERSION 3.14)
2+
include(FetchContent)
3+
4+
project(jknative LANGUAGES C CXX)
5+
6+
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
7+
8+
# Specify path to own LVGL config header
9+
set(
10+
LV_CONF_PATH
11+
${CMAKE_CURRENT_SOURCE_DIR}/lv_conf.h
12+
CACHE STRING "" FORCE
13+
)
14+
15+
set(
16+
LV_DRIVERS_PUBLIC_HEADERS
17+
${CMAKE_CURRENT_SOURCE_DIR}/lv_drv_conf.h
18+
CACHE STRING "" FORCE
19+
)
20+
21+
# Rockchip SDK paths
22+
set(RK_SDK_BASE "/opt/jetkvm-native-buildkit")
23+
set(RK_MEDIA_OUTPUT "${RK_SDK_BASE}/media/out")
24+
set(RK_MEDIA_INCLUDE_PATH "${RK_MEDIA_OUTPUT}/include")
25+
set(RK_APP_MEDIA_LIBS_PATH "${RK_MEDIA_OUTPUT}/lib")
26+
27+
# Fetch LVGL from GitHub
28+
FetchContent_Declare(
29+
lvgl
30+
GIT_REPOSITORY https://github.com/lvgl/lvgl.git
31+
GIT_TAG v8.3.11
32+
)
33+
FetchContent_MakeAvailable(lvgl)
34+
35+
# Fetch LVGL drivers from GitHub
36+
FetchContent_Declare(
37+
lv_drivers
38+
GIT_REPOSITORY https://github.com/lvgl/lv_drivers.git
39+
GIT_TAG v8.3.0
40+
)
41+
FetchContent_MakeAvailable(lv_drivers)
42+
43+
# Get source files, excluding CMake generated files
44+
file(GLOB_RECURSE sources CONFIGURE_DEPENDS "*.c")
45+
list(FILTER sources EXCLUDE REGEX "CMakeFiles.*CompilerId.*\\.c$")
46+
47+
add_library(jknative STATIC ${sources} ${CMAKE_CURRENT_SOURCE_DIR}/jknative.h)
48+
49+
# Include directories
50+
target_include_directories(jknative PRIVATE
51+
${RK_MEDIA_INCLUDE_PATH}
52+
${RK_MEDIA_INCLUDE_PATH}/libdrm
53+
${CMAKE_CURRENT_SOURCE_DIR}
54+
${CMAKE_CURRENT_SOURCE_DIR}/ui
55+
)
56+
57+
# Set library search path
58+
target_link_directories(jknative PRIVATE ${RK_APP_MEDIA_LIBS_PATH})
59+
60+
61+
target_link_libraries(jknative PRIVATE
62+
lvgl::lvgl
63+
lvgl::drivers
64+
pthread
65+
rockit
66+
rockchip_mpp
67+
rga
68+
m
69+
)

internal/native/cgo/build.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/bash
2+
3+
CMAKE_TOOLCHAIN_FILE=/opt/jetkvm-native-buildkit/rv1106-jetkvm-v2.cmake
4+
CLEAN_ALL=${CLEAN_ALL:-0}
5+
6+
if [ "$CLEAN_ALL" -eq 1 ]; then
7+
find . -name build -exec rm -r {} +
8+
fi
9+
10+
set -x
11+
VERBOSE=1 cmake -B build \
12+
-DCMAKE_SYSTEM_PROCESSOR=armv7l \
13+
-DCMAKE_SYSTEM_NAME=Linux \
14+
-DCMAKE_CROSSCOMPILING=1 \
15+
-DCMAKE_TOOLCHAIN_FILE=$CMAKE_TOOLCHAIN_FILE \
16+
-DSKIP_GLIBC_NAMES=ON \
17+
18+
cmake --build build

0 commit comments

Comments
 (0)