gobot.io/x/gobot/v2@v2.1.0/drivers/spi/mfrc522_driver.go (about)

     1  package spi
     2  
     3  import (
     4  	"gobot.io/x/gobot/v2/drivers/common/mfrc522"
     5  )
     6  
     7  // MFRC522Driver is a wrapper for SPI bus usage. Please refer to the mfrc522.MFRC522Common package
     8  // for implementation details.
     9  type MFRC522Driver struct {
    10  	*Driver
    11  	*mfrc522.MFRC522Common
    12  }
    13  
    14  // NewMFRC522Driver creates a new Gobot Driver for MFRC522 RFID with SPI connection
    15  //
    16  // Params:
    17  //
    18  //	a *Adaptor - the Adaptor to use with this Driver
    19  //
    20  // Optional params:
    21  //
    22  //	 spi.WithBusNumber(int):  bus to use with this driver
    23  //		spi.WithChipNumber(int): chip to use with this driver
    24  //	 spi.WithMode(int):    	 mode to use with this driver
    25  //	 spi.WithBitCount(int):   number of bits to use with this driver
    26  //	 spi.WithSpeed(int64):    speed in Hz to use with this driver
    27  func NewMFRC522Driver(a Connector, options ...func(Config)) *MFRC522Driver {
    28  	d := &MFRC522Driver{
    29  		Driver: NewDriver(a, "MFRC522"),
    30  	}
    31  	d.MFRC522Common = mfrc522.NewMFRC522Common()
    32  	d.afterStart = d.initialize
    33  	for _, option := range options {
    34  		option(d)
    35  	}
    36  	return d
    37  }
    38  
    39  func (d *MFRC522Driver) initialize() error {
    40  	wrapper := &conWrapper{origCon: d.connection}
    41  	return d.MFRC522Common.Initialize(wrapper)
    42  }
    43  
    44  // this is necessary due to special behavior of shift bytes and set first bit
    45  type conWrapper struct {
    46  	origCon Connection
    47  }
    48  
    49  func (w *conWrapper) ReadByteData(reg uint8) (uint8, error) {
    50  	// MSBit=1 for reading, LSBit not used for first byte (address/register)
    51  	return w.origCon.ReadByteData(0x80 | (reg << 1))
    52  }
    53  
    54  func (w *conWrapper) WriteByteData(reg uint8, val uint8) error {
    55  	// LSBit not used for first byte (address/register)
    56  	return w.origCon.WriteByteData(reg<<1, val)
    57  }