123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100 |
- package main
- import (
- "flag"
- "fmt"
- "log"
- "math"
- "os"
- dev "github.com/vladimirvivien/go4vl/device"
- "github.com/vladimirvivien/go4vl/v4l2"
- )
- var (
- controls = map[string]v4l2.CtrlID{
- "brightness": v4l2.CtrlBrightness,
- "contrast": v4l2.CtrlContrast,
- }
- )
- func main() {
- devName := "/dev/video0"
- flag.StringVar(&devName, "d", devName, "device name (path)")
- var list bool
- flag.BoolVar(&list, "list", list, "List current device controls")
- var ctrlName string
- flag.StringVar(&ctrlName, "c", ctrlName, fmt.Sprintf("Contrl name to set or get (supported %v)", controls))
- ctrlVal := math.MinInt32
- flag.IntVar(&ctrlVal, "v", ctrlVal, fmt.Sprintf("Value for selected control (supported %v)", controls))
- flag.Parse()
- // open device
- device, err := dev.Open(devName)
- if err != nil {
- log.Fatalf("failed to open device: %s", err)
- }
- defer device.Close()
- if len(os.Args) < 2 || list {
- listUserControls(device)
- os.Exit(0)
- }
- ctrlID, ok := controls[ctrlName]
- if !ok {
- fmt.Printf("Program does not support ctrl [%s]; supported ctrls: %#v\n", ctrlName, controls)
- os.Exit(1)
- }
- if ctrlName != "" {
- if ctrlVal != math.MinInt32 {
- if err := setUserControlValue(device, ctrlID, ctrlVal); err != nil {
- fmt.Println(err)
- os.Exit(1)
- }
- }
- ctrl, err := device.GetControl(ctrlID)
- if err != nil {
- fmt.Printf("query controls: %s\n", err)
- os.Exit(1)
- }
- printUserControl(ctrl)
- }
- }
- func setUserControlValue(device *dev.Device, ctrlID v4l2.CtrlID, val int) error {
- if ctrlID == 0 {
- return fmt.Errorf("invalid control specified")
- }
- return device.SetControlValue(ctrlID, v4l2.CtrlValue(val))
- }
- func listUserControls(device *dev.Device) {
- ctrls, err := device.QueryAllControls()
- if err != nil {
- log.Fatalf("query controls: %s", err)
- }
- for _, ctrl := range ctrls {
- printUserControl(ctrl)
- }
- }
- func printUserControl(ctrl v4l2.Control) {
- fmt.Printf("Control id (%d) name: %s\t[min: %d; max: %d; step: %d; default: %d current_val: %d]\n",
- ctrl.ID, ctrl.Name, ctrl.Minimum, ctrl.Maximum, ctrl.Step, ctrl.Default, ctrl.Value)
- if ctrl.IsMenu() {
- menus, err := ctrl.GetMenuItems()
- if err != nil {
- return
- }
- for _, m := range menus {
- fmt.Printf("\tMenu items for %s: %#v\n", ctrl.Name, m)
- }
- }
- }
|