diff --git a/src/ecmcDAQChannelItem.h b/src/ecmcDAQChannelItem.h index b907a8d..bdbac3d 100644 --- a/src/ecmcDAQChannelItem.h +++ b/src/ecmcDAQChannelItem.h @@ -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_ */ diff --git a/src/ecmcDAQDataArray.cpp b/src/ecmcDAQDataArray.cpp index d732c10..93b0344 100644 --- a/src/ecmcDAQDataArray.cpp +++ b/src/ecmcDAQDataArray.cpp @@ -115,7 +115,7 @@ void ecmcDAQDataArray::buildArrayHeader(){ dataStartOffset = dataStartOffset + (*pDataCh)->getDataElementCount(); index++; // Forth index spare... - buffer_[index] = -1234567890; + buffer_[index] = -1234.0; index++; } }