Skip to content

Commit efbf763

Browse files
Add check if data fast is running fast enough
1 parent fd8bb4b commit efbf763

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

main/system/data_fast.c

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ static struct
2727

2828
char ext_err_msg[128];
2929
biodyn_df_err_t ext_err;
30+
double max_read_delay_before_err;
3031
} data_fast = {
3132
.data_cnt = IMU_DATA_CNT,
3233
.data_ptr = 0,
3334
.read_task = NULL,
3435
.data_mutex = NULL,
3536
.ext_err = BIODYN_DATAFAST_OK,
37+
.max_read_delay_before_err = 15,
3638
};
3739

3840
static esp_err_t collect_err(biodyn_timesync_err_t err, const char *msg, esp_err_t code);
@@ -41,12 +43,26 @@ void read_task(void *usr_data)
4143
{
4244
TickType_t last_wake_time = xTaskGetTickCount();
4345
// This is the fastest we can go without gptimer or increasing tick rate
44-
const TickType_t period = pdMS_TO_TICKS(10);
46+
const TickType_t period = pdMS_TO_TICKS(10);
4547

4648
for (;;)
4749
{
50+
ts_ticker_t tick_before = biodyn_time_sync_get_ticker();
4851
data_fast_read();
4952
vTaskDelayUntil(&last_wake_time, period);
53+
54+
// Ensure we're reading fast enough
55+
ts_ticker_t tick_after = biodyn_time_sync_get_ticker();
56+
double read_time_ms = ts_ticker_t_to_ms(tick_after - tick_before);
57+
if (read_time_ms > data_fast.max_read_delay_before_err)
58+
{
59+
data_fast.ext_err |= BIODYN_DATAFAST_RUNNING_TOO_SLOW;
60+
snprintf(data_fast.ext_err_msg, sizeof(data_fast.ext_err_msg),
61+
"DataFast trying to run at %.1lfms, instead is %.1lfms",
62+
data_fast.max_read_delay_before_err, read_time_ms);
63+
} else {
64+
data_fast.ext_err &= ~BIODYN_DATAFAST_RUNNING_TOO_SLOW;
65+
}
5066
}
5167
}
5268

@@ -76,6 +92,7 @@ esp_err_t biodyn_data_fast_init()
7692

7793
esp_err_t biodyn_data_fast_self_test()
7894
{
95+
7996
return biodyn_data_fast_has_error() ? -1 : ESP_OK;
8097
}
8198

@@ -99,7 +116,7 @@ void data_fast_read()
99116
imu_motion_data data;
100117
biodyn_imu_icm20948_read_accel_gyro_mag(&data);
101118

102-
// Take mutex
119+
// Take mutex
103120
if (xSemaphoreTake(data_fast.data_mutex, portMAX_DELAY))
104121
{
105122
data_fast.data_ptr += 1;
@@ -129,7 +146,7 @@ void ble_data_fast_packed(uint16_t *size, void *out)
129146
}
130147
}
131148

132-
static esp_err_t collect_err(biodyn_timesync_err_t err, const char *msg, esp_err_t code)
149+
static esp_err_t collect_err(biodyn_df_err_t err, const char *msg, esp_err_t code)
133150
{
134151
data_fast.ext_err |= err;
135152
snprintf(data_fast.ext_err_msg, sizeof(data_fast.ext_err_msg), "%s %x", msg, code);

main/system/data_fast.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ typedef uint32_t biodyn_df_err_t;
2525
#define BIODYN_DATAFAST_OK 0x0
2626
#define BIODYN_DATAFAST_COULDNT_CREATE_TASK 0x1
2727
#define BIODYN_DATAFAST_TOO_MUCH_DATA 0x2
28-
#define BIODYN_DATAFAST_COULDNT_CREATE_MUTEX 0x2
28+
#define BIODYN_DATAFAST_COULDNT_CREATE_MUTEX 0x4
29+
#define BIODYN_DATAFAST_RUNNING_TOO_SLOW 0x8
2930

3031
#endif // BIODYN_DATA_FAST_H

main/system/time_sync.c

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,4 +136,14 @@ void ble_time_sync_rtt_write(uint16_t size, void *src)
136136

137137
memcpy(&time_sync.rtt, src, sizeof(ts_ticker_t));
138138
ESP_LOGI(TAG, "Wrote new RTT: %lld", time_sync.rtt);
139-
}
139+
}
140+
141+
double ts_ticker_t_to_ms(ts_ticker_t t)
142+
{
143+
return (double)t / 1000.0;
144+
}
145+
146+
ts_ticker_t ms_to_ts_ticker_t(double ms)
147+
{
148+
return (ts_ticker_t)(ms * 1000.0);
149+
}

main/system/time_sync.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ esp_err_t biodyn_time_sync_self_test();
1212
bool time_sync_has_error();
1313
const char *time_sync_get_error();
1414

15+
double ts_ticker_t_to_ms(ts_ticker_t t);
16+
ts_ticker_t ms_to_ts_ticker_t(double ms);
17+
1518
// BLE callbacks
1619
void ble_time_sync_ticker_read(uint16_t *size, void *out);
1720
void ble_time_sync_ticker_write(uint16_t size, void *src);

0 commit comments

Comments
 (0)