Skip to content

Commit 77682ac

Browse files
committed
[module-dreameye] Improved preview and frame sync.
1 parent dc33aaa commit 77682ac

5 files changed

Lines changed: 160 additions & 107 deletions

File tree

include/drivers/dreameye.h

Lines changed: 33 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,25 @@ typedef struct dreameye_state_ext {
8282
/** \brief Frame capture callback. */
8383
dreameye_frame_cb callback;
8484

85+
/** \brief Last frame request time in NS */
86+
uint64_t last_request;
87+
8588
} dreameye_state_ext_t;
8689

90+
typedef struct dreameye_preview {
91+
92+
int isp_mode;
93+
int bpp;
94+
95+
int fullscreen;
96+
int scale;
97+
int x;
98+
int y;
99+
100+
dreameye_frame_cb callback;
101+
102+
} dreameye_preview_t;
103+
87104

88105
/** \brief Read/write CMOS Image Sensor registers. */
89106
#define DREAMEYE_COND_REG_CIS 0x00
@@ -131,7 +148,6 @@ typedef struct dreameye_state_ext {
131148
Dreameye as the dev parameter.
132149
133150
\param dev The device to get an image from.
134-
\param fb_num The frame buffer number to download.
135151
\param data A pointer to a buffer to store things in. This
136152
will be allocated by the function and you are
137153
responsible for freeing the data when you are done.
@@ -140,56 +156,60 @@ typedef struct dreameye_state_ext {
140156
\retval MAPLE_EOK On success.
141157
\retval MAPLE_EFAIL On error.
142158
*/
143-
int dreameye_get_video_frame(maple_device_t *dev, uint8_t fb_num, uint8_t **data, int *img_sz);
159+
int dreameye_get_video_frame(maple_device_t *dev, uint8_t **data, int *img_sz);
144160

161+
/** \brief Request a captured frame from the Dreameye.
162+
*
163+
*/
164+
int dreameye_req_video_frame(maple_device_t *dev);
145165

146166
/** \brief Get params from any subsystem
147167
* TODO
148168
*/
149169
int dreameye_get_param(maple_device_t *dev, uint8_t param, uint8_t arg, uint16_t *value);
150170

151171
/** \brief Set params for any subsystem
152-
* TODO
172+
*
153173
*/
154174
int dreameye_set_param(maple_device_t *dev, uint8_t param, uint8_t arg, uint16_t value);
155175

156176
/** \brief Add to queue params for any subsystem
157-
* TODO
177+
*
158178
*/
159179
int dreameye_queue_param(maple_device_t *dev, uint8_t param, uint8_t arg, uint16_t value);
160180

161181
/** \brief Setup CIS and ISP regs for video capturing
162-
* TODO
182+
*
163183
*/
164184
int dreameye_setup_video_camera(maple_device_t *dev, int isp_mode, int format);
165185

166186
/** \brief Stop video capture
167-
* TODO
187+
*
168188
*/
169189
int dreameye_stop_video_camera(maple_device_t *dev);
170190

171191
/** \brief Initialize preview
172-
* TODO
192+
*
173193
*/
174-
int dreameye_preview_init(maple_device_t *dev, int isp_mode, int fullscreen, int scale, int x, int y);
194+
int dreameye_preview_init(maple_device_t *dev, dreameye_preview_t *params);
175195

176196
/** \brief Shutdown preview
177-
* TODO
197+
*
178198
*/
179-
void dreameye_preview_shutdown(void);
199+
void dreameye_preview_shutdown(maple_device_t *dev);
180200

181201
/** \brief Start frames capturing
182-
* TODO
202+
*
183203
*/
184204
int dreameye_start_capturing(maple_device_t *dev, dreameye_frame_cb cb);
185205

186206
/** \brief Stop frames capturing
187-
* TODO
207+
*
188208
*/
189209
int dreameye_stop_capturing(maple_device_t *dev);
190210

191211
/** \brief Polling device
192-
* TODO
212+
*
193213
*/
194214
int dreameye_poll(maple_device_t *dev);
195215

modules/dreameye/dreameye.c

Lines changed: 39 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* DreamShell ##version##
22
33
dreameye.c - dreameye driver addons
4-
Copyright (C) 2015, 2023 SWAT
4+
Copyright (C) 2015, 2023, 2024 SWAT
55
66
*/
77

@@ -24,7 +24,7 @@
2424
#define JANGGU_FMT_YUYV422 ((0 << 1) | (0 << 6))
2525
#define JANGGU_FMT_UNK24BPP ((1 << 1) | (1 << 6))
2626
#define JANGGU_FMT_UNK32BPP ((1 << 1) | (0 << 6))
27-
#define JANGGU_FMT_UNK7 ((1 << 7))
27+
#define JANGGU_FMT_UNK7 (1 << 7)
2828

2929
// #define MAPLE_SPEED_2MBPS 0x0000
3030
#define MAPLE_SPEED_1MBPS 0x0100
@@ -155,49 +155,6 @@ static dreameye_register_t ic_regs[85] = {
155155
};
156156

157157

158-
void hexDump(char *desc, void *addr, int len) {
159-
int i;
160-
unsigned char buff[17];
161-
unsigned char *pc = (unsigned char*)addr;
162-
163-
// Output description if given.
164-
if (desc != NULL)
165-
dbglog(DBG_DEBUG, "%s:\n", desc);
166-
167-
// Process every byte in the data.
168-
for (i = 0; i < len; i++) {
169-
// Multiple of 16 means new line (with line offset).
170-
171-
if ((i % 16) == 0) {
172-
// Just don't print ASCII for the zeroth line.
173-
if (i != 0)
174-
dbglog(DBG_DEBUG, " %s\n", buff);
175-
176-
// Output the offset.
177-
dbglog(DBG_DEBUG, " %04x ", i);
178-
}
179-
180-
// Now the hex code for the specific character.
181-
dbglog(DBG_DEBUG, " %02x", pc[i]);
182-
183-
// And store a printable ASCII character for later.
184-
if ((pc[i] < 0x20) || (pc[i] > 0x7e))
185-
buff[i % 16] = '.';
186-
else
187-
buff[i % 16] = pc[i];
188-
buff[(i % 16) + 1] = '\0';
189-
}
190-
191-
// Pad out last line if not exactly 16 characters.
192-
while ((i % 16) != 0) {
193-
dbglog(DBG_DEBUG, " ");
194-
i++;
195-
}
196-
197-
// And print the final ASCII bit.
198-
dbglog(DBG_DEBUG, " %s\n", buff);
199-
}
200-
201158
static void yuv420de_to_nv21(uint8_t *dest, const uint8_t *src, int width, int height) {
202159
int w, h;
203160

@@ -304,8 +261,6 @@ static void dreameye_get_video_frame_cb(maple_frame_t *frame) {
304261
respbuf32 = (uint32_t *)resp->data;
305262
respbuf8 = (uint8_t *)resp->data;
306263

307-
// hexDump("resp", resp->data, resp->data_len * 4);
308-
309264
if(resp->response != MAPLE_RESPONSE_DATATRF) {
310265
first_state->img_transferring = -1;
311266
return;
@@ -366,17 +321,18 @@ static void dreameye_get_video_frame_cb(maple_frame_t *frame) {
366321
first_state->img_transferring = -1;
367322
} else {
368323
first_state->img_transferring = 0;
324+
first_state->last_request = timer_ns_gettime64();
325+
/* FIXME: Better framebuffers sync */
326+
if(first_state->width >= 320) {
327+
timer_spin_sleep(10);
328+
}
329+
else {
330+
timer_spin_sleep(2);
331+
}
369332
}
370333
return;
371334
}
372335

373-
/* FIXME: Very stupid things right here, but it's sync frames */
374-
if(first_state->width == 320)
375-
timer_spin_sleep(1);
376-
else
377-
timer_spin_sleep(2);
378-
/* End of FIXME */
379-
380336
if(--first_state->img_transferring == 1) {
381337
dreameye_get_video_frame_part(frame->dev);
382338
}
@@ -411,19 +367,18 @@ static int dreameye_send_get_video_frame(maple_device_t *dev, dreameye_state_ext
411367
return MAPLE_EOK;
412368
}
413369

414-
int dreameye_get_video_frame(maple_device_t *dev, uint8_t fb_num, uint8_t **data,
415-
int *img_sz) {
416-
dreameye_state_ext_t *de;
370+
int dreameye_req_video_frame(maple_device_t *dev) {
417371

418372
assert(dev != NULL);
419373
assert(dev->unit == 1);
420374

375+
dreameye_state_ext_t *de;
421376
de = (dreameye_state_ext_t *)dev->status;
422377
first_state = de;
423378

424379
de->img_transferring = 1;
425380
de->img_size = 0;
426-
de->img_number = fb_num;
381+
de->img_number ^= 1;
427382

428383
if(de->compressed) {
429384
de->transfer_count = de->frame_size / JANGGU_FRAME_DATA_SIZE_COMPRESSED;
@@ -439,7 +394,30 @@ int dreameye_get_video_frame(maple_device_t *dev, uint8_t fb_num, uint8_t **data
439394
goto fail;
440395
}
441396

442-
dreameye_get_video_frame_part(dev);
397+
if(dreameye_get_video_frame_part(dev) != MAPLE_EOK) {
398+
goto fail;
399+
}
400+
401+
return MAPLE_EOK;
402+
403+
fail:
404+
first_state = NULL;
405+
de->img_transferring = 0;
406+
de->img_buf = NULL;
407+
de->img_size = 0;
408+
de->transfer_count = 0;
409+
410+
return MAPLE_EFAIL;
411+
}
412+
413+
int dreameye_get_video_frame(maple_device_t *dev, uint8_t **data, int *img_sz) {
414+
415+
dreameye_state_ext_t *de;
416+
de = (dreameye_state_ext_t *)dev->status;
417+
418+
if(!de->img_transferring) {
419+
dreameye_req_video_frame(dev);
420+
}
443421

444422
while(de->img_transferring > 0) {
445423
thd_pass();
@@ -462,7 +440,6 @@ int dreameye_get_video_frame(maple_device_t *dev, uint8_t fb_num, uint8_t **data
462440
free(de->img_buf);
463441
}
464442

465-
fail:
466443
*data = NULL;
467444
*img_sz = 0;
468445
first_state = NULL;
@@ -508,11 +485,9 @@ static void dreameye_get_param_cb(maple_frame_t *frame) {
508485
assert((resp->data_len) == 3);
509486
assert(respbuf8[4] == 0xD0);
510487
assert(respbuf8[5] == 0x00);
511-
// assert(respbuf8[8] == DREAMEYE_GETCOND_***);
512488

513489
/* Update the data in the status. */
514490
de = (dreameye_state_ext_t *)frame->dev->status;
515-
// hexDump("getparam", respbuf8, 12);
516491
de->value = respbuf8[10] | respbuf8[11] << 8;
517492
}
518493

@@ -586,8 +561,6 @@ static void dreameye_queue_param_cb(maple_frame_t *frame) {
586561
dbglog(DBG_ERROR, "%s: bad response: %d\n", __func__, resp->response);
587562
return;
588563
}
589-
590-
// hexDump("setparam", respbuf8, 12);
591564
}
592565

593566
int dreameye_queue_param(maple_device_t *dev, uint8_t param, uint8_t arg, uint16_t value) {
@@ -725,6 +698,8 @@ static int dreameye_set_format(maple_device_t **devs, int isp_mode, int format)
725698

726699
de->format = format;
727700
de->compressed = (pix_fmt & JANGGU_FMT_UNCOMPRESSED) ? 0 : 1;
701+
de->img_number = 1;
702+
de->last_request = 0;
728703

729704
/* Set ISP operation mode */
730705
dreameye_set_param(devs[0], DREAMEYE_COND_REG_ISP, ISP_OP_MODE, isp_mode);

modules/dreameye/exports.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ include drivers/dreameye.h
44
dreameye_get_param
55
dreameye_set_param
66
dreameye_queue_param
7+
dreameye_req_video_frame
78
dreameye_get_video_frame
89
dreameye_setup_video_camera
910
dreameye_stop_video_camera

modules/dreameye/module.c

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,15 +107,24 @@ int builtin_dreameye_cmd(int argc, char *argv[]) {
107107

108108
if(show) {
109109
ds_printf("DS_PROCESS: Initializing preview\n");
110-
if (dreameye_preview_init(dreameye, isp, 1, 1, 0, 0) < 0) {
110+
dreameye_preview_t p = {
111+
.isp_mode = isp,
112+
.bpp = 12,
113+
.fullscreen = 1,
114+
.scale = 1,
115+
.x = 0,
116+
.y = 0,
117+
.callback = NULL
118+
};
119+
if (dreameye_preview_init(dreameye, &p) < 0) {
111120
return CMD_ERROR;
112121
}
113122
return CMD_OK;
114123
}
115124

116125
if(hide) {
117126
ds_printf("DS_PROCESS: Shutting down preview\n");
118-
dreameye_preview_shutdown();
127+
dreameye_preview_shutdown(dreameye);
119128
return CMD_OK;
120129
}
121130

0 commit comments

Comments
 (0)