public byte ExecuteCommand(DeviceCommands deviceCommand) { return(ExceptionExtensions.ExecuteFunction(_logger, () => { CanExecuteCommand(deviceCommand); byte[] sendBuffer = new byte[1], receiveBuffer = new byte[1]; sendBuffer[0] = (byte)deviceCommand; if (_logger.IsTraceEnabled) { _logger.TraceFormat("ExecuteCommand {0} BufferData: {1}", deviceCommand, sendBuffer.Aggregate("", (current, part) => current + part.ToString("X").PadLeft(2, '0'))); } lock (SyncRoot) { _spiDevice.TransferFullDuplex(sendBuffer, receiveBuffer); } if (_logger.IsTraceEnabled) { _logger.TraceFormat("ExecuteCommand result Status Register: {0}", receiveBuffer[0]); } return receiveBuffer[0]; })); }
private void CanExecuteCommand(DeviceCommands deviceCommand) { ExceptionExtensions.ExecuteFunction(_logger, () => { OperatingModes?operatingMode = GetOperatingMode?.Invoke(); if (CheckOperatingMode && operatingMode.HasValue && (deviceCommand == DeviceCommands.W_REGISTER && !(operatingMode == OperatingModes.StandBy || operatingMode == OperatingModes.PowerDown))) { throw new InvalidOperationException( "Writing to registers should only happen in Standby or PowerDown mode"); } }); }
public byte[] ExecuteCommand(DeviceCommands deviceCommand, byte address, byte[] value, bool autoRevert = true) { return(ExceptionExtensions.ExecuteFunction(_logger, () => { CanExecuteCommand(deviceCommand); // Create send and receive buffers int resultLength = value.Length, bufferLength = resultLength + 1; byte[] result = new byte[resultLength]; byte[] sendBuffer = new byte[bufferLength], receiveBuffer = new byte[bufferLength]; // Populate send buffer with command and value to write sendBuffer[0] = (byte)((byte)deviceCommand | address); if (value.Length > 1 && autoRevert && _revertBytes) { for (int i = 0; i < resultLength; i++) { sendBuffer[resultLength - i] = value[i]; } } else { Array.Copy(value, 0, sendBuffer, 1, resultLength); } // Send and Receive if (_logger.IsTraceEnabled) { _logger.TraceFormat("ExecuteCommand: {0} Address: {1} Value: {2} BufferData: {3}", deviceCommand, address, value.Aggregate("", (current, part) => current + part.ToString("X").PadLeft(2, '0')), sendBuffer.Aggregate("", (current, part) => current + part.ToString("X").PadLeft(2, '0'))); } lock (SyncRoot) { _spiDevice.TransferFullDuplex(sendBuffer, receiveBuffer); } Task.Delay(1).Wait(); if (_logger.IsTraceEnabled) { _logger.TraceFormat("ExecuteCommand result Status Register: {0}", receiveBuffer[0]); } // The STATUS register value is returned at first byte on each SPI call LoadStatusRegister?.Invoke(new[] { receiveBuffer[0] }); // Populate result with the rest of the receive buffer if (value.Length > 1 && autoRevert && _revertBytes) { for (int i = 0; i < result.Length; i++) { result[i] = receiveBuffer[bufferLength - (i + 1)]; } } else { Array.Copy(receiveBuffer, 1, result, 0, bufferLength - 1); } return result; })); }