Skip to content

Commit 27610a0

Browse files
Merge pull request #51 from romankurbatov/encodersInDegrees
Encoders in degrees
2 parents e7edf33 + dde1176 commit 27610a0

File tree

7 files changed

+76
-12
lines changed

7 files changed

+76
-12
lines changed

trikControl/config.xml

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,9 +145,9 @@ Use it if JCx ports are configured to work as PWM signal generators.
145145
<!-- Encoders configuration, maps logical port to I2C command.
146146
I2C device path and device id are set separately, in "i2c" section. -->
147147
<encoders>
148-
<encoder port="B2" i2cCommandNumber="0x31" />
149-
<encoder port="B4" i2cCommandNumber="0x32" />
150-
<encoder port="B3" i2cCommandNumber="0x33" />
148+
<encoder port="B2" i2cCommandNumber="0x31" defaultType="defaultEncoder"/>
149+
<encoder port="B4" i2cCommandNumber="0x32" defaultType="defaultEncoder"/>
150+
<encoder port="B3" i2cCommandNumber="0x33" defaultType="defaultEncoder"/>
151151
</encoders>
152152

153153
<!-- Description of servo motor types used in servo motors mapping. Supplied values correspond to
@@ -182,6 +182,11 @@ Use it if JCx ports are configured to work as PWM signal generators.
182182
<volumeSensor min="0" max="100"/>
183183
</digitalSensorTypes>
184184

185+
<!-- Description of encoder types. Provides a coefficient for converting raw encoder values to degrees. -->
186+
<encoderTypes>
187+
<defaultEncoder rawToDegrees="0.02304708" />
188+
</encoderTypes>
189+
185190
<!-- Format for playSound command, used to play .wav files. %1 designates file name to be played. -->
186191
<playWavFile command="aplay --quiet &quot;%1&quot; &amp;" />
187192

trikControl/config_capture.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,11 @@ Use it if JCx ports are configured to work as PWM signal capture devices.
182182
<volumeSensor min="0" max="100"/>
183183
</digitalSensorTypes>
184184

185+
<!-- Description of encoder types. Provides a coefficient for converting raw encoder values to degrees. -->
186+
<encoderTypes>
187+
<defaultEncoder rawToDegrees="0.02304708" />
188+
</encoderTypes>
189+
185190
<!-- Format for playSound command, used to play .wav files. %1 designates file name to be played. -->
186191
<playWavFile command="aplay --quiet &quot;%1&quot; &amp;" />
187192

trikControl/include/trikControl/encoder.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,18 +31,20 @@ class TRIKCONTROL_EXPORT Encoder : public QObject
3131
/// Constructor.
3232
/// @param communicator - I2C communicator.
3333
/// @param i2cCommandNumber - number of I2C command to query this encoder.
34-
Encoder(I2cCommunicator &communicator, int i2cCommandNumber);
34+
/// @param rawToDegrees - coefficient for converting raw encoder readings to degrees.
35+
Encoder(I2cCommunicator &communicator, int i2cCommandNumber, double rawToDegrees);
3536

3637
public slots:
37-
/// Returns current encoder reading.
38-
float read();
38+
/// Returns current encoder reading (in degrees).
39+
int read();
3940

4041
/// Resets encoder by setting current reading to 0.
4142
void reset();
4243

4344
private:
4445
I2cCommunicator &mCommunicator;
4546
int mI2cCommandNumber;
47+
double mRawToDegrees;
4648
};
4749

4850
}

trikControl/src/brick.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,12 @@ Brick::Brick(QThread &guiThread, QString const &configFilePath, const QString &s
119119
}
120120

121121
for (QString const &port : mConfigurer->encoderPorts()) {
122-
Encoder *encoder = new Encoder(*mI2cCommunicator, mConfigurer->encoderI2cCommandNumber(port));
122+
QString const encoderType = mConfigurer->encoderDefaultType(port);
123+
124+
Encoder *encoder = new Encoder(
125+
*mI2cCommunicator
126+
, mConfigurer->encoderI2cCommandNumber(port)
127+
, mConfigurer->encoderTypeRawToDegrees(encoderType));
123128
mEncoders.insert(port, encoder);
124129
}
125130

trikControl/src/configurer.cpp

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ Configurer::Configurer(QString const &configFilePath)
5252
loadServoMotorTypes(root);
5353
loadAnalogSensorTypes(root);
5454
loadDigitalSensorTypes(root);
55+
loadEncoderTypes(root);
5556
loadSound(root);
5657

5758
mAccelerometer = loadSensor3d(root, "accelerometer");
@@ -141,6 +142,11 @@ int Configurer::digitalSensorTypeMax(QString const &digitalSensorType) const
141142
return mDigitalSensorTypes[digitalSensorType].max;
142143
}
143144

145+
double Configurer::encoderTypeRawToDegrees(QString const &encoderType) const
146+
{
147+
return mEncoderTypes[encoderType].rawToDegrees;
148+
}
149+
144150
QStringList Configurer::servoMotorPorts() const
145151
{
146152
return mServoMotorMappings.keys();
@@ -226,6 +232,11 @@ int Configurer::encoderI2cCommandNumber(QString const &port) const
226232
return mEncoderMappings[port].i2cCommandNumber;
227233
}
228234

235+
QString Configurer::encoderDefaultType(QString const &port) const
236+
{
237+
return mEncoderMappings[port].defaultType;
238+
}
239+
229240
QStringList Configurer::digitalSensorPorts() const
230241
{
231242
return mDigitalSensorMappings.keys();
@@ -579,6 +590,7 @@ void Configurer::loadEncoders(QDomElement const &root)
579590
EncoderMapping mapping;
580591
mapping.port = childElement.attribute("port");
581592
mapping.i2cCommandNumber = childElement.attribute("i2cCommandNumber").toInt(NULL, 0);
593+
mapping.defaultType = childElement.attribute("defaultType");
582594

583595
mEncoderMappings.insert(mapping.port, mapping);
584596
}
@@ -700,6 +712,31 @@ void Configurer::loadDigitalSensorTypes(QDomElement const &root)
700712
}
701713
}
702714

715+
void Configurer::loadEncoderTypes(const QDomElement &root)
716+
{
717+
if (root.elementsByTagName("encoderTypes").isEmpty()) {
718+
qDebug() << "config.xml does not have <encoderTypes> tag";
719+
throw "config.xml parsing failed";
720+
}
721+
722+
QDomElement const encoderTypes = root.elementsByTagName("encoderTypes").at(0).toElement();
723+
for (QDomNode child = encoderTypes.firstChild()
724+
; !child.isNull()
725+
; child = child.nextSibling())
726+
{
727+
if (!child.isElement()) {
728+
continue;
729+
}
730+
731+
QDomElement const childElement = child.toElement();
732+
QString const typeName = childElement.nodeName();
733+
734+
EncoderType encoderType;
735+
encoderType.rawToDegrees = childElement.attribute("rawToDegrees").toDouble();
736+
mEncoderTypes.insert(typeName, encoderType);
737+
}
738+
}
739+
703740
void Configurer::loadSound(QDomElement const &root)
704741
{
705742
if (root.elementsByTagName("playWavFile").isEmpty()) {

trikControl/src/configurer.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ class Configurer {
6969

7070
int digitalSensorTypeMax(QString const &digitalSensorType) const;
7171

72+
double encoderTypeRawToDegrees(QString const &encoderType) const;
73+
7274
QStringList servoMotorPorts() const;
7375

7476
QString servoMotorDeviceFile(QString const &port) const;
@@ -103,6 +105,8 @@ class Configurer {
103105

104106
int encoderI2cCommandNumber(QString const &port) const;
105107

108+
QString encoderDefaultType(QString const &port) const;
109+
106110
QStringList digitalSensorPorts() const;
107111

108112
QString digitalSensorDeviceFile(QString const &port) const;
@@ -205,6 +209,10 @@ class Configurer {
205209
int max;
206210
};
207211

212+
struct EncoderType {
213+
double rawToDegrees;
214+
};
215+
208216
struct ServoMotorMapping {
209217
QString port;
210218
QString deviceFile;
@@ -235,6 +243,7 @@ class Configurer {
235243
struct EncoderMapping {
236244
QString port;
237245
int i2cCommandNumber;
246+
QString defaultType;
238247
};
239248

240249
struct DigitalSensorMapping {
@@ -268,6 +277,7 @@ class Configurer {
268277
void loadServoMotorTypes(QDomElement const &root);
269278
void loadAnalogSensorTypes(QDomElement const &root);
270279
void loadDigitalSensorTypes(QDomElement const &root);
280+
void loadEncoderTypes(QDomElement const &root);
271281
void loadSound(QDomElement const &root);
272282
static OnBoardSensor loadSensor3d(QDomElement const &root, QString const &tagName);
273283
void loadI2c(QDomElement const &root);
@@ -281,6 +291,7 @@ class Configurer {
281291
QHash<QString, ServoMotorType> mServoMotorTypes;
282292
QHash<QString, AnalogSensorType> mAnalogSensorTypes;
283293
QHash<QString, DigitalSensorType> mDigitalSensorTypes;
294+
QHash<QString, EncoderType> mEncoderTypes;
284295
QHash<QString, ServoMotorMapping> mServoMotorMappings;
285296
QHash<QString, PwmCaptureMapping> mPwmCaptureMappings;
286297
QHash<QString, PowerMotorMapping> mPowerMotorMappings;

trikControl/src/encoder.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,12 @@
1616

1717
#include "src/i2cCommunicator.h"
1818

19-
float const parToRad = 0.03272492;
20-
2119
using namespace trikControl;
2220

23-
Encoder::Encoder(I2cCommunicator &communicator, int i2cCommandNumber)
21+
Encoder::Encoder(I2cCommunicator &communicator, int i2cCommandNumber, double rawToDegrees)
2422
: mCommunicator(communicator)
2523
, mI2cCommandNumber(i2cCommandNumber)
24+
, mRawToDegrees(rawToDegrees)
2625
{
2726
}
2827

@@ -35,11 +34,11 @@ void Encoder::reset()
3534
mCommunicator.send(command);
3635
}
3736

38-
float Encoder::read()
37+
int Encoder::read()
3938
{
4039
QByteArray command(2, '\0');
4140
command[0] = static_cast<char>(mI2cCommandNumber);
4241
int data = mCommunicator.read(command);
4342

44-
return parToRad * data;
43+
return mRawToDegrees * data;
4544
}

0 commit comments

Comments
 (0)