mirror of https://github.com/jetkvm/kvm.git
feat(display): show cloud connection status
This commit is contained in:
parent
f712cb1719
commit
edba5c94f5
16
cloud.go
16
cloud.go
|
@ -140,10 +140,22 @@ var (
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
cloudConnectionAlive bool
|
||||||
|
cloudConnectionAliveLock = &sync.Mutex{}
|
||||||
|
|
||||||
cloudDisconnectChan chan error
|
cloudDisconnectChan chan error
|
||||||
cloudDisconnectLock = &sync.Mutex{}
|
cloudDisconnectLock = &sync.Mutex{}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func setCloudConnectionAlive(alive bool) {
|
||||||
|
cloudConnectionAliveLock.Lock()
|
||||||
|
defer cloudConnectionAliveLock.Unlock()
|
||||||
|
|
||||||
|
cloudConnectionAlive = alive
|
||||||
|
|
||||||
|
go waitCtrlAndRequestDisplayUpdate()
|
||||||
|
}
|
||||||
|
|
||||||
func wsResetMetrics(established bool, sourceType string, source string) {
|
func wsResetMetrics(established bool, sourceType string, source string) {
|
||||||
metricConnectionLastPingTimestamp.WithLabelValues(sourceType, source).Set(-1)
|
metricConnectionLastPingTimestamp.WithLabelValues(sourceType, source).Set(-1)
|
||||||
metricConnectionLastPingDuration.WithLabelValues(sourceType, source).Set(-1)
|
metricConnectionLastPingDuration.WithLabelValues(sourceType, source).Set(-1)
|
||||||
|
@ -307,6 +319,8 @@ func runWebsocketClient() error {
|
||||||
metricConnectionTotalPingReceivedCount.WithLabelValues("cloud", wsURL.Host).Inc()
|
metricConnectionTotalPingReceivedCount.WithLabelValues("cloud", wsURL.Host).Inc()
|
||||||
metricConnectionLastPingReceivedTimestamp.WithLabelValues("cloud", wsURL.Host).SetToCurrentTime()
|
metricConnectionLastPingReceivedTimestamp.WithLabelValues("cloud", wsURL.Host).SetToCurrentTime()
|
||||||
|
|
||||||
|
setCloudConnectionAlive(true)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
@ -336,6 +350,8 @@ func runWebsocketClient() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if errors.Is(err, context.Canceled) {
|
if errors.Is(err, context.Canceled) {
|
||||||
cloudLogger.Info().Msg("websocket connection canceled")
|
cloudLogger.Info().Msg("websocket connection canceled")
|
||||||
|
setCloudConnectionAlive(false)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return err
|
return err
|
||||||
|
|
60
display.go
60
display.go
|
@ -33,9 +33,37 @@ func switchToScreen(screen string) {
|
||||||
|
|
||||||
var displayedTexts = make(map[string]string)
|
var displayedTexts = make(map[string]string)
|
||||||
|
|
||||||
|
func lvObjSetState(objName string, state string) (*CtrlResponse, error) {
|
||||||
|
return CallCtrlAction("lv_obj_set_state", map[string]interface{}{"obj": objName, "state": state})
|
||||||
|
}
|
||||||
|
|
||||||
|
func lvObjAddFlag(objName string, flag string) (*CtrlResponse, error) {
|
||||||
|
return CallCtrlAction("lv_obj_add_flag", map[string]interface{}{"obj": objName, "flag": flag})
|
||||||
|
}
|
||||||
|
|
||||||
|
func lvObjClearFlag(objName string, flag string) (*CtrlResponse, error) {
|
||||||
|
return CallCtrlAction("lv_obj_clear_flag", map[string]interface{}{"obj": objName, "flag": flag})
|
||||||
|
}
|
||||||
|
|
||||||
|
func lvObjHide(objName string) (*CtrlResponse, error) {
|
||||||
|
return lvObjAddFlag(objName, "LV_OBJ_FLAG_HIDDEN")
|
||||||
|
}
|
||||||
|
|
||||||
|
func lvObjShow(objName string) (*CtrlResponse, error) {
|
||||||
|
return lvObjClearFlag(objName, "LV_OBJ_FLAG_HIDDEN")
|
||||||
|
}
|
||||||
|
|
||||||
|
func lvLabelSetText(objName string, text string) (*CtrlResponse, error) {
|
||||||
|
return CallCtrlAction("lv_label_set_text", map[string]interface{}{"obj": objName, "text": text})
|
||||||
|
}
|
||||||
|
|
||||||
|
func lvImgSetSrc(objName string, src string) (*CtrlResponse, error) {
|
||||||
|
return CallCtrlAction("lv_img_set_src", map[string]interface{}{"obj": objName, "src": src})
|
||||||
|
}
|
||||||
|
|
||||||
func updateLabelIfChanged(objName string, newText string) {
|
func updateLabelIfChanged(objName string, newText string) {
|
||||||
if newText != "" && newText != displayedTexts[objName] {
|
if newText != "" && newText != displayedTexts[objName] {
|
||||||
_, _ = CallCtrlAction("lv_label_set_text", map[string]interface{}{"obj": objName, "text": newText})
|
_, _ = lvLabelSetText(objName, newText)
|
||||||
displayedTexts[objName] = newText
|
displayedTexts[objName] = newText
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,29 +79,43 @@ func updateDisplay() {
|
||||||
updateLabelIfChanged("ui_Home_Content_Ip", networkState.IPv4String())
|
updateLabelIfChanged("ui_Home_Content_Ip", networkState.IPv4String())
|
||||||
if usbState == "configured" {
|
if usbState == "configured" {
|
||||||
updateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Connected")
|
updateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Connected")
|
||||||
_, _ = CallCtrlAction("lv_obj_set_state", map[string]interface{}{"obj": "ui_Home_Footer_Usb_Status_Label", "state": "LV_STATE_DEFAULT"})
|
_, _ = lvObjSetState("ui_Home_Footer_Usb_Status_Label", "LV_STATE_DEFAULT")
|
||||||
} else {
|
} else {
|
||||||
updateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Disconnected")
|
updateLabelIfChanged("ui_Home_Footer_Usb_Status_Label", "Disconnected")
|
||||||
_, _ = CallCtrlAction("lv_obj_set_state", map[string]interface{}{"obj": "ui_Home_Footer_Usb_Status_Label", "state": "LV_STATE_USER_2"})
|
_, _ = lvObjSetState("ui_Home_Footer_Usb_Status_Label", "LV_STATE_USER_2")
|
||||||
}
|
}
|
||||||
if lastVideoState.Ready {
|
if lastVideoState.Ready {
|
||||||
updateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Connected")
|
updateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Connected")
|
||||||
_, _ = CallCtrlAction("lv_obj_set_state", map[string]interface{}{"obj": "ui_Home_Footer_Hdmi_Status_Label", "state": "LV_STATE_DEFAULT"})
|
_, _ = lvObjSetState("ui_Home_Footer_Hdmi_Status_Label", "LV_STATE_DEFAULT")
|
||||||
} else {
|
} else {
|
||||||
updateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Disconnected")
|
updateLabelIfChanged("ui_Home_Footer_Hdmi_Status_Label", "Disconnected")
|
||||||
_, _ = CallCtrlAction("lv_obj_set_state", map[string]interface{}{"obj": "ui_Home_Footer_Hdmi_Status_Label", "state": "LV_STATE_USER_2"})
|
_, _ = lvObjSetState("ui_Home_Footer_Hdmi_Status_Label", "LV_STATE_USER_2")
|
||||||
}
|
}
|
||||||
updateLabelIfChanged("ui_Home_Header_Cloud_Status_Label", fmt.Sprintf("%d active", actionSessions))
|
updateLabelIfChanged("ui_Home_Header_Cloud_Status_Label", fmt.Sprintf("%d active", actionSessions))
|
||||||
|
|
||||||
if networkState.IsUp() {
|
if networkState.IsUp() {
|
||||||
switchToScreenIfDifferent("ui_Home_Screen")
|
switchToScreenIfDifferent("ui_Home_Screen")
|
||||||
} else {
|
} else {
|
||||||
switchToScreenIfDifferent("ui_No_Network_Screen")
|
switchToScreenIfDifferent("ui_No_Network_Screen")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if config.CloudToken == "" || config.CloudURL == "" {
|
||||||
|
lvObjHide("ui_Home_Header_Cloud_Status_Icon")
|
||||||
|
} else {
|
||||||
|
lvObjShow("ui_Home_Header_Cloud_Status_Icon")
|
||||||
|
// TODO: blink the icon if establishing connection
|
||||||
|
if cloudConnectionAlive {
|
||||||
|
_, _ = lvImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud.png")
|
||||||
|
} else {
|
||||||
|
_, _ = lvImgSetSrc("ui_Home_Header_Cloud_Status_Icon", "cloud_disconnected.png")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
displayInited = false
|
displayInited = false
|
||||||
displayUpdateLock = sync.Mutex{}
|
displayUpdateLock = sync.Mutex{}
|
||||||
|
waitDisplayUpdate = sync.Mutex{}
|
||||||
)
|
)
|
||||||
|
|
||||||
func requestDisplayUpdate() {
|
func requestDisplayUpdate() {
|
||||||
|
@ -92,6 +134,14 @@ func requestDisplayUpdate() {
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func waitCtrlAndRequestDisplayUpdate() {
|
||||||
|
waitDisplayUpdate.Lock()
|
||||||
|
defer waitDisplayUpdate.Unlock()
|
||||||
|
|
||||||
|
waitCtrlClientConnected()
|
||||||
|
requestDisplayUpdate()
|
||||||
|
}
|
||||||
|
|
||||||
func updateStaticContents() {
|
func updateStaticContents() {
|
||||||
//contents that never change
|
//contents that never change
|
||||||
updateLabelIfChanged("ui_Home_Content_Mac", networkState.MACString())
|
updateLabelIfChanged("ui_Home_Content_Mac", networkState.MACString())
|
||||||
|
|
|
@ -325,7 +325,6 @@ func initNetwork() {
|
||||||
}
|
}
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
waitCtrlClientConnected()
|
|
||||||
ticker := time.NewTicker(1 * time.Second)
|
ticker := time.NewTicker(1 * time.Second)
|
||||||
defer ticker.Stop()
|
defer ticker.Stop()
|
||||||
|
|
||||||
|
@ -340,8 +339,4 @@ func initNetwork() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
err := startMDNS()
|
|
||||||
if err != nil {
|
|
||||||
logger.Warn().Err(err).Msg("failed to run mDNS")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
|
@ -1 +1 @@
|
||||||
c0803a9185298398eff9a925de69bd0ca882cd5983b989a45b748648146475c6
|
b556ac0d6f38518f20dcf212ba65fe97981aa169ae418c68b2cbb155447affda
|
||||||
|
|
7
web.go
7
web.go
|
@ -242,7 +242,12 @@ func handleWebRTCSignalWsMessages(
|
||||||
scopedLogger *zerolog.Logger,
|
scopedLogger *zerolog.Logger,
|
||||||
) error {
|
) error {
|
||||||
runCtx, cancelRun := context.WithCancel(context.Background())
|
runCtx, cancelRun := context.WithCancel(context.Background())
|
||||||
defer cancelRun()
|
defer func() {
|
||||||
|
if isCloudConnection {
|
||||||
|
setCloudConnectionAlive(false)
|
||||||
|
}
|
||||||
|
cancelRun()
|
||||||
|
}()
|
||||||
|
|
||||||
// connection type
|
// connection type
|
||||||
var sourceType string
|
var sourceType string
|
||||||
|
|
Loading…
Reference in New Issue