upload page added + parchment properly waits for ack command

This commit is contained in:
2026-01-30 06:18:25 -06:00
parent f5a688e741
commit 073b78bcb3
3 changed files with 95 additions and 17 deletions
+62 -11
View File
@@ -1,6 +1,7 @@
package main
import (
"bytes"
"fmt"
"time"
@@ -15,6 +16,8 @@ type Device struct {
Connected bool
}
var commandAck = []byte{0xAA, 0x06, 0x00, 0x00, 0x00}
// NewDevice creates a new Device instance.
func NewDevice() *Device {
return &Device{}
@@ -51,18 +54,16 @@ func (d *Device) Connect() error {
d.Port = port
d.Connected = true
_ = d.Port.SetReadTimeout(100 * time.Millisecond)
// Send dev mode request
// 0xAA 0x04 0x00 0x00 0x00 is the command sequence for dev mode
_, err = d.Port.Write([]byte{0xAA, 0x04, 0x00, 0x00, 0x00})
err = d.sendCommand([]byte{0xAA, 0x04, 0x00, 0x00, 0x00})
if err != nil {
d.Close()
return fmt.Errorf("failed to send dev mode request: %w", err)
return fmt.Errorf("failed to enter dev mode: %w", err)
}
// Allow some time for the device to respond or settle if needed
time.Sleep(100 * time.Millisecond)
return nil
}
@@ -73,14 +74,10 @@ func (d *Device) ExitDevMode() error {
}
// disable dev mode
_, err := d.Port.Write([]byte{0xAA, 0x05, 0x00, 0x00, 0x00})
if err != nil {
return fmt.Errorf("failed to send exit dev mode command: %w", err)
if err := d.sendCommand([]byte{0xAA, 0x05, 0x00, 0x00, 0x00}); err != nil {
return fmt.Errorf("failed to exit dev mode: %w", err)
}
// Allow some time for the device to respond or settle if needed
time.Sleep(100 * time.Millisecond)
return nil
}
@@ -108,3 +105,57 @@ func (d *Device) Write(data []byte) (int, error) {
}
return d.Port.Write(data)
}
func (d *Device) sendCommand(cmd []byte) error {
if d.Port == nil {
return fmt.Errorf("port not open")
}
if _, err := d.Port.Write(cmd); err != nil {
return fmt.Errorf("failed to send command: %w", err)
}
if err := d.waitForResponse(commandAck, 2*time.Second); err != nil {
return err
}
return nil
}
func (d *Device) waitForResponse(expected []byte, timeout time.Duration) error {
if d.Port == nil {
return fmt.Errorf("port not open")
}
if len(expected) == 0 {
return fmt.Errorf("expected response is empty")
}
deadline := time.NewTimer(timeout)
defer deadline.Stop()
readBuf := make([]byte, 64)
window := make([]byte, 0, len(expected)*4)
maxWindow := len(expected) * 4
if maxWindow < 64 {
maxWindow = 64
}
for {
select {
case <-deadline.C:
return fmt.Errorf("timeout waiting for response %x", expected)
default:
n, err := d.Port.Read(readBuf)
if err != nil {
return fmt.Errorf("failed while waiting for response: %w", err)
}
if n == 0 {
continue
}
window = append(window, readBuf[:n]...)
if len(window) > maxWindow {
window = window[len(window)-maxWindow:]
}
if bytes.Contains(window, expected) {
return nil
}
}
}
}