Code for autonomous rover for Sparkfun AVC. DataBus won 3rd in 2012 and the same code was used on Troubled Child, a 1986 Jeep Grand Wagoneer to win 1st in 2014.

Dependencies:   mbed Watchdog SDFileSystem DigoleSerialDisp

Committer:
shimniok
Date:
Fri Nov 30 16:11:53 2018 +0000
Revision:
25:bb5356402687
Parent:
0:a6a169de725f
Initial publish of revised version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
shimniok 0:a6a169de725f 1 /** @file
shimniok 0:a6a169de725f 2 * @brief MAVLink comm protocol.
shimniok 0:a6a169de725f 3 * @see http://qgroundcontrol.org/mavlink/
shimniok 0:a6a169de725f 4 * Generated on Sunday, September 11 2011, 13:52 UTC
shimniok 0:a6a169de725f 5 */
shimniok 0:a6a169de725f 6 #ifndef COMMON_H
shimniok 0:a6a169de725f 7 #define COMMON_H
shimniok 0:a6a169de725f 8
shimniok 0:a6a169de725f 9 #ifdef __cplusplus
shimniok 0:a6a169de725f 10 extern "C" {
shimniok 0:a6a169de725f 11 #endif
shimniok 0:a6a169de725f 12
shimniok 0:a6a169de725f 13
shimniok 0:a6a169de725f 14 #include "../protocol.h"
shimniok 0:a6a169de725f 15
shimniok 0:a6a169de725f 16 #define MAVLINK_ENABLED_COMMON
shimniok 0:a6a169de725f 17
shimniok 0:a6a169de725f 18 // MAVLINK VERSION
shimniok 0:a6a169de725f 19
shimniok 0:a6a169de725f 20 #ifndef MAVLINK_VERSION
shimniok 0:a6a169de725f 21 #define MAVLINK_VERSION 2
shimniok 0:a6a169de725f 22 #endif
shimniok 0:a6a169de725f 23
shimniok 0:a6a169de725f 24 #if (MAVLINK_VERSION == 0)
shimniok 0:a6a169de725f 25 #undef MAVLINK_VERSION
shimniok 0:a6a169de725f 26 #define MAVLINK_VERSION 2
shimniok 0:a6a169de725f 27 #endif
shimniok 0:a6a169de725f 28
shimniok 0:a6a169de725f 29 // ENUM DEFINITIONS
shimniok 0:a6a169de725f 30
shimniok 0:a6a169de725f 31 /** @brief Commands to be executed by the MAV. They can be executed on user request, or as part of a mission script. If the action is used in a mission, the parameter mapping to the waypoint/mission message is as follows: Param 1, Param 2, Param 3, Param 4, X: Param 5, Y:Param 6, Z:Param 7. This command list is similar what ARINC 424 is for commercial aircraft: A data format how to interpret waypoint/mission data. */
shimniok 0:a6a169de725f 32 enum MAV_CMD
shimniok 0:a6a169de725f 33 {
shimniok 0:a6a169de725f 34 MAV_CMD_NAV_WAYPOINT=16, /* Navigate to waypoint. | Hold time in decimal seconds. (ignored by fixed wing, time to stay at waypoint for rotary wing) | Acceptance radius in meters (if the sphere with this radius is hit, the waypoint counts as reached) | 0 to pass through the WP, if > 0 radius in meters to pass by WP. Positive value for clockwise orbit, negative value for counter-clockwise orbit. Allows trajectory control. | Desired yaw angle at waypoint (rotary wing) | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 35 MAV_CMD_NAV_LOITER_UNLIM=17, /* Loiter around this waypoint an unlimited amount of time | Empty | Empty | Radius around waypoint, in meters. If positive loiter clockwise, else counter-clockwise | Desired yaw angle. | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 36 MAV_CMD_NAV_LOITER_TURNS=18, /* Loiter around this waypoint for X turns | Turns | Empty | Radius around waypoint, in meters. If positive loiter clockwise, else counter-clockwise | Desired yaw angle. | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 37 MAV_CMD_NAV_LOITER_TIME=19, /* Loiter around this waypoint for X seconds | Seconds (decimal) | Empty | Radius around waypoint, in meters. If positive loiter clockwise, else counter-clockwise | Desired yaw angle. | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 38 MAV_CMD_NAV_RETURN_TO_LAUNCH=20, /* Return to launch location | Empty | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 39 MAV_CMD_NAV_LAND=21, /* Land at location | Empty | Empty | Empty | Desired yaw angle. | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 40 MAV_CMD_NAV_TAKEOFF=22, /* Takeoff from ground / hand | Minimum pitch (if airspeed sensor present), desired pitch without sensor | Empty | Empty | Yaw angle (if magnetometer present), ignored without magnetometer | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 41 MAV_CMD_NAV_ROI=80, /* Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various sensors such as cameras. | Region of intereset mode. (see MAV_ROI enum) | Waypoint index/ target ID. (see MAV_ROI enum) | ROI index (allows a vehicle to manage multiple ROI's) | Empty | x the location of the fixed ROI (see MAV_FRAME) | y | z | */
shimniok 0:a6a169de725f 42 MAV_CMD_NAV_PATHPLANNING=81, /* Control autonomous path planning on the MAV. | 0: Disable local obstacle avoidance / local path planning (without resetting map), 1: Enable local path planning, 2: Enable and reset local path planning | 0: Disable full path planning (without resetting map), 1: Enable, 2: Enable and reset map/occupancy grid, 3: Enable and reset planned route, but not occupancy grid | Empty | Yaw angle at goal, in compass degrees, [0..360] | Latitude/X of goal | Longitude/Y of goal | Altitude/Z of goal | */
shimniok 0:a6a169de725f 43 MAV_CMD_NAV_LAST=95, /* NOP - This command is only used to mark the upper limit of the NAV/ACTION commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 44 MAV_CMD_CONDITION_DELAY=112, /* Delay mission state machine. | Delay in seconds (decimal) | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 45 MAV_CMD_CONDITION_CHANGE_ALT=113, /* Ascend/descend at rate. Delay mission state machine until desired altitude reached. | Descent / Ascend rate (m/s) | Empty | Empty | Empty | Empty | Empty | Finish Altitude | */
shimniok 0:a6a169de725f 46 MAV_CMD_CONDITION_DISTANCE=114, /* Delay mission state machine until within desired distance of next NAV point. | Distance (meters) | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 47 MAV_CMD_CONDITION_YAW=115, /* Reach a certain target angle. | target angle: [0-360], 0 is north | speed during yaw change:[deg per second] | direction: negative: counter clockwise, positive: clockwise [-1,1] | relative offset or absolute angle: [ 1,0] | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 48 MAV_CMD_CONDITION_LAST=159, /* NOP - This command is only used to mark the upper limit of the CONDITION commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 49 MAV_CMD_DO_SET_MODE=176, /* Set system mode. | Mode, as defined by ENUM MAV_MODE | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 50 MAV_CMD_DO_JUMP=177, /* Jump to the desired command in the mission list. Repeat this action only the specified number of times | Sequence number | Repeat count | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 51 MAV_CMD_DO_CHANGE_SPEED=178, /* Change speed and/or throttle set points. | Speed type (0=Airspeed, 1=Ground Speed) | Speed (m/s, -1 indicates no change) | Throttle ( Percent, -1 indicates no change) | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 52 MAV_CMD_DO_SET_HOME=179, /* Changes the home location either to the current location or a specified location. | Use current (1=use current location, 0=use specified location) | Empty | Empty | Empty | Latitude | Longitude | Altitude | */
shimniok 0:a6a169de725f 53 MAV_CMD_DO_SET_PARAMETER=180, /* Set a system parameter. Caution! Use of this command requires knowledge of the numeric enumeration value of the parameter. | Parameter number | Parameter value | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 54 MAV_CMD_DO_SET_RELAY=181, /* Set a relay to a condition. | Relay number | Setting (1=on, 0=off, others possible depending on system hardware) | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 55 MAV_CMD_DO_REPEAT_RELAY=182, /* Cycle a relay on and off for a desired number of cyles with a desired period. | Relay number | Cycle count | Cycle time (seconds, decimal) | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 56 MAV_CMD_DO_SET_SERVO=183, /* Set a servo to a desired PWM value. | Servo number | PWM (microseconds, 1000 to 2000 typical) | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 57 MAV_CMD_DO_REPEAT_SERVO=184, /* Cycle a between its nominal setting and a desired PWM for a desired number of cycles with a desired period. | Servo number | PWM (microseconds, 1000 to 2000 typical) | Cycle count | Cycle time (seconds) | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 58 MAV_CMD_DO_CONTROL_VIDEO=200, /* Control onboard camera capturing. | Camera ID (-1 for all) | Transmission: 0: disabled, 1: enabled compressed, 2: enabled raw | Transmission mode: 0: video stream, >0: single images every n seconds (decimal) | Recording: 0: disabled, 1: enabled compressed, 2: enabled raw | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 59 MAV_CMD_DO_SET_ROI=201, /* Sets the region of interest (ROI) for a sensor set or the vehicle itself. This can then be used by the vehicles control system to control the vehicle attitude and the attitude of various devices such as cameras. | Region of interest mode. (see MAV_ROI enum) | Waypoint index/ target ID. (see MAV_ROI enum) | ROI index (allows a vehicle to manage multiple cameras etc.) | Empty | x the location of the fixed ROI (see MAV_FRAME) | y | z | */
shimniok 0:a6a169de725f 60 MAV_CMD_DO_LAST=240, /* NOP - This command is only used to mark the upper limit of the DO commands in the enumeration | Empty | Empty | Empty | Empty | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 61 MAV_CMD_PREFLIGHT_CALIBRATION=241, /* Trigger calibration. This command will be only accepted if in pre-flight mode. | Gyro calibration: 0: no, 1: yes | Magnetometer calibration: 0: no, 1: yes | Ground pressure: 0: no, 1: yes | Radio calibration: 0: no, 1: yes | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 62 MAV_CMD_PREFLIGHT_STORAGE=245, /* Request storage of different parameter values and logs. This command will be only accepted if in pre-flight mode. | Parameter storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM | Mission storage: 0: READ FROM FLASH/EEPROM, 1: WRITE CURRENT TO FLASH/EEPROM | Reserved | Reserved | Empty | Empty | Empty | */
shimniok 0:a6a169de725f 63 MAV_CMD_ENUM_END
shimniok 0:a6a169de725f 64 };
shimniok 0:a6a169de725f 65
shimniok 0:a6a169de725f 66 /** @brief Data stream IDs. A data stream is not a fixed set of messages, but rather a recommendation to the autopilot software. Individual autopilots may or may not obey the recommended messages. */
shimniok 0:a6a169de725f 67 enum MAV_DATA_STREAM
shimniok 0:a6a169de725f 68 {
shimniok 0:a6a169de725f 69 MAV_DATA_STREAM_ALL=0, /* Enable all data streams | */
shimniok 0:a6a169de725f 70 MAV_DATA_STREAM_RAW_SENSORS=1, /* Enable IMU_RAW, GPS_RAW, GPS_STATUS packets. | */
shimniok 0:a6a169de725f 71 MAV_DATA_STREAM_EXTENDED_STATUS=2, /* Enable GPS_STATUS, CONTROL_STATUS, AUX_STATUS | */
shimniok 0:a6a169de725f 72 MAV_DATA_STREAM_RC_CHANNELS=3, /* Enable RC_CHANNELS_SCALED, RC_CHANNELS_RAW, SERVO_OUTPUT_RAW | */
shimniok 0:a6a169de725f 73 MAV_DATA_STREAM_RAW_CONTROLLER=4, /* Enable ATTITUDE_CONTROLLER_OUTPUT, POSITION_CONTROLLER_OUTPUT, NAV_CONTROLLER_OUTPUT. | */
shimniok 0:a6a169de725f 74 MAV_DATA_STREAM_POSITION=6, /* Enable LOCAL_POSITION, GLOBAL_POSITION/GLOBAL_POSITION_INT messages. | */
shimniok 0:a6a169de725f 75 MAV_DATA_STREAM_EXTRA1=10, /* Dependent on the autopilot | */
shimniok 0:a6a169de725f 76 MAV_DATA_STREAM_EXTRA2=11, /* Dependent on the autopilot | */
shimniok 0:a6a169de725f 77 MAV_DATA_STREAM_EXTRA3=12, /* Dependent on the autopilot | */
shimniok 0:a6a169de725f 78 MAV_DATA_STREAM_ENUM_END
shimniok 0:a6a169de725f 79 };
shimniok 0:a6a169de725f 80
shimniok 0:a6a169de725f 81 /** @brief The ROI (region of interest) for the vehicle. This can be be used by the vehicle for camera/vehicle attitude alignment (see MAV_CMD_NAV_ROI). */
shimniok 0:a6a169de725f 82 enum MAV_ROI
shimniok 0:a6a169de725f 83 {
shimniok 0:a6a169de725f 84 MAV_ROI_NONE=0, /* No region of interest. | */
shimniok 0:a6a169de725f 85 MAV_ROI_WPNEXT=1, /* Point toward next waypoint. | */
shimniok 0:a6a169de725f 86 MAV_ROI_WPINDEX=2, /* Point toward given waypoint. | */
shimniok 0:a6a169de725f 87 MAV_ROI_LOCATION=3, /* Point toward fixed location. | */
shimniok 0:a6a169de725f 88 MAV_ROI_TARGET=4, /* Point toward of given id. | */
shimniok 0:a6a169de725f 89 MAV_ROI_ENUM_END
shimniok 0:a6a169de725f 90 };
shimniok 0:a6a169de725f 91
shimniok 0:a6a169de725f 92
shimniok 0:a6a169de725f 93 // MESSAGE DEFINITIONS
shimniok 0:a6a169de725f 94
shimniok 0:a6a169de725f 95 #include "./mavlink_msg_heartbeat.h"
shimniok 0:a6a169de725f 96 #include "./mavlink_msg_boot.h"
shimniok 0:a6a169de725f 97 #include "./mavlink_msg_system_time.h"
shimniok 0:a6a169de725f 98 #include "./mavlink_msg_ping.h"
shimniok 0:a6a169de725f 99 #include "./mavlink_msg_system_time_utc.h"
shimniok 0:a6a169de725f 100 #include "./mavlink_msg_change_operator_control.h"
shimniok 0:a6a169de725f 101 #include "./mavlink_msg_change_operator_control_ack.h"
shimniok 0:a6a169de725f 102 #include "./mavlink_msg_auth_key.h"
shimniok 0:a6a169de725f 103 #include "./mavlink_msg_action_ack.h"
shimniok 0:a6a169de725f 104 #include "./mavlink_msg_action.h"
shimniok 0:a6a169de725f 105 #include "./mavlink_msg_set_mode.h"
shimniok 0:a6a169de725f 106 #include "./mavlink_msg_set_nav_mode.h"
shimniok 0:a6a169de725f 107 #include "./mavlink_msg_param_request_read.h"
shimniok 0:a6a169de725f 108 #include "./mavlink_msg_param_request_list.h"
shimniok 0:a6a169de725f 109 #include "./mavlink_msg_param_value.h"
shimniok 0:a6a169de725f 110 #include "./mavlink_msg_param_set.h"
shimniok 0:a6a169de725f 111 #include "./mavlink_msg_gps_raw_int.h"
shimniok 0:a6a169de725f 112 #include "./mavlink_msg_scaled_imu.h"
shimniok 0:a6a169de725f 113 #include "./mavlink_msg_gps_status.h"
shimniok 0:a6a169de725f 114 #include "./mavlink_msg_raw_imu.h"
shimniok 0:a6a169de725f 115 #include "./mavlink_msg_raw_pressure.h"
shimniok 0:a6a169de725f 116 #include "./mavlink_msg_scaled_pressure.h"
shimniok 0:a6a169de725f 117 #include "./mavlink_msg_attitude.h"
shimniok 0:a6a169de725f 118 #include "./mavlink_msg_local_position.h"
shimniok 0:a6a169de725f 119 #include "./mavlink_msg_global_position.h"
shimniok 0:a6a169de725f 120 #include "./mavlink_msg_gps_raw.h"
shimniok 0:a6a169de725f 121 #include "./mavlink_msg_gps_raw_ugv.h"
shimniok 0:a6a169de725f 122 #include "./mavlink_msg_sys_status.h"
shimniok 0:a6a169de725f 123 #include "./mavlink_msg_rc_channels_raw.h"
shimniok 0:a6a169de725f 124 #include "./mavlink_msg_rc_channels_scaled.h"
shimniok 0:a6a169de725f 125 #include "./mavlink_msg_servo_output_raw.h"
shimniok 0:a6a169de725f 126 #include "./mavlink_msg_waypoint.h"
shimniok 0:a6a169de725f 127 #include "./mavlink_msg_waypoint_request.h"
shimniok 0:a6a169de725f 128 #include "./mavlink_msg_waypoint_set_current.h"
shimniok 0:a6a169de725f 129 #include "./mavlink_msg_waypoint_current.h"
shimniok 0:a6a169de725f 130 #include "./mavlink_msg_waypoint_request_list.h"
shimniok 0:a6a169de725f 131 #include "./mavlink_msg_waypoint_count.h"
shimniok 0:a6a169de725f 132 #include "./mavlink_msg_waypoint_clear_all.h"
shimniok 0:a6a169de725f 133 #include "./mavlink_msg_waypoint_reached.h"
shimniok 0:a6a169de725f 134 #include "./mavlink_msg_waypoint_ack.h"
shimniok 0:a6a169de725f 135 #include "./mavlink_msg_gps_set_global_origin.h"
shimniok 0:a6a169de725f 136 #include "./mavlink_msg_gps_local_origin_set.h"
shimniok 0:a6a169de725f 137 #include "./mavlink_msg_local_position_setpoint_set.h"
shimniok 0:a6a169de725f 138 #include "./mavlink_msg_local_position_setpoint.h"
shimniok 0:a6a169de725f 139 #include "./mavlink_msg_control_status.h"
shimniok 0:a6a169de725f 140 #include "./mavlink_msg_safety_set_allowed_area.h"
shimniok 0:a6a169de725f 141 #include "./mavlink_msg_safety_allowed_area.h"
shimniok 0:a6a169de725f 142 #include "./mavlink_msg_set_roll_pitch_yaw_thrust.h"
shimniok 0:a6a169de725f 143 #include "./mavlink_msg_set_roll_pitch_yaw_speed_thrust.h"
shimniok 0:a6a169de725f 144 #include "./mavlink_msg_roll_pitch_yaw_thrust_setpoint.h"
shimniok 0:a6a169de725f 145 #include "./mavlink_msg_roll_pitch_yaw_speed_thrust_setpoint.h"
shimniok 0:a6a169de725f 146 #include "./mavlink_msg_nav_controller_output.h"
shimniok 0:a6a169de725f 147 #include "./mavlink_msg_position_target.h"
shimniok 0:a6a169de725f 148 #include "./mavlink_msg_state_correction.h"
shimniok 0:a6a169de725f 149 #include "./mavlink_msg_set_altitude.h"
shimniok 0:a6a169de725f 150 #include "./mavlink_msg_request_data_stream.h"
shimniok 0:a6a169de725f 151 #include "./mavlink_msg_hil_state.h"
shimniok 0:a6a169de725f 152 #include "./mavlink_msg_hil_controls.h"
shimniok 0:a6a169de725f 153 #include "./mavlink_msg_manual_control.h"
shimniok 0:a6a169de725f 154 #include "./mavlink_msg_rc_channels_override.h"
shimniok 0:a6a169de725f 155 #include "./mavlink_msg_global_position_int.h"
shimniok 0:a6a169de725f 156 #include "./mavlink_msg_vfr_hud.h"
shimniok 0:a6a169de725f 157 #include "./mavlink_msg_command.h"
shimniok 0:a6a169de725f 158 #include "./mavlink_msg_command_ack.h"
shimniok 0:a6a169de725f 159 #include "./mavlink_msg_optical_flow.h"
shimniok 0:a6a169de725f 160 #include "./mavlink_msg_object_detection_event.h"
shimniok 0:a6a169de725f 161 #include "./mavlink_msg_debug_vect.h"
shimniok 0:a6a169de725f 162 #include "./mavlink_msg_named_value_float.h"
shimniok 0:a6a169de725f 163 #include "./mavlink_msg_named_value_int.h"
shimniok 0:a6a169de725f 164 #include "./mavlink_msg_statustext.h"
shimniok 0:a6a169de725f 165 #include "./mavlink_msg_debug.h"
shimniok 0:a6a169de725f 166
shimniok 0:a6a169de725f 167
shimniok 0:a6a169de725f 168 // MESSAGE LENGTHS
shimniok 0:a6a169de725f 169
shimniok 0:a6a169de725f 170 #undef MAVLINK_MESSAGE_LENGTHS
shimniok 0:a6a169de725f 171 #define MAVLINK_MESSAGE_LENGTHS { 3, 4, 8, 14, 8, 28, 3, 32, 0, 2, 3, 2, 2, 0, 0, 0, 0, 0, 0, 0, 19, 2, 23, 21, 0, 37, 26, 101, 26, 16, 32, 32, 37, 32, 11, 17, 17, 16, 18, 36, 4, 4, 2, 2, 4, 2, 2, 3, 14, 12, 18, 16, 8, 27, 25, 18, 18, 24, 24, 0, 0, 0, 26, 16, 36, 5, 6, 56, 26, 21, 18, 0, 0, 18, 20, 20, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 14, 14, 51 }
shimniok 0:a6a169de725f 172
shimniok 0:a6a169de725f 173 #ifdef __cplusplus
shimniok 0:a6a169de725f 174 }
shimniok 0:a6a169de725f 175 #endif
shimniok 0:a6a169de725f 176 #endif