47#define IMPORT_CODE_FROM_EMBOT_HW_PGA308 
   59#if defined(IMPORT_CODE_FROM_EMBOT_HW_PGA308) 
   64        static const std::uint16_t 
Default = 0x8000;
 
 
   86        static const std::uint16_t 
Default = 0x4000;
 
 
  124        CFG0register(std::uint8_t GO, std::uint8_t MUX, std::uint8_t GI, std::uint8_t OS)
 
 
  140        void setGO(std::uint8_t GO) { 
value |= (
static_cast<std::uint8_t
>(GO&0x07) << 13); }
 
  141        std::uint8_t 
getGO()
 const { 
return ((
value >> 13) & 0x07); }
 
  144        void setMUX(std::uint8_t MUX) { 
value |= (
static_cast<std::uint8_t
>(MUX&0x01) << 12); }
 
  148        void setGI(std::uint8_t GI) { 
value |= (
static_cast<std::uint8_t
>(GI&0x0f) << 8); }
 
  153        void setOS(std::uint8_t OS) { 
value |= (
static_cast<std::uint8_t
>(OS&0xff)); }
 
 
  234        static const std::uint16_t 
VREF = 8192;    
 
  338            static const std::uint16_t mapGI2val[16] = {4, 6, 8, 12, 16, 32, 64, 100, 200, 400, 480, 600, 800, 960, 1200, 1600};
 
  339            return static_cast<float>(mapGI2val[
GI]);
 
 
  344            static const float mapGO2val[8] = {2.0f, 2.4f, 3.0f, 3.6f, 4.0f, 4.5f, 6.0f, 1.0f};
 
  345            return mapGO2val[
GO];
 
 
  358            return (1.0f + 
static_cast<float>(
x)/32768.0f)/3.0f;
 
 
  371            std::uint8_t v = co & 0x7f;
 
  372            if(v > 100) { v = 100; }
 
  373            std::uint8_t negative = co >> 7;
 
  374            return (1 == negative) ? -v : +v;
 
 
  382                v = std::floor(v + 0.5f);
 
  383                if(v > +100.0f) { v = +100.0f; }
 
  384                r = 
static_cast<std::uint8_t
>(v);
 
  389                v = std::floor(v + 0.5f);
 
  390                if(v > +100.0f) { v = +100.0f; }
 
  391                r = 
static_cast<std::uint8_t
>(v) | 0x80;
 
 
  404            return static_cast<float>(
VREF)*(1.0f/65536.0f)*(32768.0f - 
static_cast<float>(
Vzerodac));
 
 
  418            return (0 == 
muxsign) ? v : -v;
 
 
  437        bool alignVOUT(
const std::uint16_t vout, 
const std::uint16_t target, std::uint8_t &Y, std::uint16_t &Z)
 
  441            float y = (target - c - b*
static_cast<float>(
Vzerodac))/a;  
 
  448            float z = (target - c - a*
y)/b;
 
  449            if((
z > 65535.0f) || (
z < 0.0f))
 
  454            Z = 
static_cast<std::uint16_t
>(std::floor(
z + 0.5f));
 
 
  464            std::int32_t 
x = 
static_cast<std::int32_t
>(std::floor(xgd + 0.5f));
 
  465            if((
x >= 65536) || (
x < 0))
 
  469            GD = 
static_cast<std::uint16_t
>(
x);
 
 
  479            std::int32_t 
z = 
static_cast<std::int32_t
>(std::floor(zco + 0.5f));
 
  480            if((
z >= 65536) || (
z < 0))
 
  485            Vzerodac = 
static_cast<std::uint16_t
>(
z);
 
 
 
  514            {0x00, 0x80, 0x66, 0x06, 0xcb, 0x80},   
 
  515            {0x00, 0x80, 0x56, 0x0c, 0xcb, 0x80},   
 
  516            {0x00, 0x40, 0x56, 0x10, 0x0f, 0x81},   
 
  517            {0x00, 0x80, 0x46, 0x17, 0x6d, 0x7f},   
 
  518            {0x00, 0x40, 0x46, 0x1f, 0xb1, 0x7f},   
 
  519            {0x00, 0x10, 0x46, 0x2a, 0x80, 0x80},   
 
  520            {0x00, 0x40, 0x42, 0x3e, 0x62, 0x7f},   
 
  521            {0x00, 0x20, 0x42, 0x4b, 0x15, 0x80},   
 
  522            {0x00, 0x00, 0x42, 0x5e, 0x72, 0x80},   
 
  523            {0x00, 0xC0, 0x02, 0x64, 0xf6, 0x6e},   
 
  524            {0x00, 0x80, 0x02, 0x64, 0x29, 0x62},   
 
  525            {0x00, 0x40, 0x02, 0x64, 0xd4, 0x4c},   
 
  526            {0x00, 0x40, 0x00, 0x64, 0x29, 0x22}    
 
  540                uint8_t index = 
static_cast<uint8_t
>(g);
 
  542                cfg.
load(_cfgmap[index], 6);
 
 
  557            {0x00, 0x80, 0x66, 0x20, 0x00, 0x80},   
 
  558            {0x00, 0x80, 0x56, 0x20, 0x00, 0x80},   
 
  559            {0x00, 0x40, 0x56, 0x20, 0x00, 0x80},   
 
  560            {0x00, 0x80, 0x46, 0x20, 0x00, 0x80},   
 
  561            {0x00, 0x40, 0x46, 0x20, 0x00, 0x80},   
 
  562            {0x00, 0x10, 0x46, 0x20, 0x00, 0x80},   
 
  563            {0x00, 0x40, 0x42, 0x20, 0x00, 0x80},   
 
  564            {0x00, 0x20, 0x42, 0x20, 0x00, 0x80},   
 
  565            {0x00, 0x00, 0x42, 0x20, 0x00, 0x80},   
 
  566            {0x00, 0xC0, 0x02, 0x20, 0x00, 0x80},   
 
  567            {0x00, 0x80, 0x02, 0x20, 0x00, 0x80},   
 
  568            {0x00, 0x40, 0x02, 0x20, 0x00, 0x80},   
 
  569            {0x00, 0x40, 0x00, 0x20, 0x00, 0x80}    
 
  583                uint8_t index = 
static_cast<uint8_t
>(g);
 
  585                cfg.
load(_cfgmap[index], 6);
 
 
  630        if((
z > 65535.0f) || (
z < 0.0f))
 
  635        uint16_t Z = 
static_cast<std::uint16_t
>(std::floor(
z + 0.5f));
 
 
  645        int32_t tmp = 
static_cast<int32_t
>(round(8.0f*
tsf.
beta()));
 
  646        if((tmp >= 0) && (tmp < 65536))
 
  648            offset = 
static_cast<uint16_t
>(tmp);
 
 
 
  670        256,128,96,64,48, 36, 24, 20, 16, 10, 8, 6, 4
 
 
  675        uint8_t index = 
static_cast<uint8_t
>(dg);
 
 
  725        const uint16_t *u16 = 
reinterpret_cast<const uint16_t*
>(
data);
 
  726        const uint8_t *u08 = 
reinterpret_cast<const uint8_t*
>(
data);
 
  728        GI = (u08[2] >> 4) & 0x0f;
 
  729        S  = (u08[2] >> 3) & 0x01;
 
  730        GO = (u08[2]) & 0x07;
 
 
  741        uint16_t *u16 = 
reinterpret_cast<uint16_t*
>(
data);
 
  742        uint8_t *u08 = 
reinterpret_cast<uint8_t*
>(
data);
 
  743        u16[0] = GD; u16[2] = Vzerodac;
 
  745        u08[2] = ((
static_cast<uint8_t
>(GI) & 0x0f) << 4) | ((
static_cast<uint8_t
>(S) & 0x01) << 3) | ((
static_cast<uint8_t
>(GO) & 0x07));
 
  746        u08[3] = Voffsetcoarse;
 
  747        size = sizeofregisters;
 
 
  812       if(
nullptr != wideparams)
 
  814           get(wideparams->
g, wideparams->
o);
 
 
  845            return pImpl->
load(g);
 
 
  853        return load(discreteparams.
dg, discreteparams.
o);
 
 
  864        return get(wideparams.
g, wideparams.
o);
 
 
 
  889namespace strain { 
namespace amplifier {
 
  909        const bool step1 = 
true;
 
  911        const bool step2 = 
true;
 
  926            wp.
load(4.0, 32*1024);
 
  941            wp.
load(48.0, 32531);
 
  974            pga.
import(regs, &wparams);
 
  977            if(
true == 
convert(wparams, dparams))
 
 
  997        wp.
load(48.0, 32*1024);
 
 1023        pga.
import(regs, &wparams);
 
 1026        if(
true == 
convert(wparams, dparams))
 
 1044        thePGAs[0].
load(discreteparams);
 
 1047        thePGAs[0].
get(regs);
 
 1049        uint8_t payload[8] = {0};
 
 1054        uint8_t rxpayload[8] = {0}; 
 
 1055        regs.
load(rxpayload);
 
 1058        rxregs.
load(rxpayload);
 
 1061        thePGAs[0].
load(rxregs);
 
 1062        thePGAs[0].
get(gg, oo);
 
 
 1073namespace strain { 
namespace dsp { 
namespace fsc {
 
 1078        FSC ret = 
static_cast<FSC>(v);
 
 
 1097        return static_cast<double>(v);
 
 
 1101    bool convert(
const std::vector<double> &in, std::vector<FSC> &
out)
 
 1106        for(
int i=0; i<in.size(); i++)
 
 
 1117    bool convert(
const std::vector<FSC> &in, std::vector<double> &
out)
 
 1121        for(
int i=0; i<in.size(); i++)
 
 
 
 1133namespace strain { 
namespace dsp { 
namespace q15 {
 
 1143        return valU16-0x8000;
 
 
 1146    bool convert(
const std::vector<double> &in, std::vector<Q15> &
out)
 
 1151        for(
int i=0; i<in.size(); i++)
 
 
 1162    bool convert(
const std::vector<Q15> &in, std::vector<double> &
out)
 
 1166        for(
int i=0; i<in.size(); i++)
 
 
 1175        return valQ15+0x8000;
 
 
 1180        return static_cast<double>(v) / 32768.0;  
 
 
 1199        else if (
x < -0x8000)
 
 1206        return static_cast<Q15>(
x);
 
 
 1211        bool saturated = 
false;
 
 1212        return add(a, b, saturated);
 
 
 1232        tmp += (1 << (15 - 1));
 
 
 1241        bool saturated = 
false;
 
 1242        return mul(a, b, saturated);
 
 
 1250        std::uint8_t neg = 0;
 
 1270        rr = (n1 << 15) / n2;
 
 
 1294        for(
int r=0; r<res.
nrows; r++)
 
 1296            for(
int c=0; c<res.
ncols; c++)
 
 
 1329        std::uint32_t nsat = 0;
 
 1332        for(
int r=0; r<res.
nrows; r++)
 
 1334            for(
int c=0; c<res.
ncols; c++)
 
 1339                const Q15 *col_wise = &m2.
data[c];          
 
 1340                for(
int i=0; i<m1.
ncols; i++)
 
 1344                    Q15 x = 
mul(*row_wise, *col_wise, sat1);
 
 1345                    v = 
add(v, 
x, sat2);
 
 1352                    col_wise += m2.
ncols;
 
 
 
 1387        const char * filename = fname.c_str();
 
 1389        std::fstream filestr;
 
 1390        filestr.open (filename, fstream::in);
 
 1391        if (!filestr.is_open()){
 
 1401        filestr.getline (buffer,256);
 
 1402        filestr.getline (buffer,256);
 
 1403        sscanf (buffer,
"%d",&file_version);
 
 1406        if((4 != file_version) && (3 != file_version))
 
 1418            filestr.getline (buffer,256);
 
 1419            filestr.getline (buffer,256);
 
 1420            if(0 != strcmp(buffer, 
"strain2"))
 
 1430            char serial_no[256] = {0};
 
 1431            filestr.getline (buffer,256);
 
 1432            filestr.getline (buffer,256);
 
 1433            snprintf(serial_no, 
sizeof(serial_no), 
"%s", buffer);
 
 1436            reg.
serial = std::string(serial_no);
 
 1444            filestr.getline (buffer,256);
 
 1447                filestr.getline (buffer,256);
 
 1449                unsigned int t08[6] = {0};
 
 1450                sscanf  (buffer,
"0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", &t08[0], &t08[1], &t08[2], &t08[3], &t08[4], &t08[5]);
 
 1451                for(
int j=0; j<6; j++)
 
 1468            filestr.getline (buffer,256);
 
 1469            for (i=0;i<36; i++){
 
 1470                unsigned int tmp = 0;
 
 1471                filestr.getline (buffer,256);
 
 1472                sscanf (buffer,
"%x", &tmp);
 
 1480            filestr.getline (buffer,256);
 
 1481            filestr.getline (buffer,256);
 
 1483            sscanf (buffer,
"%d",&cc);
 
 1487            filestr.getline (buffer,256);
 
 1489                filestr.getline (buffer,256);
 
 1491                sscanf  (buffer,
"%d", &tt);
 
 1492                set.
digital.
tare[i] = 
static_cast<std::uint16_t
>(tt);
 
 1497            filestr.getline (buffer,256);
 
 1499                filestr.getline (buffer,256);
 
 1501                sscanf  (buffer,
"%d", &fs);
 
 1506            reg.
sets.push_back(set);
 
 
 
static const std::uint8_t defval[sizeofregisters]
 
virtual bool load(const void *data, const size_t size)
 
static const std::uint8_t sizeofregisters
 
std::uint8_t Voffsetcoarse
 
virtual std::uint8_t size()
 
virtual bool fill(void *data, size_t &size)
 
bool import(const Registers ®s, WideParams *wideparams=nullptr)
 
bool load(const Registers ®s)
 
bool get(WideParams &wideparams)
 
double sat(const double val, const double min, const double max)
 
Gain convert(const DiscreteGain dg)
 
static const float mapofgains[static_cast< uint8_t >(DiscreteGain::maxnumberof)]
 
void testIT(std::string &output)
 
const Offset midrangeOffset
 
FSC convert(const double v, bool &saturated)
 
std::uint16_t Q15toU16(const Q15 valQ15)
 
Q15 saturate(const Q15result x, bool &saturated)
 
Q15 convert(const double v, bool &saturated)
 
bool multiply(const matrix &m1, const matrix &m2, matrix &res, bool &saturated)
 
Q15 div(const Q15 a, const Q15 b, bool &saturated)
 
Q15 mul(const Q15 a, const Q15 b, bool &saturated)
 
Q15 U16toQ15(const std::uint16_t valU16)
 
Q15 opposite(const Q15 v)
 
Q15 add(const Q15 a, const Q15 b)
 
bool read(const std::string fname, FullRegulation ®)
 
void load(DiscreteGain _dg, Offset _o)
 
Example_strain2_ampl_regs_t()
 
void setMUX(std::uint8_t MUX)
 
std::uint8_t getOS() const
 
static const std::uint8_t DefaultGO_g_32_96
 
std::uint8_t getGO() const
 
std::uint8_t getGI() const
 
static const std::uint8_t DefaultOS
 
static const std::uint8_t DefaultGI
 
static const std::uint8_t DefaultGO
 
std::uint8_t getMUX() const
 
static const std::uint8_t DefaultGO_g_11_75
 
CFG0register(std::uint16_t v)
 
static const std::uint8_t DefaultGO_g_16_80
 
void setGI(std::uint8_t GI)
 
void setOS(std::uint8_t OS)
 
static const std::uint8_t DefaultMUX
 
CFG0register(std::uint8_t GO, std::uint8_t MUX, std::uint8_t GI, std::uint8_t OS)
 
void setGO(std::uint8_t GO)
 
void set(std::uint16_t cfg1)
 
CFG1register(std::uint16_t v)
 
static const std::uint16_t Default
 
CFG2register(std::uint16_t v)
 
void set(std::uint16_t cfg2)
 
static const std::uint16_t Default
 
GDACregister(std::uint16_t v)
 
void set(std::uint16_t gdac)
 
static const std::uint16_t Default
 
void set(std::uint16_t sftc)
 
static const std::uint16_t Default
 
SFTCregister(std::uint16_t v)
 
void load(const Registers ®s)
 
bool alignVOUT(const std::uint16_t vout, const std::uint16_t target, std::uint8_t &Y, std::uint16_t &Z)
 
std::uint8_t Vcoarseoffset
 
float valueOfGD(std::uint16_t x)
 
void assign(const CFG0register &cfg0, const ZDACregister &zdac, const GDACregister &gdac)
 
float regvco2value(std::uint8_t co)
 
void load(const ZDACregister &zdac)
 
void obtain(CFG0register &cfg0, ZDACregister &zdac, GDACregister &gdac) const
 
float valueOfFineOffset()
 
void load(const CFG0register &cfg0)
 
static const std::uint16_t VREF
 
void load(const GDACregister &gdac)
 
std::uint8_t value2regvco(float v)
 
float valueOfCoarseOffset()
 
float alpha(std::uint16_t x)
 
void computeOffsetParams(const std::uint16_t vout, float &a, float &b, float &c)
 
void get(Registers ®s)
 
ZDACregister(std::uint16_t v)
 
static const std::uint16_t Default
 
void set(std::uint16_t zdac)
 
TransferFunctionConfig tsf
 
bool load(const DiscreteGain g, const Offset offset)
 
bool load_step1(const DiscreteGain g)
 
bool get(Gain &gain, Offset &offset)
 
bool load(const DiscreteGain g)
 
void load(Gain _g, Offset _o)
 
std::uint8_t amplregs[strain::numberofchannels][strain::amplifier::PGA308::Registers::sizeofregisters]
 
strain::dsp::Q15 matrix[strain::numberofchannels *strain::numberofchannels]
 
strain::dsp::FSC fullscale[strain::numberofchannels]
 
std::uint16_t tare[strain::numberofchannels]
 
std::uint8_t set2useatbootstrap