好的变成习惯之头文件编写

头文件编写:
1.#define MAX_SAT_NUM 6
程序中经常用到的有意义的数字用宏代替写在头文件开始处。
2.类设计
class
{
public:
//公有的一些方法(包括构造函数、析构函数、接口函数等。。。)
public:
//公有的成员变量(包括结构体、枚举、成员变量等。。。)
protected:
//保护的一些方法(只有类内部调用的一些函数)
protected:
//保护的成员变量(类内部的大部分成员变量)
}
结构体对于变长的数据成员定义为u8 data[1];
例如
#pragma pack(push)
#pragma pack(1)
typedef struct S_FRAME 
{
u8  from; //信源
u8  to; //信宿
u16 year; //发送时刻:年
u8  month; //月
u8  day; //日
u8  hour; //时
u8  minute; //分
u8  second; //秒
u16 millisecond; //毫秒
u8  sign; //主备计算机标志
u16 count; //包序号
u16 frame_len; //整包数据长度
u16 group_num; //信息组数
u8  data[1]; //信息内容
}DATAFRAME, * PDATAFRAME;
#pragma pack(pop)

用的时候可以直接 PDATAFRAME pFrame = (PDATAFRAME)pData;
pFrame->data即可得到数据域首地址。 注意DATAFRAME基本上用不到因为该结构体用于指针类型
更有意义。





void* m_pContex;
上下文指针的使用。为了避免a.h头文件中想访问b.h头文件中的类对象,b.h头文件中还想访问a.h
头文件中的对象这样的情况出现交叉访问的问题。b.h头文件中包含a.h头文件并定义一个A m_a;数据
成员。而a.h中定义一个void* m_pB;在B类初始化的时候将m_a.m_pB = this;即可。
这样就解决了交叉访问的问题。
或者在a.h中定义一个容器vector<data> m_vData;。b.cpp中收到数据直接放到m_vData中,而a.pp中开
一个线程不停的对m_vData.size();进行判断,只要有值就进行处理,处理后删掉。要注意的是线程安全
问题。访问m_vData时要加锁。


/**获取4字节CRC算法
*
* 参数:crcp为要进行CRC校验的数据首地址,len为数据长度,
*/
多行注释要以上面的格式书写。第一行写函数功能。空一行后面接着写参数说明,返回值说明。

#pragma once
//dtea header
#include "stdafx.h"
#include "Header.h"
#include <_datatype.h>
#include "MtHandler.h"


#include <dtea/dtObjectI.h>
using namespace dtea;


#define MAX_SAT_NUM 6  //支持卫星模拟器的最大个数,目前第一类模拟器1颗,第二类模拟器5颗,共6颗


namespace dtMTServer{


class dtsMTServer: public dtea::dtObjectI
{
//定义服务对象标准导出接口
DECLARE_DTUNIT_AUTOCREATE(dtsMTServer,dtea::dtObjectI);


public:
~dtsMTServer(void);


MEMBER_REPORT_HANDLER( dtsMTServer, OnNewCadu );
MEMBER_REPORT_HANDLER( dtsMTServer, OnNewEpdu );


virtual void Open();
virtual void Close();
virtual void Run();
virtual void Stop();


MEMBER_FUNC_HANDLER(dtsMTServer, TaskInitEnd);


//本地日志
void LogInfo_Local( const int level, char* info_head );


//设置某一台模拟器的本星SCID
bool SetSCID(u8 sat_idx, u8 SCID);


//切换某一台模拟器时频模式,0:内时频,1:外时频
bool SetTimeMode(u8 sat_idx, u8 time_mode);


//向某个卫星模拟器注入指令
bool SendCmd( u8 sat_idx, u8* pData, i32 size);






public:
//卫星模拟器的相关信息
struct SAT_SIM{


SAT_SIM(){
m_refObjTM = NULL;
m_refRptCadu = NULL;
m_ptbCadu = NULL;
m_refRptEpdu = NULL;
m_ptbEpdu = NULL;
m_refObjTC = NULL;
m_pFuncTC = NULL;


m_LSCID = 0;
m_tc_addr = 0xB5C1;
m_time_mode = 0;
m_state = 0;
}
//卫星模拟器的AOS遥测数据接收接口,仅支持低速遥测
dtRefObjPtr m_refObjTM; 
dtLocalReportPtr m_refRptCadu;
dtLocalReportCbPtr m_ptbCadu;
dtLocalReportPtr m_refRptEpdu;
dtLocalReportCbPtr m_ptbEpdu;


//卫星模拟器的遥控注入函数接口
dtRefObjPtr m_refObjTC;
dtLocalFuncPtr m_pFuncTC;


//本星SCID
u8 m_LSCID;


//地址同步字
u16 m_tc_addr;


//内外时频状态 0:内时频 1:外时频
u8 m_time_mode;


//模拟器状态 0:正常 1:异常 2:静默  3:其他
u8 m_state;


};


SAT_SIM m_sats[MAX_SAT_NUM];




protected:


virtual void SetAllFunctionHandler();
virtual void OnInitialize1();
virtual void OnInitialize2();
virtual void OnClosing();


//report转发服务参数
void RepParam();


void StartThrd();
void StopThrd();




//读取某个文件,将其中的内容以二进制块的形式返回
SP<MemBlock> ReadFile(const string& filename);


protected:


//UDP网络通信
SP<TcpEngine> m_spEngine;
SP<ServerHandler> m_spSvr;
SP<CMTHandler> m_spCon;




//综保的IP地址和端口号
string m_ipZB;
u16 m_portZB;


//监控终端的IP地址和端口号
string m_ipMT;
u16 m_portMT;


//组播发送遥测数据的IP地址和端口号
string m_ipMul;
u16 m_portMul;




//监控服务运行状态报告
dtea::dtReportIPtr m_rep_param; //在对象关闭前需要设定为NULL,避免循环引用
SP<boost::thread> m_pThRepParam;
bool m_bRunningRepParam;


//工作路径(配置文件所在路径)
string m_sWkPath;
};
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值