From 3a2194842b37967d049127ff1ffe9f09eb262994 Mon Sep 17 00:00:00 2001 From: dhacks541 <46331701+dhacks541@users.noreply.github.com> Date: Sun, 9 Mar 2025 20:53:00 -0400 Subject: [PATCH 1/3] add second ODS capture + delayed first ODS capture --- src/Control Tasks/CameraControlTask.cpp | 25 +++++++++++++++++++++++-- src/constants.hpp | 8 ++++---- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/src/Control Tasks/CameraControlTask.cpp b/src/Control Tasks/CameraControlTask.cpp index 1e1eb4ed..b30e1e39 100644 --- a/src/Control Tasks/CameraControlTask.cpp +++ b/src/Control Tasks/CameraControlTask.cpp @@ -155,7 +155,13 @@ void CameraControlTask::execute() // handle taking and storing photos if (sfr::camera::take_photo == true && sfr::camera::powered == true) { - if (!adaCam.takePicture()) { + // extra 200ms delay between commanding photo and triggering capture + if (sfr::camera::start_progress < 8) { + sfr::camera::start_progress++; +#ifdef VERBOSE + Serial.println("Photo triggered, delaying additional 100ms"); +#endif + } else if (!adaCam.takePicture()) { #ifdef VERBOSE Serial.println("Failed to snap!"); #endif @@ -206,7 +212,21 @@ void CameraControlTask::execute() #ifdef VERBOSE Serial.println("Done writing file"); #endif - sfr::camera::power_setting = (uint8_t)sensor_power_mode_type::off; + if (sfr::camera::images_written == 1) { + if (!adaCam.resumeVideo()) { +#ifdef VERBOSE + Serial.println("Failed to resume ODS frame!"); +#endif + sfr::camera::power_setting = (uint8_t)sensor_power_mode_type::off; + } else { + sfr::camera::take_photo = true; +#ifdef VERBOSE + Serial.println("Triggering second activation of optical sensor"); +#endif + } + } else { + sfr::camera::power_setting = (uint8_t)sensor_power_mode_type::off; + } } } } @@ -244,6 +264,7 @@ void CameraControlTask::camera_shutdown() pinMode(constants::camera::tx, OUTPUT); Pins::setPinState(constants::camera::rx, LOW); Pins::setPinState(constants::camera::tx, LOW); + sfr::camera::start_progress = 0; // if SD.begin succeeds but camera is never able to snap, reduce SD card power consumption File file = SD.open("-", FILE_WRITE); diff --git a/src/constants.hpp b/src/constants.hpp index 150876fe..74ceddf5 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -86,7 +86,7 @@ namespace constants { constexpr uint16_t fault_opcode_max = 0x6100; } // namespace opcodes - } // namespace rockblock + } // namespace rockblock namespace temperature { constexpr int pin = 39; constexpr int in_sun_val = 30; @@ -98,7 +98,7 @@ namespace constants { constexpr float in_sun_val = 70; // mA constexpr int load = 30; // load resister value (kOhm) constexpr float shunt = 0.1; // shunt resistor value (Ohm) - } // namespace current + } // namespace current namespace masks { constexpr uint32_t uint32_byte1_mask = 0b11111111000000000000000000000000; constexpr uint32_t uint32_byte2_mask = 0b00000000111111110000000000000000; @@ -248,7 +248,7 @@ namespace constants { } // namespace battery namespace camera { constexpr int power_on_pin = 31; - constexpr int content_length = 64; + constexpr int content_length = 80; constexpr int bytes_allocated_fragment = 4; constexpr int tx = 34; constexpr int rx = 33; @@ -304,6 +304,6 @@ namespace constants { namespace watchdog { constexpr uint32_t max_period_ms = 10000; } // namespace watchdog -}; // namespace constants +}; // namespace constants #endif \ No newline at end of file From e7935351c26b8db6000ee755008eb1b9d813746f Mon Sep 17 00:00:00 2001 From: dhacks541 <46331701+dhacks541@users.noreply.github.com> Date: Tue, 11 Mar 2025 21:25:11 -0400 Subject: [PATCH 2/3] move capture delay to sfr --- src/Control Tasks/CameraControlTask.cpp | 4 ++-- src/sfr.cpp | 5 +++-- src/sfr.hpp | 3 ++- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Control Tasks/CameraControlTask.cpp b/src/Control Tasks/CameraControlTask.cpp index b30e1e39..de5d44b7 100644 --- a/src/Control Tasks/CameraControlTask.cpp +++ b/src/Control Tasks/CameraControlTask.cpp @@ -155,8 +155,8 @@ void CameraControlTask::execute() // handle taking and storing photos if (sfr::camera::take_photo == true && sfr::camera::powered == true) { - // extra 200ms delay between commanding photo and triggering capture - if (sfr::camera::start_progress < 8) { + // extra delay (200 ms default) between commanding photo and triggering capture + if (sfr::camera::start_progress < (sfr::camera::delay_count + 6)) { sfr::camera::start_progress++; #ifdef VERBOSE Serial.println("Photo triggered, delaying additional 100ms"); diff --git a/src/sfr.cpp b/src/sfr.cpp index d689a44d..378a011e 100644 --- a/src/sfr.cpp +++ b/src/sfr.cpp @@ -17,7 +17,7 @@ namespace sfr { SFRField max_stable_gyro_y = SFRField((0.2 * constants::imu::sfr_resolution), 0x1502, constants::imu::sfr_resolution); // rad/s SFRField min_unstable_gyro_x = SFRField((0.7 * constants::imu::sfr_resolution), 0x1503, constants::imu::sfr_resolution); // rad/s SFRField min_unstable_gyro_y = SFRField((0.7 * constants::imu::sfr_resolution), 0x1504, constants::imu::sfr_resolution); // rad/s - } // namespace detumble + } // namespace detumble namespace aliveSignal { // OP Codes 1600 SFRField downlinked = SFRField(false, 0x1600); @@ -139,6 +139,7 @@ namespace sfr { SFRField fragment_number_requested = SFRField(0, 0x2016); SFRField power_start_time = SFRField(0, 0x2017); SFRField power_time = SFRField(400, 0x2018); + SFRField delay_count = SFRField(2, 0x2019); } // namespace camera namespace rockblock { // OP Codes 2100 @@ -283,4 +284,4 @@ namespace sfr { SFRField dynamic_data_age = SFRField(0, 0x2809); SFRField sfr_data_age = SFRField(0, 0x2810); } // namespace eeprom -}; // namespace sfr \ No newline at end of file +}; // namespace sfr \ No newline at end of file diff --git a/src/sfr.hpp b/src/sfr.hpp index 404fc20d..0919a129 100644 --- a/src/sfr.hpp +++ b/src/sfr.hpp @@ -159,6 +159,7 @@ namespace sfr { extern SFRField fragment_number_requested; extern SFRField power_start_time; extern SFRField power_time; + extern SFRField delay_count; } // namespace camera namespace rockblock { // OP Codes 2100 @@ -286,6 +287,6 @@ namespace sfr { extern SFRField dynamic_data_age; extern SFRField sfr_data_age; } // namespace eeprom -}; // namespace sfr +}; // namespace sfr #endif \ No newline at end of file From be9306a577bf346734e316ab802073cdd4b7684c Mon Sep 17 00:00:00 2001 From: dhacks541 <46331701+dhacks541@users.noreply.github.com> Date: Thu, 13 Mar 2025 10:16:46 -0400 Subject: [PATCH 3/3] update eeprom constant --- src/constants.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/constants.hpp b/src/constants.hpp index 74ceddf5..6954e21c 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -293,7 +293,7 @@ namespace constants { static constexpr unsigned int dynamic_data_start = 10; static constexpr unsigned int sfr_data_start = 460; static constexpr unsigned int sfr_store_size = 5; - static constexpr unsigned int sfr_num_fields = 92; + static constexpr unsigned int sfr_num_fields = 93; static constexpr unsigned int sfr_data_full_offset = sfr_num_fields * sfr_store_size + 4; static constexpr unsigned int write_age_limit = 95000; // Must be less than 100000