gobot.io/x/gobot@v1.16.0/drivers/gpio/aip1640_driver.go (about)

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