#include "stdint.h"
#include <exception>

#define BAR_NUM 3
#define DEV_NAME  "usd_reg"

typedef struct bar_t{
    void* ptr;
    int file;
    uint32_t size;
}bar_t;

class myexception: public std::exception
{
private:
    char* _message;
public:
  myexception(char* message) { _message = message; }
  virtual const char* what() const noexcept
  {
    return _message;
  }
};

class UltraSoundDevice 
{
private:
  bar_t bars[BAR_NUM];

  void sanityCheck(uint32_t address, uint32_t bar);

public:
  UltraSoundDevice();
  ~UltraSoundDevice();

  uint8_t readByte(uint32_t address, uint32_t bar);
  uint16_t readShort(uint32_t address, uint32_t bar);
  uint32_t readWord(uint32_t address, uint32_t bar);
  uint64_t readLong(uint32_t address, uint32_t bar);

  void writeByte(uint32_t address, uint32_t bar, uint8_t data);
  void writeShort(uint32_t address, uint32_t bar, uint16_t data);
  void writeWord(uint32_t address, uint32_t bar, uint32_t data);
  void writeLong(uint32_t address, uint32_t bar, uint64_t data);
};