You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
2.8 KiB
Go

package device
import (
pb "FRMS/internal/pkg/grpc"
"fmt"
"sync"
"github.com/spf13/viper"
)
type SubManager interface {
Start() error
Exit() error
String() string // printing info about the sub manager
// for config bs
GetDefaultName() string
}
type NameChan struct {
Ch chan string
}
// base device manager
type DeviceManager struct {
SubManager `mapstructure:",squash"`
// across controllers/sensors
Address int `mapstructure:"address"`
infoMu sync.Mutex
*Name
Name string `mapstructure:"name"`
Status string // easier to remember
Config *viper.Viper
ConfigPrefix string
//sync.RWMutex
pb.UnimplementedDeviceInfoServer
}
func NewDeviceManager(addr int32, config *viper.Viper, cPre string) (*DeviceManager, error) {
s, err := NewSubManager(addr)
dm := &DeviceManager{
SubManager: s,
Config: config,
Address: int(addr),
ConfigPrefix: cPre,
}
return dm, err
}
func (m *DeviceManager) LoadConfig() error {
// setting default name
mainKey := fmt.Sprintf("%s.devices.%d", m.ConfigPrefix, m.Address)
nameKey := fmt.Sprintf("%s.name", mainKey)
if !m.Config.IsSet(nameKey) {
m.Config.Set(nameKey, m.SubManager.GetDefaultName())
}
m.Config.UnmarshalKey(mainKey, m)
return nil
}
// dev info grpc handlers
func (m *DeviceManager) Name(stream pb.DeviceInfo_StatusServer) error {
// this might be scuffed
}
// I think I can use grpc streams to do better
// func (m *DeviceManger) GetName(ctx context.Context, req *pb.DeviceName) (*pb.DeviceName, error) {
// // gets name
// var name string
// var err error
// // quick lock
// m.infoMu.RLock()
// name = m.Name
// m.infoMu.RUnlock()
// if name == "" {
// name = m.GetDefaultName()
// err = m.UpdateName(name)
// }
// response := &pb.DeviceName{Address: int32(m.Address), Name: name}
// return response, err
// }
// func (m *DeviceManger) SetName(ctx context.Context, req *pb.DeviceName) (*pb.DeviceName, error) {
// // handles incoming req
// response := &pb.DeviceName{Address: int32(m.Address)}
// err := m.UpdateName()
// return response, err
// }
// func (m *DeviceManager) UpdateName(name string) error {
// // updates name/config
// m.infoMu.Lock()
// defer m.infoMu.Unlock()
// nameKey := fmt.Sprintf("%s.devices.%d.name", m.ConfigPrefix, m.Address)
// m.Config.SetKey(nameKey, name)
// return nil
// }
// func (m *DeviceManger) GetStatus(ctx context.Context, req *pb.DeviceStatus) (*pb.DeviceStatus, error) {
// }
// func (m *DeviceManger) SetStatus(ctx context.Context, req *pb.DeviceStatus) (*pb.DeviceStatus, error) {
// }
// monitoring grpc
func (m *DeviceManager) GetDevice() (*pb.Device, error) {
// turns info into pb.Device for monitoring grpc
}
func (m *DeviceManger) UpdateDevice(*pb.Device) error {
// unpacks pb.Device to update itself
}