You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

414 lines
17 KiB
C

/******************************************************************************
* 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>&copy; 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 ****************/