Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 7 additions & 3 deletions trikControl/configs/kernel-4.14/model-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,13 @@ Note that device, even if listed here, may fail by itself, then it also will not
</soundSensor>
-->

<lidarPort>
<lidar file="/dev/ttyS1" />
</lidarPort>
<serialPort>
<commonSerialDevice file="/dev/ttyS1" />
</serialPort>

<!-- <usbPort>
<commonSerialDevice file="/dev/ttyUSB0" />
</usbPort>-->

<irCameraPort>
<irCamera />
Expand Down
9 changes: 6 additions & 3 deletions trikControl/configs/kernel-4.14/system-config.xml
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ equal to its class name.
<rangeSensor commonModule="hcsr04" minValue="0" maxValue="100" filter="median3" />
<digitalSensor />
<fifo />
<lidar />
<serialDevice />
<iioDevice />
<lineSensor script="/etc/init.d/line-sensor-ov7670" inputFile="/run/line-sensor.in.fifo" outputFile="/run/line-sensor.out.fifo" toleranceFactor="1.0" />
<objectSensor script="/etc/init.d/object-sensor-ov7670" inputFile="/run/object-sensor.in.fifo" outputFile="/run/object-sensor.out.fifo" toleranceFactor="1.0" />
Expand Down Expand Up @@ -177,7 +177,8 @@ equal to its class name.
<fifo port="soundSensor" file="/home/root/trik/soundSensor.fifo" />
<iioDevice port="boardAccelPort" />
<iioDevice port="boardGyroPort" />
<lidar port="lidarPort" file="/dev/ttyUSB0" />
<serialDevice port="serialPort"/>
<serialDevice port="usbPort"/>
<irCamera port="irCameraPort" i2cAddress="0x33" m="3" n="3" />
</devicePorts>

Expand Down Expand Up @@ -225,7 +226,9 @@ equal to its class name.

<accelerometer class="iioDevice" deviceFile="/dev/iio:device0" scanType="be:s14/16>>2"/>
<gyroscope class="iioDevice" deviceFile="/dev/iio:device1" scanType="le:s16/16>>0" modelNameFile="/sys/bus/iio/devices/iio:device1/name"/>
</deviceTypes>
<lidar class="serialDevice" />
<commonSerialDevice class="serialDevice" />
</deviceTypes>

<!-- Format for playSound command, used to play .wav files. %1 designates file name to be played. -->
<playWavFile command="aplay --quiet &quot;%1&quot; &amp;" />
Expand Down
3 changes: 3 additions & 0 deletions trikControl/include/trikControl/brickInterface.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
#include "lidarInterface.h"
#include "i2cDeviceInterface.h"
#include "irCameraInterface.h"
#include "serialDeviceInterface.h"

#include <trikControl/trikControlDeclSpec.h>

Expand Down Expand Up @@ -135,6 +136,8 @@ public Q_SLOTS:
/// Returns i2c device object
Q_INVOKABLE virtual trikControl::I2cDeviceInterface *i2c(int bus, int address, int regSize = 1) = 0;

Q_INVOKABLE virtual trikControl::SerialDeviceInterface *serialDevice(QString port) = 0;

/// Returns QVector<uin8_t> with image using camera on given port (video0 or video1).
Q_INVOKABLE virtual QVector<uint8_t> getStillImage() = 0;

Expand Down
35 changes: 35 additions & 0 deletions trikControl/include/trikControl/serialDeviceInterface.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#pragma once

#include <QtCore/QObject>
#include <QVector>
#include "deviceInterface.h"

#include <trikControl/trikControlDeclSpec.h>

namespace trikControl {

class TRIKCONTROL_EXPORT SerialDeviceInterface : public QObject, public DeviceInterface
{
Q_OBJECT

public :
virtual int writeByte(const char byte) = 0;
virtual int writeArray(const QByteArray data) = 0;
virtual QByteArray read(const int maxLen) = 0;
virtual int read(char *data, int maxLen) = 0;
virtual int readByte() = 0;
virtual QByteArray readAll() = 0;
virtual void begin(int baud) = 0;
virtual int available() = 0;
virtual bool atEnd() = 0;
virtual void init() = 0;
virtual void enableConnect() = 0;

Q_SIGNALS:
void newData();

Check notice on line 30 in trikControl/include/trikControl/serialDeviceInterface.h

View check run for this annotation

codefactor.io / CodeFactor

trikControl/include/trikControl/serialDeviceInterface.h#L30

Redundant blank line at the end of a code block should be deleted. (whitespace/blank_line)
};

}

Q_DECLARE_METATYPE(trikControl::SerialDeviceInterface *)
20 changes: 18 additions & 2 deletions trikControl/src/brick.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@
#include "mspI2cCommunicator.h"
#include "lidar.h"
#include "irCamera.h"
#include "serialDeviceInterface.h"
#include "serialDevice.h"

#include "mspBusAutoDetector.h"
#include "moduleLoader.h"
Expand Down Expand Up @@ -460,6 +462,15 @@ I2cDeviceInterface *Brick::smBusI2c(int bus, int address)
[this](){ return mHardwareAbstraction->createMspI2c();});
}

SerialDeviceInterface *Brick::serialDevice(QString port)
{
if (mSerialDevices.contains(port)) {
return mSerialDevices[port];
} else {
return nullptr;
}
}

QVector<uint8_t> Brick::getStillImage()
{
if (!mCamera)
Expand Down Expand Up @@ -625,8 +636,13 @@ void Brick::createDevice(const QString &port)
connect(mSoundSensors[port], &SoundSensor::stopped, this, &Brick::stopped);
} else if (deviceClass == "fifo") {
mFifos.insert(port, new Fifo(port, mConfigurer, *mHardwareAbstraction));
} else if (deviceClass == "lidar") {
mLidars.insert(port, new Lidar(port, mConfigurer, *mHardwareAbstraction));
} else if (deviceClass == "serialDevice") {
const auto &deviceType = mConfigurer.deviceType(port);
if (deviceType == "lidar") {
mLidars.insert(port, new Lidar(new SerialDevice(port, mConfigurer), *mHardwareAbstraction));
} else if (deviceType == "commonSerialDevice") {
mSerialDevices.insert(port, new SerialDevice(port, mConfigurer));
}
} else if (deviceClass == "camera") {
QScopedPointer<CameraDeviceInterface> tmp (
new CameraDevice(port, mMediaPath, mConfigurer, *mHardwareAbstraction)
Expand Down
3 changes: 3 additions & 0 deletions trikControl/src/brick.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,8 @@ public Q_SLOTS:

I2cDeviceInterface *smBusI2c(int bus, int address) override;

SerialDeviceInterface *serialDevice(QString port) override;

QVector<uint8_t> getStillImage() override;

SoundSensorInterface *soundSensor(const QString &port) override;
Expand Down Expand Up @@ -202,6 +204,7 @@ public Q_SLOTS:
QHash<QString, Fifo *> mFifos; // Has ownership.
QHash<QString, EventDeviceInterface *> mEventDevices; // Has ownership.
QHash<uint16_t, I2cDeviceInterface *> mI2cDevices; // Has ownership.
QHash<QString, SerialDeviceInterface *> mSerialDevices; // Has ownership.

QString mPlayWavFileCommand;
QString mPlayMp3FileCommand;
Expand Down
6 changes: 2 additions & 4 deletions trikControl/src/lidar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,11 @@

#include "lidar.h"

#include <trikKernel/configurer.h>

using namespace trikControl;

Lidar::Lidar(const QString &port, const trikKernel::Configurer &configurer
Lidar::Lidar(SerialDeviceInterface *serialDevice
, trikHal::HardwareAbstractionInterface &hardwareAbstraction)
: mLidarWorker(new LidarWorker(configurer.attributeByPort(port, "file"), hardwareAbstraction))
: mLidarWorker(new LidarWorker(serialDevice, hardwareAbstraction))
{
mLidarWorker->moveToThread(&mWorkerThread);

Expand Down
3 changes: 2 additions & 1 deletion trikControl/src/lidar.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "lidarWorker.h"

#include <trikControl/trikControlDeclSpec.h>
#include "serialDeviceInterface.h"

namespace trikKernel {
class Configurer;
Expand All @@ -42,7 +43,7 @@ class Lidar : public LidarInterface
/// Constructor.
/// @param port - port on which this sensor is configured.
/// @param configurer - configurer object containing preparsed XML files with lidar parameters.
Lidar(const QString &port, const trikKernel::Configurer &configurer
Lidar(SerialDeviceInterface *serialDevice
, trikHal::HardwareAbstractionInterface &hardwareAbstraction);
~Lidar() override;

Expand Down
47 changes: 9 additions & 38 deletions trikControl/src/lidarWorker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,12 +51,12 @@ static uint16_t get_unaligned_be16(const void *p) {
return (((uint16_t)data[0]) << 8) + data[1];
}

trikControl::LidarWorker::LidarWorker(const QString &fileName
trikControl::LidarWorker::LidarWorker(SerialDeviceInterface *serialDevice
, const trikHal::HardwareAbstractionInterface &)
: mSerial(fileName)
: mSerialDevice(serialDevice)
, mLidarChunk(new uint8_t[LIDAR_DATA_CHUNK_SIZE])
, mResult(ANGLES_RAW_NUMBER, 0)
, mState("Lidar on " + fileName)
, mState("Lidar on ")
{
mState.start();
mWaitForInit.acquire(1);
Expand All @@ -73,41 +73,12 @@ LidarWorker::Status LidarWorker::status() const

void LidarWorker::init()
{
// TODO: refactor TRIK system config
// quick-and-dirty hack to avoid serial port misuse
if (mSerial.portName() == "ttyS1" ||
mSerial.portName() == "/dev/ttyS1") {
QFile consoleConfig("/etc/default/ttyS1");
if (consoleConfig.open(QIODevice::ReadOnly)) {
QTextStream in(&consoleConfig);
QString line = in.readLine();
if (line != "LINE_PROTOCOL=lidar" &&
line != "LINE_PROTOCOL=nothing") {
QLOG_ERROR() << "Lidar: the serial port ttyS1 is not designated for lidar";
mState.fail();
mWaitForInit.release(1);
return;
}
}
}

if (!mSerial.open(QIODevice::ReadOnly)) {
QLOG_ERROR() << "Lidar: failed to open serial port " << mSerial.portName()
<< " in read-only mode: " << mSerial.error();
mState.fail();
mWaitForInit.release(1);
return;
}
mSerial.setBaudRate(230400);
mSerial.setDataBits(QSerialPort::Data8);
mSerial.setParity(QSerialPort::NoParity);
mSerial.setStopBits(QSerialPort::OneStop);
mSerial.setFlowControl(QSerialPort::NoFlowControl);
mSerialDevice->enableConnect();

connect(&mSerial, &QSerialPort::readyRead, this, &LidarWorker::readData);
connect(mSerialDevice, &SerialDeviceInterface::newData, this, &LidarWorker::readData);
mState.ready();

QLOG_INFO() << "Lidar: opened serial port" << mSerial.portName();
QLOG_INFO() << "Lidar inited";
mWaitForInit.release(1);
}

Expand Down Expand Up @@ -139,13 +110,13 @@ void LidarWorker::readData()
uint8_t bytes[256];
auto s = reinterpret_cast<struct Delta2ALayout*>(mLidarChunk.data());

while (!mSerial.atEnd()) {
while (!mSerialDevice->atEnd()) {
// read data block from serial port
auto bytesRead = mSerial.read((char *)bytes, sizeof(bytes));
auto bytesRead = mSerialDevice->read((char *)bytes, sizeof(bytes));
if (bytesRead == 0)
return;
if (bytesRead < 0) {
QLOG_ERROR() << "Lidar: read failed: " << mSerial.error() << " in " << mSerial.portName();
QLOG_ERROR() << "Lidar: read failed";
return;
}

Expand Down
6 changes: 3 additions & 3 deletions trikControl/src/lidarWorker.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "deviceState.h"

#include <trikHal/hardwareAbstractionInterface.h>
#include "serialDeviceInterface.h"

namespace trikControl {

Expand All @@ -36,7 +37,7 @@ class LidarWorker : public QObject, public DeviceInterface
/// Constructor.
/// @param fileName - name of a FIFO file.
/// @param hardwareAbstraction - interface to underlying hardware or operating system capabilities of a robot.
explicit LidarWorker(const QString &fileName, const trikHal::HardwareAbstractionInterface &hardwareAbstraction);
explicit LidarWorker(SerialDeviceInterface *serialDevice, const trikHal::HardwareAbstractionInterface &hardwareAbstraction);
~LidarWorker();

Status status() const override;
Expand All @@ -63,8 +64,7 @@ private Q_SLOTS:

bool checkChecksum(const uint8_t *data, size_t size);

/// serial port QT object
QSerialPort mSerial;
SerialDeviceInterface *mSerialDevice;

/// buffer for unparsed raw data chunks from serial port
QScopedArrayPointer<uint8_t> mLidarChunk;
Expand Down
Loading
Loading