Program Listing for File adis_device_registry.cpp

Return to documentation for file (src/utils/adis_device_registry.cpp)

// Copyright 2025 Analog Devices, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "adi_imu/utils/adis_device_registry.h"

#include <algorithm>
#include <iostream>

namespace adi_imu
{

const std::unordered_map<std::string, adis_device_id> ADISDeviceRegistry::m_supported_devices = {
  {"adis16465-1", ADIS16465_1}, {"adis16465-2", ADIS16465_2}, {"adis16465-3", ADIS16465_3},
  {"adis16467-1", ADIS16467_1}, {"adis16467-2", ADIS16467_2}, {"adis16467-3", ADIS16467_3},
  {"adis16470", ADIS16470},     {"adis16475-1", ADIS16475_1}, {"adis16475-2", ADIS16475_2},
  {"adis16475-3", ADIS16475_3}, {"adis16477-1", ADIS16477_1}, {"adis16477-2", ADIS16477_2},
  {"adis16477-3", ADIS16477_3}, {"adis16500", ADIS16500},     {"adis16501", ADIS16501},
  {"adis16505-1", ADIS16505_1}, {"adis16505-2", ADIS16505_2}, {"adis16505-3", ADIS16505_3},
  {"adis16507-1", ADIS16507_1}, {"adis16507-2", ADIS16507_2}, {"adis16507-3", ADIS16507_3},
  {"adis16545-1", ADIS16545_1}, {"adis16545-2", ADIS16545_2}, {"adis16545-3", ADIS16545_3},
  {"adis16547-1", ADIS16547_1}, {"adis16547-2", ADIS16547_2}, {"adis16547-3", ADIS16547_3},
  {"adis16550", ADIS16550},     {"adis16575-2", ADIS16575_2}, {"adis16575-3", ADIS16575_3},
  {"adis16576-2", ADIS16576_2}, {"adis16576-3", ADIS16576_3}, {"adis16577-2", ADIS16577_2},
  {"adis16577-3", ADIS16577_3}};

adis_device_id ADISDeviceRegistry::getDeviceIdFromString(const std::string & device_name)
{
  std::string lower_name = device_name;
  std::transform(lower_name.begin(), lower_name.end(), lower_name.begin(), ::tolower);

  auto it = m_supported_devices.find(lower_name);
  if (it == m_supported_devices.end()) {
    throw std::invalid_argument("Unsupported device name: " + device_name);
  }
  return it->second;
}

std::string ADISDeviceRegistry::getDeviceNameFromId(adis_device_id device_id)
{
  for (const auto & pair : m_supported_devices) {
    if (pair.second == device_id) {
      return pair.first;
    }
  }
  throw std::invalid_argument(
    "Unsupported device ID: " + std::to_string(static_cast<int>(device_id)));
}

std::vector<std::string> ADISDeviceRegistry::getSupportedDeviceNames()
{
  std::vector<std::string> names;
  names.reserve(m_supported_devices.size());
  for (const auto & pair : m_supported_devices) {
    names.push_back(pair.first);
  }
  std::sort(names.begin(), names.end());
  return names;
}

std::vector<adis_device_id> ADISDeviceRegistry::getSupportedDeviceIds()
{
  std::vector<adis_device_id> ids;
  ids.reserve(m_supported_devices.size());
  for (const auto & pair : m_supported_devices) {
    ids.push_back(pair.second);
  }
  return ids;
}

bool ADISDeviceRegistry::isDeviceSupported(const std::string & device_name)
{
  return m_supported_devices.find(device_name) != m_supported_devices.end();
}

bool ADISDeviceRegistry::isDeviceSupported(adis_device_id device_id)
{
  auto device_name = getDeviceNameFromId(device_id);
  return isDeviceSupported(device_name);
}

std::string ADISDeviceRegistry::getDeviceFamily(adis_device_id device_id)
{
  switch (device_id) {
    // ADIS1646x family
    case ADIS16465_1:
    case ADIS16465_2:
    case ADIS16465_3:
    case ADIS16467_1:
    case ADIS16467_2:
    case ADIS16467_3:
    case ADIS16470:
    case ADIS16475_1:
    case ADIS16475_2:
    case ADIS16475_3:
      return "adis1646x";

    // ADIS1647x family
    case ADIS16477_1:
    case ADIS16477_2:
    case ADIS16477_3:
      return "adis1647x";

    // ADIS1650x family
    case ADIS16500:
    case ADIS16501:
    case ADIS16505_1:
    case ADIS16505_2:
    case ADIS16505_3:
    case ADIS16507_1:
    case ADIS16507_2:
    case ADIS16507_3:
      return "adis1650x";

    // ADIS1654x family
    case ADIS16545_1:
    case ADIS16545_2:
    case ADIS16545_3:
    case ADIS16547_1:
    case ADIS16547_2:
    case ADIS16547_3:
      return "adis1654x";

    // ADIS1655x family
    case ADIS16550:
      return "adis1655x";

    // ADIS1657x family
    case ADIS16575_2:
    case ADIS16575_3:
    case ADIS16576_2:
    case ADIS16576_3:
    case ADIS16577_2:
    case ADIS16577_3:
      return "adis1657x";

    // Unknown device
    default:
      return nullptr;
  }
}

std::string ADISDeviceRegistry::getDeviceFamily(const std::string & device_name)
{
  adis_device_id device_id = getDeviceIdFromString(device_name);
  return getDeviceFamily(device_id);
}

}  // namespace adi_imu