Filter BMA456 logs by configurable LSB threshold; master can set deadzone for local sensor or slaves using ACCEL_DEADZONE (UART) and ESP-NOW broadcast until unicast delivery is restored. Co-authored-by: Cursor <cursoragent@cursor.com>
59 lines
1.5 KiB
Go
59 lines
1.5 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
|
|
"google.golang.org/protobuf/proto"
|
|
|
|
"powerpod/gotool/pb"
|
|
)
|
|
|
|
func runDeadzone(sp *serialPort, args []string) error {
|
|
fs := flag.NewFlagSet("deadzone", flag.ExitOnError)
|
|
write := fs.Bool("set", false, "write deadzone (default: read)")
|
|
deadzone := fs.Uint("value", 100, "deadzone in raw accel LSB (with -set)")
|
|
clientID := fs.Uint("client", 0, "client id (0=local master BMA456)")
|
|
all := fs.Bool("all", false, "apply to all registered slaves (master only)")
|
|
if err := fs.Parse(args); err != nil {
|
|
return err
|
|
}
|
|
|
|
req := &pb.AccelDeadzoneRequest{
|
|
Write: *write,
|
|
Deadzone: uint32(*deadzone),
|
|
ClientId: uint32(*clientID),
|
|
AllClients: *all,
|
|
}
|
|
msg := &pb.UartMessage{
|
|
Type: pb.MessageType_ACCEL_DEADZONE,
|
|
Payload: &pb.UartMessage_AccelDeadzoneRequest{
|
|
AccelDeadzoneRequest: req,
|
|
},
|
|
}
|
|
body, err := proto.Marshal(msg)
|
|
if err != nil {
|
|
return fmt.Errorf("encode request: %w", err)
|
|
}
|
|
|
|
payload := append([]byte{byte(pb.MessageType_ACCEL_DEADZONE)}, body...)
|
|
respPayload, err := sp.exchangePayload(payload, "ACCEL_DEADZONE")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var respMsg pb.UartMessage
|
|
if err := proto.Unmarshal(respPayload[1:], &respMsg); err != nil {
|
|
return fmt.Errorf("decode response: %w", err)
|
|
}
|
|
|
|
r := respMsg.GetAccelDeadzoneResponse()
|
|
if r == nil {
|
|
return fmt.Errorf("response missing accel_deadzone_response")
|
|
}
|
|
|
|
fmt.Printf("deadzone=%d client_id=%d success=%v slaves_updated=%d\n",
|
|
r.GetDeadzone(), r.GetClientId(), r.GetSuccess(), r.GetSlavesUpdated())
|
|
return nil
|
|
}
|