Я построил контроллер с 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
Ротари -энкодер контроллер C ++ - Как бы вы это сделали? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение