91 lines
1.6 KiB
C++
91 lines
1.6 KiB
C++
|
|
/*
|
|||
|
|
* TableAdcResult.cpp
|
|||
|
|
*
|
|||
|
|
* Created on: 29 <EFBFBD><EFBFBD><EFBFBD>. 2019 <EFBFBD>.
|
|||
|
|
* Author: titov
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#include "TableAdcResult.hh"
|
|||
|
|
|
|||
|
|
#include <cmath>
|
|||
|
|
#include <stdint.h>
|
|||
|
|
|
|||
|
|
driver::TableAdcResult::TableAdcResult(const volatile uint16_t** result,
|
|||
|
|
const volatile uint16_t** buff, Id size) : data(result), buff(buff), size(size), quantity(0) {
|
|||
|
|
|
|||
|
|
for( Id id = 0; id < size; ++id ) {
|
|||
|
|
result[id] = buff[id] = nullptr;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
uint32_t driver::TableAdcResult::sum() const {
|
|||
|
|
|
|||
|
|
uint32_t temp = 0;
|
|||
|
|
|
|||
|
|
for( Id i = 0; i < quantity; ++i )
|
|||
|
|
temp += *buff[i];
|
|||
|
|
|
|||
|
|
return temp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool driver::TableAdcResult::attach( peripheral::IAdcResult<uint16_t> * adc_result, Id position ) {
|
|||
|
|
|
|||
|
|
if( position < size and not data[position] and quantity < size ) {
|
|||
|
|
|
|||
|
|
return ( buff[quantity++] = data[position] = adc_result->result() );
|
|||
|
|
|
|||
|
|
} else return false;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
const volatile float & driver::TableAdcAsValue::getValue() const {
|
|||
|
|
|
|||
|
|
return result;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool driver::TableAdcAsValue::configure( Setting & config ) {
|
|||
|
|
|
|||
|
|
if( config.isValid() ) {
|
|||
|
|
|
|||
|
|
offset = config.offset;
|
|||
|
|
coeff = config.coeff;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
} else return false;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void driver::TableAdcAsValue::process() {
|
|||
|
|
|
|||
|
|
if( is_filled() ) {
|
|||
|
|
|
|||
|
|
uint32_t temp = sum();
|
|||
|
|
result = temp * coeff + offset; //todo: hren
|
|||
|
|
|
|||
|
|
} else
|
|||
|
|
result = NAN;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
driver::TableAdcAsAdcChannel::operator uint32_t() const {
|
|||
|
|
|
|||
|
|
return sum();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool driver::TableAdcAsValue::Setting::isValid() const {
|
|||
|
|
|
|||
|
|
using namespace std;
|
|||
|
|
|
|||
|
|
return isfinite( coeff ) and isfinite( offset );
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool driver::TableAdcResult::is_filled() const {
|
|||
|
|
|
|||
|
|
return size == quantity;
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|