作者 主题: 调试了三天的bug,实在无解,请各位大神来指指路  (阅读 3894 次)

zhouxiangming14

  • Newbie
  • *
  • 帖子: 10
调试了三天的bug,实在无解,请各位大神来指指路
« 于: 三月 16, 2013, 09:24:27 上午 »
麻烦各位大神啦,小弟实在是焦头烂额了。先说说目的:读取鼠标所在位置(屏幕坐标),将该坐标用TUIO协议发出去,但是Vinjn大神的TuioGateway接收后崩溃了。BSQSimulator接收后鼠标停在屏幕左上角不动,拉也拉不回来,小弟先在此谢谢啦。
#include "ofxOscSender.h"
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#include <string>

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "Winmm.lib")

#define ADDRESS "127.0.0.1"
#define PORT 3333

using namespace osc;

class OSCApp
{
public:


   OSCApp()
   {
      frameSeq = 0;

   }

   ~OSCApp()
   {
   }

   void connectSocket(std::string ip_address, int port)
   {         
      tuioSender.setup(ip_address, port);
      printf("Socket Initialized : %s Port : %i\n\n", ip_address.c_str(), port);
      frameSeq = 0;
   }

   void frame()
   {
      ofxOscBundle bundle;

      ofxOscMessage alive;
      {
      alive.setAddress("/tuio/2Dcur");
      alive.addStringArg("alive");
      }

      ofxOscMessage fseq;
      {
      fseq.setAddress( "/tuio/2Dcur" );
      fseq.addStringArg( "fseq" );
      fseq.addIntArg(frameSeq);
      }

     POINT pt;
      GetCursorPos(&pt);  //获得当前鼠标坐标
     int i;
     i = frameSeq/50;
      ofxOscMessage m;
      m.setAddress( "/tuio/2Dcur" );
      m.addStringArg("set");
      m.addIntArg(i);            // id
      m.addFloatArg(pt.x/1366.0f);   // x
      m.addFloatArg(pt.y/768.0f);   // y
      // TOTO
      m.addFloatArg(0);         // dX
      m.addFloatArg(0);         // dY
      m.addFloatArg(0.0f);      // maccel
      bundle.addMessage(m);

      alive.addIntArg(i);            // add blob to list of ALL active IDs
      bundle.addMessage(alive);
      bundle.addMessage(fseq);
      tuioSender.sendBundle(bundle);

     Sleep(20);

      frameSeq ++;
      if(frameSeq>65530)
      frameSeq = 0;
   }

private:
   ofxOscSender tuioSender;
   int frameSeq;
};


int main()
{
   OSCApp app;
   std::string ip_address = ADDRESS;
   int port = PORT;
   app.connectSocket(ip_address, port);

   cvNamedWindow("touch",CV_WINDOW_AUTOSIZE  );
   int key;
   while(1)
   {
      key=cvWaitKey(1);
      if(key==27) break;
     
      app.frame();
      Sleep(10);
   }
   cvDestroyWindow("touch");
   return 0;
}
« 最后编辑时间: 三月 16, 2013, 11:06:37 上午 作者 zhouxiangming14 »

zhouxiangming14

  • Newbie
  • *
  • 帖子: 10
Re: 调试了三天的bug,实在无解,请各位大神来指指路
« 回复 #1 于: 三月 16, 2013, 02:48:58 下午 »
找到问题的答案了,是数据大端小端的问题。在windows上UDP使用的小端,所以才会出现奇葩现象,贴出来与大家分享啦~
OSC修改大端小端在头文件OSCHOSTENDIANNESS.h里
« 最后编辑时间: 三月 16, 2013, 02:54:42 下午 作者 zhouxiangming14 »

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Re: 调试了三天的bug,实在无解,请各位大神来指指路
« 回复 #2 于: 三月 16, 2013, 07:51:14 下午 »
找到问题的答案了,是数据大端小端的问题。在windows上UDP使用的小端,所以才会出现奇葩现象,贴出来与大家分享啦~
OSC修改大端小端在头文件OSCHOSTENDIANNESS.h里

good job
你改动的具体是啥?

zhouxiangming14

  • Newbie
  • *
  • 帖子: 10
Re: 调试了三天的bug,实在无解,请各位大神来指指路
« 回复 #3 于: 三月 18, 2013, 08:50:02 上午 »
找到问题的答案了,是数据大端小端的问题。在windows上UDP使用的小端,所以才会出现奇葩现象,贴出来与大家分享啦~
OSC修改大端小端在头文件OSCHOSTENDIANNESS.h里

good job
你改动的具体是啥?

我再该头文件的前面加入了
#if !defined(OSC_HOST_LITTLE_ENDIAN) && !defined(OSC_HOST_BIG_ENDIAN)
#    define OSC_HOST_LITTLE_ENDIAN
#  endif
当然如果你在苹果或者Linux上编程就应该加入
#if !defined(OSC_HOST_LITTLE_ENDIAN) && !defined(OSC_HOST_BIG_ENDIAN)
#    define OSC_HOST_BIG_ENDIAN
#  endif

vinjn

  • SuperManager
  • Hero Member
  • *****
  • 帖子: 586
Re: 调试了三天的bug,实在无解,请各位大神来指指路
« 回复 #4 于: 三月 18, 2013, 09:45:10 上午 »
/*
    Make sure either OSC_HOST_LITTLE_ENDIAN or OSC_HOST_BIG_ENDIAN is defined

    If you know a way to enhance the detection below for Linux and/or MacOSX
    please let me know! I've tried a few things which don't work.
*/

原来你是在 Mac 下开发
哈哈,作者自己也表示无能为力

Tags: TUIO