using static InnovEnergy.Lib.Protocols.Modbus.Protocol.FunctionCode;

namespace InnovEnergy.Lib.Protocols.Modbus.Protocol;

[Flags]
public enum FunctionCode : byte
{
    ReadCoils                  =  1,   
    ReadDiscreteInputs         =  2,   
    ReadHoldingRegisters       =  3,   
    ReadInputRegisters         =  4,   
                                                                               
    WriteSingleCoil            =  5,   
    WriteSingleRegister        =  6,   
    WriteMultipleCoils         = 15,   
    WriteMultipleRegisters     = 16,    
                                                                                
    ReadWriteMultipleRegisters = 23,

    Error = 128
}


public static class FunctionCodeExtensions
{

    public static Boolean IsWriteOnly(this FunctionCode fc)
    {
        return fc is WriteSingleCoil 
                  or WriteSingleRegister 
                  or WriteMultipleCoils 
                  or WriteMultipleRegisters;
    }

    public static Boolean IsMultiWrite(this FunctionCode fc)
    {
        return fc is WriteMultipleCoils 
                  or WriteMultipleRegisters 
                  or ReadWriteMultipleRegisters;
    }

    public static Boolean IsError(this FunctionCode fc)
    {
        return fc >= FunctionCode.Error;
    }


    // ReSharper disable once BitwiseOperatorOnEnumWithoutFlags
    public static FunctionCode Error(this FunctionCode fc)
    {
        return fc | FunctionCode.Error;
    }

}