ctrl.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "math"
  7. "os"
  8. dev "github.com/vladimirvivien/go4vl/device"
  9. "github.com/vladimirvivien/go4vl/v4l2"
  10. )
  11. var (
  12. controls = map[string]v4l2.CtrlID{
  13. "brightness": v4l2.CtrlBrightness,
  14. "contrast": v4l2.CtrlContrast,
  15. }
  16. )
  17. func main() {
  18. devName := "/dev/video0"
  19. flag.StringVar(&devName, "d", devName, "device name (path)")
  20. var list bool
  21. flag.BoolVar(&list, "list", list, "List current device controls")
  22. var ctrlName string
  23. flag.StringVar(&ctrlName, "c", ctrlName, fmt.Sprintf("Contrl name to set or get (supported %v)", controls))
  24. ctrlVal := math.MinInt32
  25. flag.IntVar(&ctrlVal, "v", ctrlVal, fmt.Sprintf("Value for selected control (supported %v)", controls))
  26. flag.Parse()
  27. // open device
  28. device, err := dev.Open(devName)
  29. if err != nil {
  30. log.Fatalf("failed to open device: %s", err)
  31. }
  32. defer device.Close()
  33. if len(os.Args) < 2 || list {
  34. listUserControls(device)
  35. os.Exit(0)
  36. }
  37. ctrlID, ok := controls[ctrlName]
  38. if !ok {
  39. fmt.Printf("Program does not support ctrl [%s]; supported ctrls: %#v\n", ctrlName, controls)
  40. os.Exit(1)
  41. }
  42. if ctrlName != "" {
  43. if ctrlVal != math.MinInt32 {
  44. if err := setUserControlValue(device, ctrlID, ctrlVal); err != nil {
  45. fmt.Println(err)
  46. os.Exit(1)
  47. }
  48. }
  49. ctrl, err := device.GetControl(ctrlID)
  50. if err != nil {
  51. fmt.Printf("query controls: %s\n", err)
  52. os.Exit(1)
  53. }
  54. printUserControl(ctrl)
  55. }
  56. }
  57. func setUserControlValue(device *dev.Device, ctrlID v4l2.CtrlID, val int) error {
  58. if ctrlID == 0 {
  59. return fmt.Errorf("invalid control specified")
  60. }
  61. return device.SetControlValue(ctrlID, v4l2.CtrlValue(val))
  62. }
  63. func listUserControls(device *dev.Device) {
  64. ctrls, err := device.QueryAllControls()
  65. if err != nil {
  66. log.Fatalf("query controls: %s", err)
  67. }
  68. for _, ctrl := range ctrls {
  69. printUserControl(ctrl)
  70. }
  71. }
  72. func printUserControl(ctrl v4l2.Control) {
  73. fmt.Printf("Control id (%d) name: %s\t[min: %d; max: %d; step: %d; default: %d current_val: %d]\n",
  74. ctrl.ID, ctrl.Name, ctrl.Minimum, ctrl.Maximum, ctrl.Step, ctrl.Default, ctrl.Value)
  75. if ctrl.IsMenu() {
  76. menus, err := ctrl.GetMenuItems()
  77. if err != nil {
  78. return
  79. }
  80. for _, m := range menus {
  81. fmt.Printf("\tMenu items for %s: %#v\n", ctrl.Name, m)
  82. }
  83. }
  84. }