package cli import ( "fmt" "io" "text/tabwriter" "github.com/go-flucky/flucky/pkg/config" "github.com/go-flucky/flucky/pkg/types" ) // GetSensorsByMeasuredValues returns commulated list of sensors by measured values func GetSensorsByMeasuredValues(measuredValues []*types.MeasuredValue, cnf *config.Configuration) []*types.Sensor { sensors := []*types.Sensor{} for _, measuredValue := range measuredValues { duplicated := false foundSensor := &types.Sensor{} for _, cnfSensor := range cnf.Sensors { if measuredValue.SensorID == cnfSensor.SensorID { foundSensor = cnfSensor // compare if id has already been added to list for _, sensor := range sensors { if cnfSensor.SensorID == sensor.SensorID { duplicated = true break } } } } if duplicated { continue } if foundSensor != nil { sensors = append(sensors, foundSensor) continue } else { sensors = append(sensors, &types.Sensor{SensorID: measuredValue.SensorID}) } } return sensors } // PrintRGBLEDs displays a list with all configured RGBLEDs func PrintRGBLEDs(cnf *config.Configuration, w io.Writer) { // declare tabwriter tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) // headline fmt.Fprintln(tw, "name\tlocation\tblue\tgreen\tred\tenabled\taction") for _, rgbled := range cnf.RGBLEDs { fmt.Fprintf(tw, "%v\t%v\t%v\t%v\t%v\t%v\t", rgbled.RGBLEDName, rgbled.RGBLEDLocation, *rgbled.BaseColorsToGPIO[types.BaseColorBlue], *rgbled.BaseColorsToGPIO[types.BaseColorGreen], *rgbled.BaseColorsToGPIO[types.BaseColorRed], rgbled.RGBLEDEnabled) for action, color := range rgbled.ActionMapping { fmt.Fprintf(tw, "%v=%v,", action, color) } fmt.Fprintf(tw, "\n") } tw.Flush() } // PrintSensors displays a list with all configured sensors func PrintSensors(cnf *config.Configuration, w io.Writer) error { // declar tabwriter tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) fmt.Fprint(tw, "name\tlocation\ttype\twire-id\ti2c-bus\ti2c-address\tgpio\tenabled\n") for _, sensor := range cnf.Sensors { fmt.Fprintf(tw, "%v\t%v\t%v\t", sensor.SensorName, sensor.SensorLocation, sensor.SensorModel) if sensor.WireID != nil { fmt.Fprintf(tw, "%v\t", *sensor.WireID) } else { fmt.Fprintf(tw, "\t") } if sensor.I2CBus != nil { fmt.Fprintf(tw, "%v\t", *sensor.I2CBus) } else { fmt.Fprintf(tw, "\t") } if sensor.I2CAddress != nil { fmt.Fprintf(tw, "%v\t", *sensor.I2CAddress) } else { fmt.Fprintf(tw, "\t") } if sensor.GPIONumber != nil { fmt.Fprintf(tw, "%v\t", *sensor.GPIONumber) } else { fmt.Fprintf(tw, "\t") } fmt.Fprintf(tw, "%v\n", sensor.SensorEnabled) } tw.Flush() return nil } // PrintMeasuredValues displays a list of measured values func PrintMeasuredValues(measuredValues []*types.MeasuredValue, cnf *config.Configuration, w io.Writer) { sensors := GetSensorsByMeasuredValues(measuredValues, cnf) // sort measured values for every sensor orderedMeasuredValues := make(map[string][]*types.MeasuredValue) for _, measuredValue := range measuredValues { orderedMeasuredValues[measuredValue.SensorID] = append(orderedMeasuredValues[measuredValue.SensorID], measuredValue) } // declare tabwriter tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0) // headlines for i, sensor := range sensors { fmt.Fprintf(tw, "%v\t", sensor.Name()) if i == len(sensors)-1 { fmt.Fprintf(tw, "\n") } } // find sensor with maximum temperature values maxLength := 0 for _, orderedMeasuredValue := range orderedMeasuredValues { if len(orderedMeasuredValue) > maxLength { maxLength = len(orderedMeasuredValue) } } // body for i := 0; i < maxLength; i++ { for _, sensor := range sensors { if len(orderedMeasuredValues[sensor.SensorID]) > i { fmt.Fprintf(tw, "%3.3f\t", orderedMeasuredValues[sensor.SensorID][i].Value) } else { fmt.Fprint(tw, "\t") } } fmt.Fprint(tw, "\n") } tw.Flush() }