主机收到读写响应时,不用再次响应
This commit is contained in:
parent
ca69c35a8b
commit
d72a15e8e3
|
@ -1,6 +1,6 @@
|
||||||
#include "DataMessage.h"
|
#include "DataMessage.h"
|
||||||
|
|
||||||
DataMessage::DataMessage(const Message& msg, Stream& dest) : _Src(msg.ToStream()), _Dest(dest)
|
DataMessage::DataMessage(const Message& msg, Stream& dest) : _Src(msg.ToStream()), _Dest(&dest)
|
||||||
{
|
{
|
||||||
Offset = _Src.ReadEncodeInt();
|
Offset = _Src.ReadEncodeInt();
|
||||||
Length = 0;
|
Length = 0;
|
||||||
|
@ -20,9 +20,11 @@ bool DataMessage::ReadData(const DataStore& ds)
|
||||||
// 读取数据
|
// 读取数据
|
||||||
bool DataMessage::ReadData(const Array& bs)
|
bool DataMessage::ReadData(const Array& bs)
|
||||||
{
|
{
|
||||||
|
if(!_Dest) return false;
|
||||||
|
|
||||||
TS("DataMessage::ReadData");
|
TS("DataMessage::ReadData");
|
||||||
|
|
||||||
auto& ms = _Dest;
|
auto& ms = *_Dest;
|
||||||
int remain = bs.Length() - Offset;
|
int remain = bs.Length() - Offset;
|
||||||
if(remain < 0)
|
if(remain < 0)
|
||||||
{
|
{
|
||||||
|
@ -48,31 +50,31 @@ bool DataMessage::WriteData(DataStore& ds, bool withData)
|
||||||
TS("DataMessage::WriteData");
|
TS("DataMessage::WriteData");
|
||||||
|
|
||||||
Length = _Src.Remain();
|
Length = _Src.Remain();
|
||||||
if(!Write(ds.Data.Length() - Offset)) return false;
|
if(_Dest && !Write(ds.Data.Length() - Offset)) return false;
|
||||||
|
|
||||||
Array dat(_Src.Current(), Length);
|
Array dat(_Src.Current(), Length);
|
||||||
ds.Write(Offset, dat);
|
ds.Write(Offset, dat);
|
||||||
|
|
||||||
// 如果携带数据,则把这一段数据附加到后面
|
// 如果携带数据,则把这一段数据附加到后面
|
||||||
if(withData) _Dest.Write(ds.Data.GetBuffer(), Offset, Length);
|
if(_Dest && withData) _Dest->Write(ds.Data.GetBuffer(), Offset, Length);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 写入数据
|
// 写入数据
|
||||||
bool DataMessage::WriteData(Array& bs, bool withData)
|
bool DataMessage::WriteData(Array bs, bool withData)
|
||||||
{
|
{
|
||||||
TS("DataMessage::WriteData");
|
TS("DataMessage::WriteData");
|
||||||
|
|
||||||
// 剩余可写字节数
|
// 剩余可写字节数
|
||||||
Length = _Src.Remain();
|
Length = _Src.Remain();
|
||||||
if(!Write(bs.Length() - Offset)) return false;
|
if(_Dest && !Write(bs.Length() - Offset)) return false;
|
||||||
|
|
||||||
Array dat(_Src.Current(), Length);
|
Array dat(_Src.Current(), Length);
|
||||||
bs.Copy(dat, Offset);
|
bs.Copy(dat, Offset);
|
||||||
|
|
||||||
// 如果携带数据,则把这一段数据附加到后面
|
// 如果携带数据,则把这一段数据附加到后面
|
||||||
if(withData) _Dest.Write(bs.GetBuffer(), Offset, Length);
|
if(_Dest && withData) _Dest->Write(bs.GetBuffer(), Offset, Length);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +82,7 @@ bool DataMessage::WriteData(Array& bs, bool withData)
|
||||||
// 写入数据
|
// 写入数据
|
||||||
bool DataMessage::Write(int remain)
|
bool DataMessage::Write(int remain)
|
||||||
{
|
{
|
||||||
auto& ms = _Dest;
|
auto& ms = *_Dest;
|
||||||
// 剩余可写字节数
|
// 剩余可写字节数
|
||||||
if(remain < 0)
|
if(remain < 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,17 +12,18 @@ public:
|
||||||
uint Offset;
|
uint Offset;
|
||||||
uint Length;
|
uint Length;
|
||||||
|
|
||||||
|
DataMessage(const Message& msg);
|
||||||
DataMessage(const Message& msg, Stream& dest);
|
DataMessage(const Message& msg, Stream& dest);
|
||||||
|
|
||||||
bool ReadData(const DataStore& ds);
|
bool ReadData(const DataStore& ds);
|
||||||
bool WriteData(DataStore& ds, bool withData);
|
bool WriteData(DataStore& ds, bool withData);
|
||||||
|
|
||||||
bool ReadData(const Array& bs);
|
bool ReadData(const Array& bs);
|
||||||
bool WriteData(Array& bs, bool withData);
|
bool WriteData(Array bs, bool withData);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Stream _Src;
|
Stream _Src;
|
||||||
Stream& _Dest;
|
Stream* _Dest;
|
||||||
|
|
||||||
bool Write(int remain);
|
bool Write(int remain);
|
||||||
};
|
};
|
||||||
|
|
|
@ -124,19 +124,19 @@ bool TinyServer::OnReceive(TinyMessage& msg)
|
||||||
// 修改最后读取时间
|
// 修改最后读取时间
|
||||||
if(msg.Reply) dv->LastRead = Sys.Seconds();
|
if(msg.Reply) dv->LastRead = Sys.Seconds();
|
||||||
|
|
||||||
OnReadReply(msg, *dv);
|
if(msg.Reply) OnReadReply(msg, *dv);
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
// 系统指令不会被转发,这里修改为用户指令
|
// 系统指令不会被转发,这里修改为用户指令
|
||||||
msg.Code = 0x16;
|
msg.Code = 0x16;
|
||||||
case 0x16:
|
case 0x16:
|
||||||
if(!msg.Reply)
|
if(msg.Reply)
|
||||||
|
OnWriteReply(msg, *dv);
|
||||||
|
else
|
||||||
{
|
{
|
||||||
auto rs = msg.CreateReply();
|
auto rs = msg.CreateReply();
|
||||||
if(OnWrite(msg, rs, *dv)) Send(rs);
|
if(OnWrite(msg, rs, *dv)) Send(rs);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
OnWriteReply(msg, *dv);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -171,9 +171,6 @@ bool TinyServer::Dispatch(TinyMessage& msg)
|
||||||
bool rt = false; // 是否响应远程
|
bool rt = false; // 是否响应远程
|
||||||
bool fw = true; // 是否转发给本地
|
bool fw = true; // 是否转发给本地
|
||||||
|
|
||||||
// 响应消息不转发
|
|
||||||
//if(msg.Reply) fw = false;
|
|
||||||
|
|
||||||
auto rs = msg.CreateReply();
|
auto rs = msg.CreateReply();
|
||||||
|
|
||||||
// 缓存内存操作指令
|
// 缓存内存操作指令
|
||||||
|
@ -198,22 +195,10 @@ bool TinyServer::Dispatch(TinyMessage& msg)
|
||||||
}
|
}
|
||||||
case 6:
|
case 6:
|
||||||
case 0x16:
|
case 0x16:
|
||||||
{
|
|
||||||
/*auto now = Sys.Ms();
|
|
||||||
rt = OnWrite(msg, rs, *dv);
|
|
||||||
|
|
||||||
// 避免频繁写入。间隔毫秒数
|
|
||||||
if(dv->LastWrite + 500 < now)
|
|
||||||
dv->LastWrite = now;
|
|
||||||
else
|
|
||||||
fw = false;*/
|
|
||||||
rt = false;
|
rt = false;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//debug_printf("fw=%d \r\n", fw);
|
|
||||||
if(fw && !rs.Error)
|
if(fw && !rs.Error)
|
||||||
{
|
{
|
||||||
// 非休眠设备直接发送
|
// 非休眠设备直接发送
|
||||||
|
@ -539,15 +524,11 @@ bool TinyServer::OnWrite(const Message& msg, Message& rs, Device& dv)
|
||||||
|
|
||||||
bool rt = true;
|
bool rt = true;
|
||||||
if(dm.Offset < 64)
|
if(dm.Offset < 64)
|
||||||
{
|
rt = dm.WriteData(dv.GetStore(), false);
|
||||||
auto bs = dv.GetStore();
|
|
||||||
rt = dm.WriteData(bs, false);
|
|
||||||
}
|
|
||||||
else if(dm.Offset < 128)
|
else if(dm.Offset < 128)
|
||||||
{
|
{
|
||||||
dm.Offset -= 64;
|
dm.Offset -= 64;
|
||||||
auto bs = dv.GetConfig();
|
rt = dm.WriteData(dv.GetConfig(), false);
|
||||||
rt = dm.WriteData(bs, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rs.Error = !rt;
|
rs.Error = !rt;
|
||||||
|
@ -575,28 +556,17 @@ bool TinyServer::OnWriteReply(const Message& msg, Device& dv)
|
||||||
|
|
||||||
TS("TinyServer::OnWriteReply");
|
TS("TinyServer::OnWriteReply");
|
||||||
|
|
||||||
auto rs = ((TinyMessage&)msg).CreateReply();
|
DataMessage dm(msg);
|
||||||
auto ms = rs.ToStream();
|
|
||||||
|
|
||||||
DataMessage dm(msg, ms);
|
|
||||||
|
|
||||||
bool rt = true;
|
|
||||||
if(dm.Offset < 64)
|
if(dm.Offset < 64)
|
||||||
{
|
dm.WriteData(dv.GetStore(), false);
|
||||||
auto bs = dv.GetStore();
|
|
||||||
rt = dm.WriteData(bs, false);
|
|
||||||
}
|
|
||||||
else if(dm.Offset < 128)
|
else if(dm.Offset < 128)
|
||||||
{
|
{
|
||||||
dm.Offset -= 64;
|
dm.Offset -= 64;
|
||||||
auto bs = dv.GetConfig();
|
dm.WriteData(dv.GetConfig(), false);
|
||||||
rt = dm.WriteData(bs, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rs.Error = !rt;
|
return true;
|
||||||
rs.Length = ms.Position();
|
|
||||||
|
|
||||||
return Send(rs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//设置zigbee的通道,2401无效
|
//设置zigbee的通道,2401无效
|
||||||
|
|
Loading…
Reference in New Issue