Skip to content

Commit f355ef2

Browse files
authored
Merge pull request #594 from RaceMiata/dvr-start-stop
Fix DVR start/stop logic
2 parents 725bce0 + 9eae0ee commit f355ef2

7 files changed

Lines changed: 52 additions & 17 deletions

File tree

src/core/dvr.c

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,15 @@
1919
#include "util/system.h"
2020

2121
bool dvr_is_recording = false;
22+
bool record_pending = false;
2223

2324
static time_t dvr_recording_start = 0;
2425
static pthread_mutex_t dvr_mutex;
2526

2627
///////////////////////////////////////////////////////////////////
2728
//-1=error;
2829
// 0=idle,1=recording,2=stopped,3=No SD card,4=recorf file path error,
29-
// 5=SD card Full,6=Encoder error
30+
// 5=SD card Full,6=Encoder error,7=Open Record File Failed
3031
void dvr_update_status() {
3132
pthread_mutex_lock(&dvr_mutex);
3233
if (dvr_is_recording) {
@@ -39,7 +40,8 @@ void dvr_update_status() {
3940
if (ret != 1) {
4041
dvr_is_recording = false;
4142
system_script(REC_STOP);
42-
sleep(2); // wait for record process
43+
record_pending = false;
44+
sleep(2); // wait for record process
4345
}
4446
}
4547
pthread_mutex_unlock(&dvr_mutex);
@@ -313,16 +315,11 @@ static void dvr_update_record_conf() {
313315
void dvr_cmd(osd_dvr_cmd_t cmd) {
314316
LOGI("dvr_cmd: sdcard=%d, recording=%d, cmd=%d", g_sdcard_enable, dvr_is_recording, cmd);
315317

316-
if (!g_sdcard_enable)
317-
return;
318-
319-
pthread_mutex_lock(&dvr_mutex);
320-
321318
bool start_rec = dvr_is_recording;
322319

323320
switch (cmd) {
324321
case DVR_TOGGLE:
325-
start_rec = !dvr_is_recording;
322+
start_rec = !dvr_is_recording && !record_pending;
326323
break;
327324
case DVR_STOP:
328325
start_rec = false;
@@ -332,14 +329,26 @@ void dvr_cmd(osd_dvr_cmd_t cmd) {
332329
break;
333330
}
334331

332+
if (!g_sdcard_enable) {
333+
record_pending = start_rec;
334+
return;
335+
}
336+
337+
pthread_mutex_lock(&dvr_mutex);
338+
335339
if (start_rec) {
336340
if (!dvr_is_recording && !sdcard_is_full()) {
337341
dvr_update_record_conf();
338-
dvr_is_recording = true;
339-
usleep(100 * 1000);
340-
system_script(REC_START);
341-
dvr_recording_start = time(NULL);
342-
sleep(2); // wait for record process
342+
if (g_sdcard_ready) {
343+
dvr_is_recording = true;
344+
record_pending = false;
345+
usleep(100 * 1000);
346+
system_script(REC_START);
347+
dvr_recording_start = time(NULL);
348+
sleep(2); // wait for record process
349+
} else {
350+
record_pending = true;
351+
}
343352
}
344353
} else {
345354
if (dvr_is_recording) {

src/core/dvr.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ typedef enum {
1616
} osd_dvr_cmd_t;
1717

1818
extern bool dvr_is_recording;
19+
extern bool record_pending;
1920

2021
void dvr_update_status();
2122
void dvr_select_audio_source(uint8_t audio_source);

src/core/elrs.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -349,10 +349,23 @@ void msp_process_packet() {
349349
if (g_app_state == APP_STATE_VIDEO) {
350350
record_state = packet.payload[0] == 0 ? 1 : 2;
351351
uint32_t delay = packet.payload[1] | (uint32_t)packet.payload[2] << 8;
352-
if (delay == 0)
352+
if (delay == 0) {
353+
record_time = 0;
353354
dvr_cmd(record_state);
354-
else
355-
record_time = time(NULL) + delay;
355+
}
356+
else {
357+
switch (record_state) {
358+
case DVR_STOP:
359+
if (!dvr_is_recording && !record_pending) {
360+
// discard "timer off" if dvr not already started
361+
record_time = 0;
362+
break;
363+
}
364+
// fall thru' if dvr started
365+
case DVR_START:
366+
record_time = time(NULL) + delay;
367+
}
368+
}
356369
}
357370
} break;
358371
case MSP_GET_VRX_MODE:

src/core/osd.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ void osd_rec_show(bool bShow) {
174174
return;
175175
}
176176

177-
if (!g_sdcard_enable) {
177+
if (!g_sdcard_enable || !g_sdcard_ready) {
178178
osd_resource_path(buf, "%s", is_fhd, noSdcard_bmp);
179179
lv_img_set_src(g_osd_hdzero.sd_rec[is_fhd], buf);
180180
lv_obj_clear_flag(g_osd_hdzero.sd_rec[is_fhd], LV_OBJ_FLAG_HIDDEN);

src/core/thread.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,24 +49,34 @@ static void detect_sdcard(void) {
4949
// repair is not currently executing.
5050
if (ok_to_execute) {
5151
g_sdcard_enable = sdcard_mounted();
52+
if (!g_sdcard_enable)
53+
g_sdcard_ready = false;
5254

5355
// General Runtime behavior
5456
if (-1 == g_bootup_sdcard_state) {
57+
g_sdcard_ready = true;
5558
if ((g_sdcard_enable && !sdcard_enable_last) || g_sdcard_det_req) {
5659
sdcard_update_free_size();
5760
g_sdcard_det_req = 0;
61+
g_sdcard_ready = false;
5862
}
5963

6064
// Only repair sd card when inserted
6165
if (sdcard_init_scan && g_sdcard_enable) {
6266
if (sdcard_ready_cb) {
6367
sdcard_ready_cb();
68+
g_sdcard_ready = false;
6469
}
6570
sdcard_init_scan = false;
6671
} else if (!g_sdcard_enable && sdcard_enable_last) {
72+
g_sdcard_ready = false;
6773
sdcard_init_scan = true;
6874
}
6975

76+
if (record_pending && g_sdcard_ready && !sdcard_is_full()) {
77+
dvr_cmd(DVR_START);
78+
}
79+
7080
sdcard_enable_last = g_sdcard_enable;
7181
}
7282
// SDCard detected at bootup

src/ui/page_common.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
///////////////////////////////////////////////////////////////////////////////
1212
bool g_sdcard_enable = false;
13+
bool g_sdcard_ready = false;
1314
bool g_sdcard_det_req = false;
1415
bool g_autoscan_exit = true;
1516
bool g_scanning = false;

src/ui/page_common.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ enum {
135135
typedef uint8_t lv_menu_builder_variant_t;
136136

137137
extern bool g_sdcard_enable;
138+
extern bool g_sdcard_ready;
138139
extern bool g_sdcard_det_req;
139140
extern bool g_autoscan_exit;
140141
extern bool g_scanning;

0 commit comments

Comments
 (0)