Skip to content

Commit 255c085

Browse files
incebellipipopatrickelectric
authored andcommitted
Add ping360 device generation
Co-authored-by: Patrick José Pereira <[email protected]>"
1 parent ba0f0bd commit 255c085

File tree

6 files changed

+161
-1
lines changed

6 files changed

+161
-1
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@
22
**/ping-message-*.h
33
build
44
src/device/ping-device-ping1d.*
5+
src/device/ping-device-ping360.*

src/device/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ add_custom_target(generate-devices
66
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/../generate/generate-device.py --output-dir ${CMAKE_CURRENT_SOURCE_DIR}
77
COMMENT "Generates ping device class."
88
BYPRODUCTS
9+
${CMAKE_CURRENT_SOURCE_DIR}/ping-device-ping360.cpp
910
${CMAKE_CURRENT_SOURCE_DIR}/ping-device-ping1d.cpp
1011
)
1112

1213
add_library(
1314
DEVICE
1415
STATIC
1516
ping-device-ping1d.cpp
17+
ping-device-ping360.cpp
1618
ping-device.cpp
1719
)
1820

src/generate/generate-device.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,3 +32,11 @@
3232
f = open("%s/ping-device-ping1d.cpp" % args.output_directory, "w")
3333
f.write(g.generate("%s/ping1d.json" % definitionPath, "%s/ping-device-ping1d.cpp.in" % templatePath))
3434
f.close()
35+
36+
f = open("%s/ping-device-ping360.h" % args.output_directory, "w")
37+
f.write(g.generate("%s/ping360.json" % definitionPath, "%s/ping-device-ping360.h.in" % templatePath))
38+
f.close()
39+
40+
f = open("%s/ping-device-ping360.cpp" % args.output_directory, "w")
41+
f.write(g.generate("%s/ping360.json" % definitionPath, "%s/ping-device-ping360.cpp.in" % templatePath))
42+
f.close()
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
#include <ping-message-common.h>
2+
#include "ping-message-ping360.h"
3+
#include "ping-device-ping360.h"
4+
5+
Ping360::~Ping360()
6+
{
7+
{% for msg in messages["get"]|sort %}
8+
{% for field in messages["get"][msg].payload %}
9+
{% if generator.is_vector(field.type) %}
10+
if ({{msg}}_data.{{field.name}}) {
11+
delete[] {{msg}}_data.{{field.name}};
12+
}
13+
{% endif %}
14+
{% endfor %}
15+
{% endfor %}
16+
}
17+
18+
bool Ping360::initialize()
19+
{
20+
if (!PingDevice::initialize()) {
21+
return false;
22+
}
23+
24+
return true;
25+
}
26+
27+
void Ping360::_handleMessage(const ping_message* message)
28+
{
29+
switch (message->message_id()) {
30+
{% for msg in messages["get"]|sort %}
31+
{% if not messages["get"][msg].deprecated %}
32+
case Ping360Id::{{msg|upper}}:
33+
{
34+
const ping360_{{msg}}* message_{{msg}} = static_cast<const ping360_{{msg}}*>(message);
35+
{% for field in messages["get"][msg].payload %}
36+
{% if generator.is_vector(field.type) %}
37+
if (message_{{msg}}->{{field.name}}_length() > {{msg}}_data.{{field.name}}_length) {
38+
if ({{msg}}_data.{{field.name}}) {
39+
delete[] {{msg}}_data.{{field.name}};
40+
}
41+
{{msg}}_data.{{field.name}} = new {{generator.get_type_string(field.vector.datatype)}}[message_{{msg}}->{{field.name}}_length()];
42+
}
43+
44+
{{msg}}_data.{{field.name}}_length = message_{{msg}}->{{field.name}}_length();
45+
memcpy({{msg}}_data.{{field.name}}, message_{{msg}}->{{field.name}}(), message_{{msg}}->{{field.name}}_length());
46+
{% else %}
47+
{{msg}}_data.{{field.name}} = message_{{msg}}->{{field.name}}();
48+
{% endif %}
49+
{% endfor %}
50+
}
51+
break;
52+
{% endif %}
53+
{% endfor %}
54+
55+
default:
56+
break;
57+
}
58+
59+
PingDevice::_handleMessage(message);
60+
}
61+
62+
63+
{% for msg in messages["control"]|sort %}
64+
void Ping360::set_{{msg}}({% for field in messages["control"][msg].payload %}{{generator.get_type_string(field.type)}} _{{field.name}}{{ ", " if not loop.last else "" }}{% endfor %})
65+
{
66+
ping360_{{msg}} message;
67+
{% for field in messages["control"][msg].payload %}
68+
message.set_{{field.name}}(_{{field.name}});
69+
{% endfor %}
70+
writeMessage(message);
71+
}
72+
73+
{% endfor %}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* A device API for the Blue Robotics Ping Echosounder
3+
*
4+
*~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!
5+
* THIS IS AN AUTOGENERATED FILE
6+
* DO NOT EDIT
7+
*~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!~!
8+
*
9+
*/
10+
11+
#pragma once
12+
13+
#include "ping-device.h"
14+
15+
class Ping360 : public PingDevice
16+
{
17+
public:
18+
/**
19+
* @brief Constructor
20+
*
21+
* @param ser: The device I/O
22+
*/
23+
Ping360(PingPort& port) : PingDevice(port) {}
24+
25+
/**
26+
* @brief Destructor
27+
*/
28+
~Ping360();
29+
30+
/**
31+
* @brief Establish communications with the device, and initialize the update interval
32+
*
33+
* @param pingIntervalMs: The interval (in milliseconds) between acoustic measurements
34+
*
35+
* @return true if the device was initialized successfully
36+
*/
37+
bool initialize();
38+
39+
{% for msg in messages["control"] %}
40+
/**
41+
* @brief {{messages["control"][msg].description}}
42+
*
43+
{% for field in messages["control"][msg].payload %}
44+
* @param {{field.name}} - {% if field.units %}Units: {{field.units}}; {% endif %}{{field.description}}
45+
{% endfor %}
46+
*/
47+
void set_{{msg}}({% for field in messages["control"][msg].payload %}{{generator.get_type_string(field.type)}} {{field.name}}{{ ", " if not loop.last else "" }}{% endfor %});
48+
49+
{% endfor %}
50+
51+
{% for msg in messages["get"]|sort %}
52+
{% if not messages["get"][msg].deprecated %}
53+
//! {{messages["get"][msg].description}}
54+
struct {
55+
{% for field in messages["get"][msg].payload %}
56+
// {{field.description}}
57+
{% if not generator.is_vector(field.type) %}
58+
{{generator.get_type_string(field.type)}} {{field.name}};
59+
{% else %}
60+
{{generator.get_type_string(field.vector.datatype)}}* {{field.name}} = nullptr;
61+
{{generator.get_type_string(field.vector.sizetype)}} {{field.name}}_length = 0;
62+
{% endif %}
63+
{% endfor %}
64+
} {{msg}}_data;
65+
66+
{% endif %}
67+
{% endfor %}
68+
69+
private:
70+
/**
71+
* @brief Handle an incoming message from the device. Internal values are updated according to the device data.
72+
*
73+
* @param message: A pointer to the message received from the device
74+
*/
75+
void _handleMessage(const ping_message* message) override;
76+
};

0 commit comments

Comments
 (0)