This commit is contained in:
parent
f7aa152393
commit
cb9f744a62
|
@ -1,33 +1,50 @@
|
|||
#include "UTPacket.h"
|
||||
|
||||
|
||||
UTRet UTCom::DoFunc(Buffer & line, MemoryStream & ret)
|
||||
void UTCom::DoFunc(Buffer & packet, MemoryStream & ret)
|
||||
{
|
||||
return Good;
|
||||
}
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte PortID; // 端口号
|
||||
byte Type; // 数据类型
|
||||
ushort Length; // 数据长度
|
||||
void * Next()const { return (void*)(&Length + Length + 1); };
|
||||
}PacketHead;
|
||||
|
||||
|
||||
bool UTPacket::PressTMsg(const BinaryPair& args, Stream& result)
|
||||
{
|
||||
byte data[2048];
|
||||
Buffer buff(data,sizeof(data));
|
||||
args.Get("Data", buff);
|
||||
Buffer buff = args.Get("Data"); // 引用源数据区,后面使用要小心,不能修改任何值。
|
||||
if (buff.Length() < sizeof(PacketHead))return false;
|
||||
|
||||
PacketHead * head = (PacketHead*)buff.GetBuffer();
|
||||
void * tail = head + buff.Length(); // 结尾位置
|
||||
UTPort * port = nullptr;
|
||||
|
||||
while (head<tail)
|
||||
{
|
||||
if ((uint)head->Next() >(uint)tail)break; // 要么越界,要么数据包错
|
||||
|
||||
MemoryStream resms;
|
||||
if (!Ports.TryGetValue((uint)head->PortID, port) || !port) // 获取端口
|
||||
{
|
||||
PacketHead err; // 获取失败 返回错误信息
|
||||
err.Seq = head->Seq;
|
||||
err.Length = 0;
|
||||
err.Error = NoPort; // 无端口的错误 需要定义类型
|
||||
err.PortID = head->PortID;
|
||||
err.Type = head->Type;
|
||||
Buffer errbuf(&err, sizeof(PacketHead));
|
||||
result.Write(errbuf);
|
||||
continue;
|
||||
}
|
||||
|
||||
Buffer packet(head, head->Length + sizeof(PacketHead));
|
||||
port->DoFunc(packet, resms); // 执行 返回相应的信息
|
||||
result.Write(Buffer(resms.GetBuffer(), resms.Position())); // 写入响应
|
||||
|
||||
|
||||
head = (PacketHead*)head->Next();
|
||||
port = nullptr;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
#if DEBUG
|
||||
String& UTPacket::ToStr(String& str) const
|
||||
{
|
||||
return str;
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -6,49 +6,57 @@
|
|||
#include "Message\BinaryPair.h"
|
||||
|
||||
|
||||
enum UTRet :int
|
||||
enum EorrCode : byte
|
||||
{
|
||||
Good = 1,
|
||||
CmdError = 2,
|
||||
PortError =3,
|
||||
NoPort = 4,
|
||||
Error = -1,
|
||||
Good = 1,
|
||||
CmdError = 2,
|
||||
NoPort = 3,
|
||||
Error = 4,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
byte PortID; // 端口号
|
||||
byte Seq; // paket序列号 回复消息的时候原样返回不做校验
|
||||
byte Type; // 数据类型
|
||||
EorrCode Error; // 错误编码返回时候使用 (凑对齐)
|
||||
ushort Length; // 数据长度
|
||||
void * Next()const { return (void*)(&Length + Length + sizeof(Length)); };
|
||||
}PacketHead;
|
||||
|
||||
// unvarnished transmission 透传端口基类
|
||||
class UTPort
|
||||
{
|
||||
public:
|
||||
String * Name; // 传输口名称
|
||||
byte ID;
|
||||
virtual UTRet DoFunc(Buffer & line, MemoryStream & ret) = 0; // line 为输入命令,ret为返回值。
|
||||
virtual void DoFunc(Buffer & packet, MemoryStream & ret) = 0; // packet 为输入命令,ret为返回值。
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
// 放到其他地方去 不要放在此处。
|
||||
class UTCom:public UTPort
|
||||
class UTCom : public UTPort
|
||||
{
|
||||
public:
|
||||
// SerialPort * Port;
|
||||
virtual UTRet DoFunc(Buffer & line, MemoryStream & ret);
|
||||
virtual void DoFunc(Buffer & packet, MemoryStream & ret);
|
||||
};
|
||||
|
||||
|
||||
// unvarnished transmission 透传报文
|
||||
class UTPacket
|
||||
// 由bsp注册端口到 Ports ID和对应的类
|
||||
// C++ 没有反射 找不到由UTPort派生的子类。
|
||||
// 为了节省内存,UTPort只包含Port指针 Name指针 和一个虚函数 在没有create之前只占用12字节(3个指针)
|
||||
class UTPacket : public Object
|
||||
{
|
||||
public:
|
||||
// List<UTPort*> Ports; // 透传传输口集合
|
||||
|
||||
Dictionary<uint, UTPort*> Ports; // 端口集合 Dic不支持byte 所以用uint替代
|
||||
|
||||
bool PressTMsg(const BinaryPair& args, Stream& result);
|
||||
// Client.Register("UTPacket",&UTPacket::PressTMsg,this);
|
||||
#if DEBUG
|
||||
virtual String& ToStr(String& str) const;
|
||||
#endif
|
||||
|
||||
//UTPort * CreateUTPort(byte portid);
|
||||
|
||||
virtual void Show() const = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue