2 #include "serial_mip_device.hpp"
6 #include <mip/mip_device.hpp>
7 #include <serial/serial.h>
22 fprintf(
stderr,
"Usage: %s <port> <baudrate>\n", argv[0]);
27 int main(
int argc,
const char* argv[])
33 printf(
"Available serial ports:\n");
34 std::vector<serial::PortInfo> ports = serial::list_ports();
36 for(
const serial::PortInfo&
port : ports)
38 printf(
" %s %s %s\n",
port.port.c_str(),
port.description.c_str(),
port.hardware_id.c_str());
44 baud = std::strtoul(argv[2],
nullptr, 10);
47 fprintf(
stderr,
"Error: invalid baud rate '%s'\n", argv[2]);
60 #if METHOD == 1 || METHOD == 2 || METHOD == 3
61 serial::Serial
port(argv[1], baud, serial::Timeout::simpleTimeout(10));
63 uint8_t buffer[PACKET_LENGTH_MAX];
65 mip::Packet packet(buffer,
sizeof(buffer), mip::MIP_BASE_COMMAND_DESC_SET);
71 mip::MipCmd_Base_GetDeviceInfo info;
72 size_t used = mip::insert_MipCmd_Base_GetDeviceInfo(payload, available, 0, &info);
74 mip::MipCmd_Base_GetDeviceInfo info;
75 size_t used =
mip::insert(payload, available, 0, info);
77 size_t used = mip::insert_MipCmd_Base_GetDeviceInfo_args(payload, available, 0);
81 packet.reallocLastField(payload, used);
85 printf(
"Send bytes [");
86 for(
size_t i=0; i<packet.totalLength(); i++)
87 printf(
"%02X", packet.pointer()[i]);
90 port.write(packet.pointer(), packet.totalLength());
92 size_t read =
port.read(buffer,
sizeof(buffer));
94 printf(
"Received bytes [");
95 for(
size_t i=0; i<read; i++)
96 printf(
"%02X", buffer[i]);
101 MipDevice
device(argv[1], baud);
104 mip::C::MipPendingCmd
cmd;
106 mip::C::MipCmdQueue_enqueue(
device.cmdQueue(), &
cmd);
108 uint8_t packetBuffer[PACKET_LENGTH_MAX];
110 mip::Packet packet(packetBuffer,
sizeof(packetBuffer), mip::MIP_BASE_COMMAND_DESC_SET);
115 device.sendToDevice(packet);
117 mip::CmdResult result =
device.waitForReply(
cmd);
124 const size_t responseSize = mip::C::MipPendingCmd_responseLength(&
cmd);
125 printf(
"Success: command completed with ACK: responseLength=%ld\n", responseSize);
127 mip::MipCmd_Base_GetDeviceInfo_Response
response;
128 size_t used = mip::extract_MipCmd_Base_GetDeviceInfo_Response(mip::C::MipPendingCmd_response(&
cmd), responseSize, 0, &
response);
129 if( used == responseSize )
131 auto print_info = [](
const char* name,
const char info[16])
134 std::strncpy(
msg, info, 16);
135 printf(
" %s%s\n", name,
msg);
138 print_info(
"Model name: ",
response.device_info.model_name);
139 print_info(
"Model number: ",
response.device_info.model_number);
140 print_info(
"Serial Number: ",
response.device_info.serial_number);
141 print_info(
"Device Options: ",
response.device_info.device_options);
142 print_info(
"Lot Number: ",
response.device_info.lot_number);
144 printf(
" Firmware version: %d.%d.%d\n\n",
145 (
response.device_info.firmware_version / 1000),
146 (
response.device_info.firmware_version / 100) % 10,
147 (
response.device_info.firmware_version / 1) % 100
152 printf(
"Error: response size does not match expected (at least %ld bytes)\n", used);
157 printf(
"Error: command completed with NACK: %s (%d)\n", mip::MipCmdResult_toString(result), result);
160 MipDevice
device(argv[1], baud);
162 mip::MipCmd_Base_GetDeviceInfo
cmd;
163 mip::MipCmd_Base_GetDeviceInfo_Response
response;
166 mip::CmdResult result = exec_MipCmd_Base_GetDeviceInfo(&
device, &
cmd, &
response);
172 mip::DeviceInterface* device2 = &
device;
173 mip::C::MipInterfaceState* device3 = device2;
174 mip::MipInterfaceState* device4 = device3;
175 static_assert(std::is_same<mip::MipInterfaceState, mip::C::MipInterfaceState>::value,
"Not the same");
176 mip::CmdResult result = mip::get_device_information(device4, &
response.device_info);
181 printf(
"Success:\n");
183 auto print_info = [](
const char* name,
const char info[16])
186 std::strncpy(
msg, info, 16);
187 printf(
" %s%s\n", name,
msg);
190 print_info(
"Model name: ",
response.device_info.model_name);
191 print_info(
"Model number: ",
response.device_info.model_number);
192 print_info(
"Serial Number: ",
response.device_info.serial_number);
193 print_info(
"Device Options: ",
response.device_info.device_options);
194 print_info(
"Lot Number: ",
response.device_info.lot_number);
196 printf(
" Firmware version: %d.%d.%d\n\n",
197 (
response.device_info.firmware_version / 1000),
198 (
response.device_info.firmware_version / 100) % 10,
199 (
response.device_info.firmware_version / 1) % 100
204 printf(
"Error: command completed with NACK: %s (%d)\n", mip::MipCmdResult_toString(result), result);
209 catch(
const std::exception& ex)
211 fprintf(
stderr,
"Could not open serial port: %s", ex.what());