3import "dccl/option_extensions.proto";
4import "jaiabot/messages/mission.proto";
5import "jaiabot/messages/geographic_coordinate.proto";
6import "jaiabot/messages/high_control.proto";
7import "goby/middleware/protobuf/coroner.proto";
8import "jaiabot/messages/health.proto";
9import "jaiabot/messages/imu.proto";
10import "jaiabot/messages/option_extensions.proto";
11import "jaiabot/messages/link.proto";
12import "jaiabot/messages/hub.proto";
14package jaiabot.protobuf;
19 Actual maximum size of message: 196 bytes / 1568 bits
20 dccl.id head...........................8
21 user head..............................0
22 body................................1556
23 padding to full byte...................4
24 Allowed maximum size of message: 250 bytes / 2000 bits
33 required uint32 bot_id = 1 [
34 (dccl.field) = { min: 0 max: 255 },
35 (jaia.field).rest_api.presence = OMITTED // specified in 'targets'
38 required uint64 time = 2 [
41 units { prefix: "micro" derived_dimensions: "time" }
42 precision: -6 // second precision
45 (jaia.field).rest_api.presence = OMITTED // written by API server
48 // Special case: not sent in message - written upon receipt
49 // link: which link this message traversed from hub to bot
50 optional Link link = 3 [(dccl.field).omit = true];
52 optional uint32 from_hub_id = 4 [(dccl.field) = { min: 0 max: 30 }];
57 MISSION_PLAN = 1 [(jaia.ev).rest_api.presence = GUARANTEED];
58 ACTIVATE = 2 [(jaia.ev).rest_api.presence = GUARANTEED];
59 START_MISSION = 3 [(jaia.ev).rest_api.presence = GUARANTEED];
60 MISSION_PLAN_FRAGMENT = 4;
63 NEXT_TASK = 10 [(jaia.ev).rest_api.presence = GUARANTEED];
64 RETURN_TO_HOME = 11 [(jaia.ev).rest_api.presence = GUARANTEED];
65 STOP = 12 [(jaia.ev).rest_api.presence = GUARANTEED];
66 PAUSE = 13 [(jaia.ev).rest_api.presence = GUARANTEED];
67 RESUME = 14 [(jaia.ev).rest_api.presence = GUARANTEED];
69 // during remote control mission
70 REMOTE_CONTROL_SETPOINT = 20;
71 REMOTE_CONTROL_TASK = 21;
72 REMOTE_CONTROL_RESUME_MOVEMENT = 22;
75 RECOVERED = 30 [(jaia.ev).rest_api.presence = GUARANTEED];
76 SHUTDOWN = 31 [(jaia.ev).rest_api.presence = GUARANTEED];
77 RETRY_DATA_OFFLOAD = 32;
78 DATA_OFFLOAD_COMPLETE = 33;
79 DATA_OFFLOAD_FAILED = 34;
81 // debugging low level commands
82 RESTART_ALL_SERVICES = 40;
84 SHUTDOWN_COMPUTER = 42;
87 required CommandType type = 10
88 [(jaia.field).rest_api.presence = GUARANTEED];
92 // required for type == MISSION_PLAN
93 MissionPlan plan = 20 [(jaia.field).rest_api = {
95 doc: "Used with \"command\": { \"type\" : \"MISSION_PLAN\" }"
98 // required for type == REMOTE_CONTROL_SETPOINT
99 RemoteControl rc = 30 [(jaia.field).rest_api = {
100 presence: GUARANTEED,
101 doc: "Used with \"command\": { \"type\" : \"REMOTE_CONTROL_SETPOINT\" }"
104 // required for type == REMOTE_CONTROL_TASK
105 MissionTask rc_task = 31;
111 option (dccl.msg) = {
115 required uint32 hub_id = 1 [(jaia.field).rest_api.presence = OMITTED];
116 required uint64 time = 2 [
117 (dccl.field) = { units { prefix: "micro" derived_dimensions: "time" } },
118 (jaia.field).rest_api.presence = OMITTED
124 CTD_DATA_OFFLOAD = 6;
126 // debugging low level commands
127 RESTART_ALL_SERVICES = 40;
128 REBOOT_COMPUTER = 41;
129 SHUTDOWN_COMPUTER = 42;
131 // simulator commands
132 SET_HUB_LOCATION = 80 [(jaia.ev).rest_api.presence = GUARANTEED];
135 required HubCommandType type = 10
136 [(jaia.field).rest_api.presence = GUARANTEED];
138 optional uint32 scan_for_bot_id = 11;
140 optional GeographicCoordinate hub_location = 80
141 [(jaia.field).rest_api.presence = GUARANTEED];
147 Actual maximum size of message: 48 bytes / 384 bits
148 dccl.id head...........................8
149 user head..............................0
150 body.................................369
151 padding to full byte...................7
152 Allowed maximum size of message: 250 bytes / 2000 bits
154 option (dccl.msg) = {
161 required uint32 bot_id = 1 [
162 (dccl.field) = { min: 0 max: 255 },
163 (jaia.field).rest_api.presence = GUARANTEED
165 required uint64 time = 2 [
168 units { prefix: "micro" derived_dimensions: "time" },
170 (jaia.field).rest_api.presence = GUARANTEED
172 optional uint64 last_command_time = 3 [
175 units { prefix: "micro" derived_dimensions: "time" }
177 (jaia.field).rest_api.presence = GUARANTEED
180 optional goby.middleware.protobuf.HealthState health_state = 4
181 [(jaia.field).rest_api.presence = GUARANTEED];
182 repeated Error error = 5 [
183 (dccl.field).max_repeat = 5,
184 (jaia.field).rest_api.presence = GUARANTEED
186 repeated Warning warning = 6 [
187 (dccl.field).max_repeat = 5,
188 (jaia.field).rest_api.presence = GUARANTEED
192 HYDRO = 1 [(jaia.ev).rest_api.presence = GUARANTEED];
193 ECHO = 2 [(jaia.ev).rest_api.presence = GUARANTEED];
194 BIO = 3 [(jaia.ev).rest_api.presence = GUARANTEED];
196 optional BotType bot_type = 7 [(jaia.field).rest_api.presence = GUARANTEED];
198 // Special case: not sent in message - written upon receipt
199 // link: which link this message traversed from bot to hub
200 optional Link link = 8 [(dccl.field).omit = true];
202 // Active links with last-received time per link (time written on hub upon receipt, not transmitted over air)
204 required Link link = 1;
205 optional uint64 last_received_time = 2 [
208 units { prefix: "micro" derived_dimensions: "time" }
213 // list of all active links on the Bot (based on BotStatus subscription messages)
214 repeated ActiveLink active_links = 9 [
215 (dccl.field).max_repeat = 10
218 optional GeographicCoordinate location = 10
219 [(jaia.field).rest_api.presence = GUARANTEED];
221 optional double sensor_depth = 11 [
226 units: { derived_dimensions: "length" }
228 (jaia.field).rest_api.presence = GUARANTEED
231 optional double depth = 12 [
236 units: { derived_dimensions: "length" }
238 (jaia.field).rest_api.presence = GUARANTEED
243 optional double roll = 1 [
249 derived_dimensions: "plane_angle"
250 system: "angle::degree"
253 (jaia.field).rest_api.presence = GUARANTEED
255 optional double pitch = 2 [
261 derived_dimensions: "plane_angle"
262 system: "angle::degree"
265 (jaia.field).rest_api.presence = GUARANTEED
267 optional double heading = 3 [
273 derived_dimensions: "plane_angle"
274 system: "angle::degree"
277 (jaia.field).rest_api.presence = GUARANTEED
279 optional double course_over_ground = 4 [
285 derived_dimensions: "plane_angle"
286 system: "angle::degree"
289 (jaia.field).rest_api.presence = GUARANTEED
292 optional Attitude attitude = 20
293 [(jaia.field).rest_api.presence = GUARANTEED];
297 optional double over_ground = 1 [
302 units { derived_dimensions: "velocity" }
304 (jaia.field).rest_api.presence = GUARANTEED
306 optional double over_water = 2 [(dccl.field) = {
310 units { derived_dimensions: "velocity" }
313 optional Speed speed = 30 [(jaia.field).rest_api.presence = GUARANTEED];
315 optional MissionState mission_state = 40
316 [(jaia.field).rest_api.presence = GUARANTEED];
318 // bounds should match MissionPlan.goal max_repeat value *
319 // expected_fragments max
320 optional int32 active_goal = 41 [
321 (dccl.field) = { min: 0 max: 80 },
322 (jaia.field).rest_api.presence = GUARANTEED
324 optional double distance_to_active_goal = 42 [
329 units: { derived_dimensions: "length" }
331 (jaia.field).rest_api.presence = GUARANTEED
333 optional uint32 active_goal_timeout = 43 [
338 units { base_dimensions: "T" }
340 (jaia.field).rest_api.presence = GUARANTEED
342 optional int32 repeat_index = 44 [
343 (dccl.field) = { min: 0 max: 1000 precision: 0 },
344 (jaia.field).rest_api.presence = GUARANTEED
347 optional double salinity = 51
348 [(dccl.field) = { min: 0 max: 100 precision: 1 }];
350 optional double temperature = 52 [(dccl.field) = {
354 units { derived_dimensions: "temperature" system: "celsius" }
357 optional double battery_percent = 53 [
358 (dccl.field) = { min: 0 max: 100 precision: 0 },
359 (jaia.field).rest_api.presence = GUARANTEED
362 optional int32 calibration_status = 54 [(dccl.field) = { min: 0 max: 3 }];
364 optional IMUCalibrationState calibration_state = 55;
366 optional double hdop = 56 [(dccl.field) = { min: 0 max: 100 precision: 2 }];
368 optional double pdop = 57 [(dccl.field) = { min: 0 max: 100 precision: 2 }];
370 optional int32 wifi_link_quality_percentage = 58 [
371 (dccl.field) = { min: 0 max: 100 precision: 0 },
372 (jaia.field).rest_api.presence = GUARANTEED
375 optional uint64 received_time = 59 [
378 units { prefix: "micro" derived_dimensions: "time" }
380 (jaia.field).rest_api.presence = GUARANTEED
383 optional uint64 mission_command_time = 71 [
386 units { prefix: "micro" derived_dimensions: "time" }
388 (jaia.field).rest_api.presence = GUARANTEED
391 optional string mission_name = 72
392 [(dccl.field).omit = true]; // not sent, restored on Hub from map
397 option (dccl.msg) = {
401 optional int32 drift_duration = 1 [
407 units { base_dimensions: "T" }
409 (jaia.field).rest_api.presence = GUARANTEED
412 message EstimatedDrift
414 required double speed = 1 [
419 units { derived_dimensions: "velocity" }
421 (jaia.field).rest_api.presence = GUARANTEED
424 optional double heading = 3 [
430 derived_dimensions: "plane_angle"
431 system: "angle::degree"
434 (jaia.field).rest_api.presence = GUARANTEED
438 // should correspond to ocean current velocity
439 optional EstimatedDrift estimated_drift = 10
440 [(jaia.field).rest_api.presence = GUARANTEED];
443 optional GeographicCoordinate start_location = 11
444 [(jaia.field).rest_api.presence = GUARANTEED];
446 optional GeographicCoordinate end_location = 12
447 [(jaia.field).rest_api.presence = GUARANTEED];
449 // Significant wave height is defined as the average wave height,
450 // from trough to crest, of the highest one-third of the waves
451 optional double significant_wave_height = 13 [
456 units: { derived_dimensions: "length" }
458 (jaia.field).rest_api.presence = GUARANTEED
464 option (dccl.msg) = {
468 required double dive_rate = 10 [
473 units { derived_dimensions: "velocity" }
475 (jaia.field).rest_api.presence = GUARANTEED
478 optional double unpowered_rise_rate = 11 [
483 units { derived_dimensions: "velocity" }
485 (jaia.field).rest_api.presence = GUARANTEED
488 optional double powered_rise_rate = 12 [
493 units { derived_dimensions: "velocity" }
495 (jaia.field).rest_api.presence = GUARANTEED
498 required double depth_achieved = 13 [
503 units: { derived_dimensions: "length" }
505 (jaia.field).rest_api.presence = GUARANTEED
510 optional double mean_depth = 1 [
515 units: { derived_dimensions: "length" }
517 (jaia.field).rest_api.presence = GUARANTEED
520 optional double mean_temperature = 2 [
525 units { derived_dimensions: "temperature" system: "celsius" }
527 (jaia.field).rest_api.presence = GUARANTEED
530 optional double mean_salinity = 3 [
531 (dccl.field) = { min: 0 max: 45 precision: 1 },
532 (jaia.field).rest_api.presence = GUARANTEED
536 repeated Measurements measurement = 14 [
537 (dccl.field) = { max_repeat: 50 },
538 (jaia.field).rest_api.presence = GUARANTEED
542 optional GeographicCoordinate start_location = 15
543 [(jaia.field).rest_api.presence = GUARANTEED];
545 optional double duration_to_acquire_gps = 16 [
550 units { base_dimensions: "T" }
552 (jaia.field).rest_api.presence = GUARANTEED
555 // Did we reach seafloor?
556 optional bool bottom_dive = 17
557 [default = false, (jaia.field).rest_api.presence = GUARANTEED];
559 // Did we reach min depth?
560 optional bool reached_min_depth = 18
561 [default = false, (jaia.field).rest_api.presence = GUARANTEED];
563 // If we reached bottom, what was the bottom type
566 HARD = 1 [(jaia.ev).rest_api.presence = GUARANTEED];
567 SOFT = 2 [(jaia.ev).rest_api.presence = GUARANTEED];
570 optional BottomType bottom_type = 19
571 [(jaia.field).rest_api.presence = GUARANTEED];
573 // For bottom characterization
574 optional double max_acceleration = 20 [
579 units { derived_dimensions: "acceleration" }
581 (jaia.field).rest_api.presence = GUARANTEED
584 message SubsurfaceCurrentVector
586 required double velocity = 1 [
591 units { derived_dimensions: "velocity" }
593 (jaia.field).rest_api.presence = GUARANTEED
596 required double heading = 2 [
602 derived_dimensions: "plane_angle"
603 system: "angle::degree"
606 (jaia.field).rest_api.presence = GUARANTEED
610 optional SubsurfaceCurrentVector subsurface_current = 21
611 [(jaia.field).rest_api.presence = GUARANTEED];
617 Actual maximum size of message: 220 bytes / 1760 bits
618 dccl.id head..........................16
619 user head..............................0
620 body................................1744
621 padding to full byte...................0
622 Allowed maximum size of message: 250 bytes / 2000 bits
624 option (dccl.msg) = {
631 required uint32 bot_id = 1 [
632 (dccl.field) = { min: 0 max: 255 },
633 (jaia.field).rest_api.presence = GUARANTEED
635 required uint64 start_time = 2 [
638 units { prefix: "micro" derived_dimensions: "time" }
640 (jaia.field).rest_api.presence = GUARANTEED
642 required uint64 end_time = 3 [
645 units { prefix: "micro" derived_dimensions: "time" }
647 (jaia.field).rest_api.presence = GUARANTEED
649 required MissionTask.TaskType type = 4
650 [(jaia.field).rest_api.presence = GUARANTEED];
652 // Special case: not sent in message - written upon receipt based on the
654 optional Link link = 5 [(dccl.field).omit = true];
656 optional DivePacket dive = 10 [(jaia.field).rest_api.presence = GUARANTEED];
657 optional DriftPacket drift = 11
658 [(jaia.field).rest_api.presence = GUARANTEED];
660 // The command_time is the time that the command associated with this task
661 // was sent from the Hub. This is used, along with the bot_id, to populate
662 // the mission_name on the Hub.
663 optional uint64 mission_command_time = 71 [
666 units { prefix: "micro" derived_dimensions: "time" }
668 (jaia.field).rest_api.presence = GUARANTEED
670 optional string mission_name = 72
671 [(dccl.field).omit = true]; // not sent, restored on Hub from map
676 option (dccl.msg) = {
683 optional int32 contact = 1 [(dccl.field) = { min: 1, max: 15 }];
684 required GeographicCoordinate location = 2;
685 optional double speed_over_ground = 3 [(dccl.field) = {
689 units { derived_dimensions: "velocity" }
691 optional double heading_or_cog = 5 [(dccl.field) = {
695 units { derived_dimensions: "plane_angle" system: "angle::degree" }
701 option (dccl.msg) = {
708 required uint32 hub_id = 1 [(dccl.field) = { min: 0 max: 30 }];
709 required uint64 time = 2 [(dccl.field) = {
711 units { prefix: "micro" derived_dimensions: "time" }
712 precision: -5 // deci-second precision
715 optional Link bot_link = 3; // which link did this originally come over
716 // from the bot (for BotStatus/TaskPacket)?
720 BotStatus bot_status = 10;
721 TaskPacket task_packet = 11;
722 Command command_for_bot = 12;
723 CommandCommsResult command_comms_result = 13;
724 HubStatus hub_status = 14;
728message CommandCommsResult
735 required CommsResult result = 1;
736 required Link link = 2;
737 required Command orig_command = 3;