/// <summary>
        /// Get Datasafe Blade power state
        /// </summary>
        /// <param name="bladeId">Blade ID(1-48)</param>
        /// <returns>Blade state response class object</returns>
        public DatasafeBladePowerStateResponse GetBladeDatasafePowerState(int bladeId)
        {
            Tracer.WriteInfo("Received GetBladeDatasafePowerState({0})", bladeId);

            Tracer.WriteUserLog("Invoked GetBladeDatasafePowerState(bladeid: {0})", bladeId);

            DatasafeBladePowerStateResponse stateResponse = new DatasafeBladePowerStateResponse();
            stateResponse.bladeNumber = bladeId;
            stateResponse.isDatasafeBackupInProgress = false;
            stateResponse.bladePowerState = Contracts.PowerState.NA;
            stateResponse.completionCode = Contracts.CompletionCode.Unknown;
            stateResponse.statusDescription = String.Empty;

            if (!ConfigLoaded.DatasafeOperationsEnabled)
            {
                Tracer.WriteInfo("GetBladeDatasafePowerState: User requested API not enabled in app.config");
                stateResponse.completionCode = Contracts.CompletionCode.CommandNotValidAtThisTime;
                stateResponse.statusDescription = "Datasafe commands are not enabled for this blade";
                return stateResponse;
            }

            Contracts.ChassisResponse varResponse = ValidateRequest("GetBladeDatasafePowerState", bladeId);
            if (varResponse.completionCode != Contracts.CompletionCode.Success)
            {
                stateResponse.completionCode = varResponse.completionCode;
                stateResponse.statusDescription = varResponse.statusDescription;
                return stateResponse;
            }

            // Check to see if the blade enable itself is OFF - then the BMC power state does not matter
            BladePowerStatePacket response = ChassisState.BladePower[bladeId - 1].GetBladePowerState();

            if (response.CompletionCode != CompletionCode.Success)
            {
                // No return here, because we still want to return a BMC state on the fall through,
                // if Blade enable read fails for whatever reason
                Tracer.WriteWarning("GetBladeDatasafePowerState: Blade {0} Power Enable state read failed (Completion Code: {1:X})",
                    bladeId, response.CompletionCode);
                stateResponse.completionCode =
                    ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)response.CompletionCode);
                stateResponse.statusDescription = stateResponse.completionCode.ToString();
            }
            else
            {
                // Only if the blade enable is OFF, we return that status, for anything else we have to read BMC status
                if (response.BladePowerState == (byte)Contracts.PowerState.OFF)
                {
                    // Since we do not know if a blade is present in that slot or not, we return NA as power state
                    // TODO: This was supposed to return OFF status, and not NA
                    stateResponse.bladePowerState = Contracts.PowerState.NA;

                    stateResponse.completionCode = Contracts.CompletionCode.Success;

                    return stateResponse;
                }
            }

            Ipmi.SystemStatus powerState = WcsBladeFacade.GetChassisState((byte)bladeId);
            Tracer.WriteInfo("Return: {0}, Blade State: {1}", powerState.CompletionCode, powerState.PowerState.ToString());

            if (powerState.CompletionCode != (byte)CompletionCode.Success)
            {
                Tracer.WriteError("GetBladeState Failed with Completion code {0:X}", powerState.CompletionCode);
                stateResponse.bladePowerState = Contracts.PowerState.NA;
                stateResponse.completionCode =
                    ChassisManagerUtil.GetContractsCompletionCodeMapping((byte)powerState.CompletionCode);
                stateResponse.statusDescription = stateResponse.completionCode.ToString();
                return stateResponse;
            }
            else // if success
            {
                stateResponse.completionCode = Contracts.CompletionCode.Success;
                if (powerState.PowerState == Ipmi.IpmiPowerState.On)
                {
                    stateResponse.bladePowerState = Contracts.PowerState.ON;
                }
                else
                {
                    stateResponse.bladePowerState = Contracts.PowerState.OFF;
                }
            }

            DatasafeBladeStatus datasafeResponse = DatasafeOperationSupport.ProcessDatasafeAction(bladeId, DatasafeActions.DoNothing);

            if (datasafeResponse == null)
            {
                stateResponse.completionCode = Contracts.CompletionCode.Failure;
                stateResponse.statusDescription = Contracts.CompletionCode.Failure.ToString();
                return stateResponse;
            }

            stateResponse.isDatasafeBackupInProgress = datasafeResponse.isBackupPending;
            if (datasafeResponse.isBackupPending)
            {
                stateResponse.RemainingDataSafeDurationInSecs = datasafeResponse.remainingBackupDuration;
            }
            else
            {
                stateResponse.RemainingDataSafeDurationInSecs = 0;
            }
            if (datasafeResponse.status == DatasafeCommandsReturnStatus.CommandExecuted)
            {
                stateResponse.completionCode = Contracts.CompletionCode.Success;
            }
            else
            {
                stateResponse.completionCode = Contracts.CompletionCode.Failure;
                stateResponse.statusDescription = stateResponse.completionCode.ToString();
            }

            return stateResponse;
        }
        /// <summary>
        /// command specific implementation 
        /// argVal command class member has all user-entered command argument indicators and parameter values
        /// Currently just prints all argument indicators and argument values
        /// </summary>
        internal override void commandImplementation()
        {
            DatasafeBladePowerStateResponse myResponse = new DatasafeBladePowerStateResponse();
            DatasafeAllBladesPowerStateResponse myResponses = new DatasafeAllBladesPowerStateResponse();

            try
            {
                if (this.argVal.ContainsKey('a'))
                {
                    myResponses = WcsCli2CmConnectionManager.channel.GetAllBladesDatasafePowerState();
                }

                else if (this.argVal.ContainsKey('i'))
                {
                    dynamic bladeId = null;
                    if (this.argVal.TryGetValue('i', out bladeId))
                    {
                        myResponse = WcsCli2CmConnectionManager.channel.GetBladeDatasafePowerState((int)bladeId);
                    }
                    else
                    {
                        Console.WriteLine(WcsCliConstants.commandFailure +
                            " No blade ID specified, please look at command help");
                        return;
                    }
                }
            }
            catch (Exception ex)
            {
                SharedFunc.ExceptionOutput(ex);
                return;
            }

            if ((this.argVal.ContainsKey('a') && myResponses == null) || (this.argVal.ContainsKey('a') &&
                myResponses.datasafeBladePowerStateResponseCollection == null) || myResponse == null)
            {
                Console.WriteLine(WcsCliConstants.serviceResponseEmpty);
                return;
            }

            if (this.argVal.ContainsKey('a'))
            {
                foreach (var response in myResponses.datasafeBladePowerStateResponseCollection)
                {
                    if (ResponseValidation.ValidateBladeResponse(response.bladeNumber, null, response, false))
                    {
                        Console.WriteLine(WcsCliConstants.commandSuccess + " DataSafe blade power state = " + response.bladePowerState);
                        Console.WriteLine("DataSafe power backup in progress?: " + response.isDatasafeBackupInProgress);
                    }
                }
            }
            else
            {
                if (ResponseValidation.ValidateBladeResponse(myResponse.bladeNumber, null, myResponse, false))
                {
                    Console.WriteLine(WcsCliConstants.commandSuccess + string.Format(" DataSafe blade power state = " + myResponse.bladePowerState));
                    Console.WriteLine("DataSafe power backup in progress?: " + myResponse.isDatasafeBackupInProgress);
                }
            }
        }