mirror of
https://github.com/Crocmagnon/display-epaper.git
synced 2024-12-21 11:31:48 +01:00
split files
This commit is contained in:
parent
39ae5c613e
commit
8be7b20062
7 changed files with 311 additions and 171 deletions
130
.gitignore
vendored
Normal file
130
.gitignore
vendored
Normal file
|
@ -0,0 +1,130 @@
|
|||
### JetBrains template
|
||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
|
||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# AWS User-specific
|
||||
.idea/**/aws.xml
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# SonarLint plugin
|
||||
.idea/sonarlint/
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
### Go template
|
||||
# If you prefer the allow list template instead of the deny list, see community template:
|
||||
# https://github.com/github/gitignore/blob/main/community/Golang/Go.AllowList.gitignore
|
||||
#
|
||||
# Binaries for programs and plugins
|
||||
*.exe
|
||||
*.exe~
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
|
||||
# Test binary, built with `go test -c`
|
||||
*.test
|
||||
|
||||
# Output of the go coverage tool, specifically when used with LiteIDE
|
||||
*.out
|
||||
|
||||
# Dependency directories (remove the comment below to include it)
|
||||
# vendor/
|
||||
|
||||
# Go workspace file
|
||||
go.work
|
||||
|
||||
### macOS template
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
47
epd/epd.go
47
epd/epd.go
|
@ -74,7 +74,7 @@ func New() (*EPD, error) {
|
|||
return epd, nil
|
||||
}
|
||||
|
||||
func (e *EPD) TurnOff() error {
|
||||
func (e *EPD) turnOff() error {
|
||||
log.Println("turning off...")
|
||||
if err := e.spiReg.Close(); err != nil {
|
||||
return fmt.Errorf("closing SPI: %w", err)
|
||||
|
@ -220,26 +220,12 @@ func (e *EPD) InitFast() {
|
|||
|
||||
func (e *EPD) Clear() {
|
||||
log.Println("clearing epd")
|
||||
redBuf := make([]byte, Width*Height/8)
|
||||
for i := range redBuf {
|
||||
redBuf[i] = 0x00
|
||||
}
|
||||
e.Fill(White)
|
||||
|
||||
blackBuf := make([]byte, Width*Height/8)
|
||||
for i := range blackBuf {
|
||||
blackBuf[i] = 0xff
|
||||
}
|
||||
|
||||
e.sendCommand(0x10)
|
||||
e.sendDataSlice(blackBuf)
|
||||
|
||||
e.sendCommand(0x13)
|
||||
e.sendDataSlice(redBuf)
|
||||
|
||||
//e.refresh()
|
||||
//e.Refresh()
|
||||
}
|
||||
|
||||
func (e *EPD) refresh() {
|
||||
func (e *EPD) Refresh() {
|
||||
log.Println("refreshing...")
|
||||
e.sendCommand(0x12)
|
||||
time.Sleep(100 * time.Millisecond)
|
||||
|
@ -255,7 +241,7 @@ func (e *EPD) Sleep() error {
|
|||
e.sendData(0xa5)
|
||||
|
||||
time.Sleep(2 * time.Second)
|
||||
if err := e.TurnOff(); err != nil {
|
||||
if err := e.turnOff(); err != nil {
|
||||
return fmt.Errorf("turning off: %w", err)
|
||||
}
|
||||
|
||||
|
@ -271,19 +257,19 @@ const (
|
|||
)
|
||||
|
||||
func (e *EPD) Fill(c Color) {
|
||||
log.Println("filling... (not doing anything yet)")
|
||||
log.Println("filling...")
|
||||
|
||||
//switch c {
|
||||
//case White:
|
||||
// e.Draw(nil, nil)
|
||||
//case Black:
|
||||
// e.Draw(image.Black, nil)
|
||||
//case Red:
|
||||
// e.Draw(nil, image.Black)
|
||||
//}
|
||||
switch c {
|
||||
case White:
|
||||
e.Send(image.White, image.Black)
|
||||
case Black:
|
||||
e.Send(image.Black, image.Black)
|
||||
case Red:
|
||||
e.Send(image.White, image.White)
|
||||
}
|
||||
}
|
||||
|
||||
func (e *EPD) Draw(black image.Image, red image.Image) {
|
||||
func (e *EPD) Send(black image.Image, red image.Image) {
|
||||
log.Println("drawing...")
|
||||
if black != nil {
|
||||
log.Println("sending black")
|
||||
|
@ -295,9 +281,6 @@ func (e *EPD) Draw(black image.Image, red image.Image) {
|
|||
e.sendCommand(0x13) // write red data
|
||||
e.sendImg(red)
|
||||
}
|
||||
if black != nil || red != nil {
|
||||
e.refresh()
|
||||
}
|
||||
}
|
||||
|
||||
func (e *EPD) sendImg(img image.Image) {
|
||||
|
|
21
font.go
Normal file
21
font.go
Normal file
|
@ -0,0 +1,21 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/golang/freetype/truetype"
|
||||
"github.com/llgcode/draw2d"
|
||||
)
|
||||
|
||||
type MyFontCache map[string]*truetype.Font
|
||||
|
||||
func (fc MyFontCache) Store(fd draw2d.FontData, font *truetype.Font) {
|
||||
fc[fd.Name] = font
|
||||
}
|
||||
|
||||
func (fc MyFontCache) Load(fd draw2d.FontData) (*truetype.Font, error) {
|
||||
font, stored := fc[fd.Name]
|
||||
if !stored {
|
||||
return nil, fmt.Errorf("font %s is not stored in font cache", fd.Name)
|
||||
}
|
||||
return font, nil
|
||||
}
|
72
img.go
Normal file
72
img.go
Normal file
|
@ -0,0 +1,72 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/Crocmagnon/display-epaper/epd"
|
||||
"github.com/llgcode/draw2d"
|
||||
"github.com/llgcode/draw2d/draw2dimg"
|
||||
"image"
|
||||
"image/color"
|
||||
)
|
||||
|
||||
func getBlack() (*image.RGBA, error) {
|
||||
img := newWhite()
|
||||
|
||||
gc := draw2dimg.NewGraphicContext(img)
|
||||
|
||||
gc.SetFillColor(color.RGBA{0, 0, 0, 255})
|
||||
gc.SetStrokeColor(color.RGBA{0, 0, 0, 255})
|
||||
gc.SetLineWidth(2)
|
||||
|
||||
text(gc, "Hello, world", 18, 110, 50)
|
||||
|
||||
return img, nil
|
||||
}
|
||||
|
||||
func getRed() (*image.RGBA, error) {
|
||||
img := newBlack()
|
||||
gc := draw2dimg.NewGraphicContext(img)
|
||||
gc.SetFillColor(color.RGBA{0, 0, 0, 255})
|
||||
gc.SetStrokeColor(color.RGBA{255, 255, 255, 255})
|
||||
gc.SetLineWidth(2)
|
||||
|
||||
rect(gc, 10, 10, 50, 50)
|
||||
rect(gc, 60, 10, 100, 50)
|
||||
|
||||
return img, nil
|
||||
}
|
||||
|
||||
func text(gc *draw2dimg.GraphicContext, s string, size, x, y float64) {
|
||||
gc.SetFontData(draw2d.FontData{Name: fontName})
|
||||
gc.SetFontSize(size)
|
||||
gc.StrokeStringAt(s, x, y)
|
||||
}
|
||||
|
||||
func newWhite() *image.RGBA {
|
||||
img := image.NewRGBA(image.Rect(0, 0, epd.Width, epd.Height))
|
||||
for y := 0; y < epd.Height; y++ {
|
||||
for x := 0; x < epd.Width; x++ {
|
||||
img.Set(x, y, color.White)
|
||||
}
|
||||
}
|
||||
return img
|
||||
}
|
||||
|
||||
func newBlack() *image.RGBA {
|
||||
img := image.NewRGBA(image.Rect(0, 0, epd.Width, epd.Height))
|
||||
for y := 0; y < epd.Height; y++ {
|
||||
for x := 0; x < epd.Width; x++ {
|
||||
img.Set(x, y, color.Black)
|
||||
}
|
||||
}
|
||||
return img
|
||||
}
|
||||
|
||||
func rect(gc *draw2dimg.GraphicContext, x1, y1, x2, y2 float64) {
|
||||
gc.BeginPath()
|
||||
gc.MoveTo(x1, y1)
|
||||
gc.LineTo(x2, y1)
|
||||
gc.LineTo(x2, y2)
|
||||
gc.LineTo(x1, y2)
|
||||
gc.Close()
|
||||
gc.FillStroke()
|
||||
}
|
141
main.go
141
main.go
|
@ -1,18 +1,11 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/Crocmagnon/display-epaper/epd"
|
||||
"github.com/golang/freetype/truetype"
|
||||
"github.com/llgcode/draw2d"
|
||||
"github.com/llgcode/draw2d/draw2dimg"
|
||||
_ "golang.org/x/image/bmp"
|
||||
"golang.org/x/image/font/gofont/goregular"
|
||||
"image"
|
||||
"image/color"
|
||||
"log"
|
||||
"os"
|
||||
"periph.io/x/host/v3"
|
||||
)
|
||||
|
||||
const fontName = "default"
|
||||
|
@ -28,139 +21,9 @@ func main() {
|
|||
fontCache.Store(draw2d.FontData{Name: fontName}, font)
|
||||
draw2d.SetFontCache(fontCache)
|
||||
|
||||
if len(os.Args) < 2 {
|
||||
if err := run(); err != nil {
|
||||
log.Fatal("error: ", err)
|
||||
}
|
||||
} else {
|
||||
img, err := getBlack()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
draw2dimg.SaveToPngFile("black.png", img)
|
||||
|
||||
img, err = getRed()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
draw2dimg.SaveToPngFile("red.png", img)
|
||||
|
||||
if err := run(); err != nil {
|
||||
log.Fatal("error: ", err)
|
||||
}
|
||||
|
||||
log.Println("done")
|
||||
}
|
||||
|
||||
func run() error {
|
||||
_, err := host.Init()
|
||||
if err != nil {
|
||||
return fmt.Errorf("initializing host: %w", err)
|
||||
}
|
||||
|
||||
display, err := epd.New()
|
||||
if err != nil {
|
||||
return fmt.Errorf("initializing epd: %w", err)
|
||||
}
|
||||
|
||||
//display.Init()
|
||||
display.InitFast()
|
||||
display.Clear()
|
||||
|
||||
black, err := getBlack()
|
||||
if err != nil {
|
||||
return fmt.Errorf("getting black: %w", err)
|
||||
}
|
||||
|
||||
red, err := getRed()
|
||||
if err != nil {
|
||||
return fmt.Errorf("getting red: %w", err)
|
||||
}
|
||||
|
||||
display.Draw(black, red)
|
||||
|
||||
log.Println("sleeping...")
|
||||
|
||||
if err := display.Sleep(); err != nil {
|
||||
return fmt.Errorf("sleeping: %w", err)
|
||||
}
|
||||
|
||||
log.Println("done")
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func getBlack() (*image.RGBA, error) {
|
||||
img := newWhite()
|
||||
|
||||
gc := draw2dimg.NewGraphicContext(img)
|
||||
|
||||
gc.SetFillColor(color.RGBA{0, 0, 0, 255})
|
||||
gc.SetStrokeColor(color.RGBA{0, 0, 0, 255})
|
||||
gc.SetLineWidth(2)
|
||||
|
||||
text(gc, "Hello, world", 18, 110, 50)
|
||||
|
||||
return img, nil
|
||||
}
|
||||
|
||||
func getRed() (*image.RGBA, error) {
|
||||
img := newBlack()
|
||||
gc := draw2dimg.NewGraphicContext(img)
|
||||
gc.SetFillColor(color.RGBA{0, 0, 0, 255})
|
||||
gc.SetStrokeColor(color.RGBA{255, 255, 255, 255})
|
||||
gc.SetLineWidth(2)
|
||||
|
||||
rect(gc, 10, 10, 50, 50)
|
||||
rect(gc, 60, 10, 100, 50)
|
||||
|
||||
return img, nil
|
||||
}
|
||||
|
||||
func text(gc *draw2dimg.GraphicContext, s string, size, x, y float64) {
|
||||
gc.SetFontData(draw2d.FontData{Name: fontName})
|
||||
gc.SetFontSize(size)
|
||||
gc.StrokeStringAt(s, x, y)
|
||||
}
|
||||
|
||||
func newWhite() *image.RGBA {
|
||||
img := image.NewRGBA(image.Rect(0, 0, epd.Width, epd.Height))
|
||||
for y := 0; y < epd.Height; y++ {
|
||||
for x := 0; x < epd.Width; x++ {
|
||||
img.Set(x, y, color.White)
|
||||
}
|
||||
}
|
||||
return img
|
||||
}
|
||||
|
||||
func newBlack() *image.RGBA {
|
||||
img := image.NewRGBA(image.Rect(0, 0, epd.Width, epd.Height))
|
||||
for y := 0; y < epd.Height; y++ {
|
||||
for x := 0; x < epd.Width; x++ {
|
||||
img.Set(x, y, color.Black)
|
||||
}
|
||||
}
|
||||
return img
|
||||
}
|
||||
|
||||
func rect(gc *draw2dimg.GraphicContext, x1, y1, x2, y2 float64) {
|
||||
gc.BeginPath()
|
||||
gc.MoveTo(x1, y1)
|
||||
gc.LineTo(x2, y1)
|
||||
gc.LineTo(x2, y2)
|
||||
gc.LineTo(x1, y2)
|
||||
gc.Close()
|
||||
gc.FillStroke()
|
||||
}
|
||||
|
||||
type MyFontCache map[string]*truetype.Font
|
||||
|
||||
func (fc MyFontCache) Store(fd draw2d.FontData, font *truetype.Font) {
|
||||
fc[fd.Name] = font
|
||||
}
|
||||
|
||||
func (fc MyFontCache) Load(fd draw2d.FontData) (*truetype.Font, error) {
|
||||
font, stored := fc[fd.Name]
|
||||
if !stored {
|
||||
return nil, fmt.Errorf("font %s is not stored in font cache", fd.Name)
|
||||
}
|
||||
return font, nil
|
||||
}
|
||||
|
|
24
run_darwin_arm64.go
Normal file
24
run_darwin_arm64.go
Normal file
|
@ -0,0 +1,24 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"github.com/llgcode/draw2d/draw2dimg"
|
||||
"log"
|
||||
)
|
||||
|
||||
func run() error {
|
||||
img, err := getBlack()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
draw2dimg.SaveToPngFile("out/black.png", img)
|
||||
|
||||
img, err = getRed()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
draw2dimg.SaveToPngFile("out/red.png", img)
|
||||
|
||||
log.Println("done")
|
||||
|
||||
return nil
|
||||
}
|
47
run_linux_arm64.go
Normal file
47
run_linux_arm64.go
Normal file
|
@ -0,0 +1,47 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/Crocmagnon/display-epaper/epd"
|
||||
"log"
|
||||
"periph.io/x/host/v3"
|
||||
)
|
||||
|
||||
func run() error {
|
||||
_, err := host.Init()
|
||||
if err != nil {
|
||||
return fmt.Errorf("initializing host: %w", err)
|
||||
}
|
||||
|
||||
display, err := epd.New()
|
||||
if err != nil {
|
||||
return fmt.Errorf("initializing epd: %w", err)
|
||||
}
|
||||
|
||||
display.Init()
|
||||
//display.InitFast()
|
||||
display.Clear()
|
||||
display.Refresh()
|
||||
|
||||
black, err := getBlack()
|
||||
if err != nil {
|
||||
return fmt.Errorf("getting black: %w", err)
|
||||
}
|
||||
|
||||
red, err := getRed()
|
||||
if err != nil {
|
||||
return fmt.Errorf("getting red: %w", err)
|
||||
}
|
||||
|
||||
display.Send(black, red)
|
||||
|
||||
log.Println("sleeping...")
|
||||
|
||||
if err := display.Sleep(); err != nil {
|
||||
return fmt.Errorf("sleeping: %w", err)
|
||||
}
|
||||
|
||||
log.Println("done")
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in a new issue