Add: components, progress bar

This commit is contained in:
Andrey Egorov
2024-09-22 21:53:22 +03:00
parent f29bbf8345
commit bad142a565
10 changed files with 227 additions and 28 deletions

View File

@ -9,7 +9,11 @@ import (
)
type Display interface {
IsReady() error // Nil if it is ready, error with some info otherwise
Flush(crystal, page byte)
FlushByMask(mask uint32)
GetFlushMaskBit(crystal, page byte) uint32
// Image functions
GetImg() *image.Gray
@ -17,7 +21,7 @@ type Display interface {
UnlockImg()
GetBounds() image.Rectangle
Test(ctx context.Context) error
Test(ctx context.Context) error // DEBUG ONLY
io.Closer
}

View File

@ -19,11 +19,16 @@ const (
mt12232aW = 122
mt12232aH = 32
flushChanCap = 24 // Flush channel capacity
flushUpdateTimeout = 5 * time.Millisecond
)
type displayMt12232a struct {
logger *log.Logger
// Some state flags
isTurnedOn bool
// Image
img *image.Gray
imgMutex sync.Mutex
@ -145,6 +150,14 @@ func (d *displayMt12232a) powerOn() error {
if d.dev.ReadStatus(1)&0x20 != 0 {
return fmt.Errorf("Right cristal is off")
}
d.isTurnedOn = true
return nil
}
func (d *displayMt12232a) IsReady() error {
if !d.isTurnedOn {
return fmt.Errorf("display is turned off")
}
return nil
}
@ -217,12 +230,22 @@ func (d *displayMt12232a) Flush(crystal, page byte) {
d.pagesFlushFlags.Store(d.pagesFlushFlags.Load() | bit)
}
func (d *displayMt12232a) FlushByMask(mask uint32) {
// !!! TODO Need to update GO to 1.23 to use .Or !!!
d.pagesFlushFlags.Store(d.pagesFlushFlags.Load() | mask)
}
func (d *displayMt12232a) GetFlushMaskBit(crystal, page byte) uint32 {
return uint32(1 << (crystal*4 + page))
}
func (d *displayMt12232a) Close() error {
if d.flushCancel != nil {
d.flushCancel()
d.flushCancel = nil
<-d.flushDone
}
d.isTurnedOn = false
return d.dev.Close()
}
@ -233,10 +256,10 @@ func (d *displayMt12232a) flushLoop(ctx context.Context) {
case <-ctx.Done():
close(d.flushDone)
return
case <-time.After(time.Millisecond):
case <-time.After(flushUpdateTimeout):
forUpdate := d.pagesFlushFlags.Swap(0)
checkBit := uint32(1)
st := time.Now()
//st := time.Now()
d.LockImg()
for p := byte(0); p < 4; p++ {
if forUpdate&(checkBit) != 0 {
@ -257,7 +280,7 @@ func (d *displayMt12232a) flushLoop(ctx context.Context) {
}
checkBit = checkBit << 1
}
d.logger.Printf("%08b - %s\n", forUpdate, time.Since(st))
//d.logger.Printf("%08b - %s\n", forUpdate, time.Since(st))
for p := byte(0); p < 4; p++ {
if forUpdate&(checkBit) != 0 {
d.dev.WriteCode(1, (3-p)|0xB8)

View File

@ -37,7 +37,8 @@ func newMt12864a(logger *log.Logger) (Display, error) {
d.test()
d.logger.Println("Draw finished")
return &d, nil
//return &d, nil
return nil, fmt.Errorf("IMPLEMENTATION COMMENTED")
}
func (d *displayMt12864a) Test(ctx context.Context) error {
@ -145,6 +146,9 @@ func (d *displayMt12864a) GetBounds() image.Rectangle {
func (d *displayMt12864a) Flush(crystal, page byte) {
}
func (d *displayMt12864a) FlushByMask(mask uint32) {
}
func (d *displayMt12864a) Close() error {
return rpio.Close()
}

View File

@ -42,11 +42,13 @@ func newSsd1306(logger *log.Logger) (Display, error) {
return nil, fmt.Errorf("create i2c: %w", err)
}
return &displaySsd1306{
_ = displaySsd1306{
logger: logger,
bus: bus,
dev: dev,
}, nil
}
return nil, fmt.Errorf("IMPLEMENTATION COMMENTED")
}
func (d *displaySsd1306) GetBounds() image.Rectangle {
@ -61,6 +63,10 @@ func (d *displaySsd1306) Flush(crystal, page byte) {
//return d.dev.Draw(img.Bounds(), d.img, image.Point{})
}
func (d *displaySsd1306) FlushByMask(mask uint32) {
//return d.dev.Draw(img.Bounds(), d.img, image.Point{})
}
func (d *displaySsd1306) Close() error {
if err := d.bus.Close(); err != nil {
d.logger.Println("ERROR: close i2c bus:", err.Error())