mirror of
https://github.com/okalachev/flix.git
synced 2026-01-10 21:16:50 +00:00
Add Rate class for running the code at fixed rate
This commit is contained in:
@@ -4,10 +4,10 @@
|
|||||||
// In-RAM logging
|
// In-RAM logging
|
||||||
|
|
||||||
#include "vector.h"
|
#include "vector.h"
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#define LOG_RATE 100
|
#define LOG_RATE 100
|
||||||
#define LOG_DURATION 10
|
#define LOG_DURATION 10
|
||||||
#define LOG_PERIOD 1.0 / LOG_RATE
|
|
||||||
#define LOG_SIZE LOG_DURATION * LOG_RATE
|
#define LOG_SIZE LOG_DURATION * LOG_RATE
|
||||||
|
|
||||||
Vector attitudeEuler;
|
Vector attitudeEuler;
|
||||||
@@ -46,9 +46,8 @@ void prepareLogData() {
|
|||||||
void logData() {
|
void logData() {
|
||||||
if (!armed) return;
|
if (!armed) return;
|
||||||
static int logPointer = 0;
|
static int logPointer = 0;
|
||||||
static float logTime = 0;
|
static Rate period(LOG_RATE);
|
||||||
if (t - logTime < LOG_PERIOD) return;
|
if (!period) return;
|
||||||
logTime = t;
|
|
||||||
|
|
||||||
prepareLogData();
|
prepareLogData();
|
||||||
|
|
||||||
|
|||||||
@@ -6,10 +6,11 @@
|
|||||||
#if WIFI_ENABLED
|
#if WIFI_ENABLED
|
||||||
|
|
||||||
#include <MAVLink.h>
|
#include <MAVLink.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
#define SYSTEM_ID 1
|
#define SYSTEM_ID 1
|
||||||
#define PERIOD_SLOW 1.0
|
#define MAVLINK_RATE_SLOW 1
|
||||||
#define PERIOD_FAST 0.1
|
#define MAVLINK_RATE_FAST 10
|
||||||
#define MAVLINK_CONTROL_YAW_DEAD_ZONE 0.1f
|
#define MAVLINK_CONTROL_YAW_DEAD_ZONE 0.1f
|
||||||
|
|
||||||
bool mavlinkConnected = false;
|
bool mavlinkConnected = false;
|
||||||
@@ -26,15 +27,12 @@ void processMavlink() {
|
|||||||
void sendMavlink() {
|
void sendMavlink() {
|
||||||
sendMavlinkPrint();
|
sendMavlinkPrint();
|
||||||
|
|
||||||
static float lastSlow = 0;
|
|
||||||
static float lastFast = 0;
|
|
||||||
|
|
||||||
mavlink_message_t msg;
|
mavlink_message_t msg;
|
||||||
uint32_t time = t * 1000;
|
uint32_t time = t * 1000;
|
||||||
|
|
||||||
if (t - lastSlow >= PERIOD_SLOW) {
|
static Rate slow(MAVLINK_RATE_SLOW), fast(MAVLINK_RATE_FAST);
|
||||||
lastSlow = t;
|
|
||||||
|
|
||||||
|
if (slow) {
|
||||||
mavlink_msg_heartbeat_pack(SYSTEM_ID, MAV_COMP_ID_AUTOPILOT1, &msg, MAV_TYPE_QUADROTOR, MAV_AUTOPILOT_GENERIC,
|
mavlink_msg_heartbeat_pack(SYSTEM_ID, MAV_COMP_ID_AUTOPILOT1, &msg, MAV_TYPE_QUADROTOR, MAV_AUTOPILOT_GENERIC,
|
||||||
(armed ? MAV_MODE_FLAG_SAFETY_ARMED : 0) |
|
(armed ? MAV_MODE_FLAG_SAFETY_ARMED : 0) |
|
||||||
((mode == STAB) ? MAV_MODE_FLAG_STABILIZE_ENABLED : 0) |
|
((mode == STAB) ? MAV_MODE_FLAG_STABILIZE_ENABLED : 0) |
|
||||||
@@ -49,9 +47,7 @@ void sendMavlink() {
|
|||||||
sendMessage(&msg);
|
sendMessage(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (t - lastFast >= PERIOD_FAST && mavlinkConnected) {
|
if (fast && mavlinkConnected) {
|
||||||
lastFast = t;
|
|
||||||
|
|
||||||
const float zeroQuat[] = {0, 0, 0, 0};
|
const float zeroQuat[] = {0, 0, 0, 0};
|
||||||
mavlink_msg_attitude_quaternion_pack(SYSTEM_ID, MAV_COMP_ID_AUTOPILOT1, &msg,
|
mavlink_msg_attitude_quaternion_pack(SYSTEM_ID, MAV_COMP_ID_AUTOPILOT1, &msg,
|
||||||
time, attitude.w, attitude.x, -attitude.y, -attitude.z, rates.x, -rates.y, -rates.z, zeroQuat); // convert to frd
|
time, attitude.w, attitude.x, -attitude.y, -attitude.z, rates.x, -rates.y, -rates.z, zeroQuat); // convert to frd
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
// Parameters storage in flash memory
|
// Parameters storage in flash memory
|
||||||
|
|
||||||
#include <Preferences.h>
|
#include <Preferences.h>
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
extern float channelZero[16];
|
extern float channelZero[16];
|
||||||
extern float channelMax[16];
|
extern float channelMax[16];
|
||||||
@@ -118,10 +119,9 @@ bool setParameter(const char *name, const float value) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void syncParameters() {
|
void syncParameters() {
|
||||||
static float lastSync = 0;
|
static Rate rate(1);
|
||||||
if (t - lastSync < 1) return; // sync once per second
|
if (!rate) return; // sync once per second
|
||||||
if (motorsActive()) return; // don't use flash while flying, it may cause a delay
|
if (motorsActive()) return; // don't use flash while flying, it may cause a delay
|
||||||
lastSync = t;
|
|
||||||
|
|
||||||
for (auto ¶meter : parameters) {
|
for (auto ¶meter : parameters) {
|
||||||
if (parameter.value == *parameter.variable) continue;
|
if (parameter.value == *parameter.variable) continue;
|
||||||
|
|||||||
20
flix/util.h
20
flix/util.h
@@ -50,20 +50,34 @@ void splitString(String& str, String& token0, String& token1, String& token2) {
|
|||||||
token2 = strtok(NULL, "");
|
token2 = strtok(NULL, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Rate limiter
|
||||||
|
class Rate {
|
||||||
|
public:
|
||||||
|
float rate;
|
||||||
|
float last = 0;
|
||||||
|
Rate(float rate) : rate(rate) {}
|
||||||
|
|
||||||
|
operator bool() {
|
||||||
|
if (t - last >= 1 / rate) {
|
||||||
|
last = t;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Delay filter for boolean signals - ensures the signal is on for at least 'delay' seconds
|
// Delay filter for boolean signals - ensures the signal is on for at least 'delay' seconds
|
||||||
class Delay {
|
class Delay {
|
||||||
public:
|
public:
|
||||||
float delay;
|
float delay;
|
||||||
float start = NAN;
|
float start = NAN;
|
||||||
|
|
||||||
Delay(float delay) : delay(delay) {}
|
Delay(float delay) : delay(delay) {}
|
||||||
|
|
||||||
bool update(bool on) {
|
bool update(bool on) {
|
||||||
if (!on) {
|
if (!on) {
|
||||||
start = NAN;
|
start = NAN;
|
||||||
return false;
|
return false;
|
||||||
}
|
} else if (isnan(start)) {
|
||||||
if (isnan(start)) {
|
|
||||||
start = t;
|
start = t;
|
||||||
}
|
}
|
||||||
return t - start >= delay;
|
return t - start >= delay;
|
||||||
|
|||||||
Reference in New Issue
Block a user