diff --git a/display/display.go b/display/display.go index 531500f..1a37f24 100644 --- a/display/display.go +++ b/display/display.go @@ -9,7 +9,12 @@ import ( ) type Display interface { - Flush(img *image.Gray) error + Flush(crystal, page byte) + + // Image functions + GetImg() *image.Gray + LockImg() + UnlockImg() GetBounds() image.Rectangle Test(ctx context.Context) error diff --git a/display/mt-12232a.go b/display/mt-12232a.go index cedd4b9..2c392f2 100644 --- a/display/mt-12232a.go +++ b/display/mt-12232a.go @@ -6,18 +6,35 @@ import ( "image" "log" "math/rand" + "sync" + "sync/atomic" "time" "gitea.unprism.ru/yotia/display-test/pkg/mt12232a" ) -var _ = rand.Int() // TMP for import to exist +var _ = rand.Int() // for import existance + +const ( + mt12232aW = 122 + mt12232aH = 32 + flushChanCap = 24 // Flush channel capacity +) type displayMt12232a struct { logger *log.Logger + // Image + img *image.Gray + imgMutex sync.Mutex + // GPIO pins dev mt12232a.Device + + // Flush goroutine + flushCancel context.CancelFunc + pagesFlushFlags atomic.Uint32 // (!use only 8 bits) Every bit corresponds to page/crystal with this number + flushDone chan struct{} } func newMt12232a(logger *log.Logger) (Display, error) { @@ -31,15 +48,16 @@ func newMt12232a(logger *log.Logger) (Display, error) { bits[i] = make([]byte, 122) } - // if err := dev.PowerOn(); err != nil { - // return nil, fmt.Errorf("power on: %w", err) - // } - + ctx, cancel := context.WithCancel(context.Background()) // Setup submit goroutine d := displayMt12232a{ - logger: logger, - dev: dev, + logger: logger, + dev: dev, + flushCancel: cancel, + img: image.NewGray(image.Rect(0, 0, mt12232aW, mt12232aH)), + flushDone: make(chan struct{}), // For waiting flush to finish before exiting } + go d.flushLoop(ctx) // Temp debug draw //if st0, st1 := d.dev.ReadStatus(0), d.dev.ReadStatus(1); false { //st0&0x20 == 0 && st1&0x20 == 0 { @@ -131,66 +149,23 @@ func (d *displayMt12232a) powerOn() error { } func (d *displayMt12232a) Test(ctx context.Context) error { - d.dev.WriteCode(0, 0xB8) - d.dev.WriteCode(0, 0x14) - d.dev.WriteData(0, 0xAE) start := time.Now() - d.status("4") for p := 0; p < 4; p++ { - // First - - // d.dev.WriteCode(0, byte(p)|0xB8) - // d.dev.WriteCode(0, 0x13) - // for c := 0; c < 61; c++ { - // d.dev.WriteData(0, 0) - // } - // d.dev.WriteCode(1, byte(p)|0xB8) - // d.dev.WriteCode(1, 0x00) - // for c := 0; c < 61; c++ { - // d.dev.WriteData(1, 0) - // } - // - // Second d.dev.WriteCode(0, byte(p)|0xB8) d.dev.WriteCode(0, 0x13) for c := 0; c < 61; c++ { - //d.dev.WriteDatas(0, []byte{byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2)}) - //d.dev.WriteData(0, byte(0xF0^(0xFF*(c%2)))) d.dev.WriteData(0, byte(rand.Int())) - // d.dev.WriteData(0, 0xFF) - //d.dev.WriteData(0, byte(p*122+c)) - //time.Sleep(2 * time.Millisecond) } d.dev.WriteCode(1, byte(p)|0xB8) d.dev.WriteCode(1, 0x00) for c := 0; c < 61; c++ { - //d.dev.WriteDatas(1, []byte{byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2), byte(rand.Int() % 2)}) d.dev.WriteData(1, byte(rand.Int())) - // d.dev.WriteData(1, 0xFF) - //d.dev.WriteData(1, byte(4*int(p)+c)) - //d.dev.WriteData(1, byte(p*122+c+61)) - //d.dev.WriteData(1, byte(rand.Int())>>1) - //time.Sleep(2 * time.Millisecond) } } - d.status("9") + end := time.Now() d.logger.Println(end.Sub(start)) - // for p := byte(0); p < 8; p++ { - // d.dev.WriteCodeL(p | 0xB8) - // d.dev.WriteCodeL(0x40) - // for c := 0; c < 64; c++ { - // d.dev.WriteDataL(Logo128[p][c]) - // } - // d.dev.WriteCodeR(p | 0xB8) - // d.dev.WriteCodeR(0x40) - // for c := 64; c < 128; c++ { - // d.dev.WriteDataR(Logo128[p][c]) - // } - // } - //d.dev.WriteCodeL(0xAF) // Display on - //d.dev.WriteCodeR(0xAF) // Display on return nil } @@ -199,7 +174,7 @@ func (d *displayMt12232a) GetBounds() image.Rectangle { return image.Rect(0, 0, 122, 32) } -func (d *displayMt12232a) Flush(img *image.Gray) error { +func (d *displayMt12232a) FlushFull(img *image.Gray) error { st := time.Now() for p := byte(0); p < 4; p++ { @@ -236,7 +211,83 @@ func (d *displayMt12232a) Flush(img *image.Gray) error { return nil } -func (d *displayMt12232a) Close() error { +func (d *displayMt12232a) Flush(crystal, page byte) { + // !!! TODO Need to update GO to 1.23 to use .Or !!! + bit := uint32(1 << (crystal*4 + page)) + d.pagesFlushFlags.Store(d.pagesFlushFlags.Load() | bit) +} +func (d *displayMt12232a) Close() error { + if d.flushCancel != nil { + d.flushCancel() + d.flushCancel = nil + <-d.flushDone + } return d.dev.Close() } + +func (d *displayMt12232a) flushLoop(ctx context.Context) { + + for { + select { + case <-ctx.Done(): + close(d.flushDone) + return + case <-time.After(time.Millisecond): + forUpdate := d.pagesFlushFlags.Swap(0) + checkBit := uint32(1) + st := time.Now() + d.LockImg() + for p := byte(0); p < 4; p++ { + if forUpdate&(checkBit) != 0 { + d.dev.WriteCode(0, (3-p)|0xB8) + d.dev.WriteCode(0, 0x13) + for c := 0; c < 61; c++ { + d.dev.WriteDatas(0, []byte{ + d.img.Pix[int(p<<3+7)*122+c], + d.img.Pix[int(p<<3+6)*122+c], + d.img.Pix[int(p<<3+5)*122+c], + d.img.Pix[int(p<<3+4)*122+c], + d.img.Pix[int(p<<3+3)*122+c], + d.img.Pix[int(p<<3+2)*122+c], + d.img.Pix[int(p<<3+1)*122+c], + d.img.Pix[int(p<<3+0)*122+c], + }) + } + } + checkBit = checkBit << 1 + } + 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) + d.dev.WriteCode(1, 0x00) + for c := 61; c < 122; c++ { + d.dev.WriteDatas(1, []byte{ + d.img.Pix[int(p<<3+7)*122+c], + d.img.Pix[int(p<<3+6)*122+c], + d.img.Pix[int(p<<3+5)*122+c], + d.img.Pix[int(p<<3+4)*122+c], + d.img.Pix[int(p<<3+3)*122+c], + d.img.Pix[int(p<<3+2)*122+c], + d.img.Pix[int(p<<3+1)*122+c], + d.img.Pix[int(p<<3+0)*122+c], + }) + } + } + checkBit = checkBit << 1 + } + d.UnlockImg() + } + } +} + +func (d *displayMt12232a) GetImg() *image.Gray { + return d.img +} +func (d *displayMt12232a) LockImg() { + d.imgMutex.Lock() +} +func (d *displayMt12232a) UnlockImg() { + d.imgMutex.Unlock() +} diff --git a/display/mt-12864a.go b/display/mt-12864a.go index 9522602..6ee96ed 100644 --- a/display/mt-12864a.go +++ b/display/mt-12864a.go @@ -142,10 +142,19 @@ func (d *displayMt12864a) GetBounds() image.Rectangle { return image.Rectangle{} } -func (d *displayMt12864a) Flush(img *image.Gray) error { - return nil +func (d *displayMt12864a) Flush(crystal, page byte) { } func (d *displayMt12864a) Close() error { return rpio.Close() } + +func (d *displayMt12864a) GetImg() *image.Gray { + return nil +} +func (d *displayMt12864a) LockImg() { + +} +func (d *displayMt12864a) UnlockImg() { + +} diff --git a/display/ssd1306.go b/display/ssd1306.go index aadbcb8..ebd9dd6 100644 --- a/display/ssd1306.go +++ b/display/ssd1306.go @@ -57,8 +57,8 @@ func (d *displaySsd1306) Test(ctx context.Context) error { return nil } -func (d *displaySsd1306) Flush(img *image.Gray) error { - return d.dev.Draw(img.Bounds(), d.img, image.Point{}) +func (d *displaySsd1306) Flush(crystal, page byte) { + //return d.dev.Draw(img.Bounds(), d.img, image.Point{}) } func (d *displaySsd1306) Close() error { @@ -67,3 +67,13 @@ func (d *displaySsd1306) Close() error { } return nil } + +func (d *displaySsd1306) GetImg() *image.Gray { + return nil +} +func (d *displaySsd1306) LockImg() { + +} +func (d *displaySsd1306) UnlockImg() { + +} diff --git a/drawer/bar.go b/drawer/bar.go index 961eae0..03de10e 100644 --- a/drawer/bar.go +++ b/drawer/bar.go @@ -3,8 +3,8 @@ package drawer import "math" func (d *drawer) FillBar(sx, sy, ex, ey, color int) { - d.Lock() - defer d.Unlock() + d.dev.LockImg() + defer d.dev.UnlockImg() bounds := d.img.Bounds() // Crop @@ -24,8 +24,8 @@ func (d *drawer) FillBar(sx, sy, ex, ey, color int) { } func (d *drawer) PutBar(sx, sy, ex, ey, color int) { - d.Lock() - defer d.Unlock() + d.dev.LockImg() + defer d.dev.UnlockImg() bounds := d.img.Bounds() // Crop diff --git a/drawer/drawer.go b/drawer/drawer.go index c83e2a9..01de412 100644 --- a/drawer/drawer.go +++ b/drawer/drawer.go @@ -2,26 +2,21 @@ package drawer import ( "image" - "sync" "gitea.unprism.ru/yotia/display-test/display" ) type drawer struct { - dev display.Display - img *image.Gray - imgMutex sync.Mutex + dev display.Display + + img *image.Gray } type Drawer interface { - - // Lowlevel image - GetImg() *image.Gray - Lock() - Unlock() + GetDisplay() display.Display Clear() - Flush() error + Flush() PutText(x, y int, text string) @@ -30,36 +25,35 @@ type Drawer interface { } func New(dev display.Display) Drawer { - return &drawer{ + d := &drawer{ dev: dev, - img: image.NewGray(dev.GetBounds()), } + + d.img = d.dev.GetImg() + return d } -func (d *drawer) GetImg() *image.Gray { - return d.img -} - -func (d *drawer) Lock() { - d.imgMutex.Lock() -} - -func (d *drawer) Unlock() { - d.imgMutex.Unlock() +func (d *drawer) GetDisplay() display.Display { + return d.dev } func (d *drawer) Clear() { - d.Lock() - defer d.Unlock() + d.dev.LockImg() + defer d.dev.UnlockImg() for i := range d.img.Pix { d.img.Pix[i] = 0 } } -func (d *drawer) Flush() error { - d.Lock() - defer d.Unlock() - - return d.dev.Flush(d.img) +func (d *drawer) Flush() { + // Flush all pages + d.dev.Flush(0, 0) + d.dev.Flush(0, 1) + d.dev.Flush(0, 2) + d.dev.Flush(0, 3) + d.dev.Flush(1, 0) + d.dev.Flush(1, 1) + d.dev.Flush(1, 2) + d.dev.Flush(1, 3) } diff --git a/drawer/font.go b/drawer/font.go index 62f6804..41eff4c 100644 --- a/drawer/font.go +++ b/drawer/font.go @@ -143,70 +143,70 @@ var stdFont = []byte{ 0x41, 0x36, 0x8, 0x0, 0x0, // } 0x8, 0x4, 0x8, 0x4, 0x0, // ~ 0x0, 0x0, 0x0, 0x0, 0x0, // Hollow Up Arrow - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty - 0x0, 0x0, 0x0, 0x0, 0x0, // Empty + 0x7f, 0x55, 0x49, 0x55, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty + 0x7f, 0x41, 0x41, 0x41, 0x7f, // Empty 0x7e, 0x11, 0x11, 0x7e, 0x0, // А 0x7f, 0x49, 0x49, 0x31, 0x0, // Б 0x7f, 0x49, 0x49, 0x36, 0x0, // В @@ -280,21 +280,31 @@ func IntMin(a, b int) int { return b } +func IntMax(a, b int) int { + if a > b { + return a + } + return b +} + func (d *drawer) putChar(x0, y0 int, c byte) { if int(c) > len(stdFont)/5 { return } - if y0 >= d.img.Rect.Dy() || x0 >= d.img.Rect.Dx() { - return - } + //if x0+7 < 0 || y0+5 < 0 || y0 >= d.img.Rect.Dy() || x0 >= d.img.Rect.Dx() { + // return + //} - maxYi := IntMin(y0+7, d.img.Rect.Dy()) - y0 - maxXi := IntMin(x0+5, d.img.Rect.Dx()) - x0 + minX := IntMax(x0, 0) - x0 + minY := IntMax(y0, 0) - y0 - for yi := range maxYi { + maxY := IntMin(y0+7, d.img.Rect.Dy()) - y0 + maxX := IntMin(x0+5, d.img.Rect.Dx()) - x0 + + for yi := minY; yi < maxY; yi++ { lineaddr := (y0+yi)*d.img.Stride + x0 - for xi := range maxXi { + for xi := minX; xi < maxX; xi++ { d.img.Pix[lineaddr+xi] = ((stdFont[int(c)*5+xi] >> yi) & 1) * 255 } } @@ -309,8 +319,8 @@ func convertStr(str string) []byte { } func (d *drawer) PutText(x0, y0 int, text string) { - d.Lock() - defer d.Unlock() + d.dev.LockImg() + defer d.dev.UnlockImg() asciiStr := convertStr(text) //asciiStr := []byte(text) diff --git a/main.go b/main.go index 617047e..4f854fd 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "log" + "math" "os" "os/signal" "syscall" @@ -48,7 +49,7 @@ func DrawProgress(ctx context.Context, timeout time.Duration) error { // Draw outline x := 0 y := drawer.FontCharH + 4 - w := d.GetImg().Rect.Dx() + w := dev.GetImg().Rect.Dx() h := drawer.FontCharH - 4 d.PutBar(x, y, x+w, y+h, 255) @@ -74,9 +75,7 @@ func DrawProgress(ctx context.Context, timeout time.Duration) error { if value >= 1 { return nil } - if err := d.Flush(); err != nil { - return fmt.Errorf("display flush: %w", err) - } + d.Flush() } } } @@ -95,11 +94,26 @@ func Init(ctx context.Context) error { d.Clear() //d.FillBar(0, 0, 10, 10, 1) - d.PutText(0, 0, "можно 4 строки впихнуть") - d.PutText(0, drawer.FontCharH+drawer.LineGap, "каждая буква 5x7") - d.PutText(0, (drawer.FontCharH+drawer.LineGap)*2, "+ русский через жопу") - d.PutText(0, (drawer.FontCharH+drawer.LineGap)*3, "KRBL forever!!") - d.Flush() + stTime := time.Now() + for { + select { + case <-ctx.Done(): + return nil + default: + t := float64(time.Since(stTime).Milliseconds()) / 1000 + x := math.Sin(t)*10 + 5 + y := math.Cos(t)*10 + 5 + d.Clear() + d.PutText(int(x), int(y), "CGSG forever") + stT := time.Now() + d.Flush() + logger.Println("Iteration time:", time.Since(stT)) + } + } + //d.PutText(0, 0, "можно 4 строки впихнуть") + //d.PutText(0, drawer.FontCharH+drawer.LineGap, "каждая буква 5x7") + //d.PutText(0, (drawer.FontCharH+drawer.LineGap)*2, "+ русский через жопу") + //d.PutText(0, (drawer.FontCharH+drawer.LineGap)*3, "KRBL forever!!") // Modem init //mInitCtx, mInitCtxCancel := context.WithCancel(ctx)