头文件编写:
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;
};
}
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;
};
}