127 lines
2.7 KiB
Go
127 lines
2.7 KiB
Go
|
package hwsensorsservice
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"errors"
|
||
|
"io"
|
||
|
|
||
|
"github.com/golang/protobuf/ptypes/empty"
|
||
|
"github.com/shayne/hwinfo-streamdeck/pkg/service/proto"
|
||
|
)
|
||
|
|
||
|
// GRPCClient is an implementation of KV that talks over RPC.
|
||
|
type GRPCClient struct {
|
||
|
Client proto.HWServiceClient
|
||
|
}
|
||
|
|
||
|
// PollTime rpc call
|
||
|
func (c *GRPCClient) PollTime() (uint64, error) {
|
||
|
resp, err := c.Client.PollTime(context.Background(), &empty.Empty{})
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
return resp.GetPollTime(), nil
|
||
|
}
|
||
|
|
||
|
// Sensors implementation
|
||
|
func (c *GRPCClient) Sensors() ([]Sensor, error) {
|
||
|
stream, err := c.Client.Sensors(context.Background(), &empty.Empty{})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var sensors []Sensor
|
||
|
for {
|
||
|
s, err := stream.Recv()
|
||
|
if errors.Is(err, io.EOF) {
|
||
|
break
|
||
|
}
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
sensors = append(sensors, &sensor{s})
|
||
|
}
|
||
|
|
||
|
return sensors, nil
|
||
|
}
|
||
|
|
||
|
// ReadingsForSensorID implementation
|
||
|
func (c *GRPCClient) ReadingsForSensorID(id string) ([]Reading, error) {
|
||
|
stream, err := c.Client.ReadingsForSensorID(context.Background(), &proto.SensorIDRequest{Id: id})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
var readings []Reading
|
||
|
for {
|
||
|
r, err := stream.Recv()
|
||
|
if errors.Is(err, io.EOF) {
|
||
|
break
|
||
|
}
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
readings = append(readings, &reading{r})
|
||
|
}
|
||
|
|
||
|
return readings, nil
|
||
|
}
|
||
|
|
||
|
// GRPCServer is the gRPC server that GRPCClient talks to.
|
||
|
type GRPCServer struct {
|
||
|
// This is the real implementation
|
||
|
Impl HardwareService
|
||
|
proto.UnimplementedHWServiceServer
|
||
|
}
|
||
|
|
||
|
// PollTime gRPC wrapper
|
||
|
func (s *GRPCServer) PollTime(ctx context.Context, _ *empty.Empty) (*proto.PollTimeReply, error) {
|
||
|
v, err := s.Impl.PollTime()
|
||
|
return &proto.PollTimeReply{PollTime: v}, err
|
||
|
}
|
||
|
|
||
|
// Sensors gRPC wrapper
|
||
|
func (s *GRPCServer) Sensors(_ *empty.Empty, stream proto.HWService_SensorsServer) error {
|
||
|
sensors, err := s.Impl.Sensors()
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for _, sensor := range sensors {
|
||
|
if err := stream.Send(&proto.Sensor{
|
||
|
ID: sensor.ID(),
|
||
|
Name: sensor.Name(),
|
||
|
}); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// ReadingsForSensorID gRPC wrapper
|
||
|
func (s *GRPCServer) ReadingsForSensorID(req *proto.SensorIDRequest, stream proto.HWService_ReadingsForSensorIDServer) error {
|
||
|
readings, err := s.Impl.ReadingsForSensorID(req.GetId())
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
for _, reading := range readings {
|
||
|
if err := stream.Send(&proto.Reading{
|
||
|
ID: reading.ID(),
|
||
|
TypeI: reading.TypeI(),
|
||
|
Type: reading.Type(),
|
||
|
Label: reading.Label(),
|
||
|
Unit: reading.Unit(),
|
||
|
Value: reading.Value(),
|
||
|
ValueMin: reading.ValueMin(),
|
||
|
ValueMax: reading.ValueMax(),
|
||
|
ValueAvg: reading.ValueAvg(),
|
||
|
}); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|