#ifndef TYPES_H_ #define TYPES_H_ enum rc { ROLL, PITCH, YAW, THROTTLE, AUX1, AUX2, AUX3, AUX4, AUX5, AUX6, AUX7, AUX8 }; enum pid { PIDROLL, PIDPITCH, PIDYAW, PIDALT, PIDPOS, PIDPOSR, PIDNAVR, PIDLEVEL, PIDMAG, PIDVEL, // not used currently PIDITEMS }; enum box { BOXARM, #if ACC BOXANGLE, BOXHORIZON, #endif #if BARO && (!defined(SUPPRESS_BARO_ALTHOLD)) BOXBARO, #endif #ifdef VARIOMETER BOXVARIO, #endif BOXMAG, #if defined(HEADFREE) BOXHEADFREE, BOXHEADADJ, // acquire heading for HEADFREE mode #endif #if defined(SERVO_TILT) || defined(GIMBAL) || defined(SERVO_MIX_TILT) BOXCAMSTAB, #endif #if defined(CAMTRIG) BOXCAMTRIG, #endif #if GPS BOXGPSHOME, BOXGPSHOLD, #endif #if defined(FIXEDWING) || defined(HELICOPTER) BOXPASSTHRU, #endif #if defined(BUZZER) BOXBEEPERON, #endif #if defined(LED_FLASHER) BOXLEDMAX, // we want maximum illumination BOXLEDLOW, // low/no lights #endif #if defined(LANDING_LIGHTS_DDR) BOXLLIGHTS, // enable landing lights at any altitude #endif #ifdef INFLIGHT_ACC_CALIBRATION BOXCALIB, #endif #ifdef GOVERNOR_P BOXGOV, #endif #ifdef OSD_SWITCH BOXOSD, #endif #if GPS BOXGPSNAV, BOXLAND, #endif CHECKBOXITEMS }; typedef struct { int16_t accSmooth[3]; int16_t gyroData[3]; int16_t magADC[3]; int16_t gyroADC[3]; int16_t accADC[3]; } imu_t; typedef struct { uint8_t vbat; // battery voltage in 0.1V steps uint16_t intPowerMeterSum; uint16_t rssi; // range: [0;1023] uint16_t amperage; // 1unit == 100mA uint16_t watts; // 1unit == 1W uint16_t vbatcells[VBAT_CELLS_NUM]; } analog_t; typedef struct { int32_t EstAlt; // in cm int16_t vario; // variometer in cm/s } alt_t; typedef struct { int16_t angle[2]; // absolute angle inclination in multiple of 0.1 degree 180 deg = 1800 int16_t heading; // variometer in cm/s } att_t; typedef struct { uint8_t OK_TO_ARM :1 ; uint8_t ARMED :1 ; uint8_t ACC_CALIBRATED :1 ; uint8_t ANGLE_MODE :1 ; uint8_t HORIZON_MODE :1 ; uint8_t MAG_MODE :1 ; uint8_t BARO_MODE :1 ; #ifdef HEADFREE uint8_t HEADFREE_MODE :1 ; #endif #if defined(FIXEDWING) || defined(HELICOPTER) uint8_t PASSTHRU_MODE :1 ; #endif uint8_t SMALL_ANGLES_25 :1 ; #if MAG uint8_t CALIBRATE_MAG :1 ; #endif #ifdef VARIOMETER uint8_t VARIO_MODE :1; #endif uint8_t GPS_mode: 2; // 0-3 NONE,HOLD, HOME, NAV (see GPS_MODE_* defines #if BARO || GPS uint8_t THROTTLE_IGNORED : 1; // If it is 1 then ignore throttle stick movements in baro mode; #endif #if GPS uint8_t GPS_FIX :1 ; uint8_t GPS_FIX_HOME :1 ; uint8_t GPS_BARO_MODE : 1; // This flag is used when GPS controls baro mode instead of user (it will replace rcOptions[BARO] uint8_t GPS_head_set: 1; // it is 1 if the navigation engine got commands to control heading (SET_POI or SET_HEAD) CLEAR_HEAD will zero it uint8_t LAND_COMPLETED: 1; uint8_t LAND_IN_PROGRESS: 1; #endif } flags_struct_t; typedef struct { uint8_t currentSet; int16_t accZero[3]; int16_t magZero[3]; uint16_t flashsum; uint8_t checksum; // MUST BE ON LAST POSITION OF STRUCTURE ! } global_conf_t; struct pid_ { uint8_t P8; uint8_t I8; uint8_t D8; }; struct servo_conf_ { // this is a generic way to configure a servo, every multi type with a servo should use it int16_t min; // minimum value, must be more than 1020 with the current implementation int16_t max; // maximum value, must be less than 2000 with the current implementation int16_t middle; // default should be 1500 int8_t rate; // range [-100;+100] ; can be used to ajust a rate 0-100% and a direction }; typedef struct { pid_ pid[PIDITEMS]; uint8_t rcRate8; uint8_t rcExpo8; uint8_t rollPitchRate; uint8_t yawRate; uint8_t dynThrPID; uint8_t thrMid8; uint8_t thrExpo8; int16_t angleTrim[2]; #if defined(EXTENDED_AUX_STATES) uint32_t activate[CHECKBOXITEMS]; //Extended aux states define six different aux state for each aux channel #else uint16_t activate[CHECKBOXITEMS]; #endif uint8_t powerTrigger1; #if MAG int16_t mag_declination; #endif servo_conf_ servoConf[8]; #if defined(GYRO_SMOOTHING) uint8_t Smoothing[3]; #endif #if defined (FAILSAFE) int16_t failsafe_throttle; #endif #ifdef VBAT uint8_t vbatscale; uint8_t vbatlevel_warn1; uint8_t vbatlevel_warn2; uint8_t vbatlevel_crit; #endif #ifdef POWERMETER uint8_t pint2ma; #endif #ifdef POWERMETER_HARD uint16_t psensornull; #endif #ifdef MMGYRO uint8_t mmgyro; #endif #ifdef ARMEDTIMEWARNING uint16_t armedtimewarning; #endif int16_t minthrottle; #ifdef GOVERNOR_P int16_t governorP; int16_t governorD; #endif #ifdef YAW_COLL_PRECOMP uint8_t yawCollPrecomp; uint16_t yawCollPrecompDeadband; #endif uint8_t checksum; // MUST BE ON LAST POSITION OF CONF STRUCTURE ! } conf_t; #ifdef LOG_PERMANENT typedef struct { uint16_t arm; // #arm events uint16_t disarm; // #disarm events uint16_t start; // #powercycle/reset/initialize events uint32_t armed_time ; // copy of armedTime @ disarm uint32_t lifetime; // sum (armed) lifetime in seconds uint16_t failsafe; // #failsafe state @ disarm uint16_t i2c; // #i2c errs state @ disarm uint8_t running; // toggle on arm & disarm to monitor for clean shutdown vs. powercut uint8_t checksum; // MUST BE ON LAST POSITION OF CONF STRUCTURE ! } plog_t; #endif #if GPS // TODO: cross check with I2C gps and add relevant defines //This is the mode what is selected via the remote (NONE, HOLD, RTH and NAV (NAV-> exectute mission) enum gpsmode { GPS_MODE_NONE = 0, GPS_MODE_HOLD, GPS_MODE_RTH, GPS_MODE_NAV }; enum navstate { NAV_STATE_NONE = 0, NAV_STATE_RTH_START, NAV_STATE_RTH_ENROUTE, NAV_STATE_HOLD_INFINIT, NAV_STATE_HOLD_TIMED, NAV_STATE_WP_ENROUTE, NAV_STATE_PROCESS_NEXT, NAV_STATE_DO_JUMP, NAV_STATE_LAND_START, NAV_STATE_LAND_IN_PROGRESS, NAV_STATE_LANDED, NAV_STATE_LAND_SETTLE, NAV_STATE_LAND_START_DESCENT }; enum naverror { NAV_ERROR_NONE = 0, //All systems clear NAV_ERROR_TOOFAR, //Next waypoint distance is more than safety distance NAV_ERROR_SPOILED_GPS, //GPS reception is compromised - Nav paused - copter is adrift ! NAV_ERROR_WP_CRC, //CRC error reading WP data from EEPROM - Nav stopped NAV_ERROR_FINISH, //End flag detected, navigation finished NAV_ERROR_TIMEWAIT, //Waiting for poshold timer NAV_ERROR_INVALID_JUMP, //Invalid jump target detected, aborting NAV_ERROR_INVALID_DATA, //Invalid mission step action code, aborting, copter is adrift NAV_ERROR_WAIT_FOR_RTH_ALT, //Waiting to reach RTH Altitude NAV_ERROR_GPS_FIX_LOST, //Gps fix lost, aborting mission NAV_ERROR_DISARMED, //NAV engine disabled due disarm NAV_ERROR_LANDING //Landing }; typedef struct { uint8_t number; //Waypoint number int32_t pos[2]; //GPS position uint8_t action; //Action to follow int16_t parameter1; //Parameter for the action int16_t parameter2; //Parameter for the action int16_t parameter3; //Parameter for the action uint32_t altitude; //Altitude in cm (AGL) uint8_t flag; //flags the last wp and other fancy things that are not yet defined uint8_t checksum; //this must be at the last position } mission_step_struct; typedef struct { //Don't forget to change the reply size in GUI when change this struct; // on/off flags // First byte uint8_t filtering : 1; uint8_t lead_filter : 1; uint8_t dont_reset_home_at_arm : 1; uint8_t nav_controls_heading : 1; uint8_t nav_tail_first : 1; uint8_t nav_rth_takeoff_heading : 1; uint8_t slow_nav : 1; uint8_t wait_for_rth_alt : 1; // Second byte uint8_t ignore_throttle: 1; // Disable stick controls during mission and RTH uint8_t takeover_baro: 1; uint16_t wp_radius; // in cm uint16_t safe_wp_distance; // in meter uint16_t nav_max_altitude; // in meter uint16_t nav_speed_max; // in cm/s uint16_t nav_speed_min; // in cm/s uint8_t crosstrack_gain; // * 100 (0-2.56) uint16_t nav_bank_max; // degree * 100; (3000 default) uint16_t rth_altitude; // in meter uint8_t land_speed; // between 50 and 255 (100 approx = 50cm/sec) uint16_t fence; // fence control in meters uint8_t max_wp_number; uint8_t checksum; } gps_conf_struct; #endif #endif /* TYPES_H_ */