00001
00002 #ifndef vidl_v4l2_control_h_
00003 #define vidl_v4l2_control_h_
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include <vcl_string.h>
00015 #include <vcl_vector.h>
00016
00017 extern "C" {
00018 #include <asm/types.h>
00019 #include <linux/videodev2.h>
00020 };
00021
00022
00023 class vidl_v4l2_control
00024 {
00025 protected:
00026 int fd;
00027 struct v4l2_queryctrl ctrl_;
00028 vidl_v4l2_control(const v4l2_queryctrl& ctr, int f): fd(f), ctrl_(ctr) {}
00029 void set_value(int v) const;
00030 int get_value() const;
00031 public:
00032 virtual ~vidl_v4l2_control() {}
00033
00034
00035
00036
00037 static vidl_v4l2_control * new_control(const v4l2_queryctrl& ctr, int f);
00038
00039
00040 v4l2_ctrl_type type() const { return ctrl_.type; }
00041
00042
00043 vcl_string name() const { return (const char *) ctrl_.name; }
00044
00045 virtual vcl_string description() const= 0;
00046
00047
00048 int id() const { return ctrl_.id; }
00049
00050 bool read_only() const
00051 {
00052 #ifdef V4L2_CTRL_FLAG_READ_ONLY
00053 return ctrl_.flags & V4L2_CTRL_FLAG_READ_ONLY;
00054 #else
00055 return false;
00056 #endif
00057 }
00058
00059 bool affect_other_controls() const
00060 {
00061 #ifdef V4L2_CTRL_FLAG_UPDATE
00062 return ctrl_.flags & V4L2_CTRL_FLAG_UPDATE;
00063 #else
00064 return false;
00065 #endif
00066 }
00067
00068
00069 virtual void reset() const {}
00070 };
00071
00072
00073 class vidl_v4l2_control_integer: public vidl_v4l2_control
00074 {
00075 public:
00076 vidl_v4l2_control_integer(const v4l2_queryctrl& ctr, int f): vidl_v4l2_control(ctr,f) {}
00077
00078 int minimum() const { return ctrl_.minimum; }
00079
00080 int maximum() const { return ctrl_.maximum; }
00081
00082
00083 int step() const { return ctrl_.step; }
00084
00085 int default_value() const { return ctrl_.default_value; }
00086
00087
00088 void set(int value) const;
00089
00090
00091 void set_100 ( int value) const;
00092
00093
00094 int get() const { return get_value(); }
00095
00096
00097 int get_100() const { return (get_value()-ctrl_.minimum)*100/(ctrl_.maximum-ctrl_.minimum); }
00098
00099 virtual vcl_string description() const;
00100
00101 virtual void reset() const { set(default_value()); }
00102 };
00103
00104
00105 class vidl_v4l2_control_menu: public vidl_v4l2_control
00106 {
00107 vcl_vector<vcl_string> items;
00108 public:
00109 vidl_v4l2_control_menu(const v4l2_queryctrl& ctr, int f);
00110
00111
00112 unsigned int n_items() const { return items.size();}
00113
00114
00115 vcl_string get(unsigned int i) const { return items[i]; }
00116
00117 void set(unsigned int i) const { if (i<n_items()) set_value((int) i); }
00118
00119
00120 unsigned int get() const { return (unsigned int) get_value(); }
00121
00122 unsigned int default_value() const { return ctrl_.default_value; }
00123
00124 virtual vcl_string description() const;
00125
00126 virtual void reset() const { set(default_value()); }
00127 };
00128
00129
00130 class vidl_v4l2_control_boolean: public vidl_v4l2_control
00131 {
00132 public:
00133 vidl_v4l2_control_boolean(const v4l2_queryctrl& ctr, int f): vidl_v4l2_control(ctr,f) {}
00134
00135 void set(bool v) const { set_value(v?1:0); }
00136
00137 bool get() const { return get_value(); }
00138
00139 bool default_value() const { return ctrl_.default_value; }
00140
00141 virtual vcl_string description() const
00142 { return "Control \""+name()+"\": boolean (default: "+(default_value()?"true":"false")+")"; }
00143
00144 virtual void reset() const { set(default_value()); }
00145 };
00146
00147
00148 class vidl_v4l2_control_button: public vidl_v4l2_control
00149 {
00150 public:
00151 vidl_v4l2_control_button(const v4l2_queryctrl& ctr, int f): vidl_v4l2_control(ctr,f) {}
00152
00153 void push() const { set_value(1); }
00154
00155 virtual vcl_string description() const { return "Control \""+name()+"\": button"; }
00156 };
00157
00158 #endif // vidl_v4l2_control_h_