gobot.io/x/gobot/v2@v2.1.0/drivers/gpio/aip1640_driver.go (about)

     1  package gpio
     2  
     3  import (
     4  	"time"
     5  
     6  	"gobot.io/x/gobot/v2"
     7  )
     8  
     9  // Commands of the driver
    10  const (
    11  	AIP1640DataCmd  = 0x40
    12  	AIP1640DispCtrl = 0x88
    13  	AIP1640AddrCmd  = 0xC0
    14  
    15  	AIP1640FixedAddr = 0x04
    16  )
    17  
    18  // AIP1640Driver is the gobot driver for the AIP1640 LED driver used in the WEMOS D1 mini Matrix LED Shield.
    19  // It has some similarities with the TM16xx LED drivers
    20  //
    21  // Datasheet CN: https://datasheet.lcsc.com/szlcsc/AiP1640_C82650.pdf
    22  //
    23  // Library ported from: https://github.com/wemos/WEMOS_Matrix_LED_Shield_Arduino_Library
    24  type AIP1640Driver struct {
    25  	pinClock   *DirectPinDriver
    26  	pinData    *DirectPinDriver
    27  	name       string
    28  	intensity  byte
    29  	buffer     [8]byte
    30  	connection gobot.Connection
    31  	gobot.Commander
    32  }
    33  
    34  // NewAIP1640Driver return a new AIP1640Driver given a gobot.Connection and the clock, data and strobe pins
    35  func NewAIP1640Driver(a gobot.Connection, clockPin string, dataPin string) *AIP1640Driver {
    36  	t := &AIP1640Driver{
    37  		name:       gobot.DefaultName("AIP1640Driver"),
    38  		pinClock:   NewDirectPinDriver(a, clockPin),
    39  		pinData:    NewDirectPinDriver(a, dataPin),
    40  		intensity:  7,
    41  		connection: a,
    42  		Commander:  gobot.NewCommander(),
    43  	}
    44  
    45  	/* TODO : Add commands */
    46  
    47  	return t
    48  }
    49  
    50  // Start initializes the tm1638, it uses a SPI-like communication protocol
    51  func (a *AIP1640Driver) Start() (err error) {
    52  	a.pinData.On()
    53  	a.pinClock.On()
    54  
    55  	return
    56  }
    57  
    58  // Halt implements the Driver interface
    59  func (a *AIP1640Driver) Halt() (err error) { return }
    60  
    61  // Name returns the AIP1640Drivers name
    62  func (a *AIP1640Driver) Name() string { return a.name }
    63  
    64  // SetName sets the AIP1640Drivers name
    65  func (a *AIP1640Driver) SetName(n string) { a.name = n }
    66  
    67  // Connection returns the AIP1640Driver Connection
    68  func (a *AIP1640Driver) Connection() gobot.Connection {
    69  	return a.connection
    70  }
    71  
    72  // SetIntensity changes the intensity (from 1 to 7) of the display
    73  func (a *AIP1640Driver) SetIntensity(level byte) {
    74  	if level >= 7 {
    75  		level = 7
    76  	}
    77  	a.intensity = level
    78  }
    79  
    80  // Display sends the buffer to the display (ie. turns on/off the corresponding LEDs)
    81  func (a *AIP1640Driver) Display() {
    82  	for i := 0; i < 8; i++ {
    83  		a.sendData(byte(i), a.buffer[i])
    84  
    85  		a.pinData.Off()
    86  		a.pinClock.Off()
    87  		time.Sleep(1 * time.Millisecond)
    88  		a.pinClock.On()
    89  		a.pinData.On()
    90  	}
    91  
    92  	a.sendCommand(AIP1640DispCtrl | a.intensity)
    93  }
    94  
    95  // Clear empties the buffer (turns off all the LEDs)
    96  func (a *AIP1640Driver) Clear() {
    97  	for i := 0; i < 8; i++ {
    98  		a.buffer[i] = 0x00
    99  	}
   100  }
   101  
   102  // DrawPixel turns on or off a specific in the buffer
   103  func (a *AIP1640Driver) DrawPixel(x, y byte, enabled bool) {
   104  	if x >= 8 || y >= 8 {
   105  		return
   106  	}
   107  	y = 7 - y
   108  	if enabled {
   109  		a.buffer[y] |= 1 << x
   110  	} else {
   111  		a.buffer[y] &^= 1 << x
   112  	}
   113  }
   114  
   115  // DrawRow sets any given row of LEDs in the buffer
   116  func (a *AIP1640Driver) DrawRow(row, data byte) {
   117  	if row >= 8 {
   118  		return
   119  	}
   120  	a.buffer[7-row] = data
   121  }
   122  
   123  // DrawMatrix sets the whole buffer
   124  func (a *AIP1640Driver) DrawMatrix(data [8]byte) {
   125  	for i := 0; i < 8; i++ {
   126  		a.buffer[7-i] = data[i]
   127  	}
   128  }
   129  
   130  // sendCommand is an auxiliary function to send commands to the AIP1640Driver module
   131  func (a *AIP1640Driver) sendCommand(cmd byte) {
   132  	a.pinData.Off()
   133  	a.send(cmd)
   134  	a.pinData.On()
   135  }
   136  
   137  // sendData is an auxiliary function to send data to the AIP1640Driver module
   138  func (a *AIP1640Driver) sendData(address byte, data byte) {
   139  	a.sendCommand(AIP1640DataCmd | AIP1640FixedAddr)
   140  	a.pinData.Off()
   141  	a.send(AIP1640AddrCmd | address)
   142  	a.send(data)
   143  	a.pinData.On()
   144  }
   145  
   146  // send writes data on the module
   147  func (a *AIP1640Driver) send(data byte) {
   148  	for i := 0; i < 8; i++ {
   149  		a.pinClock.Off()
   150  
   151  		if (data & 1) > 0 {
   152  			a.pinData.On()
   153  		} else {
   154  			a.pinData.Off()
   155  		}
   156  		data >>= 1
   157  
   158  		a.pinClock.On()
   159  	}
   160  }