Skip to content

Commit

Permalink
Add basic PWM capture support (#731)
Browse files Browse the repository at this point in the history
* Expose pwmCaptureInterface to script runner
* Update paths for pwmCapture in system-config.xml
* Add ConfigurerHelper::configureLong method
* Update pwmCapture interface and implementation
* Add testing GUI for PWM Capture
  • Loading branch information
WoWaster committed Oct 20, 2023
1 parent dae4a0e commit a983be0
Show file tree
Hide file tree
Showing 15 changed files with 281 additions and 41 deletions.
34 changes: 20 additions & 14 deletions translations/fr/trikGui_fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -414,48 +414,54 @@
</message>
<message>
<location line="+19"/>
<location line="+81"/>
<location line="+84"/>
<source>Analog sensors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-76"/>
<location line="+83"/>
<location line="-82"/>
<location line="+89"/>
<source>PWM Capture</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-83"/>
<location line="+90"/>
<source>Digital sensors</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-81"/>
<location line="+88"/>
<location line="-88"/>
<location line="+95"/>
<source>Encoders</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-86"/>
<location line="+93"/>
<location line="-93"/>
<location line="+100"/>
<source>Gyroscope</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-91"/>
<location line="+96"/>
<location line="-98"/>
<location line="+103"/>
<source>Accelerometer</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-94"/>
<location line="+99"/>
<location line="-101"/>
<location line="+106"/>
<source>Camera</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-127"/>
<location line="+64"/>
<location line="-137"/>
<location line="+67"/>
<source>Testing</source>
<translation type="unfinished"></translation>
</message>
<message>
<location line="-53"/>
<location line="-56"/>
<source>More...</source>
<translation type="unfinished"></translation>
</message>
Expand Down
32 changes: 19 additions & 13 deletions translations/ru/trikGui_ru.ts
Original file line number Diff line number Diff line change
Expand Up @@ -472,48 +472,54 @@
</message>
<message>
<location line="+4"/>
<location line="+64"/>
<location line="+67"/>
<source>Testing</source>
<translation>Тестирование</translation>
</message>
<message>
<location line="-53"/>
<location line="-56"/>
<source>More...</source>
<translation>Еще...</translation>
</message>
<message>
<location line="+4"/>
<location line="+81"/>
<location line="+84"/>
<source>Analog sensors</source>
<translation>Аналоговые датчики</translation>
</message>
<message>
<location line="-76"/>
<location line="+83"/>
<location line="-82"/>
<location line="+89"/>
<source>PWM Capture</source>
<translation>ШИМ захват</translation>
</message>
<message>
<location line="-83"/>
<location line="+90"/>
<source>Digital sensors</source>
<translation>Цифровые датчики</translation>
</message>
<message>
<location line="-81"/>
<location line="+88"/>
<location line="-88"/>
<location line="+95"/>
<source>Encoders</source>
<translation>Энкодеры</translation>
</message>
<message>
<location line="-86"/>
<location line="+93"/>
<location line="-93"/>
<location line="+100"/>
<source>Gyroscope</source>
<translation>Гироскоп</translation>
</message>
<message>
<location line="-91"/>
<location line="+96"/>
<location line="-98"/>
<location line="+103"/>
<source>Accelerometer</source>
<translation>Акселерометр</translation>
</message>
<message>
<location line="-94"/>
<location line="+99"/>
<location line="-101"/>
<location line="+106"/>
<source>Camera</source>
<translation>Камера</translation>
</message>
Expand Down
12 changes: 6 additions & 6 deletions trikControl/configs/kernel-3.6/system-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -113,18 +113,18 @@ equal to its class name.
/>
<pwmCapture
port="S1"
frequencyFile="/sys/class/pwm/ecap_cap.2/freq"
dutyFile="/sys/class/pwm/ecap_cap.2/duty_percentage"
frequencyFile="/sys/class/pwm/ecap_cap.2/period_freq"
dutyFile="/sys/class/pwm/ecap_cap.2/duty_ns"
/>
<pwmCapture
port="S2"
frequencyFile="/sys/class/pwm/ecap_cap.1/freq"
dutyFile="/sys/class/pwm/ecap_cap.1/duty_percentage"
frequencyFile="/sys/class/pwm/ecap_cap.1/period_freq"
dutyFile="/sys/class/pwm/ecap_cap.1/duty_ns"
/>
<pwmCapture
port="S3"
frequencyFile="/sys/class/pwm/ecap_cap.0/freq"
dutyFile="/sys/class/pwm/ecap_cap.0/duty_percentage"
frequencyFile="/sys/class/pwm/ecap_cap.0/period_freq"
dutyFile="/sys/class/pwm/ecap_cap.0/duty_ns"
/>
<powerMotor port="M1" i2cCommandNumber="0x14" invert="true" />
<powerMotor port="M2" i2cCommandNumber="0x15" />
Expand Down
14 changes: 12 additions & 2 deletions trikControl/include/trikControl/pwmCaptureInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,22 @@ class TRIKCONTROL_EXPORT PwmCaptureInterface : public QObject, public DeviceInte
{
Q_OBJECT

public:
/// Gets minimal possible value for PWM capture reading received by duty() slot.
virtual long minValue() const = 0;

/// Gets maximal possible value for PWM capture reading received by duty() slot.
virtual long maxValue() const = 0;

public slots:
/// Returns three readings of PWM signal frequency.
virtual QVector<int> frequency() = 0;

/// Returns PWM signal duty.
virtual int duty() = 0;
/// Returns scaled PWM signal duty.
virtual long duty() = 0;

/// Returns raw PWM signal duty.
virtual long dutyRaw() = 0;
};

}
Expand Down
20 changes: 20 additions & 0 deletions trikControl/src/configurerHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,26 @@ int ConfigurerHelper::configureInt(const trikKernel::Configurer &configurer, Dev
}
}

long ConfigurerHelper::configureLong(const trikKernel::Configurer &configurer, DeviceState &state, const QString &port
, const QString &parameterName)
{
try {
bool ok = false;
long parameter = configurer.attributeByPort(port, parameterName).toLong(&ok, 0);
if (!ok) {
QLOG_ERROR() << QString(R"(Incorrect configuration for parameter "%1" for port "%2": "%3" )")
.arg(parameterName).arg(port).arg(configurer.attributeByPort(port, parameterName));
state.fail();
return 0;
}

return parameter;
} catch (trikKernel::MalformedConfigException &) {
state.fail();
return 0;
}
}

qreal ConfigurerHelper::configureReal(const trikKernel::Configurer &configurer, DeviceState &state, const QString &port
, const QString &parameterName)
{
Expand Down
8 changes: 8 additions & 0 deletions trikControl/src/configurerHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,14 @@ class ConfigurerHelper
static int configureInt(const trikKernel::Configurer &configurer, DeviceState &state, const QString &port
, const QString &parameterName);

/// Reads long integer parameter from configurer, modifies device state. Returns 0 if parameter is incorrect.
/// @param configurer - configurer object from which parameter will be read.
/// @param state - reference to device state, will be set to "fail" if parameter can not be read correctly.
/// @param port - port of a device.
/// @param parameterName - name of a parameter to read.
static long configureLong(const trikKernel::Configurer &configurer, DeviceState &state, const QString &port
, const QString &parameterName);

/// Reads real parameter from configurer, modifies device state. Returns 0.0 if parameter is incorrect.
/// @param configurer - configurer object from which parameter will be read.
/// @param state - reference to device state, will be set to "fail" if parameter can not be read correctly.
Expand Down
46 changes: 44 additions & 2 deletions trikControl/src/pwmCapture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,14 @@

#include "pwmCapture.h"

#include <algorithm>

#include <QtCore/QByteArray>
#include <QtCore/QTextStream>

#include <trikKernel/configurer.h>
#include <trikHal/hardwareAbstractionInterface.h>
#include "configurerHelper.h"

#include <QsLog.h>

Expand All @@ -38,6 +41,21 @@ PwmCapture::PwmCapture(const QString &port, const trikKernel::Configurer &config
mState.fail();
}

mMinValue = ConfigurerHelper::configureLong(configurer, mState, port, "minValue");
mMaxValue = ConfigurerHelper::configureLong(configurer, mState, port, "maxValue");
mMinValueScaled = ConfigurerHelper::configureLong(configurer, mState, port, "minValueScaled");
mMaxValueScaled = ConfigurerHelper::configureLong(configurer, mState, port, "maxValueScaled");

if (mMinValue == mMaxValue) {
QLOG_ERROR() << "PWM Capture configuration error: minValue = maxValue!";
mState.fail();
mK = 0;
mB = 0;
} else {
mK = static_cast<qreal>(mMaxValueScaled - mMinValueScaled) / (mMaxValue - mMinValue);
mB = mMinValueScaled - mK * mMinValue;
}

mState.ready();
}

Expand All @@ -63,15 +81,39 @@ QVector<int> PwmCapture::frequency()
return data;
}

int PwmCapture::duty()
long PwmCapture::duty()
{
if (!mState.isReady()) {
return {};
}

long data = dutyRaw();

long result = std::min(mMaxValue, std::max(mMinValue, data));
result = mK * result + mB;

return result;
}

long PwmCapture::dutyRaw()
{
if (!mState.isReady()) {
return {};
}

mDutyFile->reset();
int data = 0;
long data = 0;
char c = '\0';
mDutyFile->stream() >> data >> c;
return data;
}

long PwmCapture::minValue() const
{
return mMinValueScaled;
}

long PwmCapture::maxValue() const
{
return mMaxValueScaled;
}
17 changes: 15 additions & 2 deletions trikControl/src/pwmCapture.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,17 +46,30 @@ class PwmCapture : public PwmCaptureInterface

Status status() const override;

long minValue() const override;

long maxValue() const override;

public slots:
/// Returns three readings of PWM signal frequency.
QVector<int> frequency() override;

/// Returns PWM signal duty.
int duty() override;
/// Returns scaled PWM signal duty.
long duty() override;

/// Returns raw PWM signal duty.
long dutyRaw() override;

private:
QScopedPointer<trikHal::InputDeviceFileInterface> mFrequencyFile;
QScopedPointer<trikHal::InputDeviceFileInterface> mDutyFile;
DeviceState mState;
long mMinValue;
long mMaxValue;
long mMinValueScaled;
long mMaxValueScaled;
qreal mK;
qreal mB;
};

}

0 comments on commit a983be0

Please sign in to comment.