Program Listing for File device_discover.hpp

Return to documentation for file (include/libcaercpp/devices/device_discover.hpp)

#ifndef LIBCAER_DEVICES_DEVICE_DISCOVER_HPP_
#define LIBCAER_DEVICES_DEVICE_DISCOVER_HPP_

#include "../../libcaer/devices/device_discover.h"

#include "davis.hpp"
#include "device.hpp"
#include "dvs128.hpp"
#include "dvs132s.hpp"
#include "dvxplorer.hpp"
#include "dynapse.hpp"
#include "edvs.hpp"
#include "samsung_evk.hpp"

#include <memory>
#include <vector>

namespace libcaer {
namespace devices {

class discover {
public:
    static std::vector<struct caer_device_discovery_result> device(int16_t deviceType) {
        caerDeviceDiscoveryResult discoveredDevices;

        ssize_t result = caerDeviceDiscover(deviceType, &discoveredDevices);

        if (result < 0) {
            throw std::runtime_error("Device Discovery: failed discovery operation.");
        }

        std::vector<struct caer_device_discovery_result> devices;
        devices.reserve(result);

        for (size_t i = 0; i < (size_t) result; i++) {
            devices.push_back(discoveredDevices[i]);
        }

        free(discoveredDevices);

        return (devices);
    }

    static std::vector<struct caer_device_discovery_result> all() {
        return (device(CAER_DEVICE_DISCOVER_ALL));
    }

    static std::unique_ptr<libcaer::devices::device> open(
        uint16_t deviceID, const struct caer_device_discovery_result &discoveredDevice) {
        switch (discoveredDevice.deviceType) {
            case CAER_DEVICE_DVS128: {
                const struct caer_dvs128_info *info = &discoveredDevice.deviceInfo.dvs128Info;
                return (std::unique_ptr<libcaer::devices::dvs128>(new libcaer::devices::dvs128(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_DAVIS_FX2: {
                const struct caer_davis_info *info = &discoveredDevice.deviceInfo.davisInfo;
                return (std::unique_ptr<libcaer::devices::davisfx2>(new libcaer::devices::davisfx2(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_DAVIS_FX3: {
                const struct caer_davis_info *info = &discoveredDevice.deviceInfo.davisInfo;
                return (std::unique_ptr<libcaer::devices::davisfx3>(new libcaer::devices::davisfx3(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_DAVIS: {
                const struct caer_davis_info *info = &discoveredDevice.deviceInfo.davisInfo;
                return (std::unique_ptr<libcaer::devices::davis>(
                    new libcaer::devices::davis(deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_DYNAPSE: {
                const struct caer_dynapse_info *info = &discoveredDevice.deviceInfo.dynapseInfo;
                return (std::unique_ptr<libcaer::devices::dynapse>(new libcaer::devices::dynapse(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_EDVS: {
                const struct caer_edvs_info *info = &discoveredDevice.deviceInfo.edvsInfo;
                return (std::unique_ptr<libcaer::devices::edvs>(
                    new libcaer::devices::edvs(deviceID, info->serialPortName, info->serialBaudRate)));
                break;
            }

            case CAER_DEVICE_DVS132S: {
                const struct caer_dvs132s_info *info = &discoveredDevice.deviceInfo.dvs132sInfo;
                return (std::unique_ptr<libcaer::devices::dvs132s>(new libcaer::devices::dvs132s(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_DVXPLORER: {
                const struct caer_dvx_info *info = &discoveredDevice.deviceInfo.dvXplorerInfo;
                return (std::unique_ptr<libcaer::devices::dvXplorer>(new libcaer::devices::dvXplorer(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            case CAER_DEVICE_SAMSUNG_EVK: {
                const struct caer_samsung_evk_info *info = &discoveredDevice.deviceInfo.samsungEVKInfo;
                return (std::unique_ptr<libcaer::devices::samsungEVK>(new libcaer::devices::samsungEVK(
                    deviceID, info->deviceUSBBusNumber, info->deviceUSBDeviceAddress, "")));
                break;
            }

            default:
                throw std::runtime_error("Device Discovery: cannot open unknown device.");
                break;
        }
    }
};
} // namespace devices
} // namespace libcaer

#endif /* LIBCAER_DEVICES_DEVICE_DISCOVER_HPP_ */