refactor: config and remote pkg
This commit is contained in:
		@@ -1,216 +1,7 @@
 | 
			
		||||
package sensor
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"path/filepath"
 | 
			
		||||
	"text/tabwriter"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"github.com/satori/go.uuid"
 | 
			
		||||
 | 
			
		||||
	stypes "git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
 | 
			
		||||
	"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Add ...
 | 
			
		||||
func Add(sensorName, sensorLocation, sensorType, wireID, gpioNumber *string, wirePath, configDir string, enabled *bool) error {
 | 
			
		||||
 | 
			
		||||
	// read cnf file
 | 
			
		||||
	cnf, err := config.Read(configDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	s := &stypes.Sensor{
 | 
			
		||||
		SensorID:       uuid.NewV4().String(),
 | 
			
		||||
		SensorName:     sensorName,
 | 
			
		||||
		SensorLocation: sensorLocation,
 | 
			
		||||
		GPIONumber:     gpioNumber,
 | 
			
		||||
		SensorType:     sensorType,
 | 
			
		||||
		SensorEnabled:  enabled,
 | 
			
		||||
		DeviceID:       cnf.DeviceID,
 | 
			
		||||
		CreationDate:   time.Now(),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// If the new sensor is a wire sensor
 | 
			
		||||
	if wireID != nil {
 | 
			
		||||
 | 
			
		||||
		// check if sensor exists
 | 
			
		||||
		if !exists(wirePath, *wireID) {
 | 
			
		||||
			return fmt.Errorf("Can not find sensor: %v", filepath.Join(wirePath, *wireID))
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// check if sensor is redundant
 | 
			
		||||
		if isWireIDRedundant(*wireID, cnf.Sensors) {
 | 
			
		||||
			return fmt.Errorf("Sensor %v already exists", *wireID)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		s.WireID = wireID
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// check if sensor is redundant
 | 
			
		||||
	if isSensorNameRedundant(*sensorName, cnf.Sensors) {
 | 
			
		||||
		return fmt.Errorf("Sensor %v already exists", *sensorName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// append sensor to list
 | 
			
		||||
	cnf.Sensors = append(cnf.Sensors, s)
 | 
			
		||||
 | 
			
		||||
	// write cnf file
 | 
			
		||||
	if err := config.Write(cnf, configDir); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
type Sensor interface {
 | 
			
		||||
	Read() (interface{}, error)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Enable a remote link
 | 
			
		||||
func Enable(sensorName string, configDir string) error {
 | 
			
		||||
 | 
			
		||||
	cnf, err := config.Read(configDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search after duplicate remote_names
 | 
			
		||||
	var found bool
 | 
			
		||||
	for _, sensor := range cnf.Sensors {
 | 
			
		||||
		if *sensor.SensorName == sensorName ||
 | 
			
		||||
			sensor.SensorID == sensorName {
 | 
			
		||||
			*sensor.SensorEnabled = true
 | 
			
		||||
			found = true
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !found {
 | 
			
		||||
		return fmt.Errorf("Can not find sensor %v", sensorName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := config.Write(cnf, configDir); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Disable a remote link
 | 
			
		||||
func Disable(sensorName string, configDir string) error {
 | 
			
		||||
 | 
			
		||||
	cnf, err := config.Read(configDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// search after duplicate remote_names
 | 
			
		||||
	var found bool
 | 
			
		||||
	for _, sensor := range cnf.Sensors {
 | 
			
		||||
		if *sensor.SensorName == sensorName ||
 | 
			
		||||
			sensor.SensorID == sensorName {
 | 
			
		||||
			*sensor.SensorEnabled = false
 | 
			
		||||
			found = true
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if !found {
 | 
			
		||||
		return fmt.Errorf("Can not find sensor %v", sensorName)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := config.Write(cnf, configDir); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Print a list with the given writer w over all temperature sensors
 | 
			
		||||
func Print(w io.Writer, configDir string, quiet bool) error {
 | 
			
		||||
 | 
			
		||||
	// read cnf file
 | 
			
		||||
	cnf, err := config.Read(configDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// declar tabwriter
 | 
			
		||||
	tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0)
 | 
			
		||||
 | 
			
		||||
	// headline
 | 
			
		||||
	if !quiet {
 | 
			
		||||
		fmt.Fprint(tw, "id\tname\tlocation\ttype\twire-id\tgpio\tenabled\n")
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for _, sensor := range cnf.Sensors {
 | 
			
		||||
		if quiet {
 | 
			
		||||
			fmt.Fprintf(tw, "%v\n", sensor.SensorID)
 | 
			
		||||
		} else {
 | 
			
		||||
			fmt.Fprintf(tw, "%v\t%v\t%v\t%v\t%v\t%v\t%v\n", sensor.SensorID, *sensor.SensorName, *sensor.SensorLocation, *sensor.SensorType, *sensor.WireID, *sensor.GPIONumber, *sensor.SensorEnabled)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	tw.Flush()
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Remove a sensor
 | 
			
		||||
func Remove(sensorName, configDir string) error {
 | 
			
		||||
 | 
			
		||||
	cnf, err := config.Read(configDir)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var j int
 | 
			
		||||
	for _, sensor := range cnf.Sensors {
 | 
			
		||||
		if *sensor.SensorName == sensorName ||
 | 
			
		||||
			sensor.SensorID == sensorName {
 | 
			
		||||
			cnf.Sensors = append(cnf.Sensors[:j], cnf.Sensors[j+1:]...)
 | 
			
		||||
 | 
			
		||||
			if j > 0 {
 | 
			
		||||
				j = j - 1
 | 
			
		||||
			}
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		j++
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if err := config.Write(cnf, configDir); err != nil {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func exists(wirePath, sensorID string) bool {
 | 
			
		||||
	sensorPath := filepath.Join(wirePath, sensorID)
 | 
			
		||||
	if _, err := os.Stat(sensorPath); os.IsNotExist(err) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isWireIDRedundant returns a boolean if the sensor id redundant
 | 
			
		||||
func isWireIDRedundant(wireID string, sensors []*stypes.Sensor) bool {
 | 
			
		||||
	for _, sensor := range sensors {
 | 
			
		||||
		if *sensor.WireID == wireID {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// isSensorNameRedundant returns a boolean if the sensor name redundant
 | 
			
		||||
func isSensorNameRedundant(sensorName string, sensors []*stypes.Sensor) bool {
 | 
			
		||||
	for _, sensor := range sensors {
 | 
			
		||||
		if *sensor.SensorName == sensorName {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
// func ReadTemperatures
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user