parent
9ea8ff2b8e
commit
c5b38d4c24
@ -0,0 +1,74 @@
|
||||
/**
|
||||
* @file BitField.h
|
||||
* @author Edwin Koch (eddyed.k@gmail.com)
|
||||
* @brief
|
||||
* @version 0.1
|
||||
* @date 2020-12-19
|
||||
*
|
||||
* @copyright Copyright (c) 2020
|
||||
*
|
||||
*/
|
||||
|
||||
// Based on:
|
||||
// https://www.youtube.com/watch?v=TYqbgvHfxjM
|
||||
// https://stackoverflow.com/questions/31726191/is-there-a-portable-alternative-to-c-bitfields
|
||||
// https://stackoverflow.com/questions/1392059/algorithm-to-generate-bit-mask
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @brief Template class for portable Bitfields
|
||||
*
|
||||
* @tparam T type of variable in which the bitfield resides
|
||||
* @tparam START bit index starting from LSB where the bitfield starts
|
||||
* @tparam SIZE number of bits
|
||||
*/
|
||||
template<typename T, uint8_t START, uint8_t SIZE>
|
||||
struct BitField
|
||||
{
|
||||
/**
|
||||
* @brief Construct a new Bit Field object
|
||||
*
|
||||
*/
|
||||
BitField()
|
||||
{
|
||||
static_assert(SIZE != 0, "Bitfield SIZE must be > 0!");
|
||||
static_assert(START < sizeof(T) * 8, "START exceeds number of bits of the chosen typename T!");
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief assignment operator
|
||||
*
|
||||
* @param v value to be written in the bitfield
|
||||
* @return BitField&
|
||||
*/
|
||||
BitField& operator =(T v)
|
||||
{
|
||||
// mask creation for v : https://stackoverflow.com/questions/1392059/algorithm-to-generate-bit-mask
|
||||
_raw = ((v & ((1ULL << SIZE)-1)) << START) ;
|
||||
return *this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the value inside the bitfield
|
||||
*
|
||||
* @return T
|
||||
*/
|
||||
operator T() const
|
||||
{
|
||||
return _raw >> START;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief return the raw value
|
||||
*
|
||||
* @return T
|
||||
*/
|
||||
T operator ()() const
|
||||
{
|
||||
return _raw;
|
||||
}
|
||||
|
||||
private:
|
||||
T _raw;
|
||||
};
|
@ -0,0 +1,9 @@
|
||||
#include <iostream>
|
||||
|
||||
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
@ -0,0 +1,124 @@
|
||||
#include "mcp4725.hpp"
|
||||
|
||||
#if 0
|
||||
MCP4725::MCP4725(pwrd_md power_down_mode,
|
||||
i2c_addr address,
|
||||
I2C* i2c) :
|
||||
power_down_mode(power_down_mode),
|
||||
address(address),
|
||||
i2c(i2c),
|
||||
dac_value(0),
|
||||
eeprom_value(0)
|
||||
|
||||
|
||||
{
|
||||
uint8_t temp[6];
|
||||
|
||||
temp[0] = cmd_write_dac_and_eeprom | (power_down_mode << 1);
|
||||
temp[1] = static_cast<uint8_t>(dac_value >> 4);
|
||||
temp[2] = static_cast<uint8_t>(dac_value << 4);
|
||||
temp[3] = temp[0];
|
||||
temp[4] = temp[1];
|
||||
temp[5] = temp[2];
|
||||
|
||||
//i2c_write(address, temp,6);
|
||||
}
|
||||
|
||||
MCP4725::MCP4725(i2c_addr address,
|
||||
I2C* i2c) :
|
||||
power_down_mode(pwrd_md::normal),
|
||||
address(address),
|
||||
i2c(i2c),
|
||||
dac_value(0),
|
||||
eeprom_value(0)
|
||||
|
||||
{
|
||||
uint8_t temp[6];
|
||||
|
||||
temp[0] = cmd_write_dac_and_eeprom | (power_down_mode << 1);
|
||||
temp[1] = static_cast<uint8_t>(dac_value >> 4);
|
||||
temp[2] = static_cast<uint8_t>(dac_value << 4);
|
||||
temp[3] = temp[0];
|
||||
temp[4] = temp[1];
|
||||
temp[5] = temp[2];
|
||||
|
||||
//i2c_write(address, temp, 6);
|
||||
}
|
||||
#endif
|
||||
|
||||
MCP4725::MCP4725()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
MCP4725::MCP4725(I2C* i2c) :
|
||||
power_down_mode(pwrd_md::normal),
|
||||
address(addr_0x60),
|
||||
i2c(i2c),
|
||||
dac_value(0),
|
||||
eeprom_value(0)
|
||||
|
||||
{
|
||||
uint8_t temp[6];
|
||||
|
||||
temp[0] = cmd_write_dac_and_eeprom | (power_down_mode << 1);
|
||||
temp[1] = static_cast<uint8_t>(dac_value >> 4);
|
||||
temp[2] = static_cast<uint8_t>(dac_value << 4);
|
||||
temp[3] = temp[0];
|
||||
temp[4] = temp[1];
|
||||
temp[5] = temp[2];
|
||||
|
||||
i2c->writeBuffer(address, temp, 6);
|
||||
}
|
||||
|
||||
//MCP4725::~MCP4725()
|
||||
//{
|
||||
|
||||
//}
|
||||
|
||||
void MCP4725::operator=(uint16_t dac_value)
|
||||
{
|
||||
uint8_t temp[3];
|
||||
this->dac_value = dac_value;
|
||||
|
||||
temp[0] = cmd_write_dac | (power_down_mode << 1);
|
||||
temp[1] = static_cast<uint8_t>(dac_value >> 4);
|
||||
temp[2] = static_cast<uint8_t>(dac_value << 4);
|
||||
|
||||
|
||||
i2c->writeBuffer(address, temp, 3);
|
||||
|
||||
//i2c_write(address, temp, 3);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void MCP4725::operator==(uint16_t dac_and_eeprom_value)
|
||||
{
|
||||
uint8_t temp[6];
|
||||
dac_value = dac_and_eeprom_value;
|
||||
eeprom_value = dac_value;
|
||||
|
||||
temp[0] = cmd_write_dac_and_eeprom | (power_down_mode << 1);
|
||||
temp[1] = static_cast<uint8_t>(dac_and_eeprom_value >> 4);
|
||||
temp[2] = static_cast<uint8_t>(dac_and_eeprom_value << 4);
|
||||
temp[3] = temp[0];
|
||||
temp[4] = temp[1];
|
||||
temp[5] = temp[2];
|
||||
|
||||
i2c->writeBuffer(address, temp, 6);
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
void MCP4725::write_dac(uint16_t dac_value)
|
||||
{
|
||||
&this = dac_value;
|
||||
}
|
||||
|
||||
void MCP4725::write_dac_and_eeprom(uint16_t dac_and_eeprom_value)
|
||||
{
|
||||
&this == dac_and_eeprom_value;
|
||||
}
|
||||
|
||||
#endif
|
@ -0,0 +1,100 @@
|
||||
#ifndef _MCP4725_HPP_
|
||||
#define _MCP4725_HPP_
|
||||
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <functional>
|
||||
#include "../../communication/i2c/i2c.hpp"
|
||||
|
||||
class MCP4725
|
||||
{
|
||||
public:
|
||||
//typedef std::function<void(uint8_t,uint8_t*,uint8_t)> i2c_write_n_t;
|
||||
//typedef std::function<void(const uint8_t&,const uint8_t*,const uint8_t&)> i2c_write_n_t;
|
||||
//typedef void(*i2c_write_n_t)(const uint8_t&, const uint8_t*, const uint8_t&);
|
||||
|
||||
//typedef std::function<void(int)>i2c_write_n_t;
|
||||
|
||||
// address list
|
||||
enum i2c_addr
|
||||
{
|
||||
addr_0x60 = 0b01100000,
|
||||
addr_0x61 = addr_0x60 + 1,
|
||||
addr_0x62 = addr_0x60 + 2,
|
||||
addr_0x63 = addr_0x60 + 3,
|
||||
addr_0x64 = addr_0x60 + 4,
|
||||
addr_0x65 = addr_0x60 + 5,
|
||||
addr_0x66 = addr_0x60 + 6,
|
||||
addr_0x67 = addr_0x60 + 7
|
||||
};
|
||||
|
||||
// power down impedance modes
|
||||
enum pwrd_md
|
||||
{
|
||||
normal = 0x04,
|
||||
ohm_1k = 0x01,
|
||||
ohm_100k = 0x02,
|
||||
ohm_500k = 0x03
|
||||
};
|
||||
|
||||
//using std::functional<uint8_t(uint8_t, uint8_t)> i2c_read_n_t;
|
||||
|
||||
//using i2c_write_n_t = std::functional<void(uint8_t, uint8_t*,uint8_t)>;
|
||||
|
||||
/**
|
||||
* @brief Constructor of mcp4725 dac
|
||||
*
|
||||
* @param power_down_mode pwrd_md power down mode
|
||||
* @param address i2c_addr i2c address of the dac
|
||||
* @param i2c_write i2c_write_n_t callback for i2c writ
|
||||
*/
|
||||
#if 0
|
||||
MCP4725(pwrd_md power_down_mode,
|
||||
i2c_addr address,
|
||||
I2C* i2c);
|
||||
|
||||
MCP4725(i2c_addr address,
|
||||
I2C* i2c);
|
||||
#endif
|
||||
|
||||
MCP4725();
|
||||
MCP4725(I2C* i2c);
|
||||
|
||||
// ~MCP4725();
|
||||
|
||||
|
||||
|
||||
void operator=(uint16_t dac_value);
|
||||
|
||||
void operator==(uint16_t dac_and_eeprom_value);
|
||||
|
||||
#if 0
|
||||
void write_dac_and_eeprom(uint16_t value);
|
||||
|
||||
void set_powerdown_impedance(pwrd_md mode);
|
||||
|
||||
i2c_addr get_i2c_addr();
|
||||
#endif
|
||||
//void set_power
|
||||
|
||||
|
||||
private:
|
||||
|
||||
enum commands_t
|
||||
{
|
||||
cmd_fast_mode = 0x00,
|
||||
cmd_write_dac = 0x40,
|
||||
cmd_write_dac_and_eeprom = 0x60
|
||||
};
|
||||
|
||||
I2C* i2c;
|
||||
|
||||
i2c_addr address;
|
||||
pwrd_md power_down_mode;
|
||||
//i2c_write_n_t i2c_write;
|
||||
uint16_t dac_value;
|
||||
uint16_t eeprom_value;
|
||||
|
||||
};
|
||||
|
||||
#endif // _MCP4725_HPP_
|
Loading…
Reference in new issue