|
|
/******************************************************************************
|
|
|
* file include/pd_csg.h
|
|
|
* author YuLiang
|
|
|
* version 1.0.0
|
|
|
* date 21-Feb-2023
|
|
|
* brief This file provides all the headers of the csg server functions.
|
|
|
******************************************************************************
|
|
|
* Attention
|
|
|
*
|
|
|
* <h2><center>© COPYRIGHT(c) 2021 LandPower</center></h2>
|
|
|
*
|
|
|
* Redistribution and use in source and binary forms, with or without modification,
|
|
|
* are permitted provided that the following conditions are met:
|
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
|
* and/or other materials provided with the distribution.
|
|
|
* 3. Neither the name of LandPower nor the names of its contributors may be used to
|
|
|
* endorse or promote products derived from this software without specific
|
|
|
* prior written permission.
|
|
|
*
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
|
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
|
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
|
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
*
|
|
|
******************************************************************************/
|
|
|
|
|
|
#ifndef _PD_CSG_H_
|
|
|
#define _PD_CSG_H_
|
|
|
|
|
|
#ifdef CFG_DEV_TYPE_LAND_PD
|
|
|
/* Includes ------------------------------------------------------------------*/
|
|
|
#include "pd_main.h"
|
|
|
#include <semaphore.h>
|
|
|
|
|
|
/* Define --------------------------------------------------------------------*/
|
|
|
#define CSG_TYPE_NANRUI 0 // 南瑞设备类型
|
|
|
#define CSG_TYPE_SELF 1 // 自定义设备类型
|
|
|
#define CSG_MAX_POINTS (700) // 最大单帧点数.
|
|
|
|
|
|
#define CSG_FIFO_ORI "CSG_FIFO_ORI"
|
|
|
#define ORI_FIFO_NUM (4)
|
|
|
#define CSG_TREND_FIFO_NUM (8)
|
|
|
#define CSG_HEAD_LEN (32)
|
|
|
#define CSG_TOTLE_LEN (26)
|
|
|
#define CSG_PKT_LEN (1400)
|
|
|
#define CSG_ADBUF_MAX_LEN (65000)
|
|
|
|
|
|
#define CSG_SEND_SELF_WAVE_NUM (6) //2ms send 4 pulse self
|
|
|
#define CSG_SEND_NR_WAVE_NUM (2) //2ms send 4 pulse nanrui
|
|
|
|
|
|
#define CSG_SHIQUCHA (28800) // 8 * 3600.
|
|
|
|
|
|
#define CSG_ORIG_ID "original"
|
|
|
#define CSG_FIFO_TREND "CSG_FIFO_TREND"
|
|
|
#define CSG_MAX_SOCKET (PD_DAU_PORT_SUM + 1)
|
|
|
|
|
|
/* 命令类型. */
|
|
|
enum CSG_CMD_TYPE
|
|
|
{
|
|
|
CSG_REQUEST = 1, /* 请求 */
|
|
|
CSG_REPLY = 2, /* 应答 */
|
|
|
CSG_PRV_REQUEST = 121, /* 私有请求 */
|
|
|
CSG_PRV_REPLY = 122 /* 私有应答 */
|
|
|
};
|
|
|
|
|
|
/* 共有命令字. */
|
|
|
enum CSG_CMD
|
|
|
{
|
|
|
CSG_C_CONTACT = 1, /* 设备连接 */
|
|
|
CSG_C_RESET = 3, /* 设备复位 */
|
|
|
CSG_C_UPDATE = 5, /* 设备升级 */
|
|
|
CSG_C_DEV_INFO_SET = 6, /* 设备基本信息设置 */
|
|
|
CSG_C_DEV_INFO_GET = 7, /* 设备基本信息获取 */
|
|
|
CSG_C_UPDATE_RESULT = 9, /* 升级结果上报 */
|
|
|
CSG_C_HEARTBEAT = 10 /* 心跳包 */
|
|
|
};
|
|
|
|
|
|
/* 私有命令字. */
|
|
|
enum DEBUG_CM_CMD
|
|
|
{
|
|
|
CSG_PRV_CONFIG_GLOBAL_SET = 1, /* 设备全局参数设置 */
|
|
|
CSG_PRV_CONFIG_GLOBAL_GET = 2, /* 设备全局参数获取 */
|
|
|
CSG_PRV_CONFIG_PORT_SET = 3, /* 设备端口参数设置 */
|
|
|
CSG_PRV_CONFIG_PORT_GET = 4, /* 设备端口参数获取 */
|
|
|
CSG_PRV_CONFIG_EIGEN_SET = 5, /* 特征量参数设置 */
|
|
|
CSG_PRV_CONFIG_EIGEN_GET = 6, /* 特征量参数获取 */
|
|
|
CSG_PRV_CONFIG_NANRUI_SET = 20, /* 南瑞设备参数设置 */
|
|
|
CSG_PRV_CONFIG_NANRUI_GET = 21, /* 南瑞设备参数获取 */
|
|
|
CSG_PRV_REAL_WAVE = 50, /* 实时触发波形上传 50-self 52nanrui*/
|
|
|
CSG_PRV_REAL_EIGEN = 51, /* 特征量数据上传 */
|
|
|
CSG_PRV_TREND = 52,
|
|
|
};
|
|
|
|
|
|
typedef struct{
|
|
|
uint8_t port;
|
|
|
uint8_t reserved1[3];
|
|
|
uint32_t century_second;
|
|
|
uint32_t pulse_num;
|
|
|
int16_t pulse_max;
|
|
|
int16_t pulse_avg;
|
|
|
int16_t noise;
|
|
|
uint16_t phase;
|
|
|
uint8_t reserved2[32];
|
|
|
} csg_trend_t;
|
|
|
|
|
|
typedef struct {
|
|
|
uint32_t port; /* 端口号 0 ~ 7 */
|
|
|
uint32_t length; /* 端口数据长度 */
|
|
|
}port_info_t;
|
|
|
|
|
|
#pragma pack(push, 1)
|
|
|
typedef struct
|
|
|
{
|
|
|
int16_t amplitude; // 幅值
|
|
|
uint16_t phase; // 相位
|
|
|
uint16_t period; // 周期
|
|
|
} prps_t;
|
|
|
#pragma pack(pop)
|
|
|
|
|
|
/* 特征量报文头 32Byte. */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t vport; // 通道编号 1 ~ 8
|
|
|
uint8_t pkt_sum; // 总包
|
|
|
uint8_t pkt_index; // 当前包
|
|
|
uint8_t reserved1; // 保留
|
|
|
uint8_t channel_type; // 通道类型 (1: UHF)
|
|
|
uint8_t unit; // 单位 (1: dBm; 2: mV)
|
|
|
int16_t noise; // 噪声
|
|
|
int16_t pulse_peak; // 脉冲峰值
|
|
|
uint16_t power_frequency; // 工频周期
|
|
|
uint8_t reserved2[8]; // 保留
|
|
|
uint16_t discharge_nums; // 放电次数
|
|
|
uint16_t frame_num; // 特征量数量
|
|
|
uint32_t first_sec; // 第一次放电的世纪秒
|
|
|
uint32_t first_ns; // 第一次放电的纳秒
|
|
|
uint32_t last_sec; // 最后一次放电的世纪秒
|
|
|
uint32_t last_ns; // 最后一次放电的纳秒
|
|
|
} csg_eigen_value_t;
|
|
|
|
|
|
typedef struct {
|
|
|
uint8_t vport; // 通道编号 1 ~ 8
|
|
|
uint8_t is_concern; // 关注 1: 关注 0: 取消关注
|
|
|
uint8_t reserve[30];
|
|
|
} csg_config_real_wave_t;
|
|
|
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t port;
|
|
|
int skfd;
|
|
|
csg_eigen_value_t eigen;
|
|
|
prps_t wave[10000]; // 20*500 2ms最大有20个,统计1s
|
|
|
char *pbuf;
|
|
|
uint32_t times;
|
|
|
uint32_t inums;
|
|
|
uint32_t noise_sum;
|
|
|
uint32_t cycle;
|
|
|
} channel_t;
|
|
|
|
|
|
/* . */
|
|
|
typedef struct
|
|
|
{
|
|
|
int skfd; // 后台通讯使用的 socket.
|
|
|
int sockfds[CSG_MAX_SOCKET];
|
|
|
int num_sockets;
|
|
|
uint32_t pkt_index; // 报文索引.
|
|
|
uint32_t fifo_real_image_id[PD_DAU_PORT_SUM]; // adc原始数据fifo
|
|
|
uint32_t fifo_trend_id;
|
|
|
char buf_send[1500]; // 发送缓冲区.
|
|
|
char buf_recv[1500]; // 接收缓冲区.
|
|
|
struct sockaddr_in server; // 服务器地址.
|
|
|
int32_t server_ip; // server ip.
|
|
|
uint16_t server_port; // server port.
|
|
|
uint8_t is_connect; // 是否连接上服务器.
|
|
|
uint8_t heartbeat; // 心跳发送后没有收到回复的次数.
|
|
|
int32_t communication_time; // 最后通讯时间.
|
|
|
pthread_mutex_t mutex; // 互斥锁.
|
|
|
pthread_mutex_t lock; // 离线监控锁.
|
|
|
uint8_t dest_mac[6]; // 目标MAC地址.
|
|
|
uint8_t is_send; // 是否发送波形和特征数据数据
|
|
|
volatile uint8_t new_data_flag[8]; // 新数据更新标志位
|
|
|
csg_config_real_wave_t real_cfg[8];
|
|
|
|
|
|
} csg_t;
|
|
|
|
|
|
/* 报文头结构. */
|
|
|
typedef struct{
|
|
|
uint16_t len; // 报文长度.
|
|
|
uint8_t dev_type_m; // 设备类型高字节.
|
|
|
uint8_t dev_type_s; // 设备类型低字节.
|
|
|
uint32_t dev_id; // 设备ID.
|
|
|
uint8_t cmd_type; // 命令类型. 1:请求 2:应答 121:私有请求 122:私有应答
|
|
|
uint8_t cmd; // 命令字. 1:设备连接 3:设备复位 5:设备升级 6:设备基本信息设置 7:设备基本信息获取 9:升级结果上报 10:心跳包
|
|
|
uint16_t pkt_id; // 报文ID, 用于区分不同的报文.
|
|
|
uint8_t version; // 版本号, 用于兼容不同版本的报文.
|
|
|
uint8_t reserve[19]; // 保留字段, 用于将来扩展.
|
|
|
} csg_pkt_head_t;
|
|
|
|
|
|
/* 报文头结构. */
|
|
|
typedef struct{
|
|
|
uint8_t dest_mac[6]; // 目标MAC地址.
|
|
|
uint8_t src_mac[6]; // 源MAC地址.
|
|
|
uint8_t cmd_type[2]; // 命令类型. 0xf0:特征量 0x11:波形
|
|
|
uint8_t reserve; // 保留字段, 用于将来扩展.
|
|
|
uint8_t port_nums; // 端口数量, 用于标识有多少个端口的数据.
|
|
|
} csg_pkt_nanrui_head_t;
|
|
|
|
|
|
typedef struct {
|
|
|
uint8_t result; // 应答结果. 0:成功 1:失败
|
|
|
uint8_t reserved[3]; // 保留
|
|
|
}csg_ack_t;
|
|
|
|
|
|
typedef struct {
|
|
|
uint8_t vport; // 通道编号 1 ~ 8
|
|
|
uint8_t result; // 应答结果. 0:成功 1:失败
|
|
|
uint8_t reserved[2]; // 保留
|
|
|
} csg_channel_ack_t;
|
|
|
|
|
|
/* 升级文件包结构体 */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t type; // 升级类型
|
|
|
uint8_t resverd[3];
|
|
|
uint16_t index; // 报文索引
|
|
|
uint16_t sum; // 总包数.
|
|
|
uint32_t len; // 数据包长度.
|
|
|
} csg_upgrade_data_t;
|
|
|
|
|
|
/* 应答升级结构体 */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint16_t index; // 应答包序号.
|
|
|
uint8_t result; // 应答结果. 0:失败 1:成功
|
|
|
uint8_t reserve; // 保留
|
|
|
} csg_upgrade_ack_t;
|
|
|
|
|
|
/* 升级结果通知 */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t result; // 升级结果
|
|
|
uint8_t reserved[3];
|
|
|
char context[128];
|
|
|
} csg_upgrade_res_t;
|
|
|
|
|
|
/* 心跳报文. */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint32_t power_freq; // 电网频率, 单位Hz.
|
|
|
uint8_t dau_state[PD_DAU_PORT_SUM]; // 采集模块的状态.
|
|
|
uint8_t pt_sync_mode; // PT同步模式, 0:外同步, 1:内同步.
|
|
|
uint8_t dau_port_nums; // 采集模块端口数量, 1 ~ 8.
|
|
|
uint8_t reserve[6]; // 保留字段, 用于将来扩展.
|
|
|
} csg_heartbeat_t;
|
|
|
|
|
|
|
|
|
/* 设备信息 */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t type_m; // 主设备号
|
|
|
uint8_t type_s; // 次设备号
|
|
|
uint8_t reserved1[2]; // 保留
|
|
|
uint32_t dev_id; // 设备ID
|
|
|
char hostname[FILE_NAME_LEN]; // 设备名 128byte
|
|
|
uint32_t factory_date; // 出厂日期.
|
|
|
uint32_t deployment_date; // 部署日期.
|
|
|
uint8_t app_version[32]; // 软件版本
|
|
|
uint8_t app_compile_time[32]; // 软件编译时间
|
|
|
uint8_t hardware_version[32]; // 硬件版本
|
|
|
uint8_t FPGA_version[32]; // fpga版本
|
|
|
uint32_t ip; // 本机 IP.
|
|
|
uint32_t mask; // 本机 MASK.
|
|
|
uint32_t gw; // 本机网关
|
|
|
uint8_t mac[6]; // MAC地址.
|
|
|
uint16_t server_port; // 服务器端口号.
|
|
|
uint32_t server_ipv4; // 服务器 IP.
|
|
|
} csg_dev_info_t;
|
|
|
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t type_m; // 主设备号
|
|
|
uint8_t type_s; // 次设备号
|
|
|
uint8_t reserved1[2]; // 保留
|
|
|
uint32_t dev_id; // 设备ID
|
|
|
char hostname[FILE_NAME_LEN]; // 设备名 128byte
|
|
|
uint32_t factory_date; // 出厂日期.
|
|
|
uint32_t deployment_date; // 部署日期.
|
|
|
uint8_t app_version[32]; // 软件版本
|
|
|
uint8_t app_compile_time[32]; // 软件编译时间
|
|
|
uint8_t hardware_version[32]; // 硬件版本
|
|
|
uint8_t FPGA_version[32]; // fpga版本
|
|
|
uint32_t ip; // 本机 IP.
|
|
|
uint32_t mask; // 本机 MASK.
|
|
|
uint32_t gw; // 本机网关
|
|
|
uint8_t mac[6]; // MAC地址.
|
|
|
uint16_t server_port; // 服务器端口号.
|
|
|
uint32_t server_ipv4; // 服务器 IP.
|
|
|
uint8_t port[PD_DAU_PORT_SUM]; // 端口号, 1 ~ 8.
|
|
|
uint8_t port_type[PD_DAU_PORT_SUM]; // 端口类型
|
|
|
} csg_contact_t;
|
|
|
|
|
|
/* 实时图谱报文头 16Byte. */
|
|
|
typedef struct
|
|
|
{
|
|
|
uint8_t channel_id; // 通道编号
|
|
|
uint8_t reserved1; // 保留
|
|
|
uint8_t channel_type; // 通道类型 (1: UHF)
|
|
|
uint8_t unit; // 单位 (1: dBm; 2: mV)
|
|
|
uint16_t sample_rate; // 采样率 (Msps)
|
|
|
uint16_t record_points; // 录波点数 N
|
|
|
uint16_t phase; // 脉冲所在相位
|
|
|
int16_t pulse_peak; // 脉冲峰值
|
|
|
uint16_t pre_trigger; // 预触发
|
|
|
uint16_t trigger_level; // 触发电平 (mv)
|
|
|
uint32_t filter_frequency; // 过滤频率
|
|
|
uint16_t rise_time; // 上升时间 (ns)
|
|
|
uint16_t peak_time; // 峰值时间
|
|
|
uint16_t fall_time; // 下降时间
|
|
|
uint16_t pulse_width; // 脉冲宽度
|
|
|
uint16_t peak_count; // 波峰数量
|
|
|
uint8_t reserved2[2]; // 保留 (2字节)
|
|
|
int32_t signal_envelope_area; // 信号包络面积
|
|
|
float signal_mean; // 信号均值
|
|
|
float signal_variance; // 信号方差值
|
|
|
int32_t first_main_freq; // 第一主频
|
|
|
int16_t first_main_freq_peak; // 第一主频峰值
|
|
|
uint16_t spectral_peak_count; // 谱峰个数
|
|
|
float spectral_mean; // 频谱均值
|
|
|
float spectral_variance; // 频谱方差值
|
|
|
uint32_t century_second; // 采样时间世纪秒
|
|
|
uint32_t nanosecond; // 纳秒
|
|
|
int16_t cycle_count; // 周期数 - 脉冲所在的周期
|
|
|
int16_t frequency; // 频率
|
|
|
int16_t noise; // 噪声
|
|
|
int16_t sampling_time; // 采集时长 - 采样时长
|
|
|
uint8_t reserved3[20]; // 预留 (20字节)
|
|
|
} csg_real_image_t;
|
|
|
|
|
|
typedef struct{
|
|
|
uint32_t sample_frequency; //采样频率 MHz
|
|
|
uint32_t trigger_sample_numbers; //触发采样长度 us
|
|
|
uint32_t pre_trigger_percent; //预触发百分比 0-100%
|
|
|
uint32_t trigLevel; //触发电平 mv
|
|
|
uint32_t trend_up_period; //趋势上升周期
|
|
|
uint16_t heartbeat_period; //心跳包周期 s
|
|
|
uint8_t ch_en_mask; //通道使能 bit0-7对应ch1-ch8
|
|
|
uint8_t sync_mode; //同步模式 0-外同步 1-内同步
|
|
|
uint32_t pt_internal_period; //内同步频率 40~300
|
|
|
uint8_t reserved[8]; //预留
|
|
|
} csg_global_config_t;
|
|
|
|
|
|
typedef struct{
|
|
|
uint32_t trigLevel; //触发电平 mv
|
|
|
uint8_t ch_en_mask; //通道使能 bit0-7对应ch1-ch8
|
|
|
uint8_t send_port_num[PD_DAU_PORT_SUM]; //南瑞传输编号
|
|
|
uint8_t reserve[3]; //保留
|
|
|
} csg_nr_config_t;
|
|
|
|
|
|
// 通道类型枚举定义
|
|
|
typedef enum {
|
|
|
SIGNAL_CHANNEL_WITH_NOISE = 0, // 信号通道关联噪声
|
|
|
SIGNAL_CHANNEL = 1, // 信号通道
|
|
|
NOISE_CHANNEL = 2 // 噪声通道
|
|
|
} ChannelType;
|
|
|
|
|
|
typedef struct{
|
|
|
uint8_t vport; // 通道编号.
|
|
|
ChannelType channel_type; // 通道类型.
|
|
|
uint8_t reserved1[2];
|
|
|
uint32_t filter_frequency; // 过滤频率(32位按位设置)
|
|
|
int16_t rise_time; // 上升时间(10%到90%峰值)
|
|
|
int16_t peak_time; // 峰值时间
|
|
|
int16_t fall_time; // 下降时间(90%到10%峰值)
|
|
|
int16_t pulse_width; // 脉冲宽度
|
|
|
int16_t peak_count; // 波峰数量
|
|
|
int16_t reserved2; // 保留字段(2字节)
|
|
|
int32_t signal_envelope; // 信号包络面
|
|
|
float signal_mean; // 信号平均值
|
|
|
float signal_variance; // 信号方差值
|
|
|
int32_t primary_frequency; // 第一主频
|
|
|
int16_t primary_freq_peak; // 第一主频峰值
|
|
|
int16_t spectral_peak_count; // 谱峰个数
|
|
|
float spectrum_mean; // 频谱均值
|
|
|
float spectrum_variance; // 频谱方差值
|
|
|
uint8_t reserved3[32]; // 预留字段(32字节)
|
|
|
} csg_config_port_t;
|
|
|
|
|
|
typedef struct {
|
|
|
uint8_t vport; // 通道编号.
|
|
|
uint8_t result; // 应答结果. 0:成功 1:失败
|
|
|
uint8_t reserved[2]; // 保留
|
|
|
}csg_config_port_ack_t;
|
|
|
|
|
|
/* Exported macro ------------------------------------------------------------*/
|
|
|
|
|
|
/* Extern global variables ---------------------------------------------------*/
|
|
|
extern csg_t csg;
|
|
|
|
|
|
/* Extern functions ----------------------------------------------------------*/
|
|
|
extern int32_t csg_handle_init(void);
|
|
|
extern int32_t csg_handle_init_after(void);
|
|
|
extern void csg_upgrade_result_send(int32_t rv, char *buf);
|
|
|
#endif
|
|
|
#endif
|
|
|
/************************ (C) COPYRIGHT LandPower ***** END OF FILE ****************/
|