Pergunta

Estou escrevendo algumas ligações SWIG/Python para algum código C ++. Isto é para o que é chamado de API acidental Kinect, eu tenho o motor e as funções de LED trabalhando. Os retornos de chamada para a classe do ouvinte que analisam e preenchem os buffers RGB e de profundidade não parecem ser chamados do SWIG. Os threads de captura de dados evidentemente começam e começam a monopolizar a CPU, mas nenhuma linha de depuração do retorno de chamada é adquirida. Qual seria a melhor maneira de preencher os buffers de dados e acessá -los facilmente do Python?

class KinectListener
{
     public:
        virtual ~KinectListener(){};
        virtual void KinectDisconnected(Kinect *K) {};
        virtual void DepthReceived(Kinect *K) {};
        virtual void ColorReceived(Kinect *K) {};
        virtual void AudioReceived(Kinect *K) {};
};

Aqui está a classe do ouvinte com os métodos virtuais, a versão Python embrulhada desta classe pode ser usada para herdar ouvintes para a classe C ++? Adicionei um ouvinte mínimo no C ++ e agora o trabalho restante é acessar as matrizes com eficiência com o TypeMaps. Atualmente estou usando este tipo de tipo ingênuo

%typemap(out) unsigned short [ANY] {
  int i;
  $result = PyList_New($1_dim0);
  for (i = 0; i < $1_dim0; i++) {
    PyObject *o = PyInt_FromLong((long)$1[i]);
    PyList_SetItem($result,i,o);
  }
}

Melhores opções?

Foi útil?

Solução

Existe uma maneira de usar o recurso de diretores. Habilite -o para o seu proxy KinectListener, uma linha de código:

%feature("director") KinectListener

Em seguida, você pode herdar da classe KinectListener no código Python e definir suas funções.

Outras dicas

Por coincidência, estou olhando para retornos de chamada com SWIG no momento.

o A documentação do Swig 2.0 diz isso:

O SWIG fornece suporte total para ponteiros de função, desde que as funções de retorno de chamada sejam definidas em C e não no idioma de destino. ... No entanto, as funções C existentes podem ser usadas como argumentos, desde que você as instale como constantes. Uma maneira de fazer isso é usar a diretiva %constante como esta ...

Estou planejando escrever um retorno de chamada C com o JNI escrito à mão para ligar para o Java. Se houver outra maneira, eu também adoraria ouvi -lo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top