Exemple #1
0
        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];
            }));
        }
Exemple #2
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");
         }
     });
 }
Exemple #3
0
        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;
            }));
        }