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 }