Main Page | Modules | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Class Members | File Members

playerv4l2.cpp

00001 /*
00002  *  This program is free software; you can redistribute it and/or modify
00003  *  it under the terms of the GNU General Public License as published by
00004  *  the Free Software Foundation; either version 2 of the License, or
00005  *  (at your option) any later version.
00006  *
00007  *  This program is distributed in the hope that it will be useful,
00008  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
00009  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00010  *  GNU General Public License for more details.
00011  *
00012  *  You should have received a copy of the GNU General Public License
00013  *  along with this program; if not, write to the Free Software
00014  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00015  *
00016  */
00018 //
00019 // Desc: Client library in C++ to access player_driver_camerav4l2 interface
00020 // Author: Marcin Rudowski
00021 // Email: mar_rud@poczta.onet.pl
00022 // Date: 19 Jun 2006
00023 //
00025 #include <stdlib.h>
00026 #include <stdio.h>
00027 #include <string.h>
00028 #include "playerv4l2.h"
00029 #include "plv4l2tools.h"
00030 
00031 
00032 #define TMP_BUFF_SIZE 128
00033 
00034 #define WYKONAJ_REQUEST(req, len) this->client->Request(this->m_device_id, (req), (len) )
00035 #define WYKONAJ_REQUEST4(req, len, rep, rplen) this->client->Request(this->m_device_id, (req), (len), &rephdr, (rep), (rplen))
00036 
00037 CameraV4L2Proxy::CameraV4L2Proxy (PlayerClient *pc, unsigned short index,
00038                      unsigned char access)
00039     : CameraProxy (pc, index, access )
00040 {
00041     swapRBFlag = 0;
00042     refreshState();
00043 
00044     getBrighteness();
00045     getContrast();
00046     getSaturation();
00047     getHue();
00048 }
00049 
00050 
00051 void CameraV4L2Proxy::refreshState(){
00052     getPixelFormatS();
00053     pixelFormat = (PixelFormats)convPixS2I(pixelFormatS);
00054 
00055     getNormS();
00056     norm = (NormStandards)convNormS2I(normS);
00057 
00058     getFieldS();
00059     field = (FieldTypes)convFieldS2I(fieldS);
00060 
00061     getName();
00062 
00063     getInputName();
00064 
00065     noOfControls = countControls();
00066 }
00067 
00068 
00069 // interface that all proxies must provide
00070 void CameraV4L2Proxy::FillData(player_msghdr_t hdr, const char* buffer)
00071 {
00072     CameraProxy::FillData(hdr, buffer);
00073 }
00074 
00075 // Selects input source
00076 int CameraV4L2Proxy::selectSourceI(int src_id)
00077 {
00078     char req[TMP_BUFF_SIZE+1];
00079     snprintf(req, TMP_BUFF_SIZE,"i %d", src_id);
00080 
00081     int out =  WYKONAJ_REQUEST(req, strlen(req)+1);
00082     refreshState();
00083 
00084     return out;
00085 }
00086 
00087 // Selects input source
00088 int CameraV4L2Proxy::selectSourceS(const char *src_name)
00089 {
00090     char req[TMP_BUFF_SIZE+1];
00091     snprintf(req, TMP_BUFF_SIZE,"i %s", src_name);
00092 
00093     int out =  WYKONAJ_REQUEST(req, strlen(req)+1);
00094     refreshState();
00095 
00096     return out;
00097 }
00098 
00099 int CameraV4L2Proxy::setFrameSize(int w, int h)
00100 {
00101     char req[TMP_BUFF_SIZE+1];
00102     snprintf(req, TMP_BUFF_SIZE,"s %d %d", w, h);
00103 
00104     return WYKONAJ_REQUEST(req, strlen(req)+1);
00105 }
00106 
00107 // pal, ntsc,
00108 int CameraV4L2Proxy::setNormI(int normID)
00109 {
00110     return setNormS(convNormI2S(normID));
00111 }
00112 
00113 // pal, ntsc,
00114 int CameraV4L2Proxy::setNormS(const char * normID)
00115 {
00116     if (normID == 0)
00117         return -1;
00118     char req[TMP_BUFF_SIZE+1];
00119     snprintf(req, TMP_BUFF_SIZE, "n %s", normID);
00120 
00121     int out =  WYKONAJ_REQUEST(req, strlen(req)+1);
00122     refreshState();
00123 
00124     return out;
00125 }
00126 
00127 //
00128 int CameraV4L2Proxy::setFieldTypeI(int fielsType)
00129 {
00130     return setFieldTypeS(convFieldI2S(fielsType));
00131 }
00132 
00133 //
00134 int CameraV4L2Proxy::setFieldTypeS(const char * fielsType)
00135 {
00136     if (fielsType == 0)
00137         return -1;
00138     char req[TMP_BUFF_SIZE+1];
00139     snprintf(req, TMP_BUFF_SIZE, "f %s", fielsType);
00140 
00141     int out =  WYKONAJ_REQUEST(req, strlen(req)+1);
00142     getFieldS();
00143     field = (FieldTypes)convFieldS2I(fieldS);
00144 
00145 
00146     return out;
00147 }
00148 
00149 
00150 int CameraV4L2Proxy::setPixelFormatI(int pixFormat)
00151 {
00152     return setPixelFormatS(convPixI2S(pixFormat));
00153 }
00154 
00155 int CameraV4L2Proxy::setPixelFormatS(const char * pixFormat)
00156 {
00157     if (pixFormat == 0)
00158         return -1;
00159     char req[TMP_BUFF_SIZE+1];
00160     snprintf(req, TMP_BUFF_SIZE, "m %s", pixFormat);
00161     int out = WYKONAJ_REQUEST(req, strlen(req)+1);
00162     getPixelFormatS();
00163     pixelFormat = (PixelFormats)convPixS2I(pixelFormatS);
00164 
00165     return out;
00166 }
00167 
00168 // for RGB/BGR formats, if swap!=0, then swap Red and Blue
00169 int CameraV4L2Proxy::setSwapRB(int swap)
00170 {
00171     char *req = 0;
00172 
00173     if (swap)
00174         req = "w 1";
00175     else
00176         req = "w 0";
00177 
00178     int out = WYKONAJ_REQUEST(req, strlen(req)+1);
00179 
00180     if (out == 0)
00181         swapRBFlag = swap;
00182 
00183     return out;
00184 }
00185 
00186 // get number of supported controls
00187 int CameraV4L2Proxy::countControls()
00188 {
00189     player_msghdr_t rephdr;
00190     char tmpBuf[TMP_BUFF_SIZE+1];
00191     int out;
00192 
00193     char *req = "gc"; // get Count
00194 
00195     out = WYKONAJ_REQUEST4(req, strlen(req)+1, tmpBuf, TMP_BUFF_SIZE);
00196 
00197     if (out != 0)
00198         return -1;
00199 
00200     if (sscanf(tmpBuf, "%d", &out)!=1)
00201         return -1;
00202     return out;
00203 }
00204 
00205 // set new value for control. Value is range 0.0 - 1.0.
00206 int CameraV4L2Proxy::setControlValueI(int id, double value)
00207 {
00208     char req[TMP_BUFF_SIZE+1];
00209     int out;
00210 
00211     snprintf(req, TMP_BUFF_SIZE,"ci %f %d", value, id);
00212     out = WYKONAJ_REQUEST(req, strlen(req)+1);
00213     if (out==0) {
00214         getBrighteness();
00215         getContrast();
00216         getSaturation();
00217         getHue();
00218     }
00219     return out;
00220 }
00221 
00222 // set new value for control. Value is range 0.0 : 1.0.
00223 int CameraV4L2Proxy::setControlValueS(const char *name, double value)
00224 {
00225     char req[TMP_BUFF_SIZE+1];
00226     int out;
00227 
00228     snprintf(req, TMP_BUFF_SIZE,"c %f %s", value, name);
00229     out = WYKONAJ_REQUEST(req, strlen(req)+1);
00230     if (out==0) {
00231         getBrighteness();
00232         getContrast();
00233         getSaturation();
00234         getHue();
00235     }
00236     return out;
00237 }
00238 
00239 // returns current control value in range 0-1. values below 0, means error
00240 // while querying driver
00241 double CameraV4L2Proxy::getControlValueI(int id)
00242 {
00243     player_msghdr_t rephdr;
00244     char tmpBuf[TMP_BUFF_SIZE+1];
00245     double out;
00246     char req[TMP_BUFF_SIZE+1];
00247     snprintf(req, TMP_BUFF_SIZE, "gci %d", id);
00248     tmpBuf[0]='\0';
00249 
00250     if (WYKONAJ_REQUEST4(req, strlen(req)+1, tmpBuf, TMP_BUFF_SIZE) == 0 &&
00251                 sscanf(tmpBuf, "%lf", &out)!=1)
00252         return -1.0;
00253     return out;
00254 }
00255 
00256 // returns current control value in range 0-1. values below 0, means error
00257 // while querying driver
00258 double CameraV4L2Proxy::getControlValueS(const char *name)
00259 {
00260     player_msghdr_t rephdr;
00261     char tmpBuf[TMP_BUFF_SIZE+1];
00262     double out;
00263     char req[TMP_BUFF_SIZE+1];
00264     snprintf(req, TMP_BUFF_SIZE, "gc %s", name);
00265 
00266     if (WYKONAJ_REQUEST4(req, strlen(req)+1, tmpBuf, TMP_BUFF_SIZE) == 0 &&
00267                 sscanf(tmpBuf, "%lf", &out)!=1)
00268         return -1.0;
00269     return out;
00270 }
00271 
00272 const char * CameraV4L2Proxy::getControlName(int id){
00273     player_msghdr_t rephdr;
00274     static char tmpBuf[TMP_BUFF_SIZE+1];
00275     int out;
00276     char req[TMP_BUFF_SIZE+1];
00277     snprintf(req, TMP_BUFF_SIZE, "gcn %d", id);
00278 
00279     out = WYKONAJ_REQUEST4(req, strlen(req)+1, tmpBuf, TMP_BUFF_SIZE);
00280 
00281     if (out != 0)
00282         return 0;
00283 
00284     return tmpBuf;
00285 }
00286 
00287 
00288 int CameraV4L2Proxy::setBrighteness(double value)
00289 {
00290     return setControlValueS("Brighteness", value);
00291 }
00292 
00293 double CameraV4L2Proxy::getBrighteness()
00294 {
00295     return brighteness = getControlValueS("Brighteness");
00296 }
00297 
00298 
00299 int CameraV4L2Proxy::setSaturation(double value)
00300 {
00301     return setControlValueS("Saturation", value);
00302 }
00303 
00304 double CameraV4L2Proxy::getSaturation()
00305 {
00306     return saturation = getControlValueS("Saturation");
00307 }
00308 
00309 
00310 int CameraV4L2Proxy::setContrast(double value)
00311 {
00312     return setControlValueS("Contrast", value);
00313 }
00314 
00315 double CameraV4L2Proxy::getContrast()
00316 {
00317     return contrast = getControlValueS("Contrast");
00318 }
00319 
00320 
00321 int CameraV4L2Proxy::setHue(double value)
00322 {
00323     return setControlValueS("Hue", value);
00324 }
00325 
00326 double CameraV4L2Proxy::getHue()
00327 {
00328     return hue = getControlValueS("Hue");
00329 }
00330 
00331 
00332 
00333 
00335 const char * CameraV4L2Proxy::getInputName(){
00336     player_msghdr_t rephdr;
00337     int out;
00338     char req[TMP_BUFF_SIZE+1];
00339     snprintf(req, TMP_BUFF_SIZE, "gi");
00340 
00341     out = WYKONAJ_REQUEST4(req, strlen(req)+1, inputName, sizeof(inputName));
00342 
00343     if (out != 0)
00344         return 0;
00345 
00346     return inputName;
00347 }
00348 
00349 
00350 
00352 const char * CameraV4L2Proxy::getName(){
00353     player_msghdr_t rephdr;
00354     int out;
00355     char req[TMP_BUFF_SIZE+1];
00356     snprintf(req, TMP_BUFF_SIZE, "g");
00357 
00358     out = WYKONAJ_REQUEST4(req, strlen(req)+1, name, sizeof(name));
00359 
00360     if (out != 0)
00361         return 0;
00362 
00363     return name;
00364 }
00365 
00367 const char * CameraV4L2Proxy::getFieldS(){
00368     player_msghdr_t rephdr;
00369     int out;
00370     char req[TMP_BUFF_SIZE+1];
00371     snprintf(req, TMP_BUFF_SIZE, "gf");
00372 
00373     out = WYKONAJ_REQUEST4(req, strlen(req)+1, fieldS, sizeof(fieldS));
00374 
00375     if (out != 0)
00376         return 0;
00377 
00378     return fieldS;
00379 }
00380 
00382 const char * CameraV4L2Proxy::getPixelFormatS(){
00383     player_msghdr_t rephdr;
00384     int out;
00385     char req[TMP_BUFF_SIZE+1];
00386     snprintf(req, TMP_BUFF_SIZE, "gm");
00387 
00388     out = WYKONAJ_REQUEST4(req, strlen(req)+1, pixelFormatS, sizeof(pixelFormatS));
00389 
00390     if (out != 0)
00391         return 0;
00392 
00393     return pixelFormatS;
00394 }
00395 
00397 const char * CameraV4L2Proxy::getNormS(){
00398     player_msghdr_t rephdr;
00399     int out;
00400     char req[TMP_BUFF_SIZE+1];
00401     snprintf(req, TMP_BUFF_SIZE, "gn");
00402 
00403     out = WYKONAJ_REQUEST4(req, strlen(req)+1, normS, sizeof(normS));
00404 
00405     if (out != 0)
00406         return 0;
00407 
00408     return normS;
00409 }
00410 

Generated on Thu Jun 29 22:04:42 2006 for Camerav4l2 by  doxygen 1.4.4