I'm using the xrce nano client with Arduino via serial (USB serial to be exact) on an Arduino Due. I set LWIP and IPv4 options to disabled because the board does not have wifi. I am trying to use a slightly modified version of the sensor-writer-serial example below. It appears that the writer sends out only 4 messages every time I reset the board. (I only see the TX light flicker 4 times and see 4 messages in RTI Admin console, but the onboard LED that I'm using for a heartbeat keeps on going). Note that this only worked after I switched to a best effort stream_id. I have tried playing with all the delays and MTU, but it always seems to be just 4 messages. Any ideas? Appreciate any help!
/******************************************************************************
*
* (c) 2020 Copyright, Real-Time Innovations, Inc. (RTI)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
******************************************************************************/
/******************************************************************************
Start nanoagentd with the following command (change paths and other arguments
according to your environment):
nanoagentd -S -Sd /dev/ttyUSB0 -Ss 115200 -St 1000 \
-a -c nano-client-arduino/extras/sensor_agent.xml
******************************************************************************/
#include <nano_client_arduino.h>
#define SENSOR_ID 0x00000001
#define CLIENT_KEY 0x01020304
#define WRITER_ID 0x4065
#define READER_ID 0x5BB6
#define TRANSPORT_MTU 128
#define PUBLISH_DELAY 100
#define INIT_DELAY 5000
#define STREAM_ID 0x0A
#define SERIAL_SPEED 115200
XrceData transport_recv_buffer[
XRCE_TRANSPORT_RECV_BUFFER_SIZE(TRANSPORT_MTU)] = { 0 };
XrceSerialTransport transport(
transport_recv_buffer, sizeof(transport_recv_buffer));
XrceClient client(transport, CLIENT_KEY);
XrceReliableStream stream(client, STREAM_ID);
XrceDataWriter writer(client,
WRITER_ID,
XRCE_OBJECT_ID_INVALID,
NULL,
false,
STREAM_ID);
XrceDataReader reader(client, READER_ID);
struct SensorData
{
uint8_t id[4];
uint32_t value;
};
SensorData data;
/**
* Listener callback used to notify the application of
* new XRCE data received by the client.
*/
void on_data(
void *const listener,
XrceClient& client,
const XrceReceivedData& recv_data)
{
SensorData data;
const uint8_t *data_ptr = recv_data.data();
memcpy(data.id, data_ptr, sizeof(data.id));
data_ptr += sizeof(data.id);
NANO_u32_deserialize(
&data.value, data_ptr, recv_data.little_endian());
/* Do something with deserialized data */
}
void serial_init()
{
Serial.begin(SERIAL_SPEED);
while(!Serial && !Serial.available()){
delay(INIT_DELAY); // Required to wait for USB device to be ready
}
}
void setup()
{
pinMode(LED_BUILTIN, OUTPUT);
serial_init();
/* Initialize XRCE client and connect to XRCE agent */
if (!client.initialize())
{
// Failed to initialize XRCE client
while (1) {}
}
stream.enable();
while (!client.connected())
{
client.connect(INIT_DELAY);
}
/* Initialize sensor data */
data.value = 0;
/* Store sensor id as big endian */
NANO_u32_serialize(SENSOR_ID, data.id, false);
}
void loop()
{
data.value += 1;
writer.write_data((uint8_t*)&data, sizeof(data));
delay(PUBLISH_DELAY);
digitalWrite(LED_BUILTIN, HIGH);
delay(PUBLISH_DELAY);
digitalWrite(LED_BUILTIN, LOW);
}