Home Forums Legacy SDKs Analytics SDK (science application) Reply To: Analytics SDK (science application)

#2661
Anders
Participant

Hi alan,
I think the JNI/JNA route is more accessible than the Python route. But I might be wrong: I don’t know the Python/Java combo well enough.

I think the fastest way to get to working code is to use Swig to create a JNI binding. Not for the whole C++ API but for a small subset. Here is a start, based on the tobiictl sample (I actually built it within the tobiictl project):

Wrapper.h (Where the wrapper class is declared)
———————————————–

#pragma once
#include <string>
#include "MainLoopRunner.h"
#include "tobii/sdk/cpp/GazeDataItem.hpp"

namespace tobii { namespace sdk { namespace cpp { class EyeTracker; } } }

namespace wrapper
{
    class EyeTracker
    {
    public:
        static void initLibrary();

        EyeTracker(const char *trackerId);

        virtual ~EyeTracker() {}

        virtual void onGazeDataReceived(const tobii::sdk::cpp::GazeDataItem& data)
        {
            // default implementation does nothing -- override this method to actually do something with the data
        }

        tobii::sdk::cpp::error_code_t run();

    private:
        void onGazeDataReceivedTrampoline(tobii::sdk::cpp::GazeDataItem::pointer_t data)
        {
            onGazeDataReceived(*data);
        }

    private:
        MainLoopRunner mainLoopRunner_;
        std::string trackerId_;
        boost::shared_ptr<tobii::sdk::cpp::EyeTracker> tracker_;
    };
}

Wrapper.cpp (Implementation of the wrapper class)
————————————————-

#include "Wrapper.h"
#include "tobii/sdk/cpp/Library.hpp"
#include "tobii/sdk/cpp/EyeTrackerBrowserFactory.hpp"
#include "tobii/sdk/cpp/EyeTracker.hpp"
#include "tobii/sdk/cpp/EyeTrackerException.hpp"

using namespace wrapper;

void EyeTracker::initLibrary()
{
    tobii::sdk::cpp::Library::init();
}

EyeTracker::EyeTracker(const char *trackerId)
: trackerId_(trackerId)
{
    mainLoopRunner_.start();
}

tobii::sdk::cpp::error_code_t EyeTracker::run()
{
    try
    {
        tobii::sdk::cpp::EyeTrackerFactory::pointer_t eyeTrackerFactory = tobii::sdk::cpp::EyeTrackerBrowserFactory::createEyeTrackerFactoryByIpAddressOrHostname(trackerId_, 0, 0);
        tracker_ = eyeTrackerFactory->createEyeTracker(mainLoopRunner_.getMainLoop());
        tracker_->addGazeDataReceivedListener(boost::bind(&EyeTracker::onGazeDataReceivedTrampoline, this, _1));
        tracker_->startTracking();
    }
    catch (tobii::sdk::cpp::EyeTrackerException& ex)
    {
        return ex.getErrorCode();
    }
}

And finally the Swig interface file, wrapper.i
———————————————-

// enable directors for cross-language polymorphism
%module(directors="1") TobiiAnalyticsSdkModule

%{
%include "Samples/tobiictl/Wrapper.h"
%}

%include <typemaps.i>

// generate directors for all virtual methods in the EyeTracker class.
%feature("director") EyeTracker;

%apply int { tobii::sdk::cpp::error_code_t }
%include "enums.swg"

%include "Samples/tobiictl/Wrapper.h"
%include "Include/tobii/sdk/cpp/GazeDataItem.hpp"

I have to admit it’s not super easy to get this up and running, but it’s certainly possible.