SalGlassesServer.cc

Go to the documentation of this file.
00001 /*!@file SalGlassesServer.cc control salGlasses via corba */
00002 
00003 //////////////////////////////////////////////////////////////////// //
00004 // The iLab Neuromorphic Vision C++ Toolkit - Copyright (C) 2001 by the //
00005 // University of Southern California (USC) and the iLab at USC.         //
00006 // See http://iLab.usc.edu for information about this project.          //
00007 // //////////////////////////////////////////////////////////////////// //
00008 // Major portions of the iLab Neuromorphic Vision Toolkit are protected //
00009 // under the U.S. patent ``Computation of Intrinsic Perceptual Saliency //
00010 // in Visual Environments, and Applications'' by Christof Koch and      //
00011 // Laurent Itti, California Institute of Technology, 2001 (patent       //
00012 // pending; application number 09/912,225 filed July 23, 2001; see      //
00013 // http://pair.uspto.gov/cgi-bin/final/home.pl for current status).     //
00014 // //////////////////////////////////////////////////////////////////// //
00015 // This file is part of the iLab Neuromorphic Vision C++ Toolkit.       //
00016 //                                                                      //
00017 // The iLab Neuromorphic Vision C++ Toolkit is free software; you can   //
00018 // redistribute it and/or modify it under the terms of the GNU General  //
00019 // Public License as published by the Free Software Foundation; either  //
00020 // version 2 of the License, or (at your option) any later version.     //
00021 //                                                                      //
00022 // The iLab Neuromorphic Vision C++ Toolkit is distributed in the hope  //
00023 // that it will be useful, but WITHOUT ANY WARRANTY; without even the   //
00024 // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR      //
00025 // PURPOSE.  See the GNU General Public License for more details.       //
00026 //                                                                      //
00027 // You should have received a copy of the GNU General Public License    //
00028 // along with the iLab Neuromorphic Vision C++ Toolkit; if not, write   //
00029 // to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,   //
00030 // Boston, MA 02111-1307 USA.                                           //
00031 // //////////////////////////////////////////////////////////////////// //
00032 //
00033 // Primary maintainer for this file: Lior Elazary <lelazary@yahoo.com>
00034 // $HeadURL: svn://isvn.usc.edu/software/invt/trunk/saliency/src/SalGlasses/SalGlassesServer/SalGlassesServer.cc $
00035 // $Id: SalGlassesServer.cc 9108 2007-12-30 06:14:30Z rjpeters $
00036 //
00037 
00038 #include <stdlib.h>
00039 #include <time.h>
00040 #include <iostream>
00041 #include <unistd.h>
00042 #include <fcntl.h>
00043 #include <sys/types.h>
00044 #include <sys/stat.h>
00045 #include <signal.h>
00046 #include <SalGlasses.hh>
00047 #include "corbaUtil.h"
00048 #include "SalGlassesServer.h"
00049 #include "capture.h"
00050 #include "serial.h"
00051 
00052 #define OBJECT_NS "saliency"
00053 #define OBJECT_NAME "SalGlasses"
00054 CORBA::ORB_var orb;
00055 CosNaming::Name objectName;
00056 int serialFd = -1;
00057 
00058 // ######################################################################
00059 // Thunk to convert from env_size_t to size_t
00060 static void* malloc_thunk(env_size_t n)
00061 {
00062         return malloc(n);
00063 }
00064 
00065 
00066 // ######################################################################
00067 static void assert_handler(const char* what, int custom_msg,
00068                            const char* where, int line_no)
00069         __attribute__((noreturn));
00070 
00071 static void assert_handler(const char* what, int custom_msg,
00072                            const char* where, int line_no)
00073 {
00074         if (custom_msg)
00075                 fprintf(stderr, "Assertion failed (%s:%d):\n\t%s\n\n",
00076                         where, line_no, what);
00077         else
00078                 fprintf(stderr, "Assertion failed (%s:%d):\n\texpected '%s'\n\n",
00079                         where, line_no, what);
00080         abort();
00081 }
00082 
00083 // ######################################################################
00084 struct status_data
00085 {
00086         int frame_number;
00087 };
00088 
00089 static void print_chan_status(void* userdata,
00090     const char* tagName,
00091     const struct env_image* img)
00092 {
00093   struct status_data* p = (struct status_data*) userdata;
00094 
00095   if (env_img_initialized(img))
00096   {
00097     intg32 mi, ma;
00098     env_c_get_min_max(env_img_pixels(img), env_img_size(img),
00099         &mi, &ma);
00100     fprintf(stderr,
00101         "frame %06d channel status: "
00102         "%20s: range [%ld .. %ld]\n",
00103         p->frame_number, tagName, (long) mi, (long) ma);
00104   }
00105 }
00106 
00107 //! Signal handler (e.g., for control-C)
00108 void terminate(int s)
00109 {
00110         printf("*** INTERRUPT ***\n");
00111         unbindObject(orb, OBJECT_NS, OBJECT_NAME, objectName);
00112         orb->shutdown(0);
00113 }
00114 
00115 void SalGlassesServer::shutdown() {
00116         // Shutdown the ORB
00117         unbindObject(orb, OBJECT_NS, OBJECT_NAME, objectName);
00118         orb->shutdown(0);
00119 }
00120 
00121 
00122 SalGlassesServer::SalGlassesServer(int debug) :
00123   currentSpeed(0),
00124   currentSteering(0),
00125   itsDebug(debug)
00126 {
00127 
00128   //start the serial device
00129  // itsSerialFd = openPort("/dev/ttyS2");
00130 
00131   //the envision object
00132   env_params_set_defaults(&itsEnvp);
00133 
00134   itsEnvp.maxnorm_type = ENV_VCXNORM_MAXNORM;
00135   itsEnvp.scale_bits = 16;
00136   env_assert_set_handler(&assert_handler);
00137   env_allocation_init(&malloc_thunk, &free);
00138 
00139   env_visual_cortex_init(&itsIvc, &itsEnvp);
00140 
00141 
00142 }
00143 
00144 
00145 SalGlassesServer::~SalGlassesServer() {
00146 
00147  // closePort(itsSerialFd);
00148   env_visual_cortex_destroy(&itsIvc);
00149   env_allocation_cleanup();
00150 }
00151 
00152 
00153 
00154 void  SalGlassesServer::init(){
00155 }
00156 
00157 
00158 void SalGlassesServer::getImageSensorDims(short &w, short &h, const short i) {
00159   w = 10; h = 10;
00160 }
00161 
00162 ImageOrb* SalGlassesServer::getImageSensor(const short i){
00163 
00164 
00165   frame* f = get_frame();
00166   int size = f->width*f->height*3;
00167 
00168   ImageOrb *imageOrb = new ImageOrb;
00169   imageOrb->width = f->width;
00170   imageOrb->height = f->height;
00171   imageOrb->pix_size = 3;
00172 
00173   CORBA::Octet *dat = new CORBA::Octet[size];
00174 
00175   memcpy(dat, f->data, size);
00176   imageOrb->data.replace(size, size, dat, 1); //release the data when delete the sequance
00177 
00178   return imageOrb;
00179 }
00180 
00181 ImageOrb* SalGlassesServer::getSaliencyMap(const short i){
00182 
00183 
00184   frame* f = get_frame();
00185   int size = f->width*f->height*3;
00186 
00187   struct env_image ivcout = env_img_initializer;
00188   struct env_image intens = env_img_initializer;
00189   struct env_image color = env_img_initializer;
00190   struct env_image ori = env_img_initializer;
00191 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00192   struct env_image flicker = env_img_initializer;
00193   struct env_image motion = env_img_initializer;
00194 #endif
00195 
00196   struct status_data userdata;
00197   userdata.frame_number = 0;
00198 
00199   struct env_dims indims;
00200   struct env_rgb_pixel *input;
00201   input  = (env_rgb_pixel*)f->data;
00202   indims.w = f->width;
00203   indims.h = f->height;
00204 
00205   env_mt_visual_cortex_input(0, //not multithreaded
00206       &itsIvc, &itsEnvp,
00207       "visualcortex",
00208       input, 0, indims,
00209       &print_chan_status,
00210       &userdata,
00211       &ivcout,
00212       &intens, &color, &ori
00213 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00214       , &flicker, &motion
00215 #endif
00216       );
00217 
00218   env_visual_cortex_rescale_ranges(
00219       &ivcout, &intens, &color, &ori
00220 #ifdef ENV_WITH_DYNAMIC_CHANNELS
00221       , &flicker, &motion
00222 #endif
00223       );
00224 
00225 
00226 
00227   ImageOrb *imageOrb = new ImageOrb;
00228   imageOrb->width = ivcout.dims.w;
00229   imageOrb->height = ivcout.dims.h;
00230   imageOrb->pix_size = 1;
00231 
00232   CORBA::Octet *dat = new CORBA::Octet[size];
00233 
00234   memcpy(dat, f->data, size);
00235   imageOrb->data.replace(size, size, dat, 1); //release the data when delete the sequance
00236 
00237   return imageOrb;
00238 }
00239 
00240 
00241 void SalGlassesServer::getWinner(short &x, short &y) {
00242   x = 10; y = 10;
00243 }
00244 
00245 short SalGlassesServer::getSensorValue(const short i) {
00246   return -1;
00247 }
00248 
00249 
00250 
00251 //start the class server
00252 int main(int argc, char **argv){
00253 
00254   printf("Starting server\n");
00255 
00256   try {
00257   //Create the object and run in
00258   orb = CORBA::ORB_init(argc, argv);
00259 
00260   if (true)
00261   {
00262     printf("Running as a daemon\n");
00263     //Become a daemon
00264     // fork off the parent process
00265     pid_t pid = fork();
00266     if (pid < 0)
00267     {
00268       printf("Can not fork\n");
00269       exit(1);
00270     }
00271 
00272     if (pid > 0)
00273       exit(0); //exit the parent process
00274 
00275     // Change the file mask
00276     umask(0);
00277 
00278     //Create a new system id so that the kernel wont think we are an orphan.
00279     pid_t sid = setsid();
00280     if (sid < 0)
00281     {
00282       printf("Can not become independent\n");
00283       exit(1);
00284     }
00285 
00286     //fclose(stdin);
00287     //fclose(stdout);
00288     //fclose(stderr);
00289 
00290   }
00291   // catch signals and redirect them to terminate for clean exit:
00292   signal(SIGHUP, terminate); signal(SIGINT, terminate);
00293   signal(SIGQUIT, terminate); signal(SIGTERM, terminate);
00294   signal(SIGALRM, terminate);
00295 
00296   //start capturing
00297   open_device();
00298   init_device(0);
00299   start_capturing();
00300 
00301 
00302 
00303 
00304 
00305 
00306   CORBA::Object_var obj = orb->resolve_initial_references("RootPOA");
00307   PortableServer::POA_var poa = PortableServer::POA::_narrow(obj);
00308 
00309   SalGlassesServer* bcs = new SalGlassesServer(0); //debug value
00310 
00311   PortableServer::ObjectId_var bcsID = poa->activate_object(bcs);
00312 
00313   //get a ref string
00314   obj = bcs->_this();
00315   CORBA::String_var sior(orb->object_to_string(obj));
00316   std::cerr << "'" << (char*)sior << "'" << "\n";
00317 
00318   if( !bindObjectToName(orb, obj, OBJECT_NS, OBJECT_NAME, OBJECT_NAME, objectName) )
00319     return 1;
00320 
00321   bcs->_remove_ref();
00322 
00323   PortableServer::POAManager_var pman = poa->the_POAManager();
00324   pman->activate();
00325 
00326   orb->run();
00327   }
00328 
00329   catch(CORBA::SystemException& ex) {
00330     printf("Caught CORBA:: %s\n", ex._name());
00331   }
00332   catch(CORBA::Exception& ex) {
00333     printf("Caught CORBA::Exception: %s\n",ex._name());
00334   }
00335   catch(omniORB::fatalException& fe) {
00336     printf("Caught omniORB::fatalException:\n");
00337     printf("  file: \n", fe.file());
00338     printf("  line: \n", fe.line());
00339     printf("  mesg: \n", fe.errmsg());
00340   }
00341 
00342   printf("Shutting down\n");
00343   stop_capturing();
00344   uninit_device();
00345   close_device();
00346   unbindObject(orb, OBJECT_NS, OBJECT_NAME, objectName);
00347 
00348   return 0;
00349 
00350 }
00351 
Generated on Sun May 8 08:06:44 2011 for iLab Neuromorphic Vision Toolkit by  doxygen 1.6.3