Skip to content

Commit f1e746d

Browse files
committed
admt: Updated CNV change method
- Changed CNV page to uint8_t - Added registry read for rotation, angle, count, temp channels - Added disable state for lineedit - Changed error value for double to UINT32_MAX Signed-off-by: John Lloyd Juanillo <[email protected]>
1 parent 2428da1 commit f1e746d

File tree

7 files changed

+410
-225
lines changed

7 files changed

+410
-225
lines changed

plugins/admt/include/admt/admtcontroller.h

+18-12
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ class SCOPY_ADMT_EXPORT ADMTController : public QObject
6767
enum Channel
6868
{
6969
ROTATION,
70-
ANGLE,
70+
ANGL,
7171
COUNT,
7272
TEMPERATURE,
7373
CHANNEL_COUNT
@@ -141,7 +141,7 @@ class SCOPY_ADMT_EXPORT ADMTController : public QObject
141141
enum SensorRegister
142142
{
143143
ABSANGLE,
144-
ANGLEREG,
144+
ANGLE,
145145
ANGLESEC,
146146
SINE,
147147
COSINE,
@@ -183,16 +183,16 @@ class SCOPY_ADMT_EXPORT ADMTController : public QObject
183183
"target_pos", "current_pos", "ramp_mode"};
184184
const uint32_t ConfigurationRegisters[CONFIGURATION_REGISTER_COUNT] = {0x01, 0x04, 0x06, 0x10,
185185
0x12, 0x13, 0x1D, 0x23};
186-
const uint32_t ConfigurationPages[CONFIGURATION_REGISTER_COUNT] = {UINT32_MAX, UINT32_MAX, UINT32_MAX, 0x02,
187-
0x02, 0x02, 0x02, 0x02};
186+
const uint8_t ConfigurationPages[CONFIGURATION_REGISTER_COUNT] = {UINT8_MAX, UINT8_MAX, UINT8_MAX, 0x02,
187+
0x02, 0x02, 0x02, 0x02};
188188
const uint32_t UniqueIdRegisters[UNIQID_REGISTER_COUNT] = {0x1E, 0x1F, 0x20, 0x21};
189-
const uint32_t UniqueIdPages[UNIQID_REGISTER_COUNT] = {0x02, 0x02, 0x02, 0x02};
189+
const uint8_t UniqueIdPages[UNIQID_REGISTER_COUNT] = {0x02, 0x02, 0x02, 0x02};
190190
const uint32_t HarmonicRegisters[HARMONIC_REGISTER_COUNT] = {0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C};
191-
const uint32_t HarmonicPages[HARMONIC_REGISTER_COUNT] = {0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02};
191+
const uint8_t HarmonicPages[HARMONIC_REGISTER_COUNT] = {0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02};
192192
const uint32_t SensorRegisters[SENSOR_REGISTER_COUNT] = {0x03, 0x05, 0x08, 0x10, 0x11, 0x12, 0x13,
193193
0x18, 0x1D, 0x1E, 0x20, 0x23, 0x14};
194-
const uint32_t SensorPages[SENSOR_REGISTER_COUNT] = {0x00, UINT32_MAX, UINT32_MAX, 0x00, 0x00, 0x00, 0x00,
195-
0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
194+
const uint8_t SensorPages[SENSOR_REGISTER_COUNT] = {0x00, UINT8_MAX, UINT8_MAX, 0x00, 0x00, 0x00, 0x00,
195+
0x00, 0x00, 0x00, 0x00, 0x00, 0x02};
196196

197197
const uint32_t
198198
RampGeneratorDriverFeatureControlRegisters[RAMP_GENERATOR_DRIVER_FEATURE_CONTROL_REGISTER_COUNT] = {
@@ -203,13 +203,13 @@ class SCOPY_ADMT_EXPORT ADMTController : public QObject
203203
const char *getDeviceAttribute(DeviceAttribute attribute);
204204
const char *getMotorAttribute(MotorAttribute attribute);
205205
const uint32_t getConfigurationRegister(ConfigurationRegister registerID);
206-
const uint32_t getConfigurationPage(ConfigurationRegister registerID);
206+
const uint8_t getConfigurationPage(ConfigurationRegister registerID);
207207
const uint32_t getUniqueIdRegister(UniqueIDRegister registerID);
208208
const uint32_t getHarmonicRegister(HarmonicRegister registerID);
209-
const uint32_t getHarmonicPage(HarmonicRegister registerID);
210-
const uint32_t getUniqueIdPage(UniqueIDRegister registerID);
209+
const uint8_t getHarmonicPage(HarmonicRegister registerID);
210+
const uint8_t getUniqueIdPage(UniqueIDRegister registerID);
211211
const uint32_t getSensorRegister(SensorRegister registerID);
212-
const uint32_t getSensorPage(SensorRegister registerID);
212+
const uint8_t getSensorPage(SensorRegister registerID);
213213

214214
const uint32_t
215215
getRampGeneratorDriverFeatureControlRegister(RampGeneratorDriverFeatureControlRegister registerID);
@@ -240,6 +240,9 @@ class SCOPY_ADMT_EXPORT ADMTController : public QObject
240240
uint16_t setGeneralRegisterBitMapping(uint16_t currentRegisterValue, map<string, int> settings);
241241
void postcalibrate(vector<double> PANG, int cycleCount, int samplesPerCycle, bool CCW);
242242
int getAbsAngleTurnCount(uint16_t registerValue);
243+
double getAbsAngle(uint16_t registerValue);
244+
double getAngle(uint16_t registerValue);
245+
double getTemperature(uint16_t registerValue);
243246
uint16_t setDIGIOENRegisterBitMapping(uint16_t currentRegisterValue, map<string, bool> settings);
244247
uint16_t setDIGIORegisterBitMapping(uint16_t currentRegisterValue, map<string, bool> settings);
245248
void unwrapAngles(vector<double> &angles_rad);
@@ -254,7 +257,10 @@ class SCOPY_ADMT_EXPORT ADMTController : public QObject
254257
bool checkRegisterFault(uint16_t registerValue, bool isMode1);
255258
int streamIO();
256259
void bufferedStreamIO(int totalSamples, int targetSampleRate);
260+
void registryStream(int totalSamples, int targetSampleRate);
257261
bool checkVelocityReachedFlag(uint16_t registerValue);
262+
uint16_t changeCNVPage(uint16_t registerValue, uint8_t page);
263+
uint16_t convertStart(bool start, uint16_t registerValue);
258264
public Q_SLOTS:
259265
void handleStreamData(double value);
260266
void handleStreamBufferedData(const QVector<double> &value);

plugins/admt/include/admt/harmoniccalibration.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -162,8 +162,10 @@ public Q_SLOTS:
162162
acquisitionSineList, acquisitionCosineList, acquisitionRadiusList, acquisitionAngleSecList,
163163
acquisitionSecAnglIList, acquisitionSecAnglQList, graphDataList, graphPostDataList;
164164

165-
QPushButton *openLastMenuButton, *calibrationStartMotorButton, *calibrateDataButton, *extractDataButton,
166-
*clearCalibrateDataButton, *clearCommandLogButton, *applySequenceButton, *readAllRegistersButton;
165+
QPushButton *openLastMenuButton, *calibrationStartMotorButton, *calibrateDataButton, *importSamplesButton,
166+
*extractDataButton, *clearCalibrateDataButton, *clearCommandLogButton, *applySequenceButton,
167+
*readAllRegistersButton;
168+
167169
QButtonGroup *rightMenuButtonGroup;
168170

169171
QLineEdit *acquisitionMotorRPMLineEdit, *calibrationCycleCountLineEdit, *calibrationTotalSamplesLineEdit,
@@ -185,7 +187,7 @@ public Q_SLOTS:
185187
MenuSectionWidget *rightMenuSectionWidget;
186188
MenuCollapseSection *rotationCollapse, *angleCollapse, *countCollapse, *tempCollapse;
187189
MenuCombo *m_dataGraphChannelMenuCombo, *m_dataGraphDirectionMenuCombo, *m_tempGraphDirectionMenuCombo,
188-
*m_calibrationMotorRampModeMenuCombo, *sequenceTypeMenuCombo, *conversionTypeMenuCombo,
190+
*m_calibrationMotorRampModeMenuCombo, *sequenceModeMenuCombo, *conversionModeMenuCombo,
189191
*cnvSourceMenuCombo, *convertSynchronizationMenuCombo, *angleFilterMenuCombo, *eighthHarmonicMenuCombo,
190192
*calibrationModeMenuCombo;
191193

@@ -267,7 +269,9 @@ public Q_SLOTS:
267269
bool readSequence();
268270
bool writeSequence(QMap<string, int> settings);
269271
void applySequence();
270-
bool changeCNVPage(uint32_t page);
272+
bool changeCNVPage(uint8_t page);
273+
bool convertStart(bool start);
274+
bool convertRestart();
271275
void initializeMotor();
272276
void startDeviceStatusMonitor();
273277
void stopDeviceStatusMonitor();
@@ -278,7 +282,7 @@ public Q_SLOTS:
278282

279283
#pragma region Acquisition Methods
280284
bool updateChannelValues();
281-
void updateCountValue();
285+
bool updateSensorValue(ADMTController::SensorRegister sensor);
282286
void updateLineEditValues();
283287
void startAcquisition();
284288
void stopAcquisition();
@@ -293,7 +297,7 @@ public Q_SLOTS:
293297
void updateSequenceWidget();
294298
void updateCapturedDataCheckBoxes();
295299
void applySequenceAndUpdate();
296-
void updateGeneralSettingEnabled(bool value);
300+
void toggleAcquisitionControls(bool value);
297301
void connectCheckBoxToAcquisitionGraph(QCheckBox *widget, PlotChannel *channel, SensorData key);
298302
void GMRReset();
299303
#pragma endregion

plugins/admt/include/admt/widgets/registerblockwidget.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class SCOPY_ADMT_EXPORT RegisterBlockWidget : public QWidget
4747

4848
QPushButton *m_readButton, *m_writeButton;
4949

50-
RegisterBlockWidget(QString header, QString description, uint32_t address, uint32_t cnvPage,
50+
RegisterBlockWidget(QString header, QString description, uint32_t address, uint8_t cnvPage,
5151
RegisterBlockWidget::ACCESS_PERMISSION accessPermission, QWidget *parent = nullptr);
5252
virtual ~RegisterBlockWidget();
5353
QPushButton *readButton();
@@ -82,4 +82,4 @@ class SCOPY_ADMT_EXPORT PaddedSpinBox : public QSpinBox
8282
};
8383
} // namespace scopy::admt
8484

85-
#endif // REGISTERBLOCKWIDGET_H
85+
#endif // REGISTERBLOCKWIDGET_H

plugins/admt/src/admtcontroller.cpp

+102-18
Original file line numberDiff line numberDiff line change
@@ -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

120120
const 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

136136
const 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

152152
const 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

168168
const uint32_t
@@ -203,21 +203,21 @@ int ADMTController::getChannelIndex(const char *deviceName, const char *channelN
203203
double 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+
12311265
uint16_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+
18421911
void ADMTController::handleStreamBufferedData(const QVector<double> &value) { streamBufferedValues = value; }
18431912

18441913
bool 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

Comments
 (0)