#include "dy_utils/dy_common.h"
#include <pthread.h>
#include <time.h>

/***************************************************************************
调用格式:
{
    "opt":"start"
}
opt可选:
    start:开始
    stop:停止
    get:获取诊断状态

返回格式:
{
    "opt": "start",
    "code": 0,
    "status": 0,
    "it": [
        {
            "name": "name1",
            "status": 0,
            "message": "message1"
        },
        {
            "name": "name2",
            "status": 0,
            "message": "message2"
        }
    ]
}
****************************************************************************/

typedef enum self_diagnosis_status
{
    self_diagnosis_no_start = 0,
    self_diagnosis_processing = 1,
    self_diagnosis_completed = 2,
    self_diagnosis_stoped = 3
} self_diagnosis_status;

typedef enum self_diagnosis_it_status
{
    self_diagnosis_it_no_start = 0,
    self_diagnosis_it_processing = 1,
    self_diagnosis_it_pass = 2,
    self_diagnosis_it_no_pass = 3
} self_diagnosis_it_status;

typedef struct self_diagnosis_it self_diagnosis_it;
struct self_diagnosis_it
{
    const char *name;                      // 诊断项目的名称，需要保证唯一
    self_diagnosis_it_status status;       // 诊断状态
    char *message;                         // 提示信息
    int (*fun)(char* no, self_diagnosis_it *this_p); // 诊断方法
};

#define POINT_NAME_LEN 64
#define SLAVE_NAME_LEN 32

typedef struct self_diagnosis
{
    char no[SLAVE_NAME_LEN];               // 诊断从机名
    self_diagnosis_status status;
    int it_size;               // 诊断项目总数
    self_diagnosis_it *cur_it; // 当前正在诊断项
    self_diagnosis_it *it;     // 所有诊断项
    pthread_t thread;          // 运行的线程
} self_diagnosis;

self_diagnosis *self_diagnosis_new(char* name, self_diagnosis_it *it, int it_size);
int self_diagnosis_delete(self_diagnosis *this_p);
int self_diagnosis_deinit(self_diagnosis *this_p);
int self_diagnosis_start(self_diagnosis *this_p);
int self_diagnosis_stop(self_diagnosis *this_p);
int self_diagnosis_stop_handle(self_diagnosis *this_p);
cJSON *self_diagnosis_get_status(self_diagnosis *this_p);
//
self_diagnosis *factory_diagnosis_new(char* name);// 出厂诊断实例生成
self_diagnosis* charge_diagnosis_new(char* name); //充放电实例生成
