mirror of
https://github.com/sipeed/NanoKVM.git
synced 2026-09-11 00:22:56 -05:00
Reworked the system state code
This commit is contained in:
@@ -46,13 +46,13 @@ typedef struct {
|
||||
uint8_t wifi_addr[16] = {0}; // WiFi ip
|
||||
uint8_t tail_addr[16] = {0}; // Tailscale ip
|
||||
uint8_t rndis_addr[16] = {0}; // RNDIS ip
|
||||
int8_t eth_state = -1; // cat /sys/class/net/eth0/carrier
|
||||
int8_t wifi_state = -1; // cat /sys/class/net/wlan0/carrier
|
||||
int8_t tail_state = -1; // ifconfig tailscale0 | grep 'inet addr' | awk '{print $2}'
|
||||
int8_t eth_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/eth0/carrier
|
||||
int8_t wifi_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/wlan0/carrier
|
||||
int8_t tail_state = NIC_STATE_UNKNOWN; // ifconfig tailscale0 | grep 'inet addr' | awk '{print $2}'
|
||||
int8_t hdmi_state = -1; // cat /proc/cvitek/vi_dbg | grep VIFPS | awk '{print $3}' (1s)
|
||||
int8_t usb_state = -1; // cat /sys/class/udc/4340000.usb/state
|
||||
int8_t hid_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GSn(n=012)
|
||||
int8_t rndis_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
|
||||
int8_t rndis_state = NIC_STATE_UNKNOWN; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
|
||||
int8_t udisk_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0
|
||||
int8_t host_pwr_state = -1; // cat /sys/class/gpio/gpio504/value
|
||||
int16_t hdmi_width = 0; // cat /kvmapp/kvm/width
|
||||
@@ -78,13 +78,13 @@ typedef struct {
|
||||
uint8_t wifi_addr[16] = {0}; // WiFi ip
|
||||
uint8_t tail_addr[16] = {0}; // Tailscale ip
|
||||
uint8_t rndis_addr[16] = {0}; // RNDIS ip
|
||||
int8_t eth_state = -1; // cat /sys/class/net/eth0/carrier
|
||||
int8_t wifi_state = -1; // cat /sys/class/net/wlan0/carrier
|
||||
int8_t tail_state = -1; // ifconfig tailscale0 | grep inet\ addr | awk '{print $2}'
|
||||
int8_t eth_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/eth0/carrier
|
||||
int8_t wifi_state = NIC_STATE_UNKNOWN; // cat /sys/class/net/wlan0/carrier
|
||||
int8_t tail_state = NIC_STATE_UNKNOWN; // ifconfig tailscale0 | grep inet\ addr | awk '{print $2}'
|
||||
int8_t hdmi_state = -1; // cat /proc/cvitek/vi_dbg | grep VIFPS | awk '{print $3}' (1s)
|
||||
int8_t usb_state = -1; // cat /sys/class/udc/4340000.usb/state
|
||||
int8_t hid_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/hid.GSn(n=012)
|
||||
int8_t rndis_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
|
||||
int8_t rndis_state = NIC_STATE_UNKNOWN; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0
|
||||
int8_t udisk_state = -1; // (exist?) /sys/kernel/config/usb_gadget/g0/configs/c.1/mass_storage.disk0
|
||||
int8_t host_pwr_state = -1; // cat /sys/class/gpio/gpio504/value
|
||||
int16_t hdmi_width = -1; // cat /kvmapp/kvm/width
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "config.h"
|
||||
#include "system_init.h"
|
||||
#include "system_state.h"
|
||||
|
||||
using namespace maix;
|
||||
using namespace maix::sys;
|
||||
@@ -186,7 +187,7 @@ void first_start(void)
|
||||
}
|
||||
uint8_t update_begin = 0;
|
||||
while(1){
|
||||
if(chack_net_state(ETH_ROUTE) && get_ip_addr(ETH_IP)){
|
||||
if(kvm_sys_state.eth_state == NIC_STATE_UP){
|
||||
OLED_Clear();
|
||||
if(kvm_hw_ver != 2){
|
||||
if(update_begin == 0){
|
||||
@@ -216,7 +217,7 @@ void first_start(void)
|
||||
}
|
||||
while(1){
|
||||
time::sleep_ms(1000);
|
||||
if(chack_net_state(ETH_ROUTE) == 0) {
|
||||
if(kvm_sys_state.eth_state == NIC_STATE_DOWN) {
|
||||
OLED_Clear();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#include "config.h"
|
||||
#include "system_state.h"
|
||||
#include <sys/socket.h>
|
||||
#include <net/if.h>
|
||||
#include <sys/ioctl.h>
|
||||
|
||||
using namespace maix;
|
||||
using namespace maix::sys;
|
||||
@@ -143,42 +146,6 @@ int get_ip_addr(ip_addr_t ip_type)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int chack_net_state(ip_addr_t use_ip_type)
|
||||
{
|
||||
char Cmd[100]={0};
|
||||
if (use_ip_type == ETH_ROUTE) sprintf( Cmd,"ping -I eth0 -w 1 %s > /dev/null", kvm_sys_state.eth_route);
|
||||
else if (use_ip_type == WiFi_ROUTE) sprintf( Cmd,"ping -I wlan0 -w 1 %s > /dev/null", kvm_sys_state.wifi_route);
|
||||
else return -1; // 不支持的端口
|
||||
if(system(Cmd) == 0){ // 256:不通; = 0:通
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void patch_eth_wifi(void)
|
||||
{
|
||||
// system("ip link set eth0 down");
|
||||
// system("ip link set eth0 up");
|
||||
// system("udhcpc -i eth0 &");
|
||||
}
|
||||
|
||||
int kvm_eth_cable_exist()
|
||||
{
|
||||
int temp;
|
||||
FILE *fp;
|
||||
int file_size;
|
||||
uint8_t RW_Data[10];
|
||||
fp = fopen("/sys/class/net/eth0/carrier", "r");
|
||||
fseek(fp, 0, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
fread(RW_Data, sizeof(char), file_size, fp);
|
||||
fclose(fp);
|
||||
if(RW_Data[0] == '0') return 0;
|
||||
else if(RW_Data[0] == '1') return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int kvm_wifi_exist()
|
||||
{
|
||||
// if(access("/sys/bus/sdio/devices/mmc1*", F_OK) == 0) return 1;
|
||||
@@ -192,45 +159,6 @@ int kvm_wifi_exist()
|
||||
else return 0;
|
||||
}
|
||||
|
||||
int kvm_rndis_exist()
|
||||
{
|
||||
// if(access("/sys/kernel/config/usb_gadget/g0/configs/c.1/rndis.usb0", F_OK) == 0) return 1;
|
||||
// else return 0;
|
||||
|
||||
int temp;
|
||||
FILE *fp;
|
||||
int file_size;
|
||||
uint8_t RW_Data[10];
|
||||
fp = fopen("/sys/class/net/usb0/carrier", "r");
|
||||
fseek(fp, 0, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
fread(RW_Data, sizeof(char), file_size, fp);
|
||||
fclose(fp);
|
||||
if(RW_Data[0] == '0') return 0;
|
||||
else if(RW_Data[0] == '1') return 1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
int kvm_tailscale_exist()
|
||||
{
|
||||
// tailscale status
|
||||
|
||||
int temp;
|
||||
FILE *fp;
|
||||
int file_size;
|
||||
uint8_t RW_Data[10];
|
||||
fp = fopen("ifconfig tailscale0 | grep 'inet addr' | awk '{print $2}'", "r");
|
||||
fseek(fp, 0, SEEK_END);
|
||||
file_size = ftell(fp);
|
||||
fseek(fp, 0, SEEK_SET);
|
||||
fread(RW_Data, sizeof(char), file_size, fp);
|
||||
fclose(fp);
|
||||
if(RW_Data[0] == 'a') return 1;
|
||||
else return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void kvm_update_usb_state()
|
||||
{
|
||||
// usb_state, hid_state, rndis_state, udisk_state
|
||||
@@ -373,167 +301,85 @@ void kvm_update_hdmi_res(void)
|
||||
kvm_sys_state.hdmi_height = atoi((char*)RW_Data);
|
||||
}
|
||||
|
||||
void kvm_update_eth_state(void)
|
||||
{
|
||||
// 嗨得是老架构啊
|
||||
static uint8_t eth_cable_state = 0;
|
||||
// if(kvm_eth_cable_exist() == 1){
|
||||
// if(eth_cable_state == 0){
|
||||
// system("udhcpc -i eth0 &");
|
||||
// }
|
||||
// eth_cable_state = 1;
|
||||
// } else {
|
||||
// eth_cable_state = 0;
|
||||
// }
|
||||
eth_cable_state = kvm_eth_cable_exist();
|
||||
|
||||
if(eth_cable_state){
|
||||
// 获取实时IP
|
||||
if(strcmp(ip_address()["eth0"].c_str(), (char*)kvm_sys_state.eth_addr) != 0){
|
||||
// if(1){
|
||||
if(get_ip_addr(ETH_IP)){
|
||||
kvm_sys_state.eth_state = 2;
|
||||
} else {
|
||||
kvm_sys_state.eth_state = 1;
|
||||
return;
|
||||
}
|
||||
// OLED_ShowKVMStreamState(KVM_IP, kvm_sys_state.ip_addr);
|
||||
int get_nic_state(const char* interface_name)
|
||||
{
|
||||
int sock;
|
||||
struct ifreq ifr;
|
||||
int ret = NIC_STATE_NO_EXIST;
|
||||
if ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
|
||||
return ret;
|
||||
}
|
||||
strcpy(ifr.ifr_name, interface_name);
|
||||
if (ioctl(sock, SIOCGIFFLAGS, &ifr) < 0) {
|
||||
close(sock);
|
||||
return ret;
|
||||
}
|
||||
if (ifr.ifr_flags & IFF_UP) {
|
||||
if (ifr.ifr_flags & IFF_RUNNING) {
|
||||
ret = NIC_STATE_RUNNING;
|
||||
} else {
|
||||
ret = NIC_STATE_UP;
|
||||
}
|
||||
// ping 网关
|
||||
} else {
|
||||
ret = NIC_STATE_DOWN;
|
||||
}
|
||||
close(sock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void kvm_update_eth_state(void)
|
||||
{
|
||||
kvm_sys_state.eth_state = get_nic_state("eth0");
|
||||
|
||||
if(kvm_sys_state.eth_state != NIC_STATE_DOWN){
|
||||
if(strcmp(ip_address()["eth0"].c_str(), (char*)kvm_sys_state.eth_addr) != 0){
|
||||
get_ip_addr(ETH_IP);
|
||||
}
|
||||
|
||||
if(kvm_sys_state.eth_route[0] == 0){
|
||||
get_ip_addr(ETH_ROUTE);
|
||||
} else {
|
||||
if(chack_net_state(ETH_ROUTE)){
|
||||
// 网络通
|
||||
kvm_sys_state.eth_state = 3;
|
||||
} else {
|
||||
kvm_sys_state.eth_state = 2;
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
kvm_sys_state.eth_state = 0;
|
||||
patch_eth_wifi();
|
||||
}
|
||||
|
||||
/*
|
||||
switch (kvm_sys_state.eth_state){
|
||||
case -1:
|
||||
// 初始缺省值
|
||||
kvm_sys_state.eth_state = 0;
|
||||
case 0:
|
||||
// 存在PHY
|
||||
printf("kvm_update_eth_state case 0\n");
|
||||
if (kvm_eth_cable_exist()) {
|
||||
// 已插入
|
||||
// system("udhcpc -i eth0 > /dev/null &");
|
||||
kvm_sys_state.eth_state = 1;
|
||||
} else break;
|
||||
// break; // 消除短暂感叹号
|
||||
case 1:
|
||||
// 线缆已插入&无网络
|
||||
if (get_ip_addr(ETH_IP)){
|
||||
kvm_sys_state.eth_state = 2;
|
||||
} else break;
|
||||
case 2:
|
||||
// 已获取ip
|
||||
// system("udhcpc -i eth0 > /dev/null");
|
||||
if (get_ip_addr(ETH_ROUTE) && chack_net_state(ETH_ROUTE)){
|
||||
// ping 通
|
||||
kvm_sys_state.eth_state = 3;
|
||||
}
|
||||
if (kvm_eth_cable_exist() == 0) {
|
||||
// 未插入
|
||||
kvm_sys_state.eth_state = 0;
|
||||
patch_eth_wifi();
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
// 有网络&检测是否拔出/持续检测是否能ping通
|
||||
if (kvm_sys_state.eth_route[0] != 0){
|
||||
if (chack_net_state(ETH_ROUTE) == 0){
|
||||
// ping不通
|
||||
kvm_sys_state.eth_state = 2;
|
||||
// patch_eth_wifi();
|
||||
}
|
||||
}
|
||||
if (kvm_eth_cable_exist() == 0) {
|
||||
// 未插入
|
||||
kvm_sys_state.eth_state = 0;
|
||||
patch_eth_wifi();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
kvm_sys_state.eth_state = 0;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void kvm_update_wifi_state(void)
|
||||
{
|
||||
// 无wifi模块(检测存在?)->有模块&未联网(检测是否联网)->
|
||||
{
|
||||
if(kvm_sys_state.wifi_state == -2) return;
|
||||
switch (kvm_sys_state.wifi_state){
|
||||
case -1:
|
||||
// 初始缺省值
|
||||
if (kvm_wifi_exist()) {
|
||||
kvm_sys_state.wifi_state = 0;
|
||||
system("touch /etc/kvm/wifi_exist");
|
||||
}
|
||||
else {
|
||||
kvm_sys_state.wifi_state = -2; // 不存在wifi模块,直接跳出
|
||||
system("rm /etc/kvm/wifi_exist");
|
||||
return;
|
||||
}
|
||||
// break; // 直接开始检测联网
|
||||
case 0:
|
||||
// 存在WiFi&未联网
|
||||
system("echo 0 > /kvmapp/kvm/wifi_state");
|
||||
if (get_ip_addr(WiFi_IP) && get_ip_addr(WiFi_ROUTE)){
|
||||
// 已获取ip+route
|
||||
if (chack_net_state(WiFi_ROUTE)){
|
||||
// ping 通
|
||||
kvm_sys_state.wifi_state = 1;
|
||||
}
|
||||
}
|
||||
kvm_sys_state.wifi_state = get_nic_state("wlan0");
|
||||
|
||||
switch (kvm_sys_state.wifi_state) {
|
||||
case -2:
|
||||
system("rm /etc/kvm/wifi_exist");
|
||||
break;
|
||||
|
||||
case 0:
|
||||
system("touch /etc/kvm/wifi_exist");
|
||||
system("echo 0 > /kvmapp/kvm/wifi_state");
|
||||
break;
|
||||
|
||||
case 1:
|
||||
// 已联网&持续检测是否能ping通
|
||||
system("echo 1 > /kvmapp/kvm/wifi_state");
|
||||
get_ip_addr(WiFi_IP);
|
||||
if (kvm_sys_state.wifi_route[0] != 0){
|
||||
if (chack_net_state(WiFi_ROUTE) == 0){
|
||||
// ping 通
|
||||
kvm_sys_state.wifi_state = 0;
|
||||
}
|
||||
}
|
||||
// default:
|
||||
// kvm_sys_state.wifi_state = -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void kvm_update_rndis_state(void)
|
||||
{
|
||||
if (kvm_rndis_exist()) {
|
||||
if(kvm_sys_state.rndis_state != 1){
|
||||
if (get_ip_addr(RNDIS_IP)) {
|
||||
kvm_sys_state.rndis_state = 1;
|
||||
}
|
||||
}
|
||||
kvm_sys_state.rndis_state = get_nic_state("usb0");
|
||||
|
||||
if(kvm_sys_state.rndis_state != NIC_STATE_UP){
|
||||
get_ip_addr(RNDIS_IP);
|
||||
}
|
||||
else kvm_sys_state.rndis_state = 0;
|
||||
}
|
||||
|
||||
void kvm_update_tailscale_state(void)
|
||||
{
|
||||
if (kvm_tailscale_exist()) {
|
||||
if(kvm_sys_state.tail_state != 1){
|
||||
if (get_ip_addr(Tailscale_IP)) {
|
||||
kvm_sys_state.tail_state = 1;
|
||||
}
|
||||
}
|
||||
kvm_sys_state.tail_state = get_nic_state("tailscale0");
|
||||
|
||||
if(kvm_sys_state.tail_state != NIC_STATE_UP){
|
||||
get_ip_addr(Tailscale_IP);
|
||||
}
|
||||
else kvm_sys_state.tail_state = 0;
|
||||
}
|
||||
|
||||
//============================================================================
|
||||
|
||||
@@ -2,6 +2,12 @@
|
||||
#define SYSTEM_STATE_H_
|
||||
#include "config.h"
|
||||
|
||||
#define NIC_STATE_UP 1
|
||||
#define NIC_STATE_DOWN 0
|
||||
#define NIC_STATE_RUNNING 2
|
||||
#define NIC_STATE_UNKNOWN -1
|
||||
#define NIC_STATE_NO_EXIST -2
|
||||
|
||||
enum ip_addr_t
|
||||
{
|
||||
ETH_IP=1, WiFi_IP, Tailscale_IP, RNDIS_IP, ETH_ROUTE, WiFi_ROUTE, NULL_IP
|
||||
@@ -9,12 +15,7 @@ enum ip_addr_t
|
||||
|
||||
// net_port
|
||||
int get_ip_addr(ip_addr_t ip_type);
|
||||
int chack_net_state(ip_addr_t use_ip_type);
|
||||
void patch_eth_wifi(void);
|
||||
int kvm_eth_cable_exist();
|
||||
int kvm_wifi_exist();
|
||||
int kvm_rndis_exist();
|
||||
int kvm_tailscale_exist();
|
||||
void kvm_update_usb_state();
|
||||
void kvm_update_hdmi_state();
|
||||
void kvm_update_stream_fps(void);
|
||||
@@ -26,5 +27,6 @@ void kvm_update_wifi_state(void);
|
||||
void kvm_update_rndis_state(void);
|
||||
void kvm_update_tailscale_state(void);
|
||||
uint8_t ion_free_space(void);
|
||||
int get_nic_state(const char* interface_name);
|
||||
|
||||
#endif // SYSTEM_STATE_H_
|
||||
|
||||
Reference in New Issue
Block a user