📄 ccsds.h
字号:
/***************************************************************************
文件名:ccsds.h
copyright :1.0 中国科学院光电研究院有效载荷应用中心
创建人 : 冯鹏
日期:2007.1.20
修改人: 无
日期: 无
描述:定义科学数据源包的包头以及头包中各字节所对应的值
***************************************************************************/
#ifndef CCSDS_H_
#define CCSDS_H_
#include "hxmt_file.h"
// #define MJDREF (1262275200)
#define HXM_SCI_PACKET_HDR_LENGTH 14 //高能X射线的数据源包包头为14字节
#define SXM_SCI_PACKET_HDR_LENGTH 16 //低能X射线的数据源包包头为16字节
#define SCI_PACKET_LENGTH 500 //每个科学数据源包为500字节
#define HXM_LENGTH 5 //高能X射线的每个事例长度为5个字节
#define SXM_LENGTH 4 //低能X射线的每个事例长度为4个字节
/***********定义高能X射线包头结构***********************/
#pragma pack(2)
typedef struct HXM_SCI_header_struct {
unsigned short sync; //同步字
unsigned short id; //包识别码
unsigned short ctrl; //源包序号(独立包)
unsigned short data_length; //源包长度
unsigned char time_code[6]; //时间码
} H_SCI_header;
#pragma pack()
inline int H_version( const H_SCI_header *x ) { return (x->id&0xe000)>>13; } //此函数输入为高能X射线的包头,返回高能X射线的版本号(3位): “000”表示CCSDS源包
inline int H_type( const H_SCI_header *x ) { return (x->id&0x1000)>>12; } //此函数输入为高能X射线的包头,返回高能X射线的类型(1位):”0”表示遥测包
inline int H_sub( const H_SCI_header *x ) { return (x->id&0x8000)>>11; } //此函数输入为高能X射线的包头,返回高能X射线的副导头标识(1位):”1”表示副导头存在;”0”表示副导头不存在
inline int H_app_id( const H_SCI_header *x ) { return (x->id&0x3ff); } //此函数返回输入为高能X射线的包头,返回高能X射线的应用过程标识符(11位):用于标识产生源包的某个特定航天器的单独应用过程
inline int H_ctrl_flag( const H_SCI_header *x ) { return (x->ctrl&0xc000)>>14; } //此函数输入为高能X射线的包头,返回高能X射线的分组标志(2位)
inline int H_data_length( const H_SCI_header *x ) { return x->data_length; } //此函数输入为高能X射线的包头,返回高能X射线的包长(16位)
inline int H_counter( const H_SCI_header *x ) { return (x->ctrl&0x3fff); } //此函数输入为高能X射线的包头,返回高能X射线的源包序列记数(14位)
/***************定义高能X射线事例结构,共5个字节**************************/
#pragma pack(1)
typedef struct HXM_struct {
unsigned char data[4];
unsigned char ctrl;
}HXM_t;
inline int energy( const HXM_t *x ) { return x->data[0]; }//函数输入为高能X射线一个事例,输出其能量
inline int ptime( const HXM_t *x ) //函数输入为高能X射线一个事例,输出其18位秒以下时间信息
{
return (((int)x->data[1])<<10) + (((int)x->data[2])<<2) + ((int)((x->data[3])&0xc0)>>6);
}
inline int chaNo( const HXM_t *x )//函数输入为高能X射线一个事例,输出其通道号
{
if( (x->data[3] & 0x3f) == 0x01 )
return 1;
if( (x->data[3] & 0x3f) == 0x02 )
return 2;
if( (x->data[3] & 0x3f) == 0x04 )
return 3;
if( (x->data[3] & 0x3f) == 0x08 )
return 4;
if( (x->data[3] & 0x3f) == 0x10 )
return 5;
if( (x->data[3] & 0x3f) == 0x20 )
return 6;
else
return 0;
}
inline time_t stime( const HXM_t *x )//函数输入为高能X射线一个事例,输出其32位秒记数
{
extern time_t global_time_offset; //全局变量,系统的时间零点
return global_time_offset + ((long)x->data[0]<<24) +
((long)x->data[1]<<16) + ((long)x->data[2]<<8) + x->data[3];
}
inline int event_type( const HXM_t *x ) { return (x->ctrl&0xc0)>>6; }//函数输入为高能X射线一个事例,输出其事例类型.
inline int brd_no( const HXM_t *x ) { return (x->ctrl&0x30)>>4; }//函数输入为高能X射线一个事例,输出其板卡号
inline int crc( const HXM_t *x ) { return (x->ctrl&0x0f); }//函数输入为高能X射线一个事例,输出其四位CRC校验位
/*************定义一个高能X事例时间结构,用于fits文件中以七个字节存放时间码**********************/
#pragma pack()
typedef struct hxm_time
{
unsigned long time;//秒以上部分的秒累计
unsigned long usec;//微妙
}hx_t;
/**********************************************
** 函数名: set_hxtime
** 输入: t, usec
** t --- tm structure
** usec --- 微妙
** 输出: hx_time(7个字节)
** 功能描述: 输入一个tm结构和一个微妙,输出一个高能X射线事例的时间,用7个字节表示
*************************************************/
inline void set_hxtime( hx_t *hx_time, const tm * t, time_t usec )
{
memset( hx_time, 0, sizeof(hx_time) );
hx_time->time |= ((t->tm_year-100) & 0xf) << 28;
hx_time->time |= ((t->tm_mon+1)&0xf) << 24;
hx_time->time |= (t->tm_mday&0x1f) << 19;
hx_time->time |= (t->tm_hour&0x1f) << 14;
hx_time->time |= (t->tm_min&0x3f) << 8;
hx_time->time |= (t->tm_sec&0x3f);
hx_time->usec |= (usec&0x3ffff)<<10;
}
/***********定义低能X射线包头结构***********************/
#pragma pack(2)
typedef struct SXM_SCI_header_struct {
unsigned short sync; //同步码
unsigned short id; //包识别码
unsigned short ctrl; //源包序号(独立包)
unsigned short data_length; //源包长度
unsigned char time_code[6]; //时间码
unsigned char data_type; //数据类别, 暂为固定码0x1111
} S_SCI_header;
#pragma pack()
inline int S_version( const S_SCI_header *x ) { return (x->id&0xe000)>>13; }//此函数输入为低能X射线的包头,返回低能X射线的版本号(3位): “000”表示CCSDS源包
inline int S_type( const S_SCI_header *x ) { return (x->id&0x1000)>>12; }//此函数输入为低能X射线的包头,返回低能X射线的类型(1位):”0”表示遥测包
inline int S_sub( const S_SCI_header *x ) { return (x->id&0x8000)>>11; }//此函数输入为低能X射线的包头,返回低能X射线的副导头标识(1位):”1”表示副导头存在;”0”表示副导头不存在
inline int S_app_id( const S_SCI_header *x ) { return (x->id&0x3ff); }//此函数返回输入为低能X射线的包头,返回低能X射线的应用过程标识符(11位):用于标识产生源包的某个特定航天器的单独应用过程
inline int S_ctrl_flag( const S_SCI_header *x ) { return (x->ctrl&0xc000)>>14; }//此函数输入为低能X射线的包头,返回低能X射线的分组标志(2位)
inline int S_data_length( const S_SCI_header *x ) { return x->data_length; }//此函数输入为低能X射线的包头,返回低能X射线的包长(16位)
inline int S_counter( const S_SCI_header *x ) { return (x->ctrl&0x3fff); }//此函数输入为低能X射线的包头,返回低能X射线的源包序列记数(14位)
inline int S_datatype( const S_SCI_header *x) { return 0x1111; }//此函数输入为高能X射线的包头,返回低能X射线的数据类别
/***************定义低能X射线事例结构,共4个字节**************************/
#pragma pack(1)
typedef struct SXM_struct {
unsigned char data[4];
}SXM_t;
#pragma pack()
/*************定义一个低能X事例时间结构,用于fits文件中以七个字节存放时间码******************/
typedef struct sxm_time
{
unsigned long time;
unsigned long usec;
}sx_t;
/**********************************************
** 函数名: set_sxtime
** 输入: t, usec
** t --- tm structure
** usec --- 微妙
** 输出: sx_time(7个字节)
** 功能描述: 输入一个tm结构和一个微妙,输出一个低能X射线事例的时间,用7个字节表示
*************************************************/
inline void set_sxtime( sx_t *sx_time, const tm * t, time_t usec )
{
memset( sx_time, 0, sizeof(sx_time) );
sx_time->time |= ((t->tm_year-100) & 0xf) << 28;
sx_time->time |= ((t->tm_mon+1)&0xf) << 24;
sx_time->time |= (t->tm_mday&0x1f) << 19;
sx_time->time |= (t->tm_hour&0x1f) << 14;
sx_time->time |= (t->tm_min&0x3f) << 8;
sx_time->time |= (t->tm_sec&0x3f);
sx_time->usec |= (usec&0xfffff)<<8;
}
inline int energy( const SXM_t *x ) //函数输入为低能X射线一个事例,输出其能量
{
return (x->data[0]<<4) + ((x->data[1]&&0xf0)>>4);
}
inline int ptime( const SXM_t *x ) //函数输入为低能X射线一个事例,输出其18位秒以下时间信息
{
return (((int)x->data[2])<<8) + x->data[3];
}
inline int chaNo( const SXM_t *x ) //函数输入为低能X射线一个事例,输出其通道
{
if( (x->data[3] & 0x3f) == 0x01 )
return 1;
if( (x->data[3] & 0x3f) == 0x02 )
return 2;
if( (x->data[3] & 0x3f) == 0x04 )
return 3;
if( (x->data[3] & 0x3f) == 0x08 )
return 4;
if( (x->data[3] & 0x3f) == 0x10 )
return 5;
if( (x->data[3] & 0x3f) == 0x20 )
return 6;
else
return 0;
}
#endif /* CCSDS_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -