From acd0b4d934a9717896d1a9078a003273f4ba0f39 Mon Sep 17 00:00:00 2001 From: Cindy Li Date: Tue, 22 Jun 2021 12:09:00 -0400 Subject: [PATCH 1/5] Create modules skeleton for new app structure (#382) * Add modules and main.cpp skeleton * Fix typos --- rover-apps/arm/CMakeLists.txt | 4 +- rover-apps/arm/include/AppConfig.h | 9 ++++ rover-apps/common/CMakeLists.txt | 0 rover-apps/common/include/Module.h | 10 +++++ rover-apps/common/src/main.cpp | 59 ++++++++++++++++++++++++++ rover-apps/gimbal/CMakeLists.txt | 4 +- rover-apps/gimbal/include/AppConfig.h | 9 ++++ rover-apps/science/CMakeLists.txt | 4 +- rover-apps/science/include/AppConfig.h | 9 ++++ 9 files changed, 102 insertions(+), 6 deletions(-) create mode 100644 rover-apps/arm/include/AppConfig.h create mode 100644 rover-apps/common/CMakeLists.txt create mode 100644 rover-apps/common/include/Module.h create mode 100644 rover-apps/common/src/main.cpp create mode 100644 rover-apps/gimbal/include/AppConfig.h create mode 100644 rover-apps/science/include/AppConfig.h diff --git a/rover-apps/arm/CMakeLists.txt b/rover-apps/arm/CMakeLists.txt index 24b7cee21..d0c03ca76 100644 --- a/rover-apps/arm/CMakeLists.txt +++ b/rover-apps/arm/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable(arm) -target_sources(arm PRIVATE src/main.cpp) -target_include_directories(arm PUBLIC include) +target_sources(arm PRIVATE ../common/src/main.cpp) +target_include_directories(arm PUBLIC include ../common/include) target_link_libraries(arm PRIVATE #Control diff --git a/rover-apps/arm/include/AppConfig.h b/rover-apps/arm/include/AppConfig.h new file mode 100644 index 000000000..32f1383b4 --- /dev/null +++ b/rover-apps/arm/include/AppConfig.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#include "Module.h" + +std::vector gModules = { + // put modules here +}; diff --git a/rover-apps/common/CMakeLists.txt b/rover-apps/common/CMakeLists.txt new file mode 100644 index 000000000..e69de29bb diff --git a/rover-apps/common/include/Module.h b/rover-apps/common/include/Module.h new file mode 100644 index 000000000..8df2b8cf8 --- /dev/null +++ b/rover-apps/common/include/Module.h @@ -0,0 +1,10 @@ +#pragma once + +class Module { + public: + virtual void periodic_10s(void) = 0; + virtual void periodic_1s(void) = 0; + virtual void periodic_100ms(void) = 0; + virtual void periodic_10ms(void) = 0; + virtual void periodic_1ms(void) = 0; +}; diff --git a/rover-apps/common/src/main.cpp b/rover-apps/common/src/main.cpp new file mode 100644 index 000000000..c60173cfb --- /dev/null +++ b/rover-apps/common/src/main.cpp @@ -0,0 +1,59 @@ +#include "AppConfig.h" +#include "mbed.h" + +Thread periodic_10s_thread(osPriorityNormal1); +Thread periodic_1s_thread(osPriorityNormal2); +Thread periodic_100ms_thread(osPriorityNormal3); +Thread periodic_10ms_thread(osPriorityNormal4); +Thread periodic_1ms_thread(osPriorityNormal5); + +void periodic_10s(void) { + auto startTime = Kernel::Clock::now(); + for (Module* module : gModules) { + module->periodic_10s(); + } + ThisThread::sleep_until(startTime + 10s); +} + +void periodic_1s(void) { + auto startTime = Kernel::Clock::now(); + for (Module* module : gModules) { + module->periodic_1s(); + } + ThisThread::sleep_until(startTime + 1s); +} + +void periodic_100ms(void) { + auto startTime = Kernel::Clock::now(); + for (Module* module : gModules) { + module->periodic_100ms(); + } + ThisThread::sleep_until(startTime + 100ms); +} + +void periodic_10ms(void) { + auto startTime = Kernel::Clock::now(); + for (Module* module : gModules) { + module->periodic_10ms(); + } + ThisThread::sleep_until(startTime + 10ms); +} + +void periodic_1ms(void) { + auto startTime = Kernel::Clock::now(); + for (Module* module : gModules) { + module->periodic_1ms(); + } + ThisThread::sleep_until(startTime + 1ms); +} + +int main() { + periodic_1ms_thread.start(periodic_1ms); + periodic_10ms_thread.start(periodic_10ms); + periodic_100ms_thread.start(periodic_100ms); + periodic_1s_thread.start(periodic_1s); + periodic_10s_thread.start(periodic_10s); + + while (true) { + } +} diff --git a/rover-apps/gimbal/CMakeLists.txt b/rover-apps/gimbal/CMakeLists.txt index a7aa85f0a..3747449b3 100644 --- a/rover-apps/gimbal/CMakeLists.txt +++ b/rover-apps/gimbal/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable(gimbal) -target_sources(gimbal PRIVATE src/main.cpp) -target_include_directories(gimbal PUBLIC include) +target_sources(gimbal PRIVATE ../common/src/main.cpp) +target_include_directories(gimbal PUBLIC include ../common/include) target_link_libraries(gimbal PRIVATE #Control diff --git a/rover-apps/gimbal/include/AppConfig.h b/rover-apps/gimbal/include/AppConfig.h new file mode 100644 index 000000000..32f1383b4 --- /dev/null +++ b/rover-apps/gimbal/include/AppConfig.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#include "Module.h" + +std::vector gModules = { + // put modules here +}; diff --git a/rover-apps/science/CMakeLists.txt b/rover-apps/science/CMakeLists.txt index ad98ab794..646a77567 100644 --- a/rover-apps/science/CMakeLists.txt +++ b/rover-apps/science/CMakeLists.txt @@ -1,6 +1,6 @@ add_executable(science) -target_sources(science PRIVATE src/main.cpp) -target_include_directories(science PUBLIC include) +target_sources(science PRIVATE ../common/src/main.cpp) +target_include_directories(science PUBLIC include ../common/include) target_link_libraries(science PRIVATE #Control diff --git a/rover-apps/science/include/AppConfig.h b/rover-apps/science/include/AppConfig.h new file mode 100644 index 000000000..32f1383b4 --- /dev/null +++ b/rover-apps/science/include/AppConfig.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#include "Module.h" + +std::vector gModules = { + // put modules here +}; From 168ba761d0cd3ab3805e0372bccd4b82af1c326f Mon Sep 17 00:00:00 2001 From: jahnavithota2011 <34670246+jahnavithota2011@users.noreply.github.com> Date: Wed, 18 Aug 2021 23:17:59 +0400 Subject: [PATCH 2/5] Create watchdog module (#389) * Watchdog module * clang fix * clang fix2 * test-watchdog * Edited WatchdogWrapper.h * Fixed pure virtual function errors * fixed namespace error * Fixed error2 * Cmake * Cmake * Cmake fix * Top-level Cmake * Changes made * clang fix * Update libs/utility/src/WatchdogWrapper.cpp Co-authored-by: Cindy Li * Update test-apps/test-watchdog/src/main.cpp Co-authored-by: Cindy Li * cmake * Changed periodic function name * watchdogwrapper fix Co-authored-by: Cindy Li --- CMakeLists.txt | 1 + libs/utility/include/WatchdogWrapper.h | 9 +++----- libs/utility/src/WatchdogWrapper.cpp | 17 +++++---------- rover-apps/arm/CMakeLists.txt | 2 ++ rover-apps/arm/include/AppConfig.h | 4 ++++ rover-apps/common/CMakeLists.txt | 8 ++++++++ rover-apps/common/include/WatchdogModule.h | 24 ++++++++++++++++++++++ rover-apps/common/src/WatchdogModule.cpp | 16 +++++++++++++++ rover-apps/gimbal/CMakeLists.txt | 2 ++ rover-apps/gimbal/include/AppConfig.h | 4 ++++ rover-apps/science/CMakeLists.txt | 2 ++ rover-apps/science/include/AppConfig.h | 4 ++++ test-apps/test-watchdog/src/main.cpp | 13 ++++++++++-- 13 files changed, 86 insertions(+), 20 deletions(-) create mode 100644 rover-apps/common/include/WatchdogModule.h create mode 100644 rover-apps/common/src/WatchdogModule.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index a670e2944..c4ded6b7e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -94,6 +94,7 @@ add_app_subdirectory(${ROVER_APPS_DIR}/gamepad) add_app_subdirectory(${ROVER_APPS_DIR}/gimbal) add_app_subdirectory(${ROVER_APPS_DIR}/pdb) add_app_subdirectory(${ROVER_APPS_DIR}/science) +add_subdirectory(${ROVER_APPS_DIR}/common) # Include Test Apps add_app_subdirectory(${TEST_APPS_DIR}/test-actuator-controller) diff --git a/libs/utility/include/WatchdogWrapper.h b/libs/utility/include/WatchdogWrapper.h index f9034813f..723786ca9 100644 --- a/libs/utility/include/WatchdogWrapper.h +++ b/libs/utility/include/WatchdogWrapper.h @@ -5,11 +5,8 @@ namespace Utility { class WatchdogWrapper { public: - static void startWatchdog(std::chrono::milliseconds countdown_ms = 5000ms, std::chrono::milliseconds pet_ms = 1000ms); - static void logResetReason(); - - private: - static void petWatchdog(std::chrono::milliseconds *pet_ms); - static Thread pet_thread; + static void startWatchdog(std::chrono::milliseconds countdown_ms); + static void logResetReason(void); + static void petWatchdog(void); }; } // namespace Utility \ No newline at end of file diff --git a/libs/utility/src/WatchdogWrapper.cpp b/libs/utility/src/WatchdogWrapper.cpp index b3328074d..5e4b5b7c3 100644 --- a/libs/utility/src/WatchdogWrapper.cpp +++ b/libs/utility/src/WatchdogWrapper.cpp @@ -6,17 +6,13 @@ namespace Utility { -Thread WatchdogWrapper::pet_thread; - -void WatchdogWrapper::startWatchdog(std::chrono::milliseconds countdown_ms /*= 5000ms*/, - std::chrono::milliseconds pet_ms /*= 1000ms*/) { +void WatchdogWrapper::startWatchdog(std::chrono::milliseconds countdown_ms) { uint32_t countdown_uint32 = countdown_ms.count(); Watchdog &watchdog = Watchdog::get_instance(); watchdog.start(countdown_uint32); - pet_thread.start(callback(WatchdogWrapper::petWatchdog, &pet_ms)); } -void WatchdogWrapper::logResetReason() { +void WatchdogWrapper::logResetReason(void) { const reset_reason_t reason = ResetReason::get(); if (reason == RESET_REASON_WATCHDOG) { time_t seconds = time(NULL); @@ -26,10 +22,7 @@ void WatchdogWrapper::logResetReason() { } } -void WatchdogWrapper::petWatchdog(std::chrono::milliseconds *pet_ms) { - while (1) { - Watchdog::get_instance().kick(); - ThisThread::sleep_for(*pet_ms); - } +void WatchdogWrapper::petWatchdog(void) { + Watchdog::get_instance().kick(); } -} // namespace Utility \ No newline at end of file +} // namespace Utility diff --git a/rover-apps/arm/CMakeLists.txt b/rover-apps/arm/CMakeLists.txt index d0c03ca76..f96859db3 100644 --- a/rover-apps/arm/CMakeLists.txt +++ b/rover-apps/arm/CMakeLists.txt @@ -21,6 +21,8 @@ target_link_libraries(arm CANMsg #Sensor CurrentSensor + #common-modules + WatchdogModule #Other uwrt-mars-rover-hw-bridge Logger diff --git a/rover-apps/arm/include/AppConfig.h b/rover-apps/arm/include/AppConfig.h index 32f1383b4..877d41d7e 100644 --- a/rover-apps/arm/include/AppConfig.h +++ b/rover-apps/arm/include/AppConfig.h @@ -3,7 +3,11 @@ #include #include "Module.h" +#include "WatchdogModule.h" + +WatchdogModule arm_watchdog; std::vector gModules = { // put modules here + &arm_watchdog, }; diff --git a/rover-apps/common/CMakeLists.txt b/rover-apps/common/CMakeLists.txt index e69de29bb..6da4a69b8 100644 --- a/rover-apps/common/CMakeLists.txt +++ b/rover-apps/common/CMakeLists.txt @@ -0,0 +1,8 @@ +add_library(WatchdogModule STATIC) +target_sources(WatchdogModule PRIVATE src/WatchdogModule.cpp) +target_include_directories(WatchdogModule PUBLIC include) +target_link_libraries(WatchdogModule + PRIVATE + WatchdogWrapper + mbed-os + ) \ No newline at end of file diff --git a/rover-apps/common/include/WatchdogModule.h b/rover-apps/common/include/WatchdogModule.h new file mode 100644 index 000000000..3dbdfb423 --- /dev/null +++ b/rover-apps/common/include/WatchdogModule.h @@ -0,0 +1,24 @@ +#pragma once + +#include "Module.h" +#include "mbed.h" + +class WatchdogModule final : public Module { + public: + /* Initiates the watchdog with a countdown + * @param countdown - max timeout of the watchdog + * */ + WatchdogModule(); + + /* Periodic function to kick the watchdog and restart its timer every 1s + * */ + void periodic_1s(void) override; + + void periodic_10s(void) override {} + void periodic_100ms(void) override {} + void periodic_10ms(void) override {} + void periodic_1ms(void) override {} + + private: + static const std::chrono::milliseconds WATCHDOG_DEFAULT_COUNTDOWN; +}; diff --git a/rover-apps/common/src/WatchdogModule.cpp b/rover-apps/common/src/WatchdogModule.cpp new file mode 100644 index 000000000..14cac732c --- /dev/null +++ b/rover-apps/common/src/WatchdogModule.cpp @@ -0,0 +1,16 @@ +#include "WatchdogModule.h" + +#include "Module.h" +#include "WatchdogWrapper.h" +#include "mbed.h" + +const std::chrono::milliseconds WatchdogModule::WATCHDOG_DEFAULT_COUNTDOWN = 5000ms; + +WatchdogModule::WatchdogModule() { + Utility::WatchdogWrapper::logResetReason(); + Utility::WatchdogWrapper::startWatchdog(WATCHDOG_DEFAULT_COUNTDOWN); +} + +void WatchdogModule::periodic_1s(void) { + Utility::WatchdogWrapper::petWatchdog(); +} diff --git a/rover-apps/gimbal/CMakeLists.txt b/rover-apps/gimbal/CMakeLists.txt index 3747449b3..dcb375c64 100644 --- a/rover-apps/gimbal/CMakeLists.txt +++ b/rover-apps/gimbal/CMakeLists.txt @@ -19,6 +19,8 @@ target_link_libraries(gimbal CANMsg #Sensor CurrentSensor + #common-modules + WatchdogModule #Other Logger uwrt-mars-rover-hw-bridge diff --git a/rover-apps/gimbal/include/AppConfig.h b/rover-apps/gimbal/include/AppConfig.h index 32f1383b4..35955ba8f 100644 --- a/rover-apps/gimbal/include/AppConfig.h +++ b/rover-apps/gimbal/include/AppConfig.h @@ -3,7 +3,11 @@ #include #include "Module.h" +#include "WatchdogModule.h" + +WatchdogModule gimbal_watchdog; std::vector gModules = { // put modules here + &gimbal_watchdog, }; diff --git a/rover-apps/science/CMakeLists.txt b/rover-apps/science/CMakeLists.txt index 646a77567..28820310b 100644 --- a/rover-apps/science/CMakeLists.txt +++ b/rover-apps/science/CMakeLists.txt @@ -22,6 +22,8 @@ target_link_libraries(science #Sensor CurrentSensor AdafruitSTEMMA + #common-modules + WatchdogModule #Other uwrt-mars-rover-hw-bridge Logger diff --git a/rover-apps/science/include/AppConfig.h b/rover-apps/science/include/AppConfig.h index 32f1383b4..d196cd0bd 100644 --- a/rover-apps/science/include/AppConfig.h +++ b/rover-apps/science/include/AppConfig.h @@ -3,7 +3,11 @@ #include #include "Module.h" +#include "WatchdogModule.h" + +WatchdogModule science_watchdog; std::vector gModules = { // put modules here + &science_watchdog, }; diff --git a/test-apps/test-watchdog/src/main.cpp b/test-apps/test-watchdog/src/main.cpp index d6815ddbf..bcd5b38d8 100644 --- a/test-apps/test-watchdog/src/main.cpp +++ b/test-apps/test-watchdog/src/main.cpp @@ -1,12 +1,21 @@ #include "WatchdogWrapper.h" #include "mbed.h" +Thread pet_thread; std::chrono::milliseconds countdown_ms = 1000ms; std::chrono::milliseconds pet_ms = 200ms; +void pet_dog_task(std::chrono::milliseconds *pet_ms) { + while (1) { + Utility::WatchdogWrapper::petWatchdog(); + ThisThread::sleep_for(*pet_ms); + } +} + int main() { Utility::WatchdogWrapper::logResetReason(); - Utility::WatchdogWrapper::startWatchdog(countdown_ms, pet_ms); + Utility::WatchdogWrapper::startWatchdog(countdown_ms); + pet_thread.start(callback(pet_dog_task, &pet_ms)); ThisThread::sleep_for(2000ms); MBED_ASSERT(false); -} \ No newline at end of file +} From 5cef90dba440065fe19b5934a7ce29376cc3570e Mon Sep 17 00:00:00 2001 From: jahnavithota2011 <34670246+jahnavithota2011@users.noreply.github.com> Date: Fri, 27 Aug 2021 01:05:36 +0400 Subject: [PATCH 3/5] Create PDB monitoring module (#392) * PDB Module added * CMake * rename include * Fixed Errors * clang fix * Changes made * Made pins config private members * clang --- rover-apps/pdb/CMakeLists.txt | 18 ++- rover-apps/pdb/include/AppConfig.h | 13 ++ rover-apps/pdb/include/PDBMonitoring.h | 78 ++++++++++++ rover-apps/pdb/src/PDBMonitoring.cpp | 132 +++++++++++++++++++++ targets/TARGET_PDB_REV2/include/PinNames.h | 23 ++++ 5 files changed, 262 insertions(+), 2 deletions(-) create mode 100644 rover-apps/pdb/include/AppConfig.h create mode 100644 rover-apps/pdb/include/PDBMonitoring.h create mode 100644 rover-apps/pdb/src/PDBMonitoring.cpp diff --git a/rover-apps/pdb/CMakeLists.txt b/rover-apps/pdb/CMakeLists.txt index a271b4781..9d6d12523 100644 --- a/rover-apps/pdb/CMakeLists.txt +++ b/rover-apps/pdb/CMakeLists.txt @@ -1,11 +1,25 @@ +add_library(PDB_Monitoring STATIC) +target_sources(PDB_Monitoring PRIVATE src/PDBMonitoring.cpp) +target_include_directories(PDB_Monitoring PUBLIC + include + ../common/include + ) +target_link_libraries(PDB_Monitoring + PRIVATE + Logger + mbed-os + ) + add_executable(pdb) -target_sources(pdb PRIVATE src/main.cpp) -target_include_directories(pdb PUBLIC include) +target_sources(pdb PRIVATE ../common/src/main.cpp) +target_include_directories(pdb PUBLIC ../common/include) target_link_libraries(pdb PRIVATE CANBus CANMsg Logger uwrt-mars-rover-hw-bridge + #Modules + PDB_Monitoring ) mbed_set_post_build(pdb) diff --git a/rover-apps/pdb/include/AppConfig.h b/rover-apps/pdb/include/AppConfig.h new file mode 100644 index 000000000..17885fb14 --- /dev/null +++ b/rover-apps/pdb/include/AppConfig.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include "Module.h" +#include "PDBMonitoring.h" + +PDBMonitoring PDB; + +std::vector gModules = { + // put modules here + &PDB, +}; diff --git a/rover-apps/pdb/include/PDBMonitoring.h b/rover-apps/pdb/include/PDBMonitoring.h new file mode 100644 index 000000000..fc97ce0ba --- /dev/null +++ b/rover-apps/pdb/include/PDBMonitoring.h @@ -0,0 +1,78 @@ +#pragma once + +#include "Module.h" +#include "mbed.h" + +/*This PDB module is for load, rail and temperature monitoring.*/ + +class PDBMonitoring final : public Module { + public: + /* Sets the Load DIAG_EN pins */ + PDBMonitoring(); + + void periodic_1s(void) override; + void periodic_10s(void) override {} + void periodic_100ms(void) override {} + void periodic_10ms(void) override {} + void periodic_1ms(void) override; + + private: + void load_monitoring(); + void rail_monitoring(); + void temperature_monitoring(); + + static const float PDB_VBAT_RAIL_NOMINAL_VOLTAGE; + static const float PDB_VBAT_RAIL_MIN_THRESHOLD; + static const float PDB_VBAT_RAIL_MAX_THRESHOLD; + + static const float PDB_24V_RAIL_NOMINAL_VOLTAGE; + static const float PDB_24V_RAIL_MIN_THRESHOLD; + static const float PDB_24V_RAIL_MAX_THRESHOLD; + + static const float PDB_17V_RAIL_NOMINAL_VOLTAGE; + static const float PDB_17V_RAIL_MIN_THRESHOLD; + static const float PDB_17V_RAIL_MAX_THRESHOLD; + + static const float PDB_5V_RAIL_NOMINAL_VOLTAGE; + static const float PDB_5V_RAIL_MIN_THRESHOLD; + static const float PDB_5V_RAIL_MAX_THRESHOLD; + + static const float PDB_TEMPERATURE_MIN_THRESHOLD; + static const float PDB_TEMPERATURE_MAX_THRESHOLD; + + static const bool PDB_5V_LOAD1_DIAG_EN; + static const bool PDB_5V_LOAD2_DIAG_EN; + static const bool PDB_5V_LOAD3_DIAG_EN; + static const bool PDB_5V_LOAD4_DIAG_EN; + static const bool PDB_5V_LOAD5_DIAG_EN; + static const bool PDB_17V_LOAD_DIAG_EN; + + /* Pins configuration for Load Monitoring */ + DigitalOut load1_5V_diag_en; + DigitalIn load1_5V_fault_n; + + DigitalOut load2_5V_diag_en; + DigitalIn load2_5V_fault_n; + + DigitalOut load3_5V_diag_en; + DigitalIn load3_5V_fault_n; + + DigitalOut load4_5V_diag_en; + DigitalIn load4_5V_fault_n; + + DigitalOut load5_5V_diag_en; + DigitalIn load5_5V_fault_n; + + DigitalOut load_17V_diag_en; + DigitalIn load_17V_fault_n; + + /* Pins configuration for Rail Monitoring */ + AnalogIn railBattery; + AnalogIn rail5V; + AnalogIn rail17V; + AnalogIn rail24V; + DigitalIn rail24V_pgood_n; + + /* Pins configuration for Temperature Monitoring */ + AnalogIn temperatureADC; +}; \ No newline at end of file diff --git a/rover-apps/pdb/src/PDBMonitoring.cpp b/rover-apps/pdb/src/PDBMonitoring.cpp new file mode 100644 index 000000000..21fc5a824 --- /dev/null +++ b/rover-apps/pdb/src/PDBMonitoring.cpp @@ -0,0 +1,132 @@ +#include "PDBMonitoring.h" + +#include + +#include "Logger.h" + +const float PDBMonitoring::PDB_VBAT_RAIL_NOMINAL_VOLTAGE = 24.0; +const float PDBMonitoring::PDB_VBAT_RAIL_MIN_THRESHOLD = 18.0; +const float PDBMonitoring::PDB_VBAT_RAIL_MAX_THRESHOLD = 25.2; + +const float PDBMonitoring::PDB_24V_RAIL_NOMINAL_VOLTAGE = 24.0; +const float PDBMonitoring::PDB_24V_RAIL_MIN_THRESHOLD = 22.0; +const float PDBMonitoring::PDB_24V_RAIL_MAX_THRESHOLD = 26.0; + +const float PDBMonitoring::PDB_17V_RAIL_NOMINAL_VOLTAGE = 17.0; +const float PDBMonitoring::PDB_17V_RAIL_MIN_THRESHOLD = 16.0; +const float PDBMonitoring::PDB_17V_RAIL_MAX_THRESHOLD = 18.0; + +const float PDBMonitoring::PDB_5V_RAIL_NOMINAL_VOLTAGE = 5.0; +const float PDBMonitoring::PDB_5V_RAIL_MIN_THRESHOLD = 4.8; +const float PDBMonitoring::PDB_5V_RAIL_MAX_THRESHOLD = 6.0; + +const float PDBMonitoring::PDB_TEMPERATURE_MIN_THRESHOLD = 10.0; +const float PDBMonitoring::PDB_TEMPERATURE_MAX_THRESHOLD = 50.0; + +const bool PDBMonitoring::PDB_5V_LOAD1_DIAG_EN = 1; +const bool PDBMonitoring::PDB_5V_LOAD2_DIAG_EN = 0; +const bool PDBMonitoring::PDB_5V_LOAD3_DIAG_EN = 0; +const bool PDBMonitoring::PDB_5V_LOAD4_DIAG_EN = 0; +const bool PDBMonitoring::PDB_5V_LOAD5_DIAG_EN = 0; +const bool PDBMonitoring::PDB_17V_LOAD_DIAG_EN = 1; + +PDBMonitoring::PDBMonitoring() + : load1_5V_diag_en(LOAD1_5V_DIAG_EN), + load1_5V_fault_n(LOAD1_5V_FAULT), + load2_5V_diag_en(LOAD2_5V_DIAG_EN), + load2_5V_fault_n(LOAD2_5V_FAULT), + load3_5V_diag_en(LOAD3_5V_DIAG_EN), + load3_5V_fault_n(LOAD3_5V_FAULT), + load4_5V_diag_en(LOAD4_5V_DIAG_EN), + load4_5V_fault_n(LOAD4_5V_FAULT), + load5_5V_diag_en(LOAD5_5V_DIAG_EN), + load5_5V_fault_n(LOAD5_5V_FAULT), + load_17V_diag_en(LOAD_17V_DIAG_EN), + load_17V_fault_n(LOAD_17V_FAULT), + railBattery(RAIL_BATTERY_ANLG_IN), + rail5V(RAIL_5V_ANLG_IN), + rail17V(RAIL_17V_ANLG_IN), + rail24V(RAIL_24V_ANLG_IN), + rail24V_pgood_n(RAIL_24V_PGOOD_N), + temperatureADC(TEMPERATURE_ADC_IN) { + load1_5V_diag_en = PDB_5V_LOAD1_DIAG_EN; + load2_5V_diag_en = PDB_5V_LOAD2_DIAG_EN; + load3_5V_diag_en = PDB_5V_LOAD3_DIAG_EN; + load4_5V_diag_en = PDB_5V_LOAD4_DIAG_EN; + load5_5V_diag_en = PDB_5V_LOAD5_DIAG_EN; + load_17V_diag_en = PDB_17V_LOAD_DIAG_EN; +} + +/*TODO:Replace the logger statements with CAN logs + * after CAN Module is ready */ + +void PDBMonitoring::load_monitoring() { + if (load1_5V_diag_en && !load1_5V_fault_n) { + Utility::logger << "Fault on 5V load 1\n"; + } + if (load2_5V_diag_en && !load2_5V_fault_n) { + Utility::logger << "Fault on 5V load 2\n"; + } + if (load3_5V_diag_en && !load3_5V_fault_n) { + Utility::logger << "Fault on 5V load 3\n"; + } + if (load4_5V_diag_en && !load4_5V_fault_n) { + Utility::logger << "Fault on 5V load 4\n"; + } + if (load5_5V_diag_en && !load5_5V_fault_n) { + Utility::logger << "Fault on 5V load 5\n"; + } + if (load_17V_diag_en && !load_17V_fault_n) { + Utility::logger << "Fault on 17V load\n"; + } +} + +void PDBMonitoring::rail_monitoring() { + float rail_vbat_voltage = railBattery.read_voltage() / 3 * PDB_VBAT_RAIL_NOMINAL_VOLTAGE; + float rail_24V_voltage = rail24V.read_voltage() / 3 * PDB_24V_RAIL_NOMINAL_VOLTAGE; + float rail_17V_voltage = rail17V.read_voltage() / 3 * PDB_17V_RAIL_NOMINAL_VOLTAGE; + float rail_5V_voltage = rail5V.read_voltage() / 3 * PDB_5V_RAIL_NOMINAL_VOLTAGE; + + if (rail_vbat_voltage < PDB_VBAT_RAIL_MIN_THRESHOLD || rail_vbat_voltage > PDB_VBAT_RAIL_MAX_THRESHOLD) { + Utility::logger << "!!! VBAT RAIL VOLTAGE: %.3fV !!!\n", rail_vbat_voltage; + } + if (rail_24V_voltage < PDB_24V_RAIL_MIN_THRESHOLD || rail_24V_voltage > PDB_24V_RAIL_MAX_THRESHOLD) { + Utility::logger << "!!! 24V RAIL VOLTAGE: %.3fV !!!\n", rail_24V_voltage; + } + if (rail_17V_voltage < PDB_17V_RAIL_MIN_THRESHOLD || rail_17V_voltage > PDB_17V_RAIL_MAX_THRESHOLD) { + Utility::logger << "!!! 17V RAIL VOLTAGE: %.3fV !!!\n", rail_17V_voltage; + } + if (rail_5V_voltage < PDB_5V_RAIL_MIN_THRESHOLD || rail_5V_voltage > PDB_5V_RAIL_MAX_THRESHOLD) { + Utility::logger << "!!! 5V RAIL VOLTAGE: %.3fV !!!\n", rail_5V_voltage; + } +} + +/*https://www.ti.com/lit/ds/symlink/lmt87-q1.pdf?ts=1627158177761&ref_url=https%253A%252F%252Fwww.google.com%252F*/ + +void PDBMonitoring::temperature_monitoring() { + float temperature_celsius = + (13.582 - sqrt(pow(-13.582, 2) + 4 * 0.00433 * (2230.8 - temperatureADC.read_voltage() * 1000))) / + (2 * (-0.00433)) + + 30; + + if (temperature_celsius < PDB_TEMPERATURE_MIN_THRESHOLD || temperature_celsius > PDB_TEMPERATURE_MAX_THRESHOLD) { + Utility::logger << "!!! TEMPERATURE FAULT:" << temperature_celsius << "degrees Celsius\n"; + } +} + +void PDBMonitoring::periodic_1s() { + temperature_monitoring(); + load_monitoring(); +} + +void PDBMonitoring::periodic_1ms() { + /*Monitoring Period = 500ms*/ + int rail_counter = 0; + + if (rail_counter % 5 == 0) { + rail_monitoring(); + rail_counter = 0; + } + + rail_counter++; +} diff --git a/targets/TARGET_PDB_REV2/include/PinNames.h b/targets/TARGET_PDB_REV2/include/PinNames.h index ab8f8232d..94e25d908 100644 --- a/targets/TARGET_PDB_REV2/include/PinNames.h +++ b/targets/TARGET_PDB_REV2/include/PinNames.h @@ -171,6 +171,29 @@ typedef enum { RAIL_17V_ANLG_IN = PA_5, RAIL_24V_ANLG_IN = PB_0, RAIL_BATTERY_ANLG_IN = PB_1, + RAIL_24V_PGOOD_N = PC_6, + + /**** Temperature Sensor ****/ + TEMPERATURE_ADC_IN = PA_3, + + /**** Load Monitor ****/ + LOAD1_5V_DIAG_EN = PA_6, + LOAD1_5V_FAULT = PA_7, + + LOAD2_5V_DIAG_EN = PC_2, + LOAD2_5V_FAULT = PC_3, + + LOAD3_5V_DIAG_EN = PC_0, + LOAD3_5V_FAULT = PC_1, + + LOAD4_5V_DIAG_EN = PC_13, + LOAD4_5V_FAULT = PC_14, + + LOAD5_5V_DIAG_EN = PB_8, + LOAD5_5V_FAULT = PB_9, + + LOAD_17V_DIAG_EN = PC_4, + LOAD_17V_FAULT = PC_5, /**** LED Matrix ****/ LED_MATRIX_R_CHANNEL = PB_4, From 1b575e857d2d46b242f8494fcde2ec03d8b12335 Mon Sep 17 00:00:00 2001 From: Ari Wasch Date: Thu, 14 Oct 2021 21:17:07 -0400 Subject: [PATCH 4/5] initial commit --- rover-apps/gimbal/include/AppConfig.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rover-apps/gimbal/include/AppConfig.h b/rover-apps/gimbal/include/AppConfig.h index 35955ba8f..34fbf326e 100644 --- a/rover-apps/gimbal/include/AppConfig.h +++ b/rover-apps/gimbal/include/AppConfig.h @@ -6,7 +6,7 @@ #include "WatchdogModule.h" WatchdogModule gimbal_watchdog; - + std::vector gModules = { // put modules here &gimbal_watchdog, From 6059832f9936631ea5e73f161f199c99553ab1c5 Mon Sep 17 00:00:00 2001 From: Ari Wasch Date: Sat, 16 Oct 2021 22:06:37 -0400 Subject: [PATCH 5/5] Add gimbal servo code --- rover-apps/gimbal/include/gimbal.h | 22 ++++++++++++++++++++++ rover-apps/gimbal/src/gimbal.cpp | 23 +++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 rover-apps/gimbal/include/gimbal.h create mode 100644 rover-apps/gimbal/src/gimbal.cpp diff --git a/rover-apps/gimbal/include/gimbal.h b/rover-apps/gimbal/include/gimbal.h new file mode 100644 index 000000000..47d866944 --- /dev/null +++ b/rover-apps/gimbal/include/gimbal.h @@ -0,0 +1,22 @@ +#pragma once + +#include "Module.h" +#include "mbed.h" +#include "LimServo.h" +/*This PDB module is for load, rail and temperature monitoring.*/ + +class gimbal final : public Module { + public: + /* Sets the Load DIAG_EN pins */ + void periodic_1s(void) override {} + void periodic_10s(void) override {} + void periodic_100ms(void) override {} + void periodic_10ms(void) override; + void periodic_1ms(void) override {} + + private: + void recieve_can_message(); + Actuator::LimServo pitchServo(SRVO_PWM_PITCH, Internal::RANGE, Internal::MAX_PULSE, Internal::MIN_PULSE); + +}; + diff --git a/rover-apps/gimbal/src/gimbal.cpp b/rover-apps/gimbal/src/gimbal.cpp new file mode 100644 index 000000000..968d6f2dd --- /dev/null +++ b/rover-apps/gimbal/src/gimbal.cpp @@ -0,0 +1,23 @@ +#pragma once +#include "mbed.h" +#include "CANMsg.h" + + +// gimbal::gimbal(){ + +// } +void periodic_10ms(){ + recieve_can_message(); +} + + +gimbal::recieve_can_message(){ + CAN can(PB_8, PB_9); //Assuming rx and tx pins + CANMsg rxMsg; + if (can.read(rxMsg)) { + float percentage; + rxMsg.getPayload(percentage); //ask how to parse can message + position_in_percent = parsed_can_message; + pitchServo.set_value(position * DEFAULT_RANGE); + } +}