diff --git a/src/libDevCom/AD56X9.cpp b/src/libDevCom/AD56X9.cpp new file mode 100644 index 0000000000000000000000000000000000000000..c21627206ef68687a8cd1acce59e7f9387aaab4f --- /dev/null +++ b/src/libDevCom/AD56X9.cpp @@ -0,0 +1,62 @@ +#include "AD56X9.h" + +#include "LinearCalibration.h" + +#include "NotSupportedException.h" +#include "OutOfRangeException.h" + +const std::map<AD56X9::Model, AD56X9ModelInfo> AD56X9::ModelInfo = + { + {AD56X9::Model::AD5629, AD56X9ModelInfo({.MaxValue=0xFFF }) }, + {AD56X9::Model::AD5669, AD56X9ModelInfo({.MaxValue=0xFFFF}) } + }; + +AD56X9::AD56X9(double reference, Model model, std::shared_ptr<I2CCom> com) + : DACDevice(std::make_shared<LinearCalibration>(reference, ModelInfo.at(model).MaxValue)), + m_model(model), m_com(com) +{ } + +AD56X9::~AD56X9() +{ } + +void AD56X9::setCount(int32_t counts) +{ + counts&=ModelInfo.at(m_model).MaxValue; + if(m_model==Model::AD5629) + counts<<=4; + counts&=0xFFFF; + m_com->write_block({0x3F,static_cast<uint8_t>((counts>>8)&0xFF),static_cast<uint8_t>((counts>>0)&0xFF)}); +} + +void AD56X9::setCount(uint8_t ch, int32_t counts) +{ + if(ch>7) + throw OutOfRangeException(ch,0,7); + + if(m_model==Model::AD5629) + counts<<=4; + counts&=0xFFFF; + + m_com->write_block({static_cast<uint8_t>(0x30|(ch&0xF)),static_cast<uint8_t>((counts>>8)&0xFF),static_cast<uint8_t>((counts>>0)&0xFF)}); +} + +void AD56X9::setCount(const std::vector<uint8_t>& chs, const std::vector<int32_t>& data) +{ + for(uint i=0;i<chs.size();i++) + setCount(chs[i],data[i]); +} + +int32_t AD56X9::readCount() +{ + throw NotSupportedException("AD56X9 does not support reading."); +} + +int32_t AD56X9::readCount(uint8_t ch) +{ + throw NotSupportedException("AD56X9 does not support reading."); +} + +void AD56X9::readCount(const std::vector<uint8_t>& chs, std::vector<int32_t>& counts) +{ + throw NotSupportedException("AD56X9 does not support reading."); +} diff --git a/src/libDevCom/AD56X9.h b/src/libDevCom/AD56X9.h new file mode 100644 index 0000000000000000000000000000000000000000..ee8f4c20686fe6bd8ac7c1270808c6d5b13c3c10 --- /dev/null +++ b/src/libDevCom/AD56X9.h @@ -0,0 +1,43 @@ +#ifndef AD56X9_H +#define AD56X9_H + +#include <stdint.h> + +#include <memory> +#include <map> + +#include "I2CCom.h" +#include "DACDevice.h" + +struct AD56X9ModelInfo +{ + int32_t MaxValue; +}; + +class AD56X9 : public DACDevice +{ +public: + enum Model {AD5629, AD5669}; + + AD56X9(double reference, Model model, std::shared_ptr<I2CCom> com); + virtual ~AD56X9(); + + virtual void setCount(int32_t counts); + virtual void setCount(uint8_t ch, int32_t counts); + virtual void setCount(const std::vector<uint8_t>& chs, const std::vector<int32_t>& data); + + virtual int32_t readCount(); + virtual int32_t readCount(uint8_t ch); + virtual void readCount(const std::vector<uint8_t>& chs, std::vector<int32_t>& data); + +private: + // Model information + static const std::map<Model, AD56X9ModelInfo> ModelInfo; + + // Properties of device + Model m_model; + + std::shared_ptr<I2CCom> m_com; +}; + +#endif // AD56X9_H diff --git a/src/libDevCom/CMakeLists.txt b/src/libDevCom/CMakeLists.txt index 8322b220ff410362641b09b27aed25415c3ae95a..89d795d2e3160e641fd9d74915f037ffacfcda61 100644 --- a/src/libDevCom/CMakeLists.txt +++ b/src/libDevCom/CMakeLists.txt @@ -26,7 +26,7 @@ target_sources(DevCom DAC5571.cpp DAC5574.cpp MCP4801.cpp - #LTC2666.cpp + AD56X9.cpp ADCDevice.cpp AD799X.cpp diff --git a/src/libDevCom/DACDevice.h b/src/libDevCom/DACDevice.h index 7394e2987443def90db991507347deea3e562b05..1a6625ff191a016a65298b244ca52c4488e90194 100644 --- a/src/libDevCom/DACDevice.h +++ b/src/libDevCom/DACDevice.h @@ -24,7 +24,7 @@ public: virtual int32_t readCount() =0; virtual int32_t readCount(uint8_t ch) =0; - virtual void readCount(const std::vector<uint8_t>& chs, std::vector<int32_t>& data) =0; + virtual void readCount(const std::vector<uint8_t>& chs, std::vector<int32_t>& data) =0; double set(double value); double set(uint8_t ch, double value); @@ -32,7 +32,7 @@ public: double read(); double read(uint8_t ch); - void read(const std::vector<uint8_t>& chs, std::vector<double>& data); + void read(const std::vector<uint8_t>& chs, std::vector<double>& data); private: std::shared_ptr<DeviceCalibration> findCalibration(uint8_t ch) const;