00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "evid100p.h"
00025
00026 #include <core/exceptions/software.h>
00027 #include <utils/math/angle.h>
00028
00029 using namespace fawkes;
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 const int SonyEviD100PVisca::MAX_PAN = 1440;
00040
00041 const int SonyEviD100PVisca::MIN_PAN = -1439;
00042
00043 const int SonyEviD100PVisca::MAX_TILT = 360;
00044
00045 const int SonyEviD100PVisca::MIN_TILT = - 359;
00046
00047
00048 const float SonyEviD100PVisca::MAX_PAN_DEG = 100.f;
00049
00050 const float SonyEviD100PVisca::MIN_PAN_DEG = -100.f;
00051
00052 const float SonyEviD100PVisca::MAX_TILT_DEG = 25.f;
00053
00054 const float SonyEviD100PVisca::MIN_TILT_DEG = - 25.f;
00055
00056
00057 const float SonyEviD100PVisca::MAX_PAN_RAD = deg2rad(MAX_PAN_DEG);
00058
00059 const float SonyEviD100PVisca::MIN_PAN_RAD = deg2rad(MIN_PAN_DEG);
00060
00061 const float SonyEviD100PVisca::MAX_TILT_RAD = deg2rad(MAX_TILT_DEG);
00062
00063 const float SonyEviD100PVisca::MIN_TILT_RAD = deg2rad(MIN_TILT_DEG);
00064
00065
00066 const float SonyEviD100PVisca::PAN_STEPS_PER_DEG = MAX_PAN / MAX_PAN_DEG;
00067
00068 const float SonyEviD100PVisca::TILT_STEPS_PER_DEG = MAX_TILT / MAX_TILT_DEG;
00069
00070
00071 const float SonyEviD100PVisca::PAN_STEPS_PER_RAD = MAX_PAN / MAX_PAN_RAD;
00072
00073 const float SonyEviD100PVisca::TILT_STEPS_PER_RAD = MAX_TILT / MAX_TILT_RAD;
00074
00075
00076 const unsigned int SonyEviD100PVisca::EFFECT_PASTEL = 1;
00077
00078 const unsigned int SonyEviD100PVisca::EFFECT_NEGATIVE = 2;
00079
00080 const unsigned int SonyEviD100PVisca::EFFECT_SEPIA = 3;
00081
00082 const unsigned int SonyEviD100PVisca::EFFECT_BW = 4;
00083
00084 const unsigned int SonyEviD100PVisca::EFFECT_SOLARIZE = 5;
00085
00086 const unsigned int SonyEviD100PVisca::EFFECT_MOSAIC = 6;
00087
00088 const unsigned int SonyEviD100PVisca::EFFECT_SLIM = 7;
00089
00090 const unsigned int SonyEviD100PVisca::EFFECT_STRETCH = 8;
00091
00092
00093
00094
00095
00096 const float SonyEviD100PVisca::SPEED_TABLE_PAN[] =
00097 {0.03548, 0.04138, 0.05319, 0.06497, 0.08262, 0.10608, 0.12951, 0.15865,
00098 0.19933, 0.24535, 0.30159, 0.35137, 0.43540, 0.53611, 0.67246, 0.81519,
00099 0.99870, 1.20673, 1.45304, 1.70703, 1.99278, 2.25729, 2.44293, 2.71852};
00100
00101
00102
00103
00104 const float SonyEviD100PVisca::SPEED_TABLE_TILT[] =
00105 {0.03541, 0.04127, 0.05298, 0.06449, 0.08195, 0.10480, 0.12741, 0.15535,
00106 0.19356, 0.23685, 0.28438, 0.33367, 0.41066, 0.49517, 0.59622, 0.71474,
00107 0.83085, 0.97431, 1.08745, 1.20977};
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117 SonyEviD100PVisca::SonyEviD100PVisca(const char *device_file,
00118 unsigned int def_timeout_ms,
00119 bool blocking)
00120 : Visca(device_file, def_timeout_ms, blocking)
00121 {
00122 }
00123
00124
00125
00126 SonyEviD100PVisca::~SonyEviD100PVisca()
00127 {
00128 }
00129
00130
00131
00132
00133
00134
00135 void
00136 SonyEviD100PVisca::set_pan_tilt_rad(float pan, float tilt)
00137 {
00138 if ( (pan < MIN_PAN_RAD) || (pan > MAX_PAN_RAD) ) {
00139 throw OutOfBoundsException("Illegal pan value", pan, MIN_PAN_RAD, MAX_PAN_RAD);
00140 }
00141 if ( (tilt < MIN_TILT_RAD) || (tilt > MAX_TILT_RAD) ) {
00142 throw OutOfBoundsException("Illegal tilt value", tilt, MIN_TILT_RAD, MAX_TILT_RAD);
00143 }
00144
00145 int tpan = 0, ttilt = 0;
00146
00147 tpan = (int)rint( pan * PAN_STEPS_PER_RAD );
00148 ttilt = (int)rint( tilt * TILT_STEPS_PER_RAD );
00149
00150 set_pan_tilt(tpan, ttilt);
00151 }
00152
00153
00154
00155
00156
00157
00158 void
00159 SonyEviD100PVisca::get_pan_tilt_rad(float &pan, float &tilt)
00160 {
00161 int tpan = 0, ttilt = 0;
00162 get_pan_tilt(tpan, ttilt);
00163
00164 pan = tpan / PAN_STEPS_PER_RAD;
00165 tilt = ttilt / PAN_STEPS_PER_RAD;
00166 }
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176 void
00177 SonyEviD100PVisca::set_speed_radsec(float pan_speed, float tilt_speed)
00178 {
00179 if ( (pan_speed < 0) ||
00180 (pan_speed > SPEED_TABLE_PAN[SONY_EVID100P_NUM_PAN_SPEEDS - 1]) ) {
00181 throw OutOfBoundsException("Illegal pan speed", pan_speed, 0,
00182 SPEED_TABLE_PAN[SONY_EVID100P_NUM_PAN_SPEEDS - 1]);
00183 }
00184 if ( (tilt_speed < 0) ||
00185 (tilt_speed > SPEED_TABLE_TILT[SONY_EVID100P_NUM_TILT_SPEEDS - 1]) ) {
00186 throw OutOfBoundsException("Illegal tilt speed", tilt_speed, 0,
00187 SPEED_TABLE_TILT[SONY_EVID100P_NUM_TILT_SPEEDS - 1]);
00188 }
00189
00190 unsigned int pan_ind = SONY_EVID100P_NUM_PAN_SPEEDS - 1;
00191 float min_pan_dist = SPEED_TABLE_PAN[pan_ind];
00192 float last_dist = min_pan_dist;;
00193 for (unsigned int i = 0; i < SONY_EVID100P_NUM_PAN_SPEEDS; ++i) {
00194 float dist = 0;
00195 if ( (dist = fabs(pan_speed - SPEED_TABLE_PAN[i])) < min_pan_dist ) {
00196 min_pan_dist = dist;
00197 pan_ind = i;
00198 } else if (dist > last_dist) {
00199 break;
00200 }
00201 last_dist = dist;
00202 }
00203
00204 unsigned int tilt_ind = SONY_EVID100P_NUM_TILT_SPEEDS - 1;
00205 float min_tilt_dist = SPEED_TABLE_TILT[tilt_ind];
00206 last_dist = min_tilt_dist;
00207 for (unsigned int i = 0; i < SONY_EVID100P_NUM_TILT_SPEEDS; ++i) {
00208 float dist = 0;
00209 if ( (dist = fabs(tilt_speed - SPEED_TABLE_TILT[i])) < min_tilt_dist ) {
00210 min_tilt_dist = dist;
00211 tilt_ind = i;
00212 } else if (dist > last_dist) {
00213 break;
00214 }
00215 last_dist = dist;
00216 }
00217
00218 set_pan_tilt_speed(pan_ind, tilt_ind);
00219 }
00220
00221
00222
00223
00224
00225
00226 void
00227 SonyEviD100PVisca::get_speed_radsec(float &pan_speed, float &tilt_speed)
00228 {
00229 unsigned char ps, ts;
00230 get_pan_tilt_speed(ps, ts);
00231 pan_speed = SPEED_TABLE_PAN[ps - 1];
00232 tilt_speed = SPEED_TABLE_TILT[ps - 1];
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242 void
00243 SonyEviD100PVisca::get_speed_limits(float &pan_min, float &pan_max,
00244 float &tilt_min, float &tilt_max)
00245 {
00246 pan_min = SPEED_TABLE_PAN[0];
00247 pan_max = SPEED_TABLE_PAN[SONY_EVID100P_NUM_PAN_SPEEDS - 1];
00248 tilt_min = SPEED_TABLE_TILT[0];
00249 tilt_max = SPEED_TABLE_TILT[SONY_EVID100P_NUM_TILT_SPEEDS - 1];
00250 }