Ротари -энкодер контроллер C ++ - Как бы вы это сделали?C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ротари -энкодер контроллер C ++ - Как бы вы это сделали?

Сообщение Anonymous »

Я построил контроллер с 3 вращающимися кодерами для управления различными параметрами программы, которую я написал для управления двигателем. Контроллер обеспечивает данные через USB через серийный (Arduino).
Первоначально я использовал OSC для перемещения данных в моторику, поэтому я реализовал контроллер в качестве сервера OSC и моториармограмму в качестве клиента. Но в конечном итоге мне также нужна была вторая программа (в данном случае осциллограф), которая была также контролирована вращающимися ручками, и обнаружил, что OSC может обрабатывать только одного клиента за раз.
, поэтому я установил контроллер как сервер UDP и другие программы в качестве клиентов UDP, которые работают на их собственных потоках.
, который был вполне Hazzle, но я работаю сейчас. ... всегда ищу лучшие решения ... < /p>
и.e. У меня были проблемы с обработкой входящих данных на стороне клиента, так как нет доступа к сигналу готового читателя для Datagrams в JUCE, и я не мог выяснить, как это сделать в C ++. Таким образом, в цикле while существует не очень элегантное решение, чтобы иметь возможность чистое закрытие потока при выходе ... < /p>
код сервера, написанный с помощью QT (я оставляю последовательную часть) < /p>
...
struct clientStruct {
int clientId;
QNetworkDatagram datagram;
};

std::vector clients;
...

void MainWindow::initUdpSocket()
{
udpSocket = new QUdpSocket(this);
udpSocket->bind(QHostAddress::LocalHost, 8080);

connect(udpSocket, &QUdpSocket::readyRead,
this, &MainWindow::readPendingDatagrams);
}

void MainWindow::readPendingDatagrams()
{
while (udpSocket->hasPendingDatagrams())
{
QNetworkDatagram datagram = udpSocket->receiveDatagram();
QByteArray reply = processDatagram(datagram);
udpSocket->writeDatagram(datagram.makeReply(reply));
}
}

QByteArray MainWindow::processDatagram(QNetworkDatagram datagram)
{
QString input = QString::fromStdString(datagram.data().toStdString());
QString reply;

if (input.left(8) == "register")
{
clientStruct newClient;
int id = 0;

if (clients.size() == 0)
{
id = 1;
}
else
{
id = clients.back().clientId + 1;
}

QNetworkDatagram tempDatagram = datagram;
newClient = {id, tempDatagram};
clients.push_back(newClient);
ui->clientsLabel->setText(QString::number(clients.size()));
reply = "ClientNumber: " + QString::number(id);
}

if (input.left(10) == "unregister")
{
for (int i = 0; i < clients.size(); i++)
{
if (clients.datagram.senderPort() == datagram.senderPort())
{
clients.erase(clients.begin() + i);
ui->clientsLabel->setText(QString::number(clients.size()));
}
}
statusBar()->showMessage("unregister");
}

return reply.toUtf8();
}

void MainWindow::serialDataReceived()
{
QByteArray data = serialPort->readAll();
QString value = QString::fromStdString(data.toStdString());

if (clients.size() > 0)
{
for (int i = 0; i < clients.size(); i++)
{
udpSocket->writeDatagram(clients.datagram.makeReply(value.toUtf8()));
}
}
data.clear();
}
< /code>
Клиентский код, написанный с Juce < /p>
class UdpThread : public juce::Thread, public juce::ChangeBroadcaster
{

#define PORT 8080
#define MAXLINE 16
#define MSG_CONFIRM 0

public:
UdpThread ()
: Thread ("Udp Thread")
{
if ( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 ) {
perror("socket creation failed");
exit(EXIT_FAILURE);
}

memset(&servaddr, 0, sizeof(servaddr));

servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(PORT);
servaddr.sin_addr.s_addr = INADDR_ANY;

sendto(sockfd, (const char *)hello, strlen(hello),
MSG_CONFIRM, (const struct sockaddr *) &servaddr,
sizeof(servaddr));

startThread();
}

~UdpThread() override
{
stopThread (2000);
}

void run() override
{
while (! threadShouldExit())
{
wait (100);

memset(buffer, 0, 16);

recv(sockfd, buffer, sizeof(buffer), MSG_DONTWAIT);

rotaryValue = std::atoi(buffer);

if (rotaryValue != 0)
{
sendChangeMessage();
}
}
sendto(sockfd, (const char *)"unregister", 10,
MSG_CONFIRM, (const struct sockaddr *) &servaddr,
sizeof(servaddr));
close(sockfd);
}

int getRotaryValue()
{
return rotaryValue;
}


Подробнее здесь: https://stackoverflow.com/questions/796 ... -you-do-it
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»