//------------------------------------------------------------------------------
// 此代码版权声明为全文件覆盖,如有原作者特别声明,会在下方手动补充
// 此代码版权(除特别声明外的代码)归作者本人Diego所有
// 源代码使用协议遵循本仓库的开源协议及附加协议
// Gitee源代码仓库:https://gitee.com/diego2098/ThingsGateway
// Github源代码仓库:https://github.com/kimdiego2098/ThingsGateway
// 使用文档:https://thingsgateway.cn/
// QQ群:605534569
//------------------------------------------------------------------------------
using Newtonsoft.Json.Linq;
namespace ThingsGateway.Foundation;
///
/// 协议设备接口
///
public interface IDevice : IDisposable, IDisposableObject
{
#region 属性
///
/// 通道
///
IChannel Channel { get; }
///
/// 日志
///
ILog? Logger { get; }
///
bool OnLine { get; }
///
/// 一个寄存器所占的字节长度
///
int RegisterByteLength { get; }
///
/// 发送前延时
///
int SendDelayTime { get; set; }
///
/// 数据解析规则
///
IThingsGatewayBitConverter ThingsGatewayBitConverter { get; }
///
/// 读写超时时间
///
int Timeout { get; set; }
///
/// 字节顺序
///
DataFormatEnum DataFormat { get; set; }
///
/// 字符串翻转
///
bool IsStringReverseByteWord { get; set; }
bool AutoConnect { get; }
#endregion 属性
#region 适配器
///
/// 获取新的适配器实例
///
DataHandlingAdapter GetDataAdapter();
#endregion 适配器
#region 变量地址解析
///
/// 寄存器地址的详细说明
///
///
string GetAddressDescription();
///
/// 获取变量地址对应的bit偏移,默认0
///
/// 变量地址
///
int GetBitOffsetDefault(string address);
///
/// 获取变量地址对应的bit偏移
///
/// 变量地址
///
int? GetBitOffset(string address);
///
/// 获取数据类型对应的寄存器长度
///
/// 寄存器地址
/// 读取数量
/// 读取数据类型对应的字节长度
/// 是否按布尔解析
///
int GetLength(string address, int length, int typeLength, bool isBool = false);
///
/// 连读寄存器打包
///
List LoadSourceRead(IEnumerable deviceVariables, int maxPack, string defaultIntervalTime) where T : IVariableSource, new();
#endregion 变量地址解析
#region 动态类型读写
///
/// 通过数据类型,获取对应的类型值
///
/// 变量地址
/// 读取长度
/// 数据类型
/// 取消令箭
///
ValueTask> ReadAsync(string address, int length, DataTypeEnum dataType, CancellationToken cancellationToken = default);
///
/// 根据数据类型,写入类型值
///
/// 变量地址
/// 值
/// 数据类型
/// 取消令箭
///
ValueTask WriteAsync(string address, JToken value, DataTypeEnum dataType, CancellationToken cancellationToken = default);
#endregion 动态类型读写
#region 读取
///
/// 批量读取字节数组信息,需要指定地址和长度
///
/// 变量地址
/// 读取寄存器数量,对于不同PLC,对应的字节数量可能不一样
/// 取消令箭
///
ValueTask> ReadAsync(string address, int length, CancellationToken cancellationToken = default);
///
/// 读取布尔量数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadBooleanAsync(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取Double数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadDoubleAsync(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取Int16数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadInt16Async(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取Int32数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadInt32Async(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取Int64数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadInt64Async(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取Single数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadSingleAsync(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取String
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadStringAsync(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取UInt16数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadUInt16Async(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取UInt32数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadUInt32Async(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 读取UInt32数组
///
/// 变量地址
/// 读取长度
/// 转换规则
/// 取消令箭
///
ValueTask> ReadUInt64Async(string address, int length, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
#endregion 读取
#region 写入
///
/// 写入原始的byte数组数据到指定的地址,返回结果
///
ValueTask WriteAsync(string address, byte[] value, DataTypeEnum dataType, CancellationToken cancellationToken = default);
///
/// 写入bool数组数据,返回结果
///
ValueTask WriteAsync(string address, bool[] value, CancellationToken cancellationToken = default);
///
/// 写入bool数据,返回结果
///
ValueTask WriteAsync(string address, bool value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入byte数据,返回结果
///
ValueTask WriteAsync(string address, byte value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入short数据,返回结果
///
ValueTask WriteAsync(string address, short value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入ushort数据,返回结果
///
ValueTask WriteAsync(string address, ushort value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入int数据,返回结果
///
ValueTask WriteAsync(string address, int value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入uint数据,返回结果
///
ValueTask WriteAsync(string address, uint value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入long数据,返回结果
///
ValueTask WriteAsync(string address, long value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入ulong数据,返回结果
///
ValueTask WriteAsync(string address, ulong value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入float数据,返回结果
///
ValueTask WriteAsync(string address, float value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入double数据,返回结果
///
ValueTask WriteAsync(string address, double value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入string数据,返回结果
///
ValueTask WriteAsync(string address, string value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
#endregion 写入
#region 写入数组
///
/// 写入String数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, string[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入Double数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, double[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入Single数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, float[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入Int32数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, int[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入Int64数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, long[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入Int16数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, short[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入UInt32数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, uint[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入UInt64数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, ulong[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
///
/// 写入UInt16数组
///
/// 变量地址
/// 值
/// 转换规则
/// 取消令箭
/// 写入结果
ValueTask WriteAsync(string address, ushort[] value, IThingsGatewayBitConverter bitConverter = null, CancellationToken cancellationToken = default);
#endregion 写入数组
///
/// 布尔量解析时是否需要按字反转
///
/// 变量地址
///
bool BitReverse(string address);
///
/// 配置IPluginManager
///
Action ConfigurePlugins(TouchSocketConfig config);
///
/// 获取通道
///
///
///
ValueTask> GetChannelAsync(string socketId);
///
/// 发送,会经过适配器,可传入socketId,如果为空,则默认通道必须为类型
///
/// 发送字节数组
/// 取消令箭
/// 返回消息体
ValueTask SendAsync(ISendMessage sendMessage, CancellationToken cancellationToken);
///
/// 发送并等待返回,会经过适配器,可传入,如果为空,则默认通道必须为类型
///
/// 发送字节数组
/// 取消令箭
/// 通道
/// 返回消息体
ValueTask> SendThenReturnAsync(ISendMessage command, IClientChannel channel = default, CancellationToken cancellationToken = default);
///
/// 发送并等待返回,会经过适配器,可传入socketId,如果为空,则默认通道必须为类型
///
/// 发送字节数组
/// 取消令箭
/// 返回消息体
ValueTask> SendThenReturnAsync(ISendMessage sendMessage, CancellationToken cancellationToken = default);
///
/// 支持通道多设备
///
///
bool SupportMultipleDevice();
///
/// 初始化通道信息
///
/// 通道
/// 单独设备日志
void InitChannel(IChannel channel, ILog? deviceLog = null);
ValueTask> ReadAsync(object state, CancellationToken cancellationToken = default);
Task ConnectAsync(CancellationToken token);
}