
// 硬件监控
#include <stdint.h>
#include <sys/types.h>
#include <time.h>
#include "net/if.h"

#define CPU_CORES                4
#define CHECK_INTERVAL  1000    // ms
#define CPU_USAGE_ALARM          300 // ms
#define MEMORY_USAGE_ALARM       300 // ms 
#define DISK_USAGE_ALARM         86400

#define DISK_USAGE_ALARM_THRESHOLD 0.95
#define DISK_USAGE_ALARM_URGENCY 0.99
#define NETWORK_DISCONNECT_ALARM_THRESHOLD 30
#define MEMORY_USAGE_ALARM_THRESHOLD 0.9
#define CPU_USAGE_ALARM_THRESHOLD          0.9

#define EMMC_DEVICE "/"
#define SSD_DEVICE "/mnt/ssd"
typedef struct harddisk_t
{
    char*           device;
    char*           mountpoint;
    dev_t           rdev;
    struct statvfs* vfs;
    uint64_t        total;
    uint64_t        used;
    double          usage;
    time_t          duration;
} harddisk_t;

// CPU时间结构体
typedef struct
{
    char     name[16]; // 核心名称（如cpu0, cpu1）
    uint64_t user;     // 用户态时间
    uint64_t nice;     // nice时间
    uint64_t system;   // 系统态时间
    uint64_t idle;     // 空闲时间
    uint64_t iowait;   // I/O等待时间
    uint64_t irq;      // 硬中断时间
    uint64_t softirq;  // 软中断时间
} cpu_times_t;

typedef struct cpu_usage_t
{
    cpu_times_t prev;
    double      usage;
    uint64_t    duration;
} cpu_usage_t;

typedef struct mem_info_t
{
    uint64_t total;
    uint64_t free;

    uint64_t duration; // 时间间隔
    double   usage;
} mem_info_t;

typedef struct net_info_t
{
    char   ifname[IF_NAMESIZE];   // 网卡名称
    time_t lost_time;             // 断联开始时间
} net_info_t;


typedef struct net_route_t
{
    char ifname[IF_NAMESIZE]; // 网卡名称
    int  metric;
} net_route_t;

// typedef struct m4g_info_t
// {
//     int    fd;
//     char*  path;
//     int    rw;
//     int    status;
//     time_t write_time;
//     time_t lost_time;
// } m4g_info_t;

// 硬件监控模块
typedef struct hardware_monitor_t
{
    harddisk_t* harddisk_list;
    int         harddisk_num;
    cpu_usage_t cpu_usage;
    mem_info_t  mem_info;

    int         sfd;
    net_info_t* net_infos;
    int         net_num;
} hardware_monitor_t;

void init_update_ems_hardware_status_task(void);
