/// <summary> /// Provide default execution function. Might be overwritten in command classes. /// </summary> /// <param name="parameter"></param> /// <returns></returns> public virtual IEECommandResult Execute(IEECommandParameter parameter) { if (parameter is TParamClass) { EECmdResultCode result = ProtocolCallbacks.SendReceive(parameter, out byte[] response); return(CreateResult(result, response, parameter)); } else { return(CreateResult(EECmdResultCode.InvalidParamClass, null, null)); } }
public override IEECommandResult Execute(IEECommandParameter parameter) { if (parameter is UploadBlockCmdParams uploadParams) { // Send command with payload (right after cmd CRC) EECmdResultCode result = ProtocolCallbacks.SendReceive(parameter, out byte[] response, uploadParams.BlockData); return(CreateResult(result, response, parameter)); } else { return(CreateResult(EECmdResultCode.InvalidParamClass, null, null)); } }
/// <summary> /// Provide default result function. Might be overwritten in command classes. /// </summary> /// <param name="cmdResultCode"></param> /// <param name="cmdResponse"></param> /// <returns></returns> protected virtual IEECommandResult CreateResult(EECmdResultCode cmdResultCode, byte[] cmdResponse, IEECommandParameter cmdParams) { EECmdResultBase result = new TResultClass() as EECmdResultBase; // Set properties that might be needed to interpret command result result.Code = cmdResultCode; result.Data = cmdResponse; // Commands have the chance to interpret the result data (in case of {ACK}/Success) if (cmdResultCode == EECmdResultCode.Success) { result.InterpretResult(ProtocolCallbacks.LookupOrCreateCmdSpecialTreatment(cmdParams.Cmd).ReverseByteOrder.Value, ProtocolConverters, cmdParams); } return(result); }
// Override CreateResult because we might have different results based on output type protected override IEECommandResult CreateResult(EECmdResultCode cmdResultCode, byte[] cmdResponse, IEECommandParameter cmdParams) { if (cmdResultCode == EECmdResultCode.Success) { if (cmdResponse.Length < 2) { return new EECmdResultBase() { Code = EECmdResultCode.InvalidResult } } ; EECmdResultBase result = null; // Fist byte is always 0. Second is output mode. // Based on output mode we create the correct result class. OutputMode outputMode = (OutputMode)cmdResponse[1]; switch (outputMode) { case OutputMode.Inactive: result = new GetOutputConfigCmdResultBase(outputMode); break; case OutputMode.Current: case OutputMode.Voltage: result = new GetOutputConfigCmdResult_Analog(outputMode); break; case OutputMode.Relais_Hysteresis: case OutputMode.Relais_Window: case OutputMode.Relais_ErrorIndication: result = new GetOutputConfigCmdResult_Relais(outputMode); break; case OutputMode.Pulse: result = new GetOutputConfigCmdResult_Pulse(outputMode); break; } if (result != null) { result.Code = cmdResultCode; result.Data = cmdResponse; result.InterpretResult(ProtocolCallbacks.LookupOrCreateCmdSpecialTreatment(cmdParams.Cmd).ReverseByteOrder.Value, ProtocolConverters, cmdParams); } else { return new EECmdResultBase() { Code = EECmdResultCode.InvalidResult } }; return(result); } else { return(new EECmdResultBase() { Code = cmdResultCode }); } } }