主机收到读写响应时,不用再次响应

This commit is contained in:
nnhy 2015-12-21 05:06:20 +00:00
parent ca69c35a8b
commit d72a15e8e3
3 changed files with 23 additions and 50 deletions

View File

@ -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)
{ {

View File

@ -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);
}; };

View File

@ -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无效