diff --git a/src/Control Tasks/CameraControlTask.cpp b/src/Control Tasks/CameraControlTask.cpp index 1e1eb4ed..fb8143c1 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 comanding photo and trigging capture + if (sfr::camera::start_progress < 8) { +#ifdef VERBOSE + Serial.println("photo triggered, delaying 100ms"); +#endif + sfr::camera::start_progress++; + } else if (!adaCam.takePicture()) { #ifdef VERBOSE Serial.println("Failed to snap!"); #endif @@ -206,7 +212,22 @@ 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 camera 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 + } + } + if (sfr::camera::images_written >= 2) { + sfr::camera::power_setting = (uint8_t)sensor_power_mode_type::off; + } } } } @@ -244,6 +265,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/MissionMode.cpp b/src/MissionMode.cpp index 161b87d9..acfc839c 100644 --- a/src/MissionMode.cpp +++ b/src/MissionMode.cpp @@ -20,7 +20,7 @@ void Boot::transition_to() void Boot::dispatch() { if (sfr::eeprom::time_alive >= sfr::boot::max_time) { - sfr::mission::current_mode = sfr::mission::aliveSignal; + sfr::mission::current_mode = sfr::mission::normalInSun; } } diff --git a/src/Monitors/ButtonMonitor.cpp b/src/Monitors/ButtonMonitor.cpp index 5d40cf67..548399ab 100644 --- a/src/Monitors/ButtonMonitor.cpp +++ b/src/Monitors/ButtonMonitor.cpp @@ -18,6 +18,10 @@ void ButtonMonitor::execute() fault_groups::hardware_faults::button->force(); } } else { - sfr::button::pressed = true; + if (sfr::mission::possible_uncovered) { + sfr::button::pressed = false; + } else { + sfr::button::pressed = true; + } } } \ No newline at end of file diff --git a/src/constants.hpp b/src/constants.hpp index 150876fe..db8aa6fb 100644 --- a/src/constants.hpp +++ b/src/constants.hpp @@ -86,10 +86,10 @@ 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; + constexpr int in_sun_val = 0; constexpr int min_temp_c = -100; constexpr int max_temp_c = 200; } // namespace temperature @@ -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 diff --git a/src/sfr.cpp b/src/sfr.cpp index d689a44d..115ba5cb 100644 --- a/src/sfr.cpp +++ b/src/sfr.cpp @@ -8,7 +8,7 @@ namespace sfr { } // namespace stabilization namespace boot { // OP Codes 1200 - SFRField max_time = SFRField(2 * constants::time::one_hour, 0x1200); + SFRField max_time = SFRField(5 * constants::time::one_minute, 0x1200); } // namespace boot namespace detumble { // OP Codes 1500 @@ -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); @@ -153,7 +153,7 @@ namespace sfr { SFRField last_downlink = SFRField(0, 0x2108); SFRField downlink_period = SFRField(20 * constants::time::one_minute, 0, 2 * constants::time::one_day, 0x2109); SFRField lp_downlink_period = SFRField(constants::time::one_hour, constants::time::one_second, 2 * constants::time::one_day, 0x2110); - SFRField transmit_downlink_period = SFRField(20 * constants::time::one_minute, constants::time::one_second, 2 * constants::time::one_day, 0x2111); + SFRField transmit_downlink_period = SFRField(5 * constants::time::one_minute, constants::time::one_second, 2 * constants::time::one_day, 0x2111); SFRField on_time = SFRField(35 * constants::time::one_minute, 0, constants::time::one_revolution, 0x2112); char buffer[constants::rockblock::buffer_size] = {0}; @@ -283,4 +283,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