#pragma once
#include <stdint.h>
#include <string>
#include <vector>
#include <wpi/SmallString.h>
#include <wpi/SmallVector.h>
#include <wpi/mutex.h>
#include "hal/SerialPort.h"
namespace hal {
class SerialHelper {
public:
SerialHelper();
std::string GetVISASerialPortName(HAL_SerialPort port, int32_t* status);
std::string GetOSSerialPortName(HAL_SerialPort port, int32_t* status);
std::vector<std::string> GetVISASerialPortList(int32_t* status);
std::vector<std::string> GetOSSerialPortList(int32_t* status);
private:
void SortHubPathVector();
void CoiteratedSort(wpi::SmallVectorImpl<wpi::SmallString<16>>& vec);
void QueryHubPaths(int32_t* status);
int32_t GetIndexForPort(HAL_SerialPort port, int32_t* status);
wpi::SmallVector<wpi::SmallString<16>, 4> m_visaResource;
wpi::SmallVector<wpi::SmallString<16>, 4> m_osResource;
wpi::SmallVector<wpi::SmallString<16>, 4> m_unsortedHubPath;
wpi::SmallVector<wpi::SmallString<16>, 4> m_sortedHubPath;
int32_t m_resourceHandle;
static wpi::mutex m_nameMutex;
static std::string m_usbNames[2];
};
}