@@ -109,12 +109,12 @@ const uint32_t ADMTController::getHarmonicRegister(HarmonicRegister registerID)
109109 return UINT32_MAX;
110110}
111111
112- const uint32_t ADMTController::getHarmonicPage (HarmonicRegister registerID)
112+ const uint8_t ADMTController::getHarmonicPage (HarmonicRegister registerID)
113113{
114114 if (registerID >= 0 && registerID < HARMONIC_REGISTER_COUNT) {
115115 return HarmonicPages[registerID];
116116 }
117- return UINT32_MAX ;
117+ return UINT8_MAX ;
118118}
119119
120120const uint32_t ADMTController::getConfigurationRegister (ConfigurationRegister registerID)
@@ -125,12 +125,12 @@ const uint32_t ADMTController::getConfigurationRegister(ConfigurationRegister re
125125 return UINT32_MAX;
126126}
127127
128- const uint32_t ADMTController::getConfigurationPage (ConfigurationRegister registerID)
128+ const uint8_t ADMTController::getConfigurationPage (ConfigurationRegister registerID)
129129{
130130 if (registerID >= 0 && registerID < CONFIGURATION_REGISTER_COUNT) {
131131 return ConfigurationPages[registerID];
132132 }
133- return UINT32_MAX ;
133+ return UINT8_MAX ;
134134}
135135
136136const uint32_t ADMTController::getSensorRegister (SensorRegister registerID)
@@ -141,12 +141,12 @@ const uint32_t ADMTController::getSensorRegister(SensorRegister registerID)
141141 return UINT32_MAX;
142142}
143143
144- const uint32_t ADMTController::getSensorPage (SensorRegister registerID)
144+ const uint8_t ADMTController::getSensorPage (SensorRegister registerID)
145145{
146146 if (registerID >= 0 && registerID < SENSOR_REGISTER_COUNT) {
147147 return SensorPages[registerID];
148148 }
149- return UINT32_MAX ;
149+ return UINT8_MAX ;
150150}
151151
152152const uint32_t ADMTController::getUniqueIdRegister (UniqueIDRegister registerID)
@@ -157,12 +157,12 @@ const uint32_t ADMTController::getUniqueIdRegister(UniqueIDRegister registerID)
157157 return UINT32_MAX;
158158}
159159
160- const uint32_t ADMTController::getUniqueIdPage (UniqueIDRegister registerID)
160+ const uint8_t ADMTController::getUniqueIdPage (UniqueIDRegister registerID)
161161{
162162 if (registerID >= 0 && registerID < UNIQID_REGISTER_COUNT) {
163163 return UniqueIdPages[registerID];
164164 }
165- return UINT32_MAX ;
165+ return UINT8_MAX ;
166166}
167167
168168const uint32_t
@@ -203,21 +203,21 @@ int ADMTController::getChannelIndex(const char *deviceName, const char *channelN
203203double ADMTController::getChannelValue (const char *deviceName, const char *channelName, int bufferSize)
204204{
205205 if (!m_iioCtx) {
206- return static_cast < double >(UINT64_MAX) ;
206+ return UINT32_MAX ;
207207 } // return QString("No context available.");
208208 double value;
209209
210210 int deviceCount = iio_context_get_devices_count (m_iioCtx);
211211 if (deviceCount < 1 )
212- return static_cast < double >(UINT64_MAX) ; // return QString("No devices found");
212+ return UINT32_MAX ; // return QString("No devices found");
213213
214214 iio_device *admtDevice = iio_context_find_device (m_iioCtx, deviceName);
215215 if (admtDevice == NULL )
216- return static_cast < double >(UINT64_MAX) ; // return QString("No ADMT4000 device");
216+ return UINT32_MAX ; // return QString("No ADMT4000 device");
217217
218218 int channelCount = iio_device_get_channels_count (admtDevice);
219219 if (channelCount < 1 )
220- return static_cast < double >(UINT64_MAX) ; // return QString("No channels found.");
220+ return UINT32_MAX ; // return QString("No channels found.");
221221
222222 iio_channel *channel;
223223 std::string message = " " ;
@@ -233,7 +233,7 @@ double ADMTController::getChannelValue(const char *deviceName, const char *chann
233233 }
234234 }
235235 if (channel == NULL )
236- return static_cast < double >(UINT64_MAX) ; // return QString("Channel not found.");
236+ return UINT32_MAX ; // return QString("Channel not found.");
237237 iio_channel_enable (channel);
238238
239239 double scale = 1.0 ;
@@ -242,16 +242,16 @@ double ADMTController::getChannelValue(const char *deviceName, const char *chann
242242 const char *offsetAttrName = " offset" ;
243243 const char *scaleAttr = iio_channel_find_attr (channel, scaleAttrName);
244244 if (scaleAttr == NULL )
245- return static_cast < double >(UINT64_MAX) ; // return QString("No scale attribute");
245+ return UINT32_MAX ; // return QString("No scale attribute");
246246 const char *offsetAttr = iio_channel_find_attr (channel, offsetAttrName);
247247 if (offsetAttr == NULL )
248- return static_cast < double >(UINT64_MAX) ; // return QString("No offset attribute");
248+ return UINT32_MAX ; // return QString("No offset attribute");
249249
250250 double *scaleVal = new double (1 );
251251 int scaleRet = iio_channel_attr_read_double (channel, scaleAttr, scaleVal);
252252 if (scaleRet != 0 ) {
253253 delete scaleVal;
254- return static_cast < double >(UINT64_MAX) ; // return QString("Cannot read scale attribute");
254+ return UINT32_MAX ; // return QString("Cannot read scale attribute");
255255 }
256256 scale = *scaleVal;
257257 delete scaleVal;
@@ -263,7 +263,7 @@ double ADMTController::getChannelValue(const char *deviceName, const char *chann
263263
264264 iio_buffer *iioBuffer = iio_device_create_buffer (admtDevice, bufferSize, false );
265265 if (iioBuffer == NULL )
266- return static_cast < double >(UINT64_MAX) ; // return QString("Cannot create buffer.");
266+ return UINT32_MAX ; // return QString("Cannot create buffer.");
267267
268268 ssize_t numBytesRead;
269269 int8_t *pointerData, *pointerEnd;
@@ -272,7 +272,7 @@ double ADMTController::getChannelValue(const char *deviceName, const char *chann
272272
273273 numBytesRead = iio_buffer_refill (iioBuffer);
274274 if (numBytesRead < 0 )
275- return static_cast < double >(UINT64_MAX) ; // return QString("Cannot refill buffer.");
275+ return UINT32_MAX ; // return QString("Cannot refill buffer.");
276276
277277 const struct iio_data_format *format = iio_channel_get_data_format (channel);
278278 const struct iio_data_format channelFormat = *format;
@@ -1228,6 +1228,40 @@ int ADMTController::getAbsAngleTurnCount(uint16_t registerValue)
12281228 }
12291229}
12301230
1231+ double ADMTController::getAbsAngle (uint16_t registerValue)
1232+ {
1233+ double scale = 0.351562500 ;
1234+
1235+ int turnCount = getAbsAngleTurnCount (registerValue);
1236+
1237+ double angle = static_cast <double >(registerValue & 0x03FF ) * scale;
1238+ double absAngle = angle;
1239+
1240+ if (turnCount != 0 )
1241+ absAngle += (turnCount * 360 );
1242+
1243+ return absAngle;
1244+ }
1245+
1246+ double ADMTController::getAngle (uint16_t registerValue)
1247+ {
1248+ // Angle resolution: 360 deg / 4096
1249+ double scale = 0.087890625 ;
1250+
1251+ // Bits 15:4: Magnetic Field Angle with 360 deg range.
1252+ double angle = static_cast <double >(registerValue >> 4 ) * scale;
1253+
1254+ return angle;
1255+ }
1256+
1257+ double ADMTController::getTemperature (uint16_t registerValue)
1258+ {
1259+ // Bits 15:4: Internal Temperature Sensor.
1260+ double temperature = (static_cast <double >((registerValue >> 4 )) - 1168 ) / 15.66 ;
1261+
1262+ return temperature;
1263+ }
1264+
12311265uint16_t ADMTController::setDIGIOENRegisterBitMapping (uint16_t currentRegisterValue, map<string, bool > settings)
12321266{
12331267 uint16_t registerValue = currentRegisterValue; // Start with the current register value
@@ -1839,6 +1873,41 @@ void ADMTController::bufferedStreamIO(int totalSamples, int targetSampleRate)
18391873 delete[] offsetDst;
18401874}
18411875
1876+ void ADMTController::registryStream (int totalSamples, int targetSampleRate)
1877+ {
1878+ QVector<double > values;
1879+ sampleCount = 0 ;
1880+ double angle = 0 ;
1881+ bool readSuccess = false ;
1882+ uint32_t *registerValue = new uint32_t ;
1883+
1884+ while (!stopStream && sampleCount < totalSamples) {
1885+ elapsedStreamTimer.start ();
1886+
1887+ qint64 elapsedNanoseconds = elapsedStreamTimer.nsecsElapsed ();
1888+ while (elapsedNanoseconds < targetSampleRate) {
1889+ if (readDeviceRegistry (getDeviceId (Device::ADMT4000), getSensorRegister (SensorRegister::ANGLE),
1890+ registerValue) == 0 )
1891+ break ;
1892+ elapsedNanoseconds = elapsedStreamTimer.nsecsElapsed ();
1893+ }
1894+
1895+ angle = getAngle (static_cast <uint16_t >(*registerValue));
1896+
1897+ values.append (angle);
1898+ sampleCount++;
1899+
1900+ elapsedNanoseconds = elapsedStreamTimer.nsecsElapsed ();
1901+ while (elapsedNanoseconds < targetSampleRate) {
1902+ elapsedNanoseconds = elapsedStreamTimer.nsecsElapsed ();
1903+ }
1904+ }
1905+
1906+ delete registerValue;
1907+
1908+ Q_EMIT streamBufferedData (values);
1909+ }
1910+
18421911void ADMTController::handleStreamBufferedData (const QVector<double > &value) { streamBufferedValues = value; }
18431912
18441913bool ADMTController::checkVelocityReachedFlag (uint16_t registerValue)
@@ -1847,4 +1916,19 @@ bool ADMTController::checkVelocityReachedFlag(uint16_t registerValue)
18471916 // set while VACTUAL and VMAX match.
18481917 return ((registerValue >> 8 ) & 0x01 ) ? true : false ;
18491918}
1919+
1920+ uint16_t ADMTController::changeCNVPage (uint16_t registerValue, uint8_t page)
1921+ {
1922+ return (registerValue & ~0x001F ) | (page & 0x1F );
1923+ }
1924+
1925+ uint16_t ADMTController::convertStart (bool start, uint16_t registerValue)
1926+ {
1927+ registerValue &= ~(0b11 << 14 );
1928+
1929+ if (!start)
1930+ registerValue |= (0b11 << 14 );
1931+
1932+ return registerValue;
1933+ }
18501934#include " moc_admtcontroller.cpp"
0 commit comments