mirror of
https://github.com/wisplite/parchment.git
synced 2026-06-27 13:47:08 -05:00
upload page added + parchment properly waits for ack command
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user