HandVu_Cintf.cpp
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:17k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. /**
  2.   * HandVu - a library for computer vision-based hand gesture
  3.   * recognition.
  4.   * Copyright (C) 2004 Mathias Kolsch, matz@cs.ucsb.edu
  5.   *
  6.   * This program is free software; you can redistribute it and/or
  7.   * modify it under the terms of the GNU General Public License
  8.   * as published by the Free Software Foundation; either version 2
  9.   * of the License, or (at your option) any later version.
  10.   *
  11.   * This program is distributed in the hope that it will be useful,
  12.   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.   * GNU General Public License for more details.
  15.   *
  16.   * You should have received a copy of the GNU General Public License
  17.   * along with this program; if not, write to the Free Software
  18.   * Foundation, Inc., 59 Temple Place - Suite 330, 
  19.   * Boston, MA  02111-1307, USA.
  20.   *
  21.   * $Id: HandVu_Cintf.cpp,v 1.3 2005/10/30 23:00:43 matz Exp $
  22. **/
  23. // HandVu_Cintf.cpp: C interface to the C++ classes in HandVu.cpp
  24. //
  25. #include "Common.h"
  26. #include "HandVu.hpp"
  27. #include "HandVu.h"
  28. #include "GestureServer.h"
  29. #if defined(WIN32)
  30. #if defined(GetMessage)
  31. #undef GetMessage
  32. #endif
  33. #include <time.h>
  34. #define CLOCKS_PER_USEC ((double)(CLOCKS_PER_SEC)/1000000.0)
  35. class RefClockWindows : public RefClock {
  36. public:
  37.   virtual RefTime GetCurrentTimeUsec() const;
  38. };
  39. RefTime RefClockWindows::GetCurrentTimeUsec() const
  40. {
  41.   clock_t ct = clock();
  42.   return (RefTime) (ct/CLOCKS_PER_USEC);
  43. }
  44. #define RefClockArch RefClockWindows
  45. #else //WIN32
  46. #define CLOCKS_PER_USEC ((double)(CLOCKS_PER_SEC)/1000000.0)
  47. class RefClockLinux : public RefClock {
  48. public:
  49.   virtual RefTime GetCurrentTimeUsec() const;
  50. };
  51. RefTime RefClockLinux::GetCurrentTimeUsec() const
  52. {
  53.   clock_t ct = clock();
  54.   return (RefTime) (ct/CLOCKS_PER_USEC);
  55. }
  56. #define RefClockArch RefClockLinux
  57. #endif //WIN32
  58. class DisplayCallbackCintf : public DisplayCallback {
  59.  public:
  60.   DisplayCallbackCintf(void (*cb)(IplImage* img, hvAction action)) :
  61.     m_cb(cb) {}
  62.   virtual void Display(IplImage* img, HandVu::HVAction action);
  63.  protected:
  64.   void (*m_cb)(IplImage*, hvAction);
  65. };
  66. void DisplayCallbackCintf::Display(IplImage* img, HandVu::HVAction action)
  67. {
  68.   CV_FUNCNAME( "hvDisplayCallback" ); // declare cvFuncName
  69.   __BEGIN__;
  70.   hvAction act;
  71.   switch (action) {
  72.   case HandVu::HV_INVALID_ACTION:
  73.     act = HV_INVALID_ACTION; break;
  74.   case HandVu::HV_PROCESS_FRAME:
  75.     act = HV_PROCESS_FRAME; break;
  76.   case HandVu::HV_SKIP_FRAME:
  77.     act = HV_SKIP_FRAME; break;
  78.   case HandVu::HV_DROP_FRAME:
  79.     act = HV_DROP_FRAME; break;
  80.   default:
  81.     CV_ERROR(CV_StsError, "unknown HVAction code");
  82.   }  
  83.   m_cb(img, act);
  84.   __END__;
  85. }
  86. typedef GestureServer* GestureServerPtr;
  87. vector<GestureServerPtr> g_pservers;
  88. HandVu* g_pHandVu = NULL;
  89. RefClockArch* g_pClock = NULL;
  90. DisplayCallbackCintf* g_displayCallback = NULL;
  91. void hvInitialize(int image_width, int image_height)
  92. {
  93.   CV_FUNCNAME( "hvInitialize" ); // declare cvFuncName
  94.   __BEGIN__;
  95.   if (image_width<0 || image_height<0) {
  96.     CV_ERROR(CV_BadImageSize, "negative image width or height");
  97.   }
  98.   if (g_pHandVu) {
  99.     CV_ERROR(CV_StsError, "HandVu already initialized");
  100.   }
  101.   try {
  102.     g_pHandVu = new HandVu();
  103.     g_pClock = new RefClockArch();
  104.     g_pHandVu->Initialize(image_width, image_height, g_pClock, NULL);
  105.   } catch (HVException& hve) {
  106.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  107.   }
  108.   __END__;
  109. }
  110. void hvUninitialize()
  111. {
  112.   CV_FUNCNAME( "hvUninitialize" ); // declare cvFuncName
  113.   __BEGIN__;
  114.   if (!g_pHandVu) {
  115.     CV_ERROR(CV_StsError, "HandVu not initialized");
  116.   }
  117.   try {
  118.     g_pHandVu->~HandVu();
  119.     g_pHandVu = NULL;
  120.     delete g_pClock;
  121.     g_pClock = NULL;
  122.     if (g_displayCallback) {
  123.       delete g_displayCallback;
  124.     }
  125.     // gesture servers
  126.     for (int i=0; i<(int)g_pservers.size(); i++) delete g_pservers[i];
  127.     g_pservers.clear();
  128.   } catch (HVException& hve) {
  129.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  130.   }
  131.   __END__;
  132. }
  133. void hvLoadConductor(const string& filename)
  134. {
  135.   CV_FUNCNAME( "hvLoadConductor" ); // declare cvFuncName
  136.   __BEGIN__;
  137.   if (!g_pHandVu) {
  138.     CV_ERROR(CV_StsError, "HandVu not initialized");
  139.   }
  140.   try {
  141.     g_pHandVu->LoadConductor(filename);
  142.   } catch (HVException& hve) {
  143.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  144.   }
  145.   __END__;
  146. }
  147. bool hvConductorLoaded()
  148. {
  149.   CV_FUNCNAME( "hvConductorLoaded" ); // declare cvFuncName
  150.   __BEGIN__;
  151.   if (!g_pHandVu) {
  152.     CV_ERROR(CV_StsError, "HandVu not initialized");
  153.   }
  154.   try {
  155.     return g_pHandVu->ConductorLoaded();
  156.   } catch (HVException& hve) {
  157.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  158.   }
  159.   __END__;
  160. }
  161. void hvStartRecognition(int obj_id)
  162. {
  163.   CV_FUNCNAME( "hvStartRecognition" ); // declare cvFuncName
  164.   __BEGIN__;
  165.   if (!g_pHandVu) {
  166.     CV_ERROR(CV_StsError, "HandVu not initialized");
  167.   }
  168.   try {
  169.     g_pHandVu->StartRecognition(obj_id);
  170.   } catch (HVException& hve) {
  171.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  172.   }
  173.   __END__;
  174. }
  175. void hvStopRecognition(int obj_id)
  176. {
  177.   CV_FUNCNAME( "hvStopRecognition" ); // declare cvFuncName
  178.   __BEGIN__;
  179.   if (!g_pHandVu) {
  180.     CV_ERROR(CV_StsError, "HandVu not initialized");
  181.   }
  182.   try {
  183.     g_pHandVu->StopRecognition(obj_id);
  184.   } catch (HVException& hve) {
  185.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  186.   }
  187.   __END__;
  188. }
  189. hvAction hvProcessFrame(IplImage* inOutImage, IplImage* rightImage)
  190. {
  191.   CV_FUNCNAME( "hvProcessFrame" ); // declare cvFuncName
  192.   __BEGIN__;
  193.   if (!g_pHandVu) {
  194.     CV_ERROR(CV_StsError, "HandVu not initialized");
  195.   }
  196.   try {
  197.     RefTime t = g_pClock->GetCurrentTimeUsec();
  198.     GrabbedImage gi(inOutImage, t, -1);
  199.     HandVu::HVAction action = g_pHandVu->ProcessFrame(gi, rightImage);
  200.     switch (action) {
  201.       case HandVu::HV_INVALID_ACTION:
  202.         return HV_INVALID_ACTION;
  203.       case HandVu::HV_PROCESS_FRAME:
  204.         return HV_PROCESS_FRAME;
  205.       case HandVu::HV_SKIP_FRAME:
  206.         return HV_SKIP_FRAME;
  207.       case HandVu::HV_DROP_FRAME:
  208.         return HV_DROP_FRAME;
  209.       default:
  210.         CV_ERROR(CV_StsError, "unknown HandVu::HVAction");
  211.     }
  212.   } catch (HVException& hve) {
  213.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  214.   }
  215.   __END__;
  216. }
  217. bool hvIsActive()
  218. {
  219.   CV_FUNCNAME( "hvIsActive" ); // declare cvFuncName
  220.   __BEGIN__;
  221.   if (!g_pHandVu) {
  222.     CV_ERROR(CV_StsError, "HandVu not initialized");
  223.   }
  224.   try {
  225.     bool active = g_pHandVu->IsActive();
  226.     return active;
  227.   } catch (HVException& hve) {
  228.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  229.   }
  230.   __END__;
  231. }
  232. void hvAsyncSetup(int num_buffers, void (*cb)(IplImage* img, hvAction action))
  233. {
  234.   CV_FUNCNAME( "hvAsyncSetup" ); // declare cvFuncName
  235.   __BEGIN__;
  236.   if (!g_pHandVu) {
  237.     CV_ERROR(CV_StsError, "HandVu not initialized");
  238.   }
  239.   try {
  240.     if (g_displayCallback) {
  241.       delete g_displayCallback;
  242.     }
  243.     g_displayCallback = new DisplayCallbackCintf(cb);
  244.     g_pHandVu->AsyncSetup(num_buffers, g_displayCallback);
  245.     
  246.   } catch (HVException& hve) {
  247.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  248.   }
  249.   __END__;
  250. }
  251. void hvAsyncGetImageBuffer(IplImage** pImage, int* pBufferID)
  252. {
  253.   CV_FUNCNAME( "hvAsyncGetImageBuffer" ); // declare cvFuncName
  254.   __BEGIN__;
  255.   if (!g_pHandVu) {
  256.     CV_ERROR(CV_StsError, "HandVu not initialized");
  257.   }
  258.   try {
  259.     g_pHandVu->AsyncGetImageBuffer(pImage, pBufferID);
  260.   } catch (HVException& hve) {
  261.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  262.   }
  263.   __END__;
  264. }
  265. void hvAsyncProcessFrame(int bufferID)
  266. {
  267.   CV_FUNCNAME( "hvAsyncProcessFrame" ); // declare cvFuncName
  268.   __BEGIN__;
  269.   if (!g_pHandVu) {
  270.     CV_ERROR(CV_StsError, "HandVu not initialized");
  271.   }
  272.   try {
  273.     RefTime t = g_pClock->GetCurrentTimeUsec();
  274.     g_pHandVu->AsyncProcessFrame(bufferID, t);
  275.   } catch (HVException& hve) {
  276.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  277.   }
  278.   __END__;
  279. }
  280. void hvGetState(int obj_id, hvState& state)
  281. {
  282.   CV_FUNCNAME( "hvGetState" ); // declare cvFuncName
  283.   __BEGIN__;
  284.   if (!g_pHandVu) {
  285.     CV_ERROR(CV_StsError, "HandVu not initialized");
  286.   }
  287.   try {
  288.     HVState hsta;
  289.     g_pHandVu->GetState(obj_id, hsta);
  290.     state.obj_id = hsta.m_obj_id;
  291.     state.tracked = hsta.m_tracked;
  292.     state.recognized = hsta.m_recognized;
  293.     state.center_xpos = hsta.m_center_xpos;
  294.     state.center_ypos = hsta.m_center_ypos;
  295.     state.scale = hsta.m_scale;
  296.     state.posture = hsta.m_posture;
  297.     state.tstamp = hsta.m_tstamp;
  298.   } catch (HVException& hve) {
  299.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  300.   }
  301.   __END__;
  302. }
  303. void hvSetDetectionArea(int left, int top, int right, int bottom)
  304. {
  305.   CV_FUNCNAME( "hvSetDetectionArea" ); // declare cvFuncName
  306.   __BEGIN__;
  307.   if (!g_pHandVu) {
  308.     CV_ERROR(CV_StsError, "HandVu not initialized");
  309.   }
  310.   try {
  311.     g_pHandVu->SetDetectionArea(left, top, right, bottom);
  312.   } catch (HVException& hve) {
  313.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  314.   }
  315.   __END__;
  316. }
  317. void hvGetDetectionArea(int* pLeft, int* pTop, int* pRight, int* pBottom)
  318. {
  319.   CV_FUNCNAME( "hvAsyncProcessFrame" ); // declare cvFuncName
  320.   __BEGIN__;
  321.   if (!g_pHandVu) {
  322.     CV_ERROR(CV_StsError, "HandVu not initialized");
  323.   }
  324.   try {
  325.     CQuadruple area;
  326.     g_pHandVu->GetDetectionArea(area);
  327.     *pLeft = (int) area.left;
  328.     *pTop = (int) area.top;
  329.     *pRight = (int) area.right;
  330.     *pBottom = (int) area.bottom;
  331.   } catch (HVException& hve) {
  332.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  333.   }
  334.   __END__;
  335. }
  336. void hvRecomputeNormalLatency()
  337. {
  338.   CV_FUNCNAME( "hvRecomputeNormalLatency" ); // declare cvFuncName
  339.   __BEGIN__;
  340.   if (!g_pHandVu) {
  341.     CV_ERROR(CV_StsError, "HandVu not initialized");
  342.   }
  343.   try {
  344.     g_pHandVu->RecomputeNormalLatency();
  345.   } catch (HVException& hve) {
  346.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  347.   }
  348.   __END__;
  349. }
  350. void hvSetOverlayLevel(int level)
  351. {
  352.   CV_FUNCNAME( "hvSetOverlayLevel" ); // declare cvFuncName
  353.   __BEGIN__;
  354.   if (!g_pHandVu) {
  355.     CV_ERROR(CV_StsError, "HandVu not initialized");
  356.   }
  357.   try {
  358.     g_pHandVu->SetOverlayLevel(level);
  359.   } catch (HVException& hve) {
  360.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  361.   }
  362.   __END__;
  363. }
  364. int hvGetOverlayLevel()
  365. {
  366.   CV_FUNCNAME( "hvRecomputeNormalLatency" ); // declare cvFuncName
  367.   __BEGIN__;
  368.   if (!g_pHandVu) {
  369.     CV_ERROR(CV_StsError, "HandVu not initialized");
  370.   }
  371.   try {
  372.     int level = g_pHandVu->GetOverlayLevel();
  373.     return level;
  374.   } catch (HVException& hve) {
  375.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  376.   }
  377.   __END__;
  378. }
  379. void hvCorrectDistortion(bool enable)
  380. {
  381.   CV_FUNCNAME( "hvCorrectDistortion" ); // declare cvFuncName
  382.   __BEGIN__;
  383.   if (!g_pHandVu) {
  384.     CV_ERROR(CV_StsError, "HandVu not initialized");
  385.   }
  386.   try {
  387.     g_pHandVu->CorrectDistortion(enable);
  388.   } catch (HVException& hve) {
  389.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  390.   }
  391.   __END__;
  392. }
  393. bool hvIsCorrectingDistortion()
  394. {
  395.   CV_FUNCNAME( "hvIsCorrectingDistortion" ); // declare cvFuncName
  396.   __BEGIN__;
  397.   if (!g_pHandVu) {
  398.     CV_ERROR(CV_StsError, "HandVu not initialized");
  399.   }
  400.   try {
  401.     return g_pHandVu->IsCorrectingDistortion();
  402.   } catch (HVException& hve) {
  403.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  404.   }
  405.   __END__;
  406. }
  407. bool hvCanCorrectDistortion()
  408. {
  409.   CV_FUNCNAME( "hvCanCorrectDistortion" ); // declare cvFuncName
  410.   __BEGIN__;
  411.   if (!g_pHandVu) {
  412.     CV_ERROR(CV_StsError, "HandVu not initialized");
  413.   }
  414.   try {
  415.     return g_pHandVu->CanCorrectDistortion();
  416.   } catch (HVException& hve) {
  417.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  418.   }
  419.   __END__;
  420. }
  421. void hvSetAdjustExposure(bool enable)
  422. {
  423.   CV_FUNCNAME( "hvSetAdjustExposure" ); // declare cvFuncName
  424.   __BEGIN__;
  425.   if (!g_pHandVu) {
  426.     CV_ERROR(CV_StsError, "HandVu not initialized");
  427.   }
  428.   try {
  429.     g_pHandVu->SetAdjustExposure(enable);
  430.   } catch (HVException& hve) {
  431.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  432.   }
  433.   __END__;
  434. }
  435. bool hvCanAdjustExposure()
  436. {
  437.   CV_FUNCNAME( "hvCanAdjustExposure" ); // declare cvFuncName
  438.   __BEGIN__;
  439.   if (!g_pHandVu) {
  440.     CV_ERROR(CV_StsError, "HandVu not initialized");
  441.   }
  442.   try {
  443.     return g_pHandVu->CanAdjustExposure();
  444.   } catch (HVException& hve) {
  445.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  446.   }
  447.   __END__;
  448. }
  449. bool hvIsAdjustingExposure()
  450. {
  451.   CV_FUNCNAME( "hvIsAdjustingExposure" ); // declare cvFuncName
  452.   __BEGIN__;
  453.   if (!g_pHandVu) {
  454.     CV_ERROR(CV_StsError, "HandVu not initialized");
  455.   }
  456.   try {
  457.     return g_pHandVu->IsAdjustingExposure();
  458.   } catch (HVException& hve) {
  459.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  460.   }
  461.   __END__;
  462. }
  463. void hvSetLogfile(const string& filename)
  464. {
  465.   CV_FUNCNAME( "hvSetLogfile" ); // declare cvFuncName
  466.   __BEGIN__;
  467.   if (!g_pHandVu) {
  468.     CV_ERROR(CV_StsError, "HandVu not initialized");
  469.   }
  470.   try {
  471.     g_pHandVu->SetLogfile(filename);
  472.   } catch (HVException& hve) {
  473.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  474.   }
  475.   __END__;
  476. }
  477. void hvSaveScannedArea(IplImage* pImg, string& picfile)
  478. {
  479.   CV_FUNCNAME( "hvSaveScannedArea" ); // declare cvFuncName
  480.   __BEGIN__;
  481.   if (!g_pHandVu) {
  482.     CV_ERROR(CV_StsError, "HandVu not initialized");
  483.   }
  484.   try {
  485.     g_pHandVu->SaveScannedArea(pImg, picfile);
  486.   } catch (HVException& hve) {
  487.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  488.   }
  489.   __END__;
  490. }
  491. void hvSaveImageArea(IplImage* pImg, int left, int top, int right, int bottom, string& picfile)
  492. {
  493.   CV_FUNCNAME( "hvSaveImageArea" ); // declare cvFuncName
  494.   __BEGIN__;
  495.   if (!g_pHandVu) {
  496.     CV_ERROR(CV_StsError, "HandVu not initialized");
  497.   }
  498.   try {
  499.     g_pHandVu->SaveImageArea(pImg, CRect(left, top, right, bottom), picfile);
  500.   } catch (HVException& hve) {
  501.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  502.   }
  503.   __END__;
  504. }
  505. void hvSetSaveFilenameRoot(const string& fname_root)
  506. {
  507.   CV_FUNCNAME( "hvSetSaveFilenameRoot" ); // declare cvFuncName
  508.   __BEGIN__;
  509.   if (!g_pHandVu) {
  510.     CV_ERROR(CV_StsError, "HandVu not initialized");
  511.   }
  512.   try {
  513.     g_pHandVu->SetSaveFilenameRoot(fname_root);
  514.   } catch (HVException& hve) {
  515.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  516.   }
  517.   __END__;
  518. }
  519. void hvSetDoTrack(bool do_track)
  520. {
  521.   CV_FUNCNAME( "hvSetDoTrack" ); // declare cvFuncName
  522.   __BEGIN__;
  523.   if (!g_pHandVu) {
  524.     CV_ERROR(CV_StsError, "HandVu not initialized");
  525.   }
  526.   try {
  527.     g_pHandVu->SetDoTrack(do_track);
  528.   } catch (HVException& hve) {
  529.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  530.   }
  531.   __END__;
  532. }
  533. void hvStartGestureServer(int port, int max_num_clients)
  534. {
  535.   CV_FUNCNAME( "hvStartGestureServer" ); // declare cvFuncName
  536.   __BEGIN__;
  537.   if (!g_pHandVu) {
  538.     CV_ERROR(CV_StsError, "HandVu not initialized");
  539.   }
  540.   try {
  541.     g_pservers.push_back(new GestureServerStream(port, max_num_clients));
  542.     g_pservers.back()->Start();
  543.   } catch (HVException& hve) {
  544.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  545.   }
  546.   __END__;
  547. }
  548. void hvStartOSCServer(const string& desthost, int destport)
  549. {
  550.   CV_FUNCNAME( "hvStartOSCServer" ); // declare cvFuncName
  551.   __BEGIN__;
  552.   if (!g_pHandVu) {
  553.     CV_ERROR(CV_StsError, "HandVu not initialized");
  554.   }
  555.   try {
  556.     g_pservers.push_back(new GestureServerOSC(desthost, destport));
  557.     g_pservers.back()->Start();
  558.   } catch (HVException& hve) {
  559.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  560.   }
  561.   __END__;
  562. }
  563. void hvStopGestureServer(int /*port*/)
  564. {
  565.   CV_FUNCNAME( "hvStopGestureServer" ); // declare cvFuncName
  566.   __BEGIN__;
  567.   if (!g_pHandVu) {
  568.     CV_ERROR(CV_StsError, "HandVu not initialized");
  569.   }
  570.   try {
  571.     throw HVException("sorry, stop server not implemented");
  572.   } catch (HVException& hve) {
  573.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  574.   }
  575.   __END__;
  576. }
  577. void hvStopOSCServer(const string& /*desthost*/, int /*destport*/)
  578. {
  579.   CV_FUNCNAME( "hvStopOSCServer" ); // declare cvFuncName
  580.   __BEGIN__;
  581.   if (!g_pHandVu) {
  582.     CV_ERROR(CV_StsError, "HandVu not initialized");
  583.   }
  584.   try {
  585.     throw HVException("sorry, stop server not implemented");
  586.   } catch (HVException& hve) {
  587.     CV_ERROR(CV_StsError, hve.GetMessage().c_str());
  588.   }
  589.   __END__;
  590. }
  591. void HandVu::SendEvent() const
  592. {
  593.   HVState state;
  594.   GetState(0, state);
  595.   for (int s=0; s<(int)g_pservers.size(); s++) {
  596.     g_pservers[s]->Send(state);
  597.   }
  598. }
  599. /** verbosity: 0 minimal, 3 maximal
  600. */
  601. void hvGetVersion(string& version, int verbosity)
  602. {
  603. //  todo: version = HV_CURRENT_VERSION_STRING;
  604.   version = "handvu version beta2";
  605.   if (verbosity>=1) {
  606. #if defined(WIN32)
  607.     version = version + ", win32";
  608. #elif defined(TARGET_SYSTEM)
  609.     version = version + ", "TARGET_SYSTEM;
  610. #else
  611. #error TARGET_SYSTEM must be defined
  612. #endif
  613. #if defined(DEBUG)
  614.     version = version + " debug";
  615. #endif
  616. #ifdef USE_MFC
  617.     version = version + ", MFC";
  618. #endif
  619.   }
  620.   if (verbosity>=2) {
  621.     version = version + ", built on "__DATE__" at "__TIME__;
  622.   }
  623.   if (verbosity>=3) {
  624.     version = version + "nCVS id: $Id: HandVu_Cintf.cpp,v 1.3 2005/10/30 23:00:43 matz Exp $";
  625.   }
  626.   string cubicles_version;
  627.   cuGetVersion(cubicles_version, verbosity);
  628.   version = version + "n" + cubicles_version;
  629. }