Skip to content

Commit dd130c8

Browse files
committed
Improved the reliability of mode detection
1 parent 886d3f0 commit dd130c8

File tree

1 file changed

+30
-23
lines changed

1 file changed

+30
-23
lines changed

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

+30-23
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
#define SAMPLING_TIMEOUT_US 1000 // us
4040
#define RESAMPLING_THRESHOLD 2500 // us, 400Hz freq = 2500us period
4141
#define RESAMPLING_SWITCHING_THRESHOLD 200 // us
42-
#define MODE_CHANGE_DELAY 100 // ms
42+
#define MODE_CHANGE_DELAY 50 // ms
4343

4444
static const stm32_usart_t fsUSART = {
4545
.USARTx = FLYSKY_HALL_SERIAL_USART,
@@ -72,13 +72,14 @@ static void* _fs_usart_ctx = nullptr;
7272

7373
static volatile bool _fs_gimbal_detected;
7474
static uint8_t _fs_gimbal_version;
75-
static uint8_t _fs_gimbal_mode;
76-
static uint8_t _fs_gimbal_mode_change;
75+
static V2_GIMBAL_MODE _fs_gimbal_mode;
76+
static V2_GIMBAL_MODE _fs_gimbal_mode_change;
77+
static V2_GIMBAL_MODE _fs_gimbal_mode_detected;
7778
static uint32_t _fs_gimbal_last_mode_change_tick;
7879
static bool _fs_gimbal_cmd_finished;
7980
static uint32_t _fs_gimbal_lastReadTick;
8081
static uint32_t _fs_gimbal_readTick;
81-
static volatile uint32_t _fs_gimbal_sync_period;
82+
static uint32_t _fs_gimbal_sync_period;
8283

8384
static int _fs_get_byte(uint8_t* data)
8485
{
@@ -186,11 +187,6 @@ void _fs_cmd_start_read()
186187
_fs_send_cmd(0xc1, 0x00);
187188
}
188189

189-
bool _fs_sync_enabled()
190-
{
191-
return _fs_gimbal_detected && _fs_gimbal_version > GIMBAL_V1 && _fs_gimbal_mode != V1_MODE;
192-
}
193-
194190
static void flysky_gimbal_loop(void*)
195191
{
196192
uint8_t byte;
@@ -219,8 +215,6 @@ static void flysky_gimbal_loop(void*)
219215
uint16_t majorVersion = p_values[7];
220216
if (majorVersion == 2 && minorVersion >= 1) {
221217
_fs_gimbal_version = GIMBAL_V2;
222-
// Enable sync mode
223-
_fs_cmd_set_mode(SYNC_RESAMPLING);
224218
}
225219
} else if (HallProtocol.hallID.hall_Id.packetID == FLYSKY_PACKET_MODE_ID) {
226220
_fs_gimbal_cmd_finished = true;
@@ -252,6 +246,7 @@ bool flysky_gimbal_init()
252246
_fs_gimbal_detected = false;
253247
_fs_gimbal_version = GIMBAL_V1;
254248
_fs_gimbal_mode = V1_MODE;
249+
_fs_gimbal_mode_detected = V1_MODE;
255250
_fs_gimbal_last_mode_change_tick = 0;
256251
_fs_gimbal_cmd_finished = true;
257252
_fs_gimbal_lastReadTick = 0;
@@ -279,30 +274,42 @@ bool flysky_gimbal_init()
279274

280275
void flysky_gimbal_start_read()
281276
{
282-
if(_fs_sync_enabled()) {
277+
if(_fs_gimbal_detected && _fs_gimbal_version > GIMBAL_V1) {
283278
_fs_gimbal_lastReadTick = _fs_gimbal_readTick;
284279
_fs_gimbal_readTick = timersGetUsTick();
285280
if (_fs_gimbal_lastReadTick != 0) {
286281
_fs_gimbal_sync_period = _fs_gimbal_readTick - _fs_gimbal_lastReadTick;
287-
uint32_t tick = timersGetMsTick();
288-
if (tick - _fs_gimbal_last_mode_change_tick >= MODE_CHANGE_DELAY) {
289-
// Prevent mode change too often
290-
_fs_gimbal_last_mode_change_tick = tick;
291-
if (_fs_gimbal_mode == SYNC_SAMPLING && _fs_gimbal_sync_period < RESAMPLING_THRESHOLD) {
292-
_fs_cmd_set_mode(SYNC_RESAMPLING);
293-
} else if(_fs_gimbal_mode == SYNC_RESAMPLING && _fs_gimbal_sync_period >= RESAMPLING_THRESHOLD + RESAMPLING_SWITCHING_THRESHOLD) {
294-
_fs_cmd_set_mode(SYNC_SAMPLING);
282+
V2_GIMBAL_MODE newMode = _fs_gimbal_mode_detected;
283+
switch (_fs_gimbal_mode_detected) {
284+
case V1_MODE:
285+
case SYNC_SAMPLING:
286+
newMode = _fs_gimbal_sync_period < RESAMPLING_THRESHOLD ? SYNC_RESAMPLING : SYNC_SAMPLING;
287+
break;
288+
case SYNC_RESAMPLING:
289+
newMode = _fs_gimbal_sync_period >= RESAMPLING_THRESHOLD + RESAMPLING_SWITCHING_THRESHOLD ? SYNC_SAMPLING : SYNC_RESAMPLING;
290+
break;
291+
}
292+
if (_fs_gimbal_mode_detected != newMode) {
293+
_fs_gimbal_mode_detected = newMode;
294+
_fs_gimbal_last_mode_change_tick = timersGetMsTick();
295+
} else if (_fs_gimbal_mode != _fs_gimbal_mode_detected) {
296+
uint32_t tick = timersGetMsTick();
297+
if (tick - _fs_gimbal_last_mode_change_tick >= MODE_CHANGE_DELAY) {
298+
// Update mode when mode is stable
299+
_fs_cmd_set_mode(_fs_gimbal_mode_detected);
295300
}
296301
}
297302
}
298-
_fs_cmd_start_read();
303+
if (_fs_gimbal_mode != V1_MODE) {
304+
_fs_cmd_start_read();
305+
}
299306
}
300307
}
301308

302309
void flysky_gimbal_wait_completion()
303310
{
304-
if(_fs_sync_enabled()) {
305-
auto timeout = timersGetUsTick();
311+
if(_fs_gimbal_detected && _fs_gimbal_version > GIMBAL_V1 && _fs_gimbal_mode != V1_MODE) {
312+
auto timeout = timersGetUsTick();
306313
while(!_fs_gimbal_cmd_finished) {
307314
// busy wait
308315
if ((uint32_t)(timersGetUsTick() - timeout) >= SAMPLING_TIMEOUT_US) {

0 commit comments

Comments
 (0)