This commit is contained in:
2024-03-02 22:24:43 +01:00
parent 42d2b54c83
commit e092ed9dea
2 changed files with 152 additions and 9 deletions

View File

@@ -37,13 +37,25 @@ enum class ecmcDAQDataFormat { raw = 0,
class ecmcDAQChannelItem {
public:
ecmcDAQChannelItem(char* name, ecmcDAQDataFormat format) {
dataItem_ = NULL;
dataItemInfo_ = NULL;
name_ = name;
format_ = format; // micro s in int32
dataItem_ = NULL;
dataItemInfo_ = NULL;
name_ = name;
format_ = format; // micro s in int32
sampleTimeCompensation_ = 0;
dataIndexToReturn_ = 0;
dataElementCount_ = 0;
bytesPerElement_ = 0;
int8Ptr_ = NULL;
uint8Ptr_ = NULL;
int16Ptr_ = NULL;
uint16Ptr_ = NULL;
int32Ptr_ = NULL;
uint32Ptr_ = NULL;
int64Ptr_ = NULL;
uint64Ptr_ = NULL;
float32Ptr_ = NULL;
float64Ptr_ = NULL;
dataType_ = ECMC_EC_NONE;
}
void connectToSource() {
@@ -59,8 +71,10 @@ class ecmcDAQChannelItem {
printf("ERROR: DataItemInfo %s NULL.\n", name_.c_str());
throw std::runtime_error( "ERROR: DataItemInfo NULL." );
}
dataElementCount_ = dataItemInfo_->dataSize / dataItemInfo_->dataElementSize;
bytesPerElement_ = dataItemInfo_->dataElementSize;
dataElementCount_ = dataItemInfo_->dataSize / bytesPerElement_;
dataType_= dataItemInfo_->dataType;
// Execute here to be sure that startup.cmd of ecmc(cfg) has been executed.
switch(format_) {
case ecmcDAQDataFormat.time_micro_s_minus_period:
@@ -95,14 +109,131 @@ class ecmcDAQChannelItem {
* before call, check if data is available with notEmpty()
*/
double getData(bool first) {
double data = 0;
uint64_t time = 0;
if(first) {
dataIndexToReturn_ = 0;
}
if(dataIndexToReturn_ >= dataElementCount_) {
printf("ERROR: Try to read outside data buffer for data item %s\n", name_);
return -1;
}
switch (dataType_) {
case ECMC_EC_B1:
uint8Ptr_ = (uint8_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
data = (double)(*uint8Ptr_ & 0x01);
break;
case ECMC_EC_B2:
uint8Ptr_ = (uint8_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
data = (double)(*uint8Ptr_ & 0x03);
break;
case ECMC_EC_B3:
uint8Ptr_ = (uint8_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
data = (double)(*uint8Ptr_ & 0x07);
break;
case ECMC_EC_B4:
uint8Ptr_ = (uint8_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
data = (double)(*uint8Ptr_ & 0x0F);
break;
case ECMC_EC_U8:
uint8Ptr_ = (uint8_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *uint8Ptr_;
data = (double)*uint8Ptr_;
break;
case ECMC_EC_S8:
int8Ptr_ = (int8_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *int8Ptr_;
data = (double)*int8Ptr_;
break;
case ECMC_EC_U16:
uint16Ptr_ = (uint16_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *uint16Ptr_;
data = (double)*uint16Ptr_;
break;
case ECMC_EC_S16:
int16Ptr_ = (int16_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *int16Ptr_;
data = (double)*int16Ptr_;
break;
case ECMC_EC_U32:
uint32Ptr_ = (uint32_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *uint32Ptr_;
data = (double)*uint32Ptr_;
break;
case ECMC_EC_S32:
int32Ptr_ = (int32_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *int32Ptr_;
data = (double)*int32Ptr_;
break;
case ECMC_EC_U64:
uint64Ptr_ = (uint64_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *uint64Ptr_;
data = (double)*uint64Ptr_;
break;
case ECMC_EC_S64:
int64Ptr_ = (int64_t *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
time = *uint64Ptr_;
data = (double)*int64Ptr_;
break;
case ECMC_EC_F32:
float32Ptr_ = (float *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
data = (double)*float32Ptr_;
break;
case ECMC_EC_F64:
float64Ptr_ = (double *)&buffer_[dataIndexToReturn_ * bytesPerElement_];
data = (double)*float64Ptr_;
break;
default:
data = 0;
return ERROR_MEM_INVALID_DATA_TYPE;
break;
}
dataIndexToReturn_++;
return formatData(data,time);
}
/* Retruns true if all data have been retruned with getData().
double formatData(double data, uint64_t time){
// Time format only works for integer values, otherwise a 0 will be returned
switch(format_) {
case ecmcDAQDataFormat.time_micro_s:
time = time / 1000; // micro seconds
data = (double)(time & 0xFFFFFFFF); //keep 32bits
break;
case ecmcDAQDataFormat.time_micro_s_minus_period:
time = time / 1000; // micro seconds
data = (double)(time & 0xFFFFFFFF); //keep 32bits
data = data - sampleTimeCompensation_;
break;
case ecmcDAQDataFormat.time_ns_minus_period:
data = (double)(time - (uint64_t)sampleTimeCompensation_);
break;
default:
;
break;
}
return data;
}
/* Returns true if all data have been retruned with getData().
*/
bool empty(){
return dataIndexToReturn_ >= dataElementCount_;
@@ -118,7 +249,19 @@ class ecmcDAQChannelItem {
ecmcDAQDataFormat format_;
double sampleTimeCompensation_;
size_t dataIndexToReturn_;
size_t dataElementCount_;
size_t dataElementCount_;
size_t bytesPerElement_;
ecmcEcDataType dataType_;
int8_t *int8Ptr_;
uint8_t *uint8Ptr_;
int16_t *int16Ptr_;
uint16_t *uint16Ptr_;
int32_t *int32Ptr_;
uint32_t *uint32Ptr_;
int64_t *int64Ptr_;
uint64_t *uint64Ptr_;
float *float32Ptr_;
double *float64Ptr_;
};
#endif /* ECMC_DAQ_CHANNEL_ITEM_H_ */

View File

@@ -115,7 +115,7 @@ void ecmcDAQDataArray::buildArrayHeader(){
dataStartOffset = dataStartOffset + (*pDataCh)->getDataElementCount();
index++;
// Forth index spare...
buffer_[index] = -1234567890;
buffer_[index] = -1234.0;
index++;
}
}