using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FObjBase;
using static FLY.Thick.BulkDataModule.BulkDataService;
using System.Collections.Specialized;
namespace FLY.Thick.BulkDataModule
{
///
/// 功能
/// 1. 获取横向扫描图,变化时推送变化量
/// 3. 获取指定分区范围的纵向趋势图,变化时推送变化量
/// 5. 获取 幅信息(基本没用)
/// 6. 删去全部数据
///
public class BULKDATA_OBJ_INTERFACE
{
public const UInt32 ID = 0x003C0001;
#region Pack
public class Pack_CallPushNewFrameDataParam : IPack
{
public int mix;//混合数
#region IPack 成员
public virtual byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(mix));
return buf.ToArray();
}
public virtual bool TryParse(byte[] value)
{
int count = 4;
if (value.Length < count)
return false;
int idx = 0;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
return true;
}
#endregion
}
public class Pack_CallPushNewFrameDataReturn : Pack_CallPushNewFrameDataParam
{
//输出
public int bookmark = -1;//结果对应的 bookmark
public DateTime dt = DateTime.MinValue;//结果对应的 时间
public FR_DATA_TYPE type = FR_DATA_TYPE.INVALID;//结果.数据是否有效
public int[] result = null;//结果, 当needPush=true, 以后推送时,只发送变化了的数据
#region IPack 成员
public override byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(mix));
buf.AddRange(BitConverter.GetBytes(bookmark));
buf.AddRange(BitConverter.GetBytes(dt.Ticks));
buf.Add((byte)type);
int len=0;
if (result != null)
len = result.Length;
buf.AddRange(BitConverter.GetBytes(len));
if(len>0)
{
foreach (int dat in result)
buf.AddRange(BitConverter.GetBytes(dat));
}
return buf.ToArray();
}
public override bool TryParse(byte[] value)
{
int count = 4 + 4 + 8 + 1 + 4;
if (value.Length < count)
return false;
int idx = 0;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
bookmark = BitConverter.ToInt32(value, idx);
idx += 4;
dt = new DateTime(BitConverter.ToInt64(value, idx));
idx += 8;
type = (FR_DATA_TYPE)value[idx];
idx += 1;
int length = BitConverter.ToInt32(value, idx);
idx += 4;
count += length * 4;
if (value.Length < count)
return false;
if (length > 0)
{
result = new int[length];
for (int i = 0; i < length; i++)
{
result[i] = BitConverter.ToInt32(value, idx);
idx += 4;
}
}
else
{
result = null;
}
return true;
}
#endregion
}
public class Pack_CallClosePushNewFrameData : Pack_CallPushNewFrameDataParam
{
}
public class Pack_CallGetFrameDataParam : Pack_CallClosePushFrameData
{
public bool NeedPush;//当数据变化时,是否需要推送
#region IPack 成员
public override byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(NeedPush));
buf.AddRange(BitConverter.GetBytes(bm));
buf.AddRange(BitConverter.GetBytes(mix));
return buf.ToArray();
}
public override bool TryParse(byte[] value)
{
if (value == null)
return false;
//TODO
int count = 9;
if (value.Length < count)
return false;
int idx = 0;
NeedPush = BitConverter.ToBoolean(value, idx);
idx += 1;
bm = BitConverter.ToInt32(value, idx);
idx += 4;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
return true;
}
#endregion
}
public class Pack_CallGetFrameDataReturn : Pack_CallGetFrameDataParam
{
//输出
public int bookmark = -1;//结果对应的 bookmark
public DateTime dt = DateTime.MinValue;//结果对应的 时间
public int fromBoltIndex = 0;//开始分区index
public int toBoltIndex = 0;//结束分区index
public FR_DATA_TYPE type = FR_DATA_TYPE.INVALID;//结果.数据是否有效
public int[] result = null;//结果, 当needPush=true, 以后推送时,只发送变化了的数据
#region IPack 成员
public override byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(NeedPush));//1
buf.AddRange(BitConverter.GetBytes(bm));//2
buf.AddRange(BitConverter.GetBytes(mix));//3
buf.AddRange(BitConverter.GetBytes(bookmark));//4
buf.AddRange(BitConverter.GetBytes(dt.Ticks));//5
buf.AddRange(BitConverter.GetBytes(fromBoltIndex));//6
buf.AddRange(BitConverter.GetBytes(toBoltIndex));//7
buf.Add((byte)type);//8
if (result != null)
{
buf.AddRange(BitConverter.GetBytes((int)result.Length));//9
foreach (int dat in result)
buf.AddRange(BitConverter.GetBytes(dat));
}
else
{
buf.AddRange(BitConverter.GetBytes((int)0));//9
}
return buf.ToArray();
}
public override bool TryParse(byte[] value)
{
int count = 1 + 4 * 2+ 4 + 8+ 4*2 + 1 + 4;
if (value.Length < count)
return false;
int idx = 0;
NeedPush = BitConverter.ToBoolean(value, idx);//1
idx++;
bm = BitConverter.ToInt32(value, idx);//2
idx += 4;
mix = BitConverter.ToInt32(value, idx);//3
idx += 4;
bookmark = BitConverter.ToInt32(value, idx);//4
idx += 4;
dt = new DateTime(BitConverter.ToInt64(value, idx));//5
idx += 8;
fromBoltIndex = BitConverter.ToInt32(value, idx);//6
idx += 4;
toBoltIndex = BitConverter.ToInt32(value, idx);//7
idx += 4;
type = (FR_DATA_TYPE)value[idx];//8
idx += 1;
int length = BitConverter.ToInt32(value, idx);//9
idx += 4;
count += length * 4;
if (value.Length < count)
return false;
if (length > 0)
{
result = new int[length];
for (int i = 0; i < length; i++)
{
result[i] = BitConverter.ToInt32(value, idx);
idx += 4;
}
}
else
{
result = null;
}
return true;
}
#endregion
}
public class Pack_CallClosePushFrameData : IPack
{
public int bm;//标记, 当bm>0 为bookmark,当bm <=0 为往前面数
public int mix;//混合数
#region IPack 成员
public virtual byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(bm));
buf.AddRange(BitConverter.GetBytes(mix));
return buf.ToArray();
}
public virtual bool TryParse(byte[] value)
{
int count = 8;
if (value.Length < count)
return false;
int idx = 0;
bm = BitConverter.ToInt32(value, idx);
idx += 4;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
return true;
}
#endregion
}
public class Pack_CallGetTrendDataParam : Pack_CallClosePushTrendData
{
public bool NeedPush;//当数据变化时,是否需要推送
public int len;//获取的长度
#region IPack 成员
public override byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(NeedPush));
buf.AddRange(BitConverter.GetBytes(len));
buf.AddRange(BitConverter.GetBytes(mix));
buf.AddRange(BitConverter.GetBytes(fromBoltNo));
buf.AddRange(BitConverter.GetBytes(toBoltNo));
return buf.ToArray();
}
public override bool TryParse(byte[] value)
{
int count = 1+4*4;
if (value.Length < count)
return false;
int idx = 0;
NeedPush = BitConverter.ToBoolean(value, idx);
idx++;
len = BitConverter.ToInt32(value, idx);
idx += 4;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
fromBoltNo = BitConverter.ToInt32(value, idx);
idx += 4;
toBoltNo = BitConverter.ToInt32(value, idx);
idx += 4;
return true;
}
#endregion
}
public class Pack_CallGetTrendDataReturn : Pack_CallGetTrendDataParam
{
//输出
///
/// 结果修改的位置; 1 在上一次数据最后一位的后面添加; 0 在上一次数据最后一位 开始修改;
///
public int edit_position = 1;
public TrendDataCell[] result = null;//结果,当 长度=0,数据被清空!!
#region IPack 成员
public override byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(NeedPush));
buf.AddRange(BitConverter.GetBytes(len));
buf.AddRange(BitConverter.GetBytes(mix));
buf.AddRange(BitConverter.GetBytes(fromBoltNo));
buf.AddRange(BitConverter.GetBytes(toBoltNo));
buf.AddRange(BitConverter.GetBytes(edit_position));
if (result != null)
{
buf.AddRange(BitConverter.GetBytes((int)result.Length));
foreach (TrendDataCell dat in result)
buf.AddRange(dat.ToBytes());
}
else
{
buf.AddRange(BitConverter.GetBytes((int)0));
}
return buf.ToArray();
}
public override bool TryParse(byte[] value)
{
int count = 1 + 4 * 6;
if (value.Length < count)
return false;
int idx = 0;
NeedPush = BitConverter.ToBoolean(value, idx);
idx++;
len = BitConverter.ToInt32(value, idx);
idx += 4;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
fromBoltNo = BitConverter.ToInt32(value, idx);
idx += 4;
toBoltNo = BitConverter.ToInt32(value, idx);
idx += 4;
edit_position = BitConverter.ToInt32(value, idx);
idx += 4;
int length = BitConverter.ToInt32(value, idx);
idx += 4;
count += length * 20;
if (value.Length < count)
return false;
if (length > 0)
{
result = new TrendDataCell[length];
for (int i = 0; i < length; i++)
{
result[i] = new TrendDataCell();
if (!result[i].TryParse(value, idx))
{
return false;
}
idx += 20;
}
}
else
{
result = null;
}
return true;
}
#endregion
}
public class Pack_CallClosePushTrendData : IPack
{
public int mix;//混合数
public int fromBoltNo;//开始分区index
public int toBoltNo;//结束分区index
#region IPack 成员
public virtual byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(mix));
buf.AddRange(BitConverter.GetBytes(fromBoltNo));
buf.AddRange(BitConverter.GetBytes(toBoltNo));
return buf.ToArray();
}
public virtual bool TryParse(byte[] value)
{
int count = 3 * 4;
if (value.Length < count)
return false;
int idx = 0;
mix = BitConverter.ToInt32(value, idx);
idx += 4;
fromBoltNo = BitConverter.ToInt32(value, idx);
idx += 4;
toBoltNo = BitConverter.ToInt32(value, idx);
idx += 4;
return true;
}
#endregion
}
public class Pack_CallGetListReponse : IPack2
{
public List list = new List();
#region IPack 成员
public virtual byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(list.Count));
for (int i = 0; i < list.Count; i++)
{
buf.AddRange(list[i].ToBytes());
}
return buf.ToArray();
}
public bool TryParse(byte[] value)
{
int cnt;
return TryParse(value, 0, out cnt);
}
public bool TryParse(byte[] value, int index, out int cnt)
{
cnt = 4;
if (value.Length < (index + cnt))
return false;
int idx = index;
int len = BitConverter.ToInt32(value, idx);
idx += 4;
list.Clear();
if (len <= 0)
{
return true;
}
for (int i = 0; i < len; i++)
{
int c;
FR_DATA t = new FR_DATA();
if (!t.TryParse(value, idx, out c))
return false;
list.Add(t);
idx += c;
cnt += c;
}
return true;
}
#endregion
}
public class Pack_PushChanged : IPack2
{
public NotifyDatasChangedAction Action;
public FR_DATA data;
#region IPack 成员
public virtual byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes((int)Action));
if (data == null)
data = new FR_DATA();
buf.AddRange(data.ToBytes());
return buf.ToArray();
}
public bool TryParse(byte[] value)
{
int cnt;
return TryParse(value, 0, out cnt);
}
public bool TryParse(byte[] value, int index, out int cnt)
{
cnt = 4;
if (value.Length < (index + cnt))
return false;
int idx = index;
Action = (NotifyDatasChangedAction)BitConverter.ToInt32(value, idx);
idx += 4;
int c;
FR_DATA t = new FR_DATA();
if (!t.TryParse(value, idx, out c))
return false;
idx += c;
cnt += c;
data = t;
return true;
}
#endregion
}
public class Pack_Params
{
public int count;
public int currentbookmark;
public int nbolts;
public int boltNo1st;
#region IPack实现
public byte[] ToBytes()
{
List buf = new List();
buf.AddRange(BitConverter.GetBytes(count));
buf.AddRange(BitConverter.GetBytes(currentbookmark));
buf.AddRange(BitConverter.GetBytes(nbolts));
buf.AddRange(BitConverter.GetBytes(boltNo1st));
return buf.ToArray();
}
public bool TryParse(byte[] value)
{
int cnt = 4*4;
if (value.Length < cnt)
return false;
int idx = 0;
count = BitConverter.ToInt32(value, idx);
idx += 4;
currentbookmark = BitConverter.ToInt32(value, idx);
idx += 4;
nbolts = BitConverter.ToInt32(value, idx);
idx += 4;
boltNo1st = BitConverter.ToInt32(value, idx);
idx += 4;
return true;
}
#endregion
}
#endregion
#region GET/SET/CALL/PUSH
#region GET
///
/// Pack_Params
///
public const UInt16 GET_PARAMS = 15;
#endregion
#region CALL
///
/// Pack_CallGetFrameDataParam
/// Pack_CallGetFrameDataReturn
///
public const UInt16 CALL_GET_FRAMEDATA = 1;//横向
///
/// Pack_CallClosePushFrameData
///
public const UInt16 CALL_CLOSE_PUSH_FRAMEDATA = 2;//关闭推送
///
/// param:Pack_CallGetTrendDataParam;
/// return:Pack_CallGetTrendDataReturn
///
public const UInt16 CALL_GET_TRENDDATA = 3;//获取指定分区范围的纵向趋势图
///
/// Pack_CallClosePushTrendData
///
public const UInt16 CALL_CLOSE_PUSH_TRENDDATA = 4;//关闭推送
///
/// no pack
///
public const UInt16 CALL_CLEAR = 6;//清空
///
/// Pack_CallPushNewFrameDataParam
/// Pack_CallPushNewFrameDataReturn
///
public const UInt16 CALL_PUSH_NEWFRAMEDATA = 7;//横向
///
/// Pack_CallClosePushNewFrameData
///
public const UInt16 CALL_CLOSE_PUSH_NEWFRAMEDATA = 8;//关闭推送
///
/// Pack_CallGetFrameDataMixRequest
/// Pack_CallGetFrameDataMixReponse
///
public const UInt16 CALL_GET_FRAMEDATAMIX = 9;//横向
///
/// Pack_CallClosePushFrameDataMixRequest
///
public const UInt16 CALL_CLOSE_PUSH_FRAMEDATAMIX = 10;//关闭推送
///
/// 获取最新的10幅数据
/// Reponse: Pack_CallGetListReponse < FR_DATA >
///
public const UInt16 CALL_GET_LIST_NEW_10 = 11;
///
/// 获取最新的10幅数据其它数据
/// Reponse: Pack_CallGetListReponse < FR_DATA >
///
public const UInt16 CALL_GET_LIST_OTHER = 12;
#endregion
#region PUSH
//永远没有push,用callfunction 推送回去
///
/// Pack_Params
///
public const UInt16 PUSH_PARAMS = 15;
///
/// Reponse: FR_DATA
///
public const UInt16 PUSH_CHANGED = 16;
#endregion
#endregion
}
}