00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef __PLUGINS_PANTILT_SONY_VISCA_H_
00025 #define __PLUGINS_PANTILT_SONY_VISCA_H_
00026
00027 #include <core/exception.h>
00028
00029 #ifdef TIMETRACKER_VISCA
00030 # warning Visca time tracker enabled
00031 # include <utils/timetracker.h>
00032 # include <fstream>
00033 #endif
00034
00035 #include <cstddef>
00036
00037 class ViscaException : public fawkes::Exception
00038 {
00039 public:
00040 ViscaException(const char *msg);
00041 ViscaException(const char *msg, const int _errno);
00042 };
00043
00044 class ViscaInquiryRunningException : public ViscaException
00045 {
00046 public:
00047 ViscaInquiryRunningException();
00048 };
00049
00050
00051 class Visca {
00052
00053 public:
00054 static const unsigned int VISCA_WHITEBLANCE_AUTO;
00055 static const unsigned int VISCA_WHITEBALANCE_INDOOR;
00056 static const unsigned int VISCA_WHITEBALANCE_OUTDOOR;
00057 static const unsigned int VISCA_WHITEBALANCE_ONE_PUSH;
00058 static const unsigned int VISCA_WHITEBALANCE_ATW;
00059 static const unsigned int VISCA_WHITEBALANCE_MANUAL;
00060
00061 static const unsigned int NONBLOCKING_PANTILT;
00062 static const unsigned int NONBLOCKING_ZOOM;
00063 static const unsigned int NONBLOCKING_NUM;
00064
00065 static const unsigned int MAX_PAN_SPEED;
00066 static const unsigned int MAX_TILT_SPEED;
00067
00068 Visca(const char *device_file, unsigned int def_timeout_ms = 10,
00069 bool blocking = true);
00070 virtual ~Visca();
00071
00072 void open();
00073 void close();
00074
00075
00076 void set_address();
00077 void clear();
00078
00079
00080 void send();
00081 void recv(unsigned int timeout_ms = 0xFFFFFFFF);
00082 void recv_ack(unsigned int *socket = NULL);
00083 void send_with_reply();
00084 void send_nonblocking(unsigned int *socket = NULL);
00085 void cancel_command(unsigned int socket);
00086 bool data_available();
00087 void process();
00088
00089
00090 void reset_pan_tilt();
00091
00092
00093
00094
00095
00096
00097
00098 void start_get_pan_tilt();
00099 void set_pan_tilt(int pan, int tilt);
00100 void get_pan_tilt(int &pan, int &tilt);
00101 void set_pan_tilt_limit(int pan_left, int pan_right, int tilt_up, int tilt_down);
00102 void reset_pan_tilt_limit();
00103 void set_pan_tilt_speed(unsigned char pan_speed, unsigned char tilt_speed);
00104 void get_pan_tilt_speed(unsigned char &pan_speed, unsigned char &tilt_speed);
00105
00106 bool is_nonblocking_finished(unsigned int item) const;
00107
00108
00109 void reset_zoom();
00110 void set_zoom(unsigned int zoom);
00111 void get_zoom(unsigned int *zoom);
00112 void set_zoom_speed_tele(unsigned int speed);
00113 void set_zoom_speed_wide(unsigned int speed);
00114 void set_zoom_digital_enabled(bool enabled);
00115
00116
00117 void reset_effect();
00118 void apply_effect(unsigned char effect);
00119 void apply_effect_pastel();
00120 void apply_effect_neg_art();
00121 void apply_effect_sepia();
00122 void apply_effect_bnw();
00123 void apply_effect_solarize();
00124 void apply_effect_mosaic();
00125 void apply_effect_slim();
00126 void apply_effect_stretch();
00127
00128 unsigned int get_white_balance_mode();
00129
00130 private:
00131
00132 static const unsigned int VISCA_RUNINQ_NONE = 0;
00133 static const unsigned int VISCA_RUNINQ_PANTILT = 1;
00134
00135
00136 static const unsigned char VISCA_BUS_0 = 0;
00137 static const unsigned char VISCA_BUS_1 = 1;
00138 static const unsigned char VISCA_BUS_2 = 2;
00139 static const unsigned char VISCA_BUS_3 = 3;
00140 static const unsigned char VISCA_BUS_4 = 4;
00141 static const unsigned char VISCA_BUS_5 = 5;
00142 static const unsigned char VISCA_BUS_6 = 6;
00143 static const unsigned char VISCA_BUS_7 = 7;
00144 static const unsigned char VISCA_BUS_BROADCAST = 8;
00145
00146
00147 static const unsigned char VISCA_COMMAND = 0x01;
00148 static const unsigned char VISCA_CANCEL = 0x20;
00149 static const unsigned char VISCA_INQUIRY = 0x09;
00150 static const unsigned char VISCA_TERMINATOR = 0xFF;
00151
00152
00153 static const unsigned char VISCA_RESPONSE_CLEAR = 0x40;
00154 static const unsigned char VISCA_RESPONSE_ADDRESS = 0x30;
00155 static const unsigned char VISCA_RESPONSE_ACK = 0x40;
00156 static const unsigned char VISCA_RESPONSE_COMPLETED = 0x50;
00157 static const unsigned char VISCA_RESPONSE_ERROR = 0x60;
00158
00159
00160 static const unsigned char VISCA_ERROR_LENGTH = 0x01;
00161 static const unsigned char VISCA_ERROR_SYNTAX = 0x02;
00162 static const unsigned char VISCA_ERROR_BUFFERFULL = 0x03;
00163 static const unsigned char VISCA_ERROR_CANCELLED = 0x04;
00164 static const unsigned char VISCA_ERROR_NOSOCKET = 0x05;
00165 static const unsigned char VISCA_ERROR_NOTEXECABLE = 0x41;
00166
00167
00168
00169 static const unsigned char VISCA_CATEGORY_INTERFACE = 0x00;
00170 static const unsigned char VISCA_CATEGORY_CAMERA1 = 0x04;
00171 static const unsigned char VISCA_CATEGORY_PAN_TILTER = 0x06;
00172 static const unsigned char VISCA_CATEGORY_CAMERA2 = 0x07;
00173
00174 static const unsigned char VISCA_POWER = 0x00;
00175 static const unsigned char VISCA_DEVICE_INFO = 0x02;
00176 static const unsigned char VISCA_KEYLOCK = 0x17;
00177 static const unsigned char VISCA_ID = 0x22;
00178 static const unsigned char VISCA_ZOOM = 0x07;
00179 static const unsigned char VISCA_ZOOM_STOP = 0x00;
00180 static const unsigned char VISCA_ZOOM_TELE = 0x02;
00181 static const unsigned char VISCA_ZOOM_WIDE = 0x03;
00182 static const unsigned char VISCA_ZOOM_TELE_SPEED = 0x20;
00183 static const unsigned char VISCA_ZOOM_WIDE_SPEED = 0x30;
00184 static const unsigned char VISCA_ZOOM_VALUE = 0x47;
00185 static const unsigned char VISCA_ZOOM_FOCUS_VALUE = 0x47;
00186 static const unsigned char VISCA_DZOOM = 0x06;
00187 static const unsigned char VISCA_DZOOM_ON = 0x02;
00188 static const unsigned char VISCA_DZOOM_OFF = 0x03;
00189 static const unsigned char VISCA_FOCUS = 0x08;
00190 static const unsigned char VISCA_FOCUS_STOP = 0x00;
00191 static const unsigned char VISCA_FOCUS_FAR = 0x02;
00192 static const unsigned char VISCA_FOCUS_NEAR = 0x03;
00193 static const unsigned char VISCA_FOCUS_FAR_SPEED = 0x20;
00194 static const unsigned char VISCA_FOCUS_NEAR_SPEED = 0x30;
00195 static const unsigned char VISCA_FOCUS_VALUE = 0x48;
00196 static const unsigned char VISCA_FOCUS_AUTO = 0x38;
00197 static const unsigned char VISCA_FOCUS_AUTO_MAN = 0x10;
00198 static const unsigned char VISCA_FOCUS_ONE_PUSH = 0x18;
00199 static const unsigned char VISCA_FOCUS_ONE_PUSH_TRIG = 0x01;
00200 static const unsigned char VISCA_FOCUS_ONE_PUSH_INF = 0x02;
00201 static const unsigned char VISCA_FOCUS_AUTO_SENSE = 0x58;
00202 static const unsigned char VISCA_FOCUS_AUTO_SENSE_HIGH = 0x02;
00203 static const unsigned char VISCA_FOCUS_AUTO_SENSE_LOW = 0x03;
00204 static const unsigned char VISCA_FOCUS_NEAR_LIMIT = 0x28;
00205 static const unsigned char VISCA_WB = 0x35;
00206 static const unsigned char VISCA_WB_AUTO = 0x00;
00207 static const unsigned char VISCA_WB_INDOOR = 0x01;
00208 static const unsigned char VISCA_WB_OUTDOOR = 0x02;
00209 static const unsigned char VISCA_WB_ONE_PUSH = 0x03;
00210 static const unsigned char VISCA_WB_ATW = 0x04;
00211 static const unsigned char VISCA_WB_MANUAL = 0x05;
00212 static const unsigned char VISCA_WB_ONE_PUSH_TRIG = 0x05;
00213 static const unsigned char VISCA_RGAIN = 0x03;
00214 static const unsigned char VISCA_RGAIN_VALUE = 0x43;
00215 static const unsigned char VISCA_BGAIN = 0x04;
00216 static const unsigned char VISCA_BGAIN_VALUE = 0x44;
00217 static const unsigned char VISCA_AUTO_EXP = 0x39;
00218 static const unsigned char VISCA_AUTO_EXP_FULL_AUTO = 0x00;
00219 static const unsigned char VISCA_AUTO_EXP_MANUAL = 0x03;
00220 static const unsigned char VISCA_AUTO_EXP_SHUTTER_PRIORITY = 0x0A;
00221 static const unsigned char VISCA_AUTO_EXP_IRIS_PRIORITY = 0x0B;
00222 static const unsigned char VISCA_AUTO_EXP_GAIN_PRIORITY = 0x0C;
00223 static const unsigned char VISCA_AUTO_EXP_BRIGHT = 0x0D;
00224 static const unsigned char VISCA_AUTO_EXP_SHUTTER_AUTO = 0x1A;
00225 static const unsigned char VISCA_AUTO_EXP_IRIS_AUTO = 0x1B;
00226 static const unsigned char VISCA_AUTO_EXP_GAIN_AUTO = 0x1C;
00227 static const unsigned char VISCA_SLOW_SHUTTER = 0x5A;
00228 static const unsigned char VISCA_SLOW_SHUTTER_AUTO = 0x02;
00229 static const unsigned char VISCA_SLOW_SHUTTER_MANUAL = 0x03;
00230 static const unsigned char VISCA_SHUTTER = 0x0A;
00231 static const unsigned char VISCA_SHUTTER_VALUE = 0x4A;
00232 static const unsigned char VISCA_IRIS = 0x0B;
00233 static const unsigned char VISCA_IRIS_VALUE = 0x4B;
00234 static const unsigned char VISCA_GAIN = 0x0C;
00235 static const unsigned char VISCA_GAIN_VALUE = 0x4C;
00236 static const unsigned char VISCA_BRIGHT = 0x0D;
00237 static const unsigned char VISCA_BRIGHT_VALUE = 0x4D;
00238 static const unsigned char VISCA_EXP_COMP = 0x0E;
00239 static const unsigned char VISCA_EXP_COMP_POWER = 0x3E;
00240 static const unsigned char VISCA_EXP_COMP_VALUE = 0x4E;
00241 static const unsigned char VISCA_BACKLIGHT_COMP = 0x33;
00242 static const unsigned char VISCA_APERTURE = 0x02;
00243 static const unsigned char VISCA_APERTURE_VALUE = 0x42;
00244 static const unsigned char VISCA_ZERO_LUX = 0x01;
00245 static const unsigned char VISCA_IR_LED = 0x31;
00246 static const unsigned char VISCA_WIDE_MODE = 0x60;
00247 static const unsigned char VISCA_WIDE_MODE_OFF = 0x00;
00248 static const unsigned char VISCA_WIDE_MODE_CINEMA = 0x01;
00249 static const unsigned char VISCA_WIDE_MODE_16_9 = 0x02;
00250 static const unsigned char VISCA_MIRROR = 0x61;
00251 static const unsigned char VISCA_FREEZE = 0x62;
00252 static const unsigned char VISCA_PICTURE_EFFECT = 0x63;
00253 static const unsigned char VISCA_PICTURE_EFFECT_OFF = 0x00;
00254 static const unsigned char VISCA_PICTURE_EFFECT_PASTEL = 0x01;
00255 static const unsigned char VISCA_PICTURE_EFFECT_NEGATIVE = 0x02;
00256 static const unsigned char VISCA_PICTURE_EFFECT_SEPIA = 0x03;
00257 static const unsigned char VISCA_PICTURE_EFFECT_BW = 0x04;
00258 static const unsigned char VISCA_PICTURE_EFFECT_SOLARIZE = 0x05;
00259 static const unsigned char VISCA_PICTURE_EFFECT_MOSAIC = 0x06;
00260 static const unsigned char VISCA_PICTURE_EFFECT_SLIM = 0x07;
00261 static const unsigned char VISCA_PICTURE_EFFECT_STRETCH = 0x08;
00262 static const unsigned char VISCA_DIGITAL_EFFECT = 0x64;
00263 static const unsigned char VISCA_DIGITAL_EFFECT_OFF = 0x00;
00264 static const unsigned char VISCA_DIGITAL_EFFECT_STILL = 0x01;
00265 static const unsigned char VISCA_DIGITAL_EFFECT_FLASH = 0x02;
00266 static const unsigned char VISCA_DIGITAL_EFFECT_LUMI = 0x03;
00267 static const unsigned char VISCA_DIGITAL_EFFECT_TRAIL = 0x04;
00268 static const unsigned char VISCA_DIGITAL_EFFECT_LEVEL = 0x65;
00269 static const unsigned char VISCA_MEMORY = 0x3F;
00270 static const unsigned char VISCA_MEMORY_RESET = 0x00;
00271 static const unsigned char VISCA_MEMORY_SET = 0x01;
00272 static const unsigned char VISCA_MEMORY_RECALL = 0x02;
00273 static const unsigned char VISCA_DISPLAY = 0x15;
00274 static const unsigned char VISCA_DISPLAY_TOGGLE = 0x10;
00275 static const unsigned char VISCA_DATE_TIME_SET = 0x70;
00276 static const unsigned char VISCA_DATE_DISPLAY = 0x71;
00277 static const unsigned char VISCA_TIME_DISPLAY = 0x72;
00278 static const unsigned char VISCA_TITLE_DISPLAY = 0x74;
00279 static const unsigned char VISCA_TITLE_DISPLAY_CLEAR = 0x00;
00280 static const unsigned char VISCA_TITLE_SET = 0x73;
00281 static const unsigned char VISCA_TITLE_SET_PARAMS = 0x00;
00282 static const unsigned char VISCA_TITLE_SET_PART1 = 0x01;
00283 static const unsigned char VISCA_TITLE_SET_PART2 = 0x02;
00284 static const unsigned char VISCA_IRRECEIVE = 0x08;
00285 static const unsigned char VISCA_IRRECEIVE_ON = 0x02;
00286 static const unsigned char VISCA_IRRECEIVE_OFF = 0x03;
00287 static const unsigned char VISCA_IRRECEIVE_ONOFF = 0x10;
00288 static const unsigned char VISCA_PT_DRIVE = 0x01;
00289 static const unsigned char VISCA_PT_DRIVE_HORIZ_LEFT = 0x01;
00290 static const unsigned char VISCA_PT_DRIVE_HORIZ_RIGHT = 0x02;
00291 static const unsigned char VISCA_PT_DRIVE_HORIZ_STOP = 0x03;
00292 static const unsigned char VISCA_PT_DRIVE_VERT_UP = 0x01;
00293 static const unsigned char VISCA_PT_DRIVE_VERT_DOWN = 0x02;
00294 static const unsigned char VISCA_PT_DRIVE_VERT_STOP = 0x03;
00295 static const unsigned char VISCA_PT_ABSOLUTE_POSITION = 0x02;
00296 static const unsigned char VISCA_PT_RELATIVE_POSITION = 0x03;
00297 static const unsigned char VISCA_PT_HOME = 0x04;
00298 static const unsigned char VISCA_PT_RESET = 0x05;
00299 static const unsigned char VISCA_PT_LIMITSET = 0x07;
00300 static const unsigned char VISCA_PT_LIMITSET_SET = 0x00;
00301 static const unsigned char VISCA_PT_LIMITSET_CLEAR = 0x01;
00302 static const unsigned char VISCA_PT_LIMITSET_SET_UR = 0x01;
00303 static const unsigned char VISCA_PT_LIMITSET_SET_DL = 0x00;
00304 static const unsigned char VISCA_PT_DATASCREEN = 0x06;
00305 static const unsigned char VISCA_PT_DATASCREEN_ON = 0x02;
00306 static const unsigned char VISCA_PT_DATASCREEN_OFF = 0x03;
00307 static const unsigned char VISCA_PT_DATASCREEN_ONOFF = 0x10;
00308 static const unsigned char VISCA_PT_VIDEOSYSTEM_INQ = 0x23;
00309 static const unsigned char VISCA_PT_MODE_INQ = 0x10;
00310 static const unsigned char VISCA_PT_MAXSPEED_INQ = 0x11;
00311 static const unsigned char VISCA_PT_POSITION_INQ = 0x12;
00312 static const unsigned char VISCA_PT_DATASCREEN_INQ = 0x06;
00313
00314
00315
00316 static const unsigned char VISCA_WIDE_CON_LENS = 0x26;
00317 static const unsigned char VISCA_WIDE_CON_LENS_SET = 0x00;
00318
00319 static const unsigned char VISCA_AT_MODE = 0x01;
00320 static const unsigned char VISCA_AT_ONOFF = 0x10;
00321 static const unsigned char VISCA_AT_AE = 0x02;
00322 static const unsigned char VISCA_AT_AUTOZOOM = 0x03;
00323 static const unsigned char VISCA_ATMD_FRAMEDISPLAY = 0x04;
00324 static const unsigned char VISCA_AT_FRAMEOFFSET = 0x05;
00325 static const unsigned char VISCA_ATMD_STARTSTOP = 0x06;
00326 static const unsigned char VISCA_AT_CHASE = 0x07;
00327 static const unsigned char VISCA_AT_CHASE_NEXT = 0x10;
00328
00329 static const unsigned char VISCA_MD_MODE = 0x08;
00330 static const unsigned char VISCA_MD_ONOFF = 0x10;
00331 static const unsigned char VISCA_MD_FRAME = 0x09;
00332 static const unsigned char VISCA_MD_DETECT = 0x0A;
00333
00334 static const unsigned char VISCA_MD_ADJUST = 0x00;
00335 static const unsigned char VISCA_MD_ADJUST_YLEVEL = 0x0B;
00336 static const unsigned char VISCA_MD_ADJUST_HUELEVEL = 0x0C;
00337 static const unsigned char VISCA_MD_ADJUST_SIZE = 0x0D;
00338 static const unsigned char VISCA_MD_ADJUST_DISPTIME = 0x0F;
00339 static const unsigned char VISCA_MD_ADJUST_REFTIME = 0x0B;
00340 static const unsigned char VISCA_MD_ADJUST_REFMODE = 0x10;
00341
00342 static const unsigned char VISCA_AT_ENTRY = 0x15;
00343 static const unsigned char VISCA_AT_LOSTINFO = 0x20;
00344 static const unsigned char VISCA_MD_LOSTINFO = 0x21;
00345 static const unsigned char VISCA_ATMD_LOSTINFO1 = 0x20;
00346 static const unsigned char VISCA_ATMD_LOSTINFO2 = 0x07;
00347
00348 static const unsigned char VISCA_MD_MEASURE_MODE_1 = 0x27;
00349 static const unsigned char VISCA_MD_MEASURE_MODE_2 = 0x28;
00350
00351 static const unsigned char VISCA_ATMD_MODE = 0x22;
00352 static const unsigned char VISCA_AT_MODE_QUERY = 0x23;
00353 static const unsigned char VISCA_MD_MODE_QUERY = 0x24;
00354 static const unsigned char VISCA_MD_REFTIME_QUERY = 0x11;
00355 static const unsigned char VISCA_AT_POSITION = 0x20;
00356 static const unsigned char VISCA_MD_POSITION = 0x21;
00357
00358 void recv_packet(unsigned int timeout_ms);
00359 void handle_response();
00360 void finish_nonblocking(unsigned int socket);
00361
00362 char *__device_file;
00363 int __fd;
00364 bool __opened;
00365 unsigned int __default_timeout_ms;
00366
00367 unsigned int __inquire;
00368
00369 unsigned char __recipient;
00370 unsigned char __sender;
00371
00372 unsigned char __obuffer[16];
00373 unsigned char __ibuffer[1024];
00374 int __obuffer_length;
00375 int __ibuffer_length;
00376
00377 bool __blocking;
00378 bool __nonblocking_running[2];
00379 unsigned int __nonblocking_sockets[2];
00380
00381 unsigned char __pan_speed;
00382 unsigned char __tilt_speed;
00383
00384 #ifdef TIMETRACKER_VISCA
00385 fawkes::TimeTracker *__tt;
00386 unsigned int __ttc_pantilt_get_send;
00387 unsigned int __ttc_pantilt_get_read;
00388 unsigned int __ttc_pantilt_get_handle;
00389 unsigned int __ttc_pantilt_get_interpret;
00390 #endif
00391
00392 };
00393
00394
00395
00396 #endif