103 lines
2.1 KiB
Go
103 lines
2.1 KiB
Go
|
//go:build linux && amd64
|
||
|
|
||
|
package intel_baseband
|
||
|
|
||
|
import (
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"net"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
// Command code
|
||
|
clearLogCmdID = 0x4
|
||
|
deviceDataCmdID = 0x9
|
||
|
)
|
||
|
|
||
|
type socketConnector struct {
|
||
|
pathToSocket string
|
||
|
accessTimeout time.Duration
|
||
|
connection net.Conn
|
||
|
}
|
||
|
|
||
|
func (sc *socketConnector) dumpTelemetryToLog() error {
|
||
|
// clean the log to have only the latest metrics in the file
|
||
|
err := sc.sendCommandToSocket(clearLogCmdID)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to send clear log command: %w", err)
|
||
|
}
|
||
|
|
||
|
// fill the file with the latest metrics
|
||
|
err = sc.sendCommandToSocket(deviceDataCmdID)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to send device data command: %w", err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (sc *socketConnector) sendCommandToSocket(c byte) error {
|
||
|
err := sc.connect()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer sc.close()
|
||
|
err = sc.writeCommandToSocket(c)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (sc *socketConnector) writeCommandToSocket(c byte) error {
|
||
|
if sc.connection == nil {
|
||
|
return errors.New("connection had not been established before")
|
||
|
}
|
||
|
var err error
|
||
|
if sc.accessTimeout == 0 {
|
||
|
err = sc.connection.SetWriteDeadline(time.Time{})
|
||
|
} else {
|
||
|
err = sc.connection.SetWriteDeadline(time.Now().Add(sc.accessTimeout))
|
||
|
}
|
||
|
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to set timeout for request: %w", err)
|
||
|
}
|
||
|
|
||
|
_, err = sc.connection.Write([]byte{c, 0x00})
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to send request to socket: %w", err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (sc *socketConnector) connect() error {
|
||
|
connection, err := net.Dial("unix", sc.pathToSocket)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("failed to connect to the socket: %w", err)
|
||
|
}
|
||
|
|
||
|
sc.connection = connection
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func (sc *socketConnector) close() error {
|
||
|
if sc.connection == nil {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
err := sc.connection.Close()
|
||
|
sc.connection = nil
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func newSocketConnector(pathToSocket string, accessTimeout time.Duration) *socketConnector {
|
||
|
return &socketConnector{
|
||
|
pathToSocket: pathToSocket,
|
||
|
accessTimeout: accessTimeout,
|
||
|
}
|
||
|
}
|