Skip to content

Commit dd8cf6e

Browse files
authored
Moreconfig (#14)
Move board hardware and other user options into myconfig Add ability to disable lamp if fitted but not used or wanted Disable the mjpg stream statistics output by default
1 parent ede61d4 commit dd8cf6e

File tree

6 files changed

+186
-128
lines changed

6 files changed

+186
-128
lines changed

app_httpd.cpp

Lines changed: 74 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "camera_index_ov2640.h"
2121
#include "camera_index_ov3660.h"
2222

23+
//#define DEBUG_STREAM_DATA // Debug: dump info for each stream frame on serial port
24+
2325
// Function+Globals needed for led and Lamp levels
2426
void flashLED(int flashtime);
2527
extern int lampVal; // The current Lamp value
@@ -88,20 +90,22 @@ static ra_filter_t * ra_filter_init(ra_filter_t * filter, size_t sample_size){
8890
return filter;
8991
}
9092

91-
static int ra_filter_run(ra_filter_t * filter, int value){
92-
if(!filter->values){
93-
return value;
94-
}
95-
filter->sum -= filter->values[filter->index];
96-
filter->values[filter->index] = value;
97-
filter->sum += filter->values[filter->index];
98-
filter->index++;
99-
filter->index = filter->index % filter->size;
100-
if (filter->count < filter->size) {
101-
filter->count++;
102-
}
103-
return filter->sum / filter->count;
104-
}
93+
#ifdef DEBUG_STREAM_DATA
94+
static int ra_filter_run(ra_filter_t * filter, int value) {
95+
if(!filter->values){
96+
return value;
97+
}
98+
filter->sum -= filter->values[filter->index];
99+
filter->values[filter->index] = value;
100+
filter->sum += filter->values[filter->index];
101+
filter->index++;
102+
filter->index = filter->index % filter->size;
103+
if (filter->count < filter->size) {
104+
filter->count++;
105+
}
106+
return filter->sum / filter->count;
107+
}
108+
#endif
105109

106110
static void rgb_print(dl_matrix3du_t *image_matrix, uint32_t color, const char * str){
107111
fb_data_t fb;
@@ -325,13 +329,17 @@ static esp_err_t stream_handler(httpd_req_t *req){
325329
uint8_t * _jpg_buf = NULL;
326330
char * part_buf[64];
327331
dl_matrix3du_t *image_matrix = NULL;
328-
bool detected = false;
329332
int face_id = 0;
330-
int64_t fr_start = 0;
331-
int64_t fr_ready = 0;
332-
int64_t fr_face = 0;
333-
int64_t fr_recognize = 0;
334-
int64_t fr_encode = 0;
333+
#ifdef DEBUG_STREAM_DATA
334+
bool detected = false;
335+
int64_t fr_start = 0;
336+
int64_t fr_face = 0;
337+
int64_t fr_recognize = 0;
338+
int64_t fr_encode = 0;
339+
int64_t fr_ready = 0;
340+
#endif
341+
342+
Serial.println("Stream started:");
335343

336344
flashLED(75); // little flash of status LED
337345

@@ -348,18 +356,22 @@ static esp_err_t stream_handler(httpd_req_t *req){
348356
httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*");
349357

350358
while(true){
351-
detected = false;
359+
#ifdef DEBUG_STREAM_DATA
360+
detected = false;
361+
#endif
352362
face_id = 0;
353363
fb = esp_camera_fb_get();
354364
if (!fb) {
355365
Serial.println("Camera capture failed");
356366
res = ESP_FAIL;
357367
} else {
358-
fr_start = esp_timer_get_time();
359-
fr_ready = fr_start;
360-
fr_face = fr_start;
361-
fr_encode = fr_start;
362-
fr_recognize = fr_start;
368+
#ifdef DEBUG_STREAM_DATA
369+
fr_start = esp_timer_get_time();
370+
fr_ready = fr_start;
371+
fr_face = fr_start;
372+
fr_encode = fr_start;
373+
fr_recognize = fr_start;
374+
#endif
363375
if(!detection_enabled || fb->width > 400){
364376
if(fb->format != PIXFORMAT_JPEG){
365377
bool jpeg_converted = frame2jpg(fb, 80, &_jpg_buf, &_jpg_buf_len);
@@ -385,20 +397,28 @@ static esp_err_t stream_handler(httpd_req_t *req){
385397
Serial.println("fmt2rgb888 failed");
386398
res = ESP_FAIL;
387399
} else {
388-
fr_ready = esp_timer_get_time();
400+
#ifdef DEBUG_STREAM_DATA
401+
fr_ready = esp_timer_get_time();
402+
#endif
389403
box_array_t *net_boxes = NULL;
390404
if(detection_enabled){
391405
net_boxes = face_detect(image_matrix, &mtmn_config);
392406
}
393-
fr_face = esp_timer_get_time();
394-
fr_recognize = fr_face;
407+
#ifdef DEBUG_STREAM_DATA
408+
fr_face = esp_timer_get_time();
409+
fr_recognize = fr_face;
410+
#endif
395411
if (net_boxes || fb->format != PIXFORMAT_JPEG){
396412
if(net_boxes){
397-
detected = true;
413+
#ifdef DEBUG_STREAM_DATA
414+
detected = true;
415+
#endif
398416
if(recognition_enabled){
399417
face_id = run_face_recognition(image_matrix, net_boxes);
400418
}
401-
fr_recognize = esp_timer_get_time();
419+
#ifdef DEBUG_STREAM_DATA
420+
fr_recognize = esp_timer_get_time();
421+
#endif
402422
draw_face_boxes(image_matrix, net_boxes, face_id);
403423
free(net_boxes->score);
404424
free(net_boxes->box);
@@ -415,7 +435,9 @@ static esp_err_t stream_handler(httpd_req_t *req){
415435
_jpg_buf = fb->buf;
416436
_jpg_buf_len = fb->len;
417437
}
418-
fr_encode = esp_timer_get_time();
438+
#ifdef DEBUG_STREAM_DATA
439+
fr_encode = esp_timer_get_time();
440+
#endif
419441
}
420442
dl_matrix3du_free(image_matrix);
421443
}
@@ -442,25 +464,26 @@ static esp_err_t stream_handler(httpd_req_t *req){
442464
if(res != ESP_OK){
443465
break;
444466
}
445-
int64_t fr_end = esp_timer_get_time();
446467

447-
int64_t ready_time = (fr_ready - fr_start)/1000;
448-
int64_t face_time = (fr_face - fr_ready)/1000;
449-
int64_t recognize_time = (fr_recognize - fr_face)/1000;
450-
int64_t encode_time = (fr_encode - fr_recognize)/1000;
451-
int64_t process_time = (fr_encode - fr_start)/1000;
452-
453-
int64_t frame_time = fr_end - last_frame;
454-
last_frame = fr_end;
455-
frame_time /= 1000;
456-
uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time);
457-
Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps), %u+%u+%u+%u=%u %s%d\n",
458-
(uint32_t)(_jpg_buf_len),
459-
(uint32_t)frame_time, 1000.0 / (uint32_t)frame_time,
460-
avg_frame_time, 1000.0 / avg_frame_time,
461-
(uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time,
462-
(detected)?"DETECTED ":"", face_id
463-
);
468+
#ifdef DEBUG_STREAM_DATA
469+
int64_t fr_end = esp_timer_get_time();
470+
int64_t ready_time = (fr_ready - fr_start)/1000;
471+
int64_t face_time = (fr_face - fr_ready)/1000;
472+
int64_t recognize_time = (fr_recognize - fr_face)/1000;
473+
int64_t encode_time = (fr_encode - fr_recognize)/1000;
474+
int64_t process_time = (fr_encode - fr_start)/1000;
475+
int64_t frame_time = fr_end - last_frame;
476+
last_frame = fr_end;
477+
frame_time /= 1000;
478+
uint32_t avg_frame_time = ra_filter_run(&ra_filter, frame_time);
479+
Serial.printf("MJPG: %uB %ums (%.1ffps), AVG: %ums (%.1ffps), %u+%u+%u+%u=%u %s%d\n",
480+
(uint32_t)(_jpg_buf_len),
481+
(uint32_t)frame_time, 1000.0 / (uint32_t)frame_time,
482+
avg_frame_time, 1000.0 / avg_frame_time,
483+
(uint32_t)ready_time, (uint32_t)face_time, (uint32_t)recognize_time, (uint32_t)encode_time, (uint32_t)process_time,
484+
(detected)?"DETECTED ":"", face_id
485+
);
486+
#endif
464487
}
465488

466489
last_frame = 0;
@@ -545,7 +568,7 @@ static esp_err_t cmd_handler(httpd_req_t *req){
545568
else if(!strcmp(variable, "lamp") && (lampVal != -1)) {
546569
Serial.print("Lamp: ");
547570
lampVal = val;
548-
if (lampVal > 100) lampVal = 100; // normalise 0-255 (pwm range) just in case..
571+
if (lampVal > 100) lampVal = 100; // normalise 0-255 (pwm range) just in case..f
549572
if (lampVal < 0 ) lampVal = 0;
550573
// https://diarmuid.ie/blog/pwm-exponential-led-fading-on-arduino-or-other-platforms
551574
int brightness = pow (2, (lampVal / lampR)) - 1;
@@ -605,7 +628,6 @@ static esp_err_t status_handler(httpd_req_t *req){
605628
p+=sprintf(p, "\"face_recognize\":%u,", recognition_enabled);
606629
p+=sprintf(p, "\"cam_name\":\"%s\",", myName);
607630
p+=sprintf(p, "\"code_ver\":\"%s\",", myVer);
608-
// Serial.printf("Status Rotate \"%s\"\n",myRotation);
609631
p+=sprintf(p, "\"rotate\":\"%s\"", myRotation);
610632
*p++ = '}';
611633
*p++ = 0;

camera_index_ov2640.h

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -521,25 +521,25 @@ const uint8_t index_ov2640_html[] PROGMEM = R"=====(
521521
</div>
522522
</div>
523523
<div class="input-group" id="hmirror-group">
524-
<label for="hmirror">H-Mirror</label>
524+
<label for="hmirror">H-Mirror Stream</label>
525525
<div class="switch">
526526
<input id="hmirror" type="checkbox" class="default-action" checked="checked">
527527
<label class="slider" for="hmirror"></label>
528528
</div>
529529
</div>
530530
<div class="input-group" id="vflip-group">
531-
<label for="vflip">V-Flip</label>
531+
<label for="vflip">V-Flip Stream</label>
532532
<div class="switch">
533533
<input id="vflip" type="checkbox" class="default-action" checked="checked">
534534
<label class="slider" for="vflip"></label>
535535
</div>
536536
</div>
537537
<div class="input-group" id="rotate-group">
538-
<label for="rotate">Rotate</label>
538+
<label for="rotate">Rotate in Browser</label>
539539
<select id="rotate" class="default-action">
540-
<option value="0" selected="selected">None</option>
541-
<option value="90">Rotate Right</option>
542-
<option value="-90">Rotate Left</option>
540+
<option value="90">90&deg; (Right)</option>
541+
<option value="0" selected="selected">0&deg; (None)</option>
542+
<option value="-90">-90&deg; (Left)</option>
543543
</select>
544544
</div>
545545
<div class="input-group" id="dcw-group">

camera_index_ov3660.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -541,11 +541,11 @@ const uint8_t index_ov3660_html[] PROGMEM = R"=====(
541541
</div>
542542
</div>
543543
<div class="input-group" id="rotate-group">
544-
<label for="rotate">Rotate</label>
545-
<select id="rotate" class="rotate-action">
546-
<option value="0" selected="selected">None</option>
547-
<option value="90">Rotate Right</option>
548-
<option value="-90">Rotate Left</option>
544+
<label for="rotate">Rotate in Browser</label>
545+
<select id="rotate" class="default-action">
546+
<option value="90">90&deg; (Right)</option>
547+
<option value="0" selected="selected">0&deg; (None)</option>
548+
<option value="-90">-90&deg; (Left)</option>
549549
</select>
550550
</div>
551551
<div class="input-group" id="bpc-group">
@@ -644,6 +644,8 @@ document.addEventListener('DOMContentLoaded', function (event) {
644644
const lampGroup = document.getElementById('lamp-group')
645645
const camName = document.getElementById('cam_name')
646646
const codeVer = document.getElementById('code_ver')
647+
const rotate = document.getElementById('rotate')
648+
647649

648650
if (updateRemote && initialValue !== value) {
649651
updateConfig(el);
@@ -671,6 +673,11 @@ document.addEventListener('DOMContentLoaded', function (event) {
671673
window.document.title = value;
672674
} else if(el.id === "code_ver"){
673675
codeVer.innerHTML = value;
676+
} else if(el.id === "rotate"){
677+
rotate.value = value;
678+
// setting value does not induce a onchange event
679+
// this sets the figure transform css values
680+
rotate.onchange();
674681
}
675682
}
676683
}

0 commit comments

Comments
 (0)