ILI9488

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jan 7, 2023 License: MIT Imports: 3 Imported by: 0

README

ILI9488

使用Golang实现的操作ILI9488,适用于 480x320 LCD显示屏, 添加RGBA支持。目前仅在Raspberry zero 2w上测试通过。

安装

go get github.com/manx98/go-ili9488

使用示例

package main

import (
	"context"
	ILI9488 "github.com/manx98/go-ili9488"
	"github.com/stianeikeland/go-rpio/v4"
	"image/gif"
	"log"
	"os"
	"sync"
	"time"
)

// displayGIF
//
//	@Description: 显示GIF图片
//	@param ctx
//	@param canvas 画布
//	@param filePath GIF路径
func displayGIF(ctx context.Context, canvas *ILI9488.Canvas, filePath string) {
	f, err := os.OpenFile(filePath, os.O_RDONLY, os.ModePerm)
	if err != nil {
		log.Fatalf("failed to open: %v", err)
	}
	defer func() {
		if err = f.Close(); err != nil {
			log.Fatalf("failed to close: %v", err)
		}
	}()
	all, err := gif.DecodeAll(f)
	if err != nil {
		log.Fatalf("failed to decode: %v", err)
	}
	showWork := make(chan []byte, 1)
	waitGroup := sync.WaitGroup{}
	displayCtx, cancelFunc := context.WithCancel(ctx)
	waitGroup.Add(1)
	var totalTime int64
	var total int64
	go func() {
		defer func() {
			waitGroup.Done()
			cancelFunc()
		}()
		for {
			select {
			case <-displayCtx.Done():
				return
			case img := <-showWork:
				start := time.Now()
				canvas.FlushDirectly(img)
				totalTime += time.Now().Sub(start).Milliseconds()
				total++
			}
		}
	}()
	waitGroup.Add(1)
	drawChan := make(chan []byte, 3)
	go func() {
		defer func() {
			waitGroup.Done()
			cancelFunc()
		}()
		for {
			for _, img := range all.Image {
				canvas.DrawImage(img)
				img := make([]byte, len(canvas.Buffer))
				copy(img, canvas.Buffer)
				select {
				case <-displayCtx.Done():
					return
				case drawChan <- img:
				}
			}
		}
	}()
	defer func() {
		cancelFunc()
		waitGroup.Wait()
		log.Printf("平均速度:%dms/fps\n", totalTime/total)
	}()
	for {
		after := time.After(1)
		for _, delay := range all.Delay {
			after = time.After(time.Duration(delay*10) * time.Millisecond)
			select {
			case <-displayCtx.Done():
				return
			case showWork <- <-drawChan:
				<-after
			}
		}
		if all.LoopCount < 0 {
			break
		}
		if all.LoopCount != 0 {
			all.LoopCount -= 1
		}
	}
}

type MyPin struct {
	rpio.Pin
}

func (m *MyPin) SetOutput() {
	m.Mode(rpio.Output)
}

type MySpi struct {
}

func (m *MySpi) SpiSpeed(speed uint32) {
	rpio.SpiSpeed(int(speed))
}

func (m *MySpi) SetSpiMode0() {
	rpio.SpiMode(0, 0)
}

func (m *MySpi) SpiTransmit(data []byte) {
	rpio.SpiTransmit(data...)
}

func main() {
	if err := rpio.Open(); err != nil {
		log.Fatalf("failed to open rpio: %v", err)
	}
	defer func() {
		if err := rpio.Close(); err != nil {
			log.Fatalf("failed to close gpio: %v", err)
		}
	}()
	err := rpio.SpiBegin(rpio.Spi0)
	if err != nil {
		log.Fatalf("failed to begin gpio: %v", err)
	}
	device := ILI9488.NewILI9488(
		&MySpi{},
		&MyPin{rpio.Pin(17)},
		&MyPin{rpio.Pin(27)},
		&MyPin{rpio.Pin(4)},
		&MyPin{rpio.Pin(22)},
	)
	canvas := device.GetCanvas(0, 0, 239, 239)
	timeout, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	displayGIF(timeout, canvas, "./sample/TeaTime.gif")//测试显示GIF图片
	canvas.Clear()
	canvas.Flush()
}

感谢

  1. GPIO库 https://github.com/stianeikeland/go-rpio/

Documentation

Index

Constants

View Source
const (
	SPI_CLOCK_HZ = 40000000 // 40 MHz
	LCD_H        = 480
	LCD_W        = 320
	SET_X_CMD    = 0x2A
	SET_Y_CMD    = 0x2B
	WARM_CMD     = 0x2C
)

Variables

This section is empty.

Functions

This section is empty.

Types

type BaseCanvas

type BaseCanvas interface {
	//
	// SetRGB565
	//  @Description: 设置指定坐标RGB565色值
	//  @param x X轴
	//  @param y Y轴
	//  @param c RBG565色值
	//
	SetRGB565(x, y int, c uint16)
	//
	// GetRGB565
	//  @Description: 获取指定坐标RGB565色值
	//  @param x X轴
	//  @param y Y轴
	//  @result RGB565色值
	//
	GetRGB565(x, y int) uint16
}

type Canvas

type Canvas struct {
	X0     int    // X轴画布起始偏移
	Y0     int    // Y轴画布起始偏移
	X1     int    // X轴画布结束偏移
	Y1     int    // Y轴画布结束偏移
	Width  int    // 画布宽度
	Height int    // 画布高度
	Buffer []byte // 缓冲区
	// contains filtered or unexported fields
}

Canvas @Description: 画布

func (*Canvas) Clear

func (d *Canvas) Clear()

Clear

@Description: 清空画布缓冲区数据
@receiver d

func (*Canvas) DrawImage

func (d *Canvas) DrawImage(img image.Image)

DrawImage

@Description: 将图像绘制到画布缓冲区中
@receiver d
@param img 图像

func (*Canvas) Flush

func (d *Canvas) Flush()

Flush

@Description: 将缓冲区内容刷新到屏幕上
@receiver d

func (*Canvas) FlushDirectly

func (d *Canvas) FlushDirectly(buffer []byte)

FlushDirectly

@Description: 直接将buffer内容绘制到画布所对应的显示区域,该方法不会覆盖画布缓冲区
@receiver d
@param buffer

func (*Canvas) GetColor

func (d *Canvas) GetColor(x, y int) color.Color

GetColor

@Description: 获取缓冲区指定坐标RGBA色值(由于该值从RBG565转换而来,故A值始终为1)
@receiver d
@param x X轴坐标
@param y Y轴坐标
@return color.Color

func (*Canvas) GetRGB

func (d *Canvas) GetRGB(x, y int) (r uint8, g uint8, b uint8)

GetRGB

@Description: 获取缓存区指定坐标的RGB565色值
@receiver d
@param x X轴坐标
@param y Y轴坐标
@param r R(0 - 255)
@param g G(0 - 255)
@param b B(0 - 255)

func (*Canvas) SetColor

func (d *Canvas) SetColor(x, y int, c color.Color)

SetColor

@Description: 设置缓冲区指定坐标的色值
@receiver d
@param x X轴坐标
@param y Y轴坐标
@param c 色值

func (*Canvas) SetRGB

func (d *Canvas) SetRGB(x, y int, r, g, b uint8)

SetRGB

@Description: 设置缓存区指定坐标的RGB565色值
@receiver d
@param x X轴坐标
@param y Y轴坐标
@param r R(0 - 255)
@param g G(0 - 255)
@param b B(0 - 255)

type ColorMode

type ColorMode uint8

ColorMode 色彩模式

type ILI9488

type ILI9488 struct {
	// contains filtered or unexported fields
}

func NewILI9488

func NewILI9488(spi SPI, dc, rst, led, cs PIN) *ILI9488

NewILI9488

@Description: ILI9488显示驱动
@param spi SPI通信端口
@param dc 引脚DC
@param rst 引脚RES
@param led 引脚BLK
@param cs 选片引脚
@return *ILI9488

func (*ILI9488) Clear

func (s *ILI9488) Clear(r, g, b uint8)

Clear

@Description: 清除画布内容
@receiver s
@param r R(0 - 255)
@param g G(0 - 255)
@param b B(0 - 255)

func (*ILI9488) Command

func (s *ILI9488) Command(data byte)

Command

@Description: 写入显示命令(非线程安全,请使用 Tx 包裹执行)
@receiver s
@param data 数据

func (*ILI9488) ExchangeData

func (s *ILI9488) ExchangeData(isData bool, data []byte)

ExchangeData

@Description: 将数据写入SPI,isData为true表示写入的是数据,反之则是命令(非线程安全,请使用 Tx 包裹执行)
@receiver s
@param data 需要发送的数据
@param isData 是否是数据类型

func (*ILI9488) FlushBitBuffer

func (s *ILI9488) FlushBitBuffer(x0, y0, x1, y1 int, buffer []byte)

FlushBitBuffer

@Description: 将画布上的图像绘制到屏幕上
@receiver s
@param X0 区域开始X轴位置(包含)
@param Y0 区域开始Y轴位置(包含)
@param X1 区域结束X轴位置(包含)
@param Y1 区域结束Y轴位置(包含)
@param Buffer RGB565图像

func (*ILI9488) GetCanvas

func (s *ILI9488) GetCanvas(x0, y0, x1, y1 int) *Canvas

GetCanvas

@Description: 获取画布
@receiver s
@param X0 区域X轴起始(包含)
@param Y0 区域Y轴起始(包含)
@param X1 区域X轴截止(包含)
@param Y1 区域X轴截止(包含)
@return *Canvas

func (*ILI9488) GetFullScreenCanvas

func (s *ILI9488) GetFullScreenCanvas() *Canvas

GetFullScreenCanvas

@Description: 获取全屏画布
@receiver s
@return *Canvas 画布

func (*ILI9488) HardReset

func (s *ILI9488) HardReset()

HardReset

@Description: 硬重启设备
@receiver s

func (*ILI9488) LcdDirection

func (s *ILI9488) LcdDirection(direction uint8)

LcdDirection

@Description: 设置显示旋转
@receiver s
@param direction
	0-0 degree
	1-90 degree
	2-180 degree
	3-270 degree

func (*ILI9488) SendData

func (s *ILI9488) SendData(data ...byte)

SendData

@Description: 写入显示数据
@receiver s
@param data 数据

func (*ILI9488) SetWindow

func (s *ILI9488) SetWindow(x0, y0, x1, y1 int)

SetWindow

@Description: Set the pixel address window for proceeding drawing commands. X0 and
   X1 should define the minimum and maximum x pixel bounds.  Y0 and Y1
   should define the minimum and maximum y pixel bound.
@receiver s
@param X0 区域开始X轴位置(包含)
@param Y0 区域开始Y轴位置(包含)
@param X1 区域结束X轴位置(包含)
@param Y1 区域结束Y轴位置(包含)

func (*ILI9488) Size

func (s *ILI9488) Size() *image.Point

Size

@Description: 获取显示器尺寸
@receiver s
@return *image.Point 尺寸

type PIN

type PIN interface {
	//
	// High
	//  @Description:输出为高电频
	//
	High()
	//
	// Low
	//  @Description:设置为低电频
	//
	Low()
	//
	// SetOutput
	//  @Description:设置为输出模式
	//
	SetOutput()
}

type SPI

type SPI interface {
	//
	// SpiSpeed
	//  @Description: 设置SPI速率
	//  @param speed
	//
	SpiSpeed(speed uint32)
	//
	// SetSpiMode0
	//  @Description:设置为Mode0 CPOL=0, CPHA=0模式
	//
	SetSpiMode0()
	//
	// SpiTransmit
	//  @Description: 发送数据
	//  @param data 需要发送的数据
	//
	SpiTransmit(data []byte)
}

type ScreenType

type ScreenType uint8

ScreenType 显示屏类型

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL