⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ccsds.h

📁 本源码是一个用于卫星数据处理的程序
💻 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 + -