diff --git a/src/lib.rs b/src/lib.rs
index 20b25be..fc17bcb 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,3 +1,5 @@
+// code updated from https://github.com/Kezii/esp32cam_rs/blob/master/src/espcam.rs
+
use std::marker::PhantomData;
use esp_idf_hal::gpio::*;
@@ -29,6 +31,16 @@ impl<'a> FrameBuffer<'a> {
pub fn timestamp(&self) -> camera::timeval {
unsafe { (*self.fb).timestamp }
}
+
+ pub fn fb_return(&self) {
+ unsafe { camera::esp_camera_fb_return(self.fb) }
+ }
+}
+
+impl Drop for FrameBuffer<'_> {
+ fn drop(&mut self) {
+ self.fb_return();
+ }
}
pub struct CameraSensor<'a> {
@@ -226,15 +238,19 @@ impl<'a> Camera<'a> {
pin_vsync: impl Peripheral
+ 'a,
pin_href: impl Peripheral
+ 'a,
pin_pclk: impl Peripheral
+ 'a,
+ pin_sda: impl Peripheral
+ 'a,
+ pin_scl: impl Peripheral
+ 'a,
+ pixel_format: camera::pixformat_t,
+ frame_size: camera::framesize_t,
) -> Result {
esp_idf_hal::into_ref!(
pin_pwdn, pin_xclk, pin_d0, pin_d1, pin_d2, pin_d3, pin_d4, pin_d5, pin_d6, pin_d7,
- pin_vsync, pin_href, pin_pclk
+ pin_vsync, pin_href, pin_pclk, pin_sda, pin_scl
);
let config = camera::camera_config_t {
pin_pwdn: pin_pwdn.pin(),
- pin_reset: 0xff, // https://github.com/Kezii/esp32cam_rs/blob/a716c0e3e2f62fc698456b6d370de55b77de42ca/src/espcam.rs#L251C24-L251C28
pin_xclk: pin_xclk.pin(),
+ pin_reset: 0xff,
pin_d0: pin_d0.pin(),
pin_d1: pin_d1.pin(),
@@ -252,13 +268,22 @@ impl<'a> Camera<'a> {
ledc_timer: esp_idf_sys::ledc_timer_t_LEDC_TIMER_0,
ledc_channel: esp_idf_sys::ledc_channel_t_LEDC_CHANNEL_0,
- pixel_format: camera::pixformat_t_PIXFORMAT_RGB565,
- frame_size: camera::framesize_t_FRAMESIZE_QVGA,
+ pixel_format,
+ frame_size,
jpeg_quality: 12,
fb_count: 1,
grab_mode: camera::camera_grab_mode_t_CAMERA_GRAB_WHEN_EMPTY,
+ fb_location: camera::camera_fb_location_t_CAMERA_FB_IN_PSRAM,
+
+ __bindgen_anon_1: camera::camera_config_t__bindgen_ty_1 {
+ pin_sccb_sda: pin_sda.pin(),
+ },
+ __bindgen_anon_2: camera::camera_config_t__bindgen_ty_2 {
+ pin_sccb_scl: pin_scl.pin(),
+ },
+
..Default::default()
};
@@ -268,14 +293,15 @@ impl<'a> Camera<'a> {
pub fn get_framebuffer(&self) -> Option {
let fb = unsafe { camera::esp_camera_fb_get() };
- return if fb.is_null() {
+ if fb.is_null() {
+ //unsafe { camera::esp_camera_fb_return(fb); }
None
} else {
Some(FrameBuffer {
fb,
_p: PhantomData,
})
- };
+ }
}
pub fn sensor(&self) -> CameraSensor<'a> {