using System;
namespace NModbus.Device
{
///
/// Base class for
///
/// The type of request to handle.
public abstract class ModbusFunctionServiceBase : IModbusFunctionService
where TRequest : class
{
private readonly byte _functionCode;
protected ModbusFunctionServiceBase(byte functionCode)
{
_functionCode = functionCode;
}
public byte FunctionCode => _functionCode;
public abstract IModbusMessage CreateRequest(byte[] frame);
public IModbusMessage HandleSlaveRequest(IModbusMessage request, ISlaveDataStore dataStore)
{
//Attempt to cast the message
TRequest typedRequest = request as TRequest;
if (typedRequest == null)
throw new InvalidOperationException($"Unable to cast request of type '{request.GetType().Name}' to type '{typeof(TRequest).Name}");
//Do the implementation specific logic
return Handle(typedRequest, dataStore);
}
public abstract int GetRtuRequestBytesToRead(byte[] frameStart);
public abstract int GetRtuResponseBytesToRead(byte[] frameStart);
protected abstract IModbusMessage Handle(TRequest request, ISlaveDataStore dataStore);
protected static T CreateModbusMessage(byte[] frame)
where T : IModbusMessage, new()
{
IModbusMessage message = new T();
message.Initialize(frame);
return (T)message;
}
}
}