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> {