New mechanism
This commit is contained in:
73
internal/temper/temperctx_linux.go
Normal file
73
internal/temper/temperctx_linux.go
Normal file
@ -0,0 +1,73 @@
|
||||
package temper
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
func (t *Temper) ReadCWithContext(ctx context.Context) (float32, error) {
|
||||
t.lock.Lock()
|
||||
defer t.lock.Unlock()
|
||||
|
||||
deadline, ok := ctx.Deadline()
|
||||
if !ok {
|
||||
deadline = time.Time{}
|
||||
}
|
||||
err := t.writer.SetWriteDeadline(deadline)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer t.writer.SetDeadline(time.Time{})
|
||||
err = t.reader.SetReadDeadline(deadline)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
defer t.reader.SetDeadline(time.Time{})
|
||||
tempChan := make(chan reading)
|
||||
go func() {
|
||||
// prepare a buffer and get ready to read
|
||||
// from the temper hid device
|
||||
response := make([]byte, 8)
|
||||
err := t.reader.SetDeadline(deadline)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
_, err = t.reader.Read(response)
|
||||
if err != nil {
|
||||
tempChan <- reading{0, err}
|
||||
return
|
||||
}
|
||||
// interpret the bytes as hex
|
||||
hexStr := hex.EncodeToString(response)
|
||||
// extract the temperature fields from the string
|
||||
temp := hexStr[4:8]
|
||||
// convert the hex ints to an integer
|
||||
tempInt, err := strconv.ParseInt(temp, 16, 64)
|
||||
if err != nil {
|
||||
tempChan <- reading{0, err}
|
||||
return
|
||||
}
|
||||
// divide the result by 100 and send to chan
|
||||
float := float32(tempInt) / 100
|
||||
tempChan <- reading{error: nil, value: float}
|
||||
}()
|
||||
// send magic byte sequence to request a temperature reading
|
||||
_, wErr := t.writer.Write([]byte{0, 1, 128, 51, 1, 0, 0, 0, 0})
|
||||
if wErr != nil {
|
||||
return 0, err
|
||||
}
|
||||
read := <-tempChan
|
||||
return read.value, read.error
|
||||
}
|
||||
|
||||
// Read the internal sensor temperature in Fahrenheit
|
||||
func (t *Temper) ReadFWithContext(ctx context.Context) (float32, error) {
|
||||
c, err := t.ReadCWithContext(ctx)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
f := c*9.0/5.0 + 32.0
|
||||
return f, err
|
||||
}
|
Reference in New Issue
Block a user