123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- #pragma once
- #include <AP_HAL/AP_HAL.h>
- #if CONFIG_HAL_BOARD == HAL_BOARD_SITL
- #include "AP_HAL_SITL.h"
- #include "AP_HAL_SITL_Namespace.h"
- #include "HAL_SITL_Class.h"
- #include "RCInput.h"
- #include <sys/types.h>
- #include <sys/socket.h>
- #include <netinet/in.h>
- #include <netinet/udp.h>
- #include <arpa/inet.h>
- #include <AP_Baro/AP_Baro.h>
- #include <AP_InertialSensor/AP_InertialSensor.h>
- #include <AP_Compass/AP_Compass.h>
- #include <AP_Terrain/AP_Terrain.h>
- #include <SITL/SITL.h>
- #include <SITL/SITL_Input.h>
- #include <SITL/SIM_Gimbal.h>
- #include <SITL/SIM_ADSB.h>
- #include <SITL/SIM_Vicon.h>
- #include <AP_HAL/utility/Socket.h>
- class HAL_SITL;
- class HALSITL::SITL_State {
- friend class HALSITL::Scheduler;
- friend class HALSITL::Util;
- friend class HALSITL::GPIO;
- public:
- void init(int argc, char * const argv[]);
- enum vehicle_type {
- ArduCopter,
- APMrover2,
- ArduPlane,
- ArduSub
- };
- int gps_pipe(void);
- int gps2_pipe(void);
- ssize_t gps_read(int fd, void *buf, size_t count);
- uint16_t pwm_output[SITL_NUM_CHANNELS];
- uint16_t pwm_input[SITL_RC_INPUT_CHANNELS];
- bool output_ready = false;
- bool new_rc_input;
- void loop_hook(void);
- uint16_t base_port(void) const {
- return _base_port;
- }
- // create a file desciptor attached to a virtual device; type of
- // device is given by name parameter
- int sim_fd(const char *name, const char *arg);
- bool use_rtscts(void) const {
- return _use_rtscts;
- }
-
- // simulated airspeed, sonar and battery monitor
- uint16_t sonar_pin_value; // pin 0
- uint16_t airspeed_pin_value; // pin 1
- uint16_t airspeed_2_pin_value; // pin 2
- uint16_t voltage_pin_value; // pin 13
- uint16_t current_pin_value; // pin 12
- uint16_t voltage2_pin_value; // pin 15
- uint16_t current2_pin_value; // pin 14
- // paths for UART devices
- const char *_uart_path[7] {
- "tcp:0:wait",
- "GPS1",
- "tcp:2",
- "tcp:3",
- "GPS2",
- "tcp:5",
- "tcp:6",
- };
- /* parse a home location string */
- static bool parse_home(const char *home_str,
- Location &loc,
- float &yaw_degrees);
- private:
- void _parse_command_line(int argc, char * const argv[]);
- void _set_param_default(const char *parm);
- void _usage(void);
- void _sitl_setup(const char *home_str);
- void _setup_fdm(void);
- void _setup_timer(void);
- void _setup_adc(void);
- void set_height_agl(void);
- void _update_rangefinder(float range_value);
- void _set_signal_handlers(void) const;
- struct gps_data {
- double latitude;
- double longitude;
- float altitude;
- double speedN;
- double speedE;
- double speedD;
- double yaw;
- bool have_lock;
- };
- #define MAX_GPS_DELAY 100
- gps_data _gps_data[MAX_GPS_DELAY];
- bool _gps_has_basestation_position;
- gps_data _gps_basestation_data;
- void _gps_write(const uint8_t *p, uint16_t size, uint8_t instance);
- void _gps_send_ubx(uint8_t msgid, uint8_t *buf, uint16_t size, uint8_t instance);
- void _update_gps_ubx(const struct gps_data *d, uint8_t instance);
- void _update_gps_mtk(const struct gps_data *d, uint8_t instance);
- void _update_gps_mtk16(const struct gps_data *d, uint8_t instance);
- void _update_gps_mtk19(const struct gps_data *d, uint8_t instance);
- uint16_t _gps_nmea_checksum(const char *s);
- void _gps_nmea_printf(uint8_t instance, const char *fmt, ...);
- void _update_gps_nmea(const struct gps_data *d, uint8_t instance);
- void _sbp_send_message(uint16_t msg_type, uint16_t sender_id, uint8_t len, uint8_t *payload, uint8_t instance);
- void _update_gps_sbp(const struct gps_data *d, uint8_t instance);
- void _update_gps_sbp2(const struct gps_data *d, uint8_t instance);
- void _update_gps_file(uint8_t instance);
- void _update_gps_nova(const struct gps_data *d, uint8_t instance);
- void _nova_send_message(uint8_t *header, uint8_t headerlength, uint8_t *payload, uint8_t payloadlen, uint8_t instance);
- uint32_t CRC32Value(uint32_t icrc);
- uint32_t CalculateBlockCRC32(uint32_t length, uint8_t *buffer, uint32_t crc);
- void _update_gps(double latitude, double longitude, float altitude,
- double speedN, double speedE, double speedD,
- double yaw, bool have_lock);
- void _update_airspeed(float airspeed);
- void _update_gps_instance(SITL::SITL::GPSType gps_type, const struct gps_data *d, uint8_t instance);
- void _check_rc_input(void);
- bool _read_rc_sitl_input();
- void _fdm_input_local(void);
- void _output_to_flightgear(void);
- void _simulator_servos(struct sitl_input &input);
- void _simulator_output(bool synthetic_clock_mode);
- uint16_t _airspeed_sensor(float airspeed);
- uint16_t _ground_sonar();
- void _fdm_input_step(void);
- void wait_clock(uint64_t wait_time_usec);
- // internal state
- enum vehicle_type _vehicle;
- uint16_t _framerate;
- uint8_t _instance;
- uint16_t _base_port;
- pid_t _parent_pid;
- uint32_t _update_count;
- AP_Baro *_barometer;
- AP_InertialSensor *_ins;
- Scheduler *_scheduler;
- Compass *_compass;
- #if AP_TERRAIN_AVAILABLE
- AP_Terrain *_terrain;
- #endif
- SocketAPM _sitl_rc_in{true};
- SITL::SITL *_sitl;
- uint16_t _rcin_port;
- uint16_t _fg_view_port;
- uint16_t _irlock_port;
- float _current;
- bool _synthetic_clock_mode;
- bool _use_rtscts;
- bool _use_fg_view;
-
- const char *_fg_address;
- // delay buffer variables
- static const uint8_t mag_buffer_length = 250;
- static const uint8_t wind_buffer_length = 50;
- // magnetometer delay buffer variables
- struct readings_mag {
- uint32_t time;
- Vector3f data;
- };
- uint8_t store_index_mag;
- uint32_t last_store_time_mag;
- VectorN<readings_mag,mag_buffer_length> buffer_mag;
- uint32_t time_delta_mag;
- uint32_t delayed_time_mag;
- // airspeed sensor delay buffer variables
- struct readings_wind {
- uint32_t time;
- float data;
- };
- uint8_t store_index_wind;
- uint32_t last_store_time_wind;
- VectorN<readings_wind,wind_buffer_length> buffer_wind;
- VectorN<readings_wind,wind_buffer_length> buffer_wind_2;
- uint32_t time_delta_wind;
- uint32_t delayed_time_wind;
- uint32_t wind_start_delay_micros;
- // internal SITL model
- SITL::Aircraft *sitl_model;
- // simulated gimbal
- bool enable_gimbal;
- SITL::Gimbal *gimbal;
- // simulated ADSb
- SITL::ADSB *adsb;
- // simulated vicon system:
- SITL::Vicon *vicon;
- // output socket for flightgear viewing
- SocketAPM fg_socket{true};
-
- const char *defaults_path = HAL_PARAM_DEFAULTS_PATH;
- const char *_home_str;
- };
- #endif // CONFIG_HAL_BOARD == HAL_BOARD_SITL
|