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 }