diff options
Diffstat (limited to 'tracker-trackhat/camera.cpp')
| -rw-r--r-- | tracker-trackhat/camera.cpp | 129 | 
1 files changed, 129 insertions, 0 deletions
| diff --git a/tracker-trackhat/camera.cpp b/tracker-trackhat/camera.cpp new file mode 100644 index 00000000..19a8d6ca --- /dev/null +++ b/tracker-trackhat/camera.cpp @@ -0,0 +1,129 @@ +#include "trackhat.hpp" +#include <QDebug> + +pt_camera::result trackhat_camera::get_info() const +{ +    return {true, get_desired() }; +} + +pt_camera_info trackhat_camera::get_desired() const +{ +    pt_camera_info ret = {}; + +    ret.fov = sensor_fov; +    ret.fps = 250; +    ret.res_x = sensor_size; +    ret.res_y = sensor_size; + +    return ret; +} + +QString trackhat_camera::get_desired_name() const +{ +    return QStringLiteral("TrackHat sensor"); +} + +QString trackhat_camera::get_active_name() const +{ +    return get_desired_name(); +} + +void trackhat_camera::set_fov(pt_camera::f) {} +void trackhat_camera::show_camera_settings() {} + +trackhat_camera::trackhat_camera() = default; + +trackhat_camera::~trackhat_camera() +{ +    stop(); +} + +pt_camera::result trackhat_camera::get_frame(pt_frame& frame_) +{ +    auto& ret = *frame_.as<trackhat_frame>(); +    trackhat_frame frame; + +    if (status < th_running || error_code != TH_SUCCESS) +    { +        if (status >= th_running) +            qDebug() << "trackhat: disconnected, status" << (void*)error_code; +        goto error; +    } + +    if (TH_ErrorCode error = trackHat_GetDetectedPoints(&device, &frame.points); error != TH_SUCCESS) +    { +        error_code = error; +        goto error; +    } + +    ret.points = frame.points; +    return {true, get_desired()}; + +error: +    if (error_code != TH_SUCCESS) +        qDebug() << "trackhat: error" << (void*)error_code; +    ret.points = {}; +    stop(); +    return {false, get_desired()}; +} + +#define CHECK(x)                                                \ +    do {                                                        \ +        if (TH_ErrorCode status_ = (x); status_ != TH_SUCCESS)  \ +        {                                                       \ +            qDebug() << "trackhat: error"                       \ +                     << (void*)status_ << "in" << #x;           \ +            error_code = status_;                               \ +            goto error;                                         \ +        }                                                       \ +    } while (false) + +bool trackhat_camera::start(const pt_settings&) +{ +    stop(); +    trackHat_EnableDebugMode(); + +    [[maybe_unused]] uint32_t uptime = 0; +    error_code = TH_SUCCESS; +    status = th_noinit; + +    CHECK(trackHat_Initialize(&device)); status = th_init; +    CHECK(trackHat_DetectDevice(&device)); status = th_detect; +    CHECK(trackHat_Connect(&device)); status = th_connect; +    CHECK(trackHat_GetUptime(&device, &uptime)); status = th_running; + +#if 0 +    qDebug() << "trackhat start: device uptime" << uptime << "seconds"; +#endif + +    return true; +error: +    stop(); +    return false; +} + +void trackhat_camera::stop() +{ +#if 0 +    if (status >= th_connect) +    { +        uint32_t uptime = 0; +        if (TH_ErrorCode status = trackHat_GetUptime(&device, &uptime); status == TH_SUCCESS) +            qDebug() << "trackhat stop: device uptime" << uptime << "seconds"; +    } +#endif + +    if (status >= th_connect) +        (void)trackHat_Disconnect(&device); +    if (status >= th_init) +        (void)trackHat_Deinitialize(&device); + +    status = th_noinit; +    device = {}; +} + +trackhat_preview::trackhat_preview(int w, int h) +{ +    frame_bgr.create(h, w, CV_8UC3); +    frame_bgra.create(h, w, CV_8UC4); +} | 
