Skip to content

Commit 13e2b89

Browse files
committed
Added logic for auto sampling mode change based on sampling frequency
1 parent f76edbf commit 13e2b89

File tree

2 files changed

+52
-28
lines changed

2 files changed

+52
-28
lines changed

radio/src/targets/common/arm/stm32/flysky_gimbal_driver.cpp

Lines changed: 50 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@
3636

3737
#include <string.h>
3838

39-
#define SAMPLING_TIMEOUT_US 500
39+
#define SAMPLING_TIMEOUT_US 1000 // us
40+
#define RESAMPLING_THRESHOLD 2500 // us, 400Hz freq = 2500us period
41+
#define RESAMPLING_SWITCHING_THRESHOLD 200 // us
42+
#define MODE_CHANGE_DELAY 100 // ms
4043

4144
static const stm32_usart_t fsUSART = {
4245
.USARTx = FLYSKY_HALL_SERIAL_USART,
@@ -68,13 +71,14 @@ static uint8_t _fs_hall_command[8] __DMA;
6871
static void* _fs_usart_ctx = nullptr;
6972

7073
static volatile bool _fs_gimbal_detected;
71-
static uint8_t _fs_gimbal_version = GIMBAL_V1;
72-
static uint8_t _fs_gimbal_mode = V1_MODE;
73-
static uint8_t _fs_gimbal_mode_cmd = V1_MODE;
74-
static bool _fs_gimbal_read_finished = true;
75-
static uint32_t _fs_lastReadTick = 0;
76-
static uint32_t _fs_readTick;
77-
static uint32_t _fs_sync_period = 0;
74+
static uint8_t _fs_gimbal_version;
75+
static uint8_t _fs_gimbal_mode;
76+
static uint8_t _fs_gimbal_mode_change;
77+
static uint32_t _fs_gimbal_last_mode_change_tick;
78+
static bool _fs_gimbal_cmd_finished;
79+
static uint32_t _fs_gimbal_lastReadTick;
80+
static uint32_t _fs_gimbal_readTick;
81+
static volatile uint32_t _fs_gimbal_sync_period;
7882

7983
static int _fs_get_byte(uint8_t* data)
8084
{
@@ -146,6 +150,11 @@ static void _fs_parse(STRUCT_HALL *hallBuffer, unsigned char ch)
146150

147151
void _fs_send_cmd(uint8_t id, uint8_t payload)
148152
{
153+
if (!_fs_gimbal_cmd_finished) {
154+
// Skip command when last command not finished
155+
return;
156+
}
157+
149158
_fs_hall_command[0] = FLYSKY_HALL_PROTOLO_HEAD;
150159
_fs_hall_command[1] = id;
151160
_fs_hall_command[2] = 0x01;
@@ -156,7 +165,9 @@ void _fs_send_cmd(uint8_t id, uint8_t payload)
156165
_fs_hall_command[4] = crc & 0xff;
157166
_fs_hall_command[5] = crc >>8 & 0xff ;
158167

168+
_fs_gimbal_cmd_finished = false;
159169
STM32SerialDriver.sendBuffer(_fs_usart_ctx, _fs_hall_command, 6);
170+
// TRACE("Flysky Gimbal: Sent command, id = %d, payload = %d", id, payload);
160171
}
161172

162173
void _fs_cmd_get_version()
@@ -166,12 +177,7 @@ void _fs_cmd_get_version()
166177

167178
void _fs_cmd_set_mode(V2_GIMBAL_MODE mode)
168179
{
169-
if (_fs_gimbal_mode != _fs_gimbal_mode_cmd) {
170-
// Last command not responsed yet
171-
return;
172-
}
173-
174-
_fs_gimbal_mode_cmd = mode;
180+
_fs_gimbal_mode_change = mode;
175181
_fs_send_cmd(0x41, mode);
176182
}
177183

@@ -202,12 +208,13 @@ static void flysky_gimbal_loop(void*)
202208
case TRANSFER_DIR_RFMODULE:
203209
int16_t* p_values = (int16_t*)HallProtocol.data;
204210
if (HallProtocol.hallID.hall_Id.packetID == FLYSKY_PACKET_CHANNEL_ID) {
211+
_fs_gimbal_cmd_finished = true;
205212
uint16_t* adcValues = getAnalogValues();
206213
for (uint8_t i = 0; i < 4; i++) {
207214
adcValues[i] = FLYSKY_OFFSET_VALUE - p_values[i];
208215
}
209-
_fs_gimbal_read_finished = true;
210216
} else if (HallProtocol.hallID.hall_Id.packetID == FLYSKY_PACKET_VERSION_ID) {
217+
_fs_gimbal_cmd_finished = true;
211218
uint16_t minorVersion = p_values[6];
212219
uint16_t majorVersion = p_values[7];
213220
if (majorVersion == 2 && minorVersion >= 1) {
@@ -216,7 +223,9 @@ static void flysky_gimbal_loop(void*)
216223
_fs_cmd_set_mode(SYNC_RESAMPLING);
217224
}
218225
} else if (HallProtocol.hallID.hall_Id.packetID == FLYSKY_PACKET_MODE_ID) {
219-
_fs_gimbal_mode = _fs_gimbal_mode_cmd;
226+
_fs_gimbal_cmd_finished = true;
227+
_fs_gimbal_mode = _fs_gimbal_mode_change;
228+
TRACE("Flysky Gimbal: Mode changed successfully, mode = %d", _fs_gimbal_mode);
220229
}
221230
break;
222231
}
@@ -242,7 +251,15 @@ bool flysky_gimbal_init(bool force)
242251
.polarity = ETX_Pol_Normal,
243252
};
244253

254+
// Init variables
245255
_fs_gimbal_detected = force;
256+
_fs_gimbal_version = GIMBAL_V1;
257+
_fs_gimbal_mode = V1_MODE;
258+
_fs_gimbal_last_mode_change_tick = 0;
259+
_fs_gimbal_cmd_finished = true;
260+
_fs_gimbal_lastReadTick = 0;
261+
_fs_gimbal_sync_period = 0;
262+
246263
_fs_usart_ctx = STM32SerialDriver.init(REF_STM32_SERIAL_PORT(FSGimbal), &cfg);
247264
STM32SerialDriver.setIdleCb(_fs_usart_ctx, flysky_gimbal_loop, 0);
248265

@@ -266,26 +283,33 @@ bool flysky_gimbal_init(bool force)
266283
void flysky_gimbal_start_read()
267284
{
268285
if(_fs_sync_enabled()) {
269-
if (_fs_gimbal_read_finished) {
270-
_fs_gimbal_read_finished = false;
271-
_fs_lastReadTick = _fs_readTick;
272-
_fs_readTick = timersGetUsTick();
273-
if (_fs_lastReadTick != 0) {
274-
_fs_sync_period = _fs_readTick - _fs_lastReadTick;
286+
_fs_gimbal_lastReadTick = _fs_gimbal_readTick;
287+
_fs_gimbal_readTick = timersGetUsTick();
288+
if (_fs_gimbal_lastReadTick != 0) {
289+
_fs_gimbal_sync_period = _fs_gimbal_readTick - _fs_gimbal_lastReadTick;
290+
uint32_t tick = timersGetMsTick();
291+
if (tick - _fs_gimbal_last_mode_change_tick >= MODE_CHANGE_DELAY) {
292+
// Prevent mode change too often
293+
_fs_gimbal_last_mode_change_tick = tick;
294+
if (_fs_gimbal_mode == SYNC_SAMPLING && _fs_gimbal_sync_period < RESAMPLING_THRESHOLD) {
295+
_fs_cmd_set_mode(SYNC_RESAMPLING);
296+
} else if(_fs_gimbal_mode == SYNC_RESAMPLING && _fs_gimbal_sync_period >= RESAMPLING_THRESHOLD + RESAMPLING_SWITCHING_THRESHOLD) {
297+
_fs_cmd_set_mode(SYNC_SAMPLING);
298+
}
275299
}
276-
_fs_cmd_start_read();
277-
}
300+
}
301+
_fs_cmd_start_read();
278302
}
279303
}
280304

281305
void flysky_gimbal_wait_completion()
282306
{
283307
if(_fs_sync_enabled()) {
284308
auto timeout = timersGetUsTick();
285-
while(!_fs_gimbal_read_finished) {
309+
while(!_fs_gimbal_cmd_finished) {
286310
// busy wait
287311
if ((uint32_t)(timersGetUsTick() - timeout) >= SAMPLING_TIMEOUT_US) {
288-
TRACE("Gimbal timeout");
312+
// TRACE("Gimbal timeout");
289313
return;
290314
}
291315
}

radio/src/tasks/mixer_task.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,10 +255,10 @@ void doMixerCalculations()
255255
DEBUG_TIMER_STOP(debugTimerGetAdc);
256256

257257
// Need to put all in a group to ensure DMA transfer will not affect ADC sampling
258-
#if defined(FLYSKY_GIMBAL)
258+
#if defined(FLYSKY_GIMBAL) && !defined(SIMU)
259259
flysky_gimbal_start_read();
260260
#endif
261-
#if defined(FLYSKY_GIMBAL)
261+
#if defined(FLYSKY_GIMBAL) && !defined(SIMU)
262262
flysky_gimbal_wait_completion();
263263
#endif
264264

0 commit comments

Comments
 (0)