1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-25 01:05:21 +03:00

refactoring

implemented beeper muting in simulator mode
implemented debug output in simulator mode
adjusted MSP_SIMULATOR command id
implemented battery emulation in simulator mode
This commit is contained in:
Roman Lut 2022-06-26 02:20:22 +03:00
parent c5d32983aa
commit 1f41db14a5
7 changed files with 88 additions and 48 deletions

View file

@ -27,6 +27,7 @@
#include "drivers/pwm_mapping.h" #include "drivers/pwm_mapping.h"
#include "drivers/pwm_output.h" #include "drivers/pwm_output.h"
#include "fc/config.h" #include "fc/config.h"
#include "fc/runtime_config.h"
#include "sound_beeper.h" #include "sound_beeper.h"
@ -45,6 +46,10 @@ void systemBeep(bool onoff)
UNUSED(onoff); UNUSED(onoff);
#else #else
if (simulatorData.flags & SIMU_MUTE_BEEPER) {
onoff = false;
}
if (beeperConfig()->pwmMode) { if (beeperConfig()->pwmMode) {
pwmWriteBeeper(onoff); pwmWriteBeeper(onoff);
beeperState = onoff; beeperState = onoff;

View file

@ -3421,61 +3421,73 @@ bool mspFCProcessInOutCommand(uint16_t cmdMSP, sbuf_t *dst, sbuf_t *src, mspResu
if (tmp_u8 != 1) break; if (tmp_u8 != 1) break;
tmp_u8 = sbufReadU8(src); tmp_u8 = sbufReadU8(src);
if (tmp_u8 & 1) { if ((tmp_u8 & SIMU_ENABLE) == 0) {
if (!ARMING_FLAG(SIMULATOR_MODE)) { DISABLE_ARMING_FLAG(SIMULATOR_MODE);
baroStartCalibration(); // just once baroStartCalibration(); // just once
simulatorData.flags = 0;
}
else {
simulatorData.flags = tmp_u8;
if (!ARMING_FLAG(SIMULATOR_MODE)) {
baroStartCalibration(); // just once
ENABLE_ARMING_FLAG(SIMULATOR_MODE); ENABLE_ARMING_FLAG(SIMULATOR_MODE);
LOG_D(SYSTEM, "Simulator enabled");
} }
} else {
DISABLE_ARMING_FLAG(SIMULATOR_MODE);
baroStartCalibration(); // just once
}
if (dataSize >= 14) {
#ifdef USE_GPS
gpsSol.fixType = sbufReadU8(src);
gpsSol.hdop = gpsSol.fixType == GPS_NO_FIX ? 9999 : 100;
gpsSol.flags.hasNewData = true;
gpsSol.flags.validVelNE = 0;
gpsSol.flags.validVelD = 0;
gpsSol.flags.validEPE = 0;
gpsSol.numSat = sbufReadU8(src);
gpsSol.llh.lat = sbufReadU32(src);
gpsSol.llh.lon = sbufReadU32(src);
gpsSol.llh.alt = sbufReadU32(src);
gpsSol.groundSpeed = sbufReadU16(src);
gpsSol.groundCourse = sbufReadU16(src);
gpsSol.velNED[X] = gpsSol.groundSpeed * cos_approx(DECIDEGREES_TO_RADIANS(gpsSol.groundCourse));
gpsSol.velNED[Y] = gpsSol.groundSpeed * sin_approx(DECIDEGREES_TO_RADIANS(gpsSol.groundCourse));
gpsSol.velNED[Z] = 0;
gpsSol.eph = 100;
gpsSol.epv = 100;
// Feed data to navigation
gpsProcessNewSolutionData();
#endif
attitude.values.roll = sbufReadU16(src)-1800;
attitude.values.pitch = sbufReadU16(src)-1800;
attitude.values.yaw = sbufReadU16(src);
acc.accADCf[X] = (float)sbufReadU16(src) / 1000 - 32;// / GRAVITY_CMSS; if (dataSize >= 14) {
acc.accADCf[Y] = (float)sbufReadU16(src) / 1000 - 32;// / GRAVITY_CMSS; gpsSol.fixType = sbufReadU8(src);
acc.accADCf[Z] = (float)sbufReadU16(src) / 1000 - 32;// / GRAVITY_CMSS; gpsSol.hdop = gpsSol.fixType == GPS_NO_FIX ? 9999 : 100;
gpsSol.flags.hasNewData = true;
gpsSol.flags.validVelNE = 0;
gpsSol.flags.validVelD = 0;
gpsSol.flags.validEPE = 0;
gpsSol.numSat = sbufReadU8(src);
gpsSol.llh.lat = sbufReadU32(src);
gpsSol.llh.lon = sbufReadU32(src);
gpsSol.llh.alt = sbufReadU32(src);
gpsSol.groundSpeed = sbufReadU16(src);
gpsSol.groundCourse = sbufReadU16(src);
gpsSol.velNED[X] = gpsSol.groundSpeed * cos_approx(DECIDEGREES_TO_RADIANS(gpsSol.groundCourse));
gpsSol.velNED[Y] = gpsSol.groundSpeed * sin_approx(DECIDEGREES_TO_RADIANS(gpsSol.groundCourse));
gpsSol.velNED[Z] = 0;
gpsSol.eph = 100;
gpsSol.epv = 100;
// Feed data to navigation
gpsProcessNewSolutionData();
gyro.gyroADCf[X] = (float)sbufReadU16(src) / 100 - 320; attitude.values.roll = sbufReadU16(src) - 1800;
gyro.gyroADCf[Y] = (float)sbufReadU16(src) / 100 - 320; attitude.values.pitch = sbufReadU16(src) - 1800;
gyro.gyroADCf[Z] = (float)sbufReadU16(src) / 100 - 320; attitude.values.yaw = sbufReadU16(src);
baro.baroPressure = sbufReadU32(src); acc.accADCf[X] = (float)sbufReadU16(src) / 1000 - 32;// / GRAVITY_CMSS;
} else { acc.accADCf[Y] = (float)sbufReadU16(src) / 1000 - 32;// / GRAVITY_CMSS;
DISABLE_STATE(GPS_FIX); acc.accADCf[Z] = (float)sbufReadU16(src) / 1000 - 32;// / GRAVITY_CMSS;
}
sbufWriteU16(dst, input[INPUT_STABILIZED_ROLL] + 500); gyro.gyroADCf[X] = (float)sbufReadU16(src) / 100 - 320;
sbufWriteU16(dst, input[INPUT_STABILIZED_PITCH] + 500); gyro.gyroADCf[Y] = (float)sbufReadU16(src) / 100 - 320;
sbufWriteU16(dst, input[INPUT_STABILIZED_YAW] + 500); gyro.gyroADCf[Z] = (float)sbufReadU16(src) / 100 - 320;
sbufWriteU16(dst, input[INPUT_STABILIZED_THROTTLE] + 500);
mspWriteSimulatorOSD(dst); baro.baroPressure = sbufReadU32(src);
}
else {
DISABLE_STATE(GPS_FIX);
}
sbufWriteU16(dst, input[INPUT_STABILIZED_ROLL] + 500);
sbufWriteU16(dst, input[INPUT_STABILIZED_PITCH] + 500);
sbufWriteU16(dst, input[INPUT_STABILIZED_YAW] + 500);
sbufWriteU16(dst, input[INPUT_STABILIZED_THROTTLE] + 500);
simulatorData.debugIndex++;
if (simulatorData.debugIndex == 8){
simulatorData.debugIndex = 0;
}
sbufWriteU8(dst, simulatorData.debugIndex);
sbufWriteU32(dst, debug[simulatorData.debugIndex]);
mspWriteSimulatorOSD(dst);
}
*ret = MSP_RESULT_ACK; *ret = MSP_RESULT_ACK;
break; break;
default: default:

View file

@ -176,3 +176,5 @@ flightModeForTelemetry_e getFlightModeForTelemetry(void)
return STATE(AIRMODE_ACTIVE) ? FLM_ACRO_AIR : FLM_ACRO; return STATE(AIRMODE_ACTIVE) ? FLM_ACRO_AIR : FLM_ACRO;
} }
simulatorData_t simulatorData = { flags: 0, debugIndex: 0 };

View file

@ -165,6 +165,20 @@ typedef enum {
flightModeForTelemetry_e getFlightModeForTelemetry(void); flightModeForTelemetry_e getFlightModeForTelemetry(void);
typedef enum {
SIMU_ENABLE = (1 << 0),
SIMU_SIMULATE_BATTERY = (1 << 1),
SIMU_MUTE_BEEPER = (1 << 2)
} simulatorFlags_t;
typedef struct {
simulatorFlags_t flags;
uint8_t debugIndex;
} simulatorData_t;
extern simulatorData_t simulatorData;
uint32_t enableFlightMode(flightModeFlags_e mask); uint32_t enableFlightMode(flightModeFlags_e mask);
uint32_t disableFlightMode(flightModeFlags_e mask); uint32_t disableFlightMode(flightModeFlags_e mask);

View file

@ -288,7 +288,6 @@
#define MSP_DEBUGMSG 253 //out message debug string buffer #define MSP_DEBUGMSG 253 //out message debug string buffer
#define MSP_DEBUG 254 //out message debug1,debug2,debug3,debug4 #define MSP_DEBUG 254 //out message debug1,debug2,debug3,debug4
#define MSP_V2_FRAME 255 //MSPv2 payload indicator #define MSP_V2_FRAME 255 //MSPv2 payload indicator
#define MSP_SIMULATOR 256 //inout Set simulator state
// Additional commands that are not compatible with MultiWii // Additional commands that are not compatible with MultiWii
#define MSP_STATUS_EX 150 //out message cycletime, errors_count, CPU load, sensor present etc #define MSP_STATUS_EX 150 //out message cycletime, errors_count, CPU load, sensor present etc

View file

@ -53,6 +53,8 @@
#define MSP2_INAV_SET_TEMP_SENSOR_CONFIG 0x201D #define MSP2_INAV_SET_TEMP_SENSOR_CONFIG 0x201D
#define MSP2_INAV_TEMPERATURES 0x201E #define MSP2_INAV_TEMPERATURES 0x201E
#define MSP_SIMULATOR 0x201F
#define MSP2_INAV_SERVO_MIXER 0x2020 #define MSP2_INAV_SERVO_MIXER 0x2020
#define MSP2_INAV_SET_SERVO_MIXER 0x2021 #define MSP2_INAV_SET_SERVO_MIXER 0x2021
#define MSP2_INAV_LOGIC_CONDITIONS 0x2022 #define MSP2_INAV_LOGIC_CONDITIONS 0x2022

View file

@ -291,6 +291,12 @@ static void updateBatteryVoltage(timeUs_t timeDelta, bool justConnected)
break; break;
} }
if (simulatorData.flags & SIMU_SIMULATE_BATTERY) {
vbat = 1260;
batteryFullVoltage = 1210;
batteryWarningVoltage = 1020;
batteryCriticalVoltage = 960;
}
if (justConnected) { if (justConnected) {
pt1FilterReset(&vbatFilterState, vbat); pt1FilterReset(&vbatFilterState, vbat);
} else { } else {