diff --git a/components/constants/include/constants/module.h b/components/constants/include/constants/module.h index e6a79b6..27cddc0 100644 --- a/components/constants/include/constants/module.h +++ b/components/constants/include/constants/module.h @@ -22,4 +22,9 @@ inline std::unordered_map MODULE_TO_NUM_CHANNELS_MAP {{ModuleType_SPLI #define DC_ENCODER_A 15 #define DC_ENCODER_B 16 +inline std::unordered_map CHANNEL_TO_0_DEG_MAP{{0, 9} }; +inline std::unordered_map CHANNEL_TO_90_DEG_MAP{{0, 7} }; +inline std::unordered_map CHANNEL_TO_180_DEG_MAP{{0, 8} }; +inline std::unordered_map CHANNEL_TO_270_DEG_MAP{{0, 10} }; + #endif //MODULE_H diff --git a/components/rpc/CMakeLists.txt b/components/rpc/CMakeLists.txt index 6700259..cea7bd6 100644 --- a/components/rpc/CMakeLists.txt +++ b/components/rpc/CMakeLists.txt @@ -1,4 +1,4 @@ -idf_component_register(SRCS "WifiManager.cpp" "mDNSDiscoveryService.cpp" "TCPServer.cpp" "CommunicationRouter.cpp" "MessagingInterface.cpp" +idf_component_register(SRCS "WifiManager.cpp" "mDNSDiscoveryService.cpp" "TCPServer.cpp" "CommunicationRouter.cpp" "MessagingInterface.cpp" "OrientationDetection.cpp" PRIV_REQUIRES driver esp_event nvs_flash esp_netif esp_wifi espressif__mdns constants config flatbuffers dataLink rmt REQUIRES ptrQueue INCLUDE_DIRS "include") diff --git a/components/rpc/CommunicationRouter.cpp b/components/rpc/CommunicationRouter.cpp index 4024ace..6cf1f50 100644 --- a/components/rpc/CommunicationRouter.cpp +++ b/components/rpc/CommunicationRouter.cpp @@ -5,13 +5,11 @@ #include "mDNSDiscoveryService.h" #include "MPIMessageBuilder.h" #include "WifiManager.h" - #include "freertos/FreeRTOS.h" #include "freertos/queue.h" - #include "Tables.h" - #include "PtrQueue.h" +#include "OrientationDetection.h" CommunicationRouter::~CommunicationRouter() { vTaskDelete(m_router_thread); @@ -139,9 +137,13 @@ std::pair, std::vector> CommunicationRouter::g } } - // todo: get orientation (temporary) for (int i = 0; i < MAX_WIRED_CONNECTIONS; i++) { - connected_module_orientations[i] = Orientation_Deg0; + const auto id = connected_module_ids[i]; + // if (const auto id = connected_module_ids[i]; 0 == id) { + // connected_module_orientations[i] = Orientation_Deg0; + // } else { + connected_module_orientations[i] = OrientationDetection::get_orientation(id); + // } } return { connected_module_ids, connected_module_orientations }; diff --git a/components/rpc/OrientationDetection.cpp b/components/rpc/OrientationDetection.cpp new file mode 100644 index 0000000..f7b26b4 --- /dev/null +++ b/components/rpc/OrientationDetection.cpp @@ -0,0 +1,46 @@ +// +// Created by Johnathon Slightham on 2025-07-26. +// + +#include +#include "OrientationDetection.h" + +#include +#include +#include + +void OrientationDetection::init() { + for (int i = 0; i < MODULE_TO_NUM_CHANNELS_MAP[ConfigManager::get_module_type()]; i++) { + setup_gpio(static_cast(CHANNEL_TO_0_DEG_MAP[i])); + setup_gpio(static_cast(CHANNEL_TO_90_DEG_MAP[i])); + setup_gpio(static_cast(CHANNEL_TO_180_DEG_MAP[i])); + setup_gpio(static_cast(CHANNEL_TO_270_DEG_MAP[i])); + } +} + +Orientation OrientationDetection::get_orientation(const uint8_t channel) { + if (gpio_get_level(static_cast(CHANNEL_TO_90_DEG_MAP[channel]))) { + std::cout << "90deg" << std::endl; + return Orientation_Deg90; + } else if (gpio_get_level(static_cast(CHANNEL_TO_180_DEG_MAP[channel]))) { + std::cout << "180deg" << std::endl; + return Orientation_Deg180; + } else if (gpio_get_level(static_cast(CHANNEL_TO_270_DEG_MAP[channel]))) { + std::cout << "270deg" << std::endl; + return Orientation_Deg270; + } else { + std::cout << "No orientation detected" << std::endl; + return Orientation_Deg0; + } +} + +void OrientationDetection::setup_gpio(const gpio_num_t pin) { + const gpio_config_t io_conf = { + .pin_bit_mask = (1ULL << pin), + .mode = GPIO_MODE_INPUT, + .pull_up_en = GPIO_PULLUP_DISABLE, + .pull_down_en = GPIO_PULLDOWN_ENABLE, + .intr_type = GPIO_INTR_DISABLE + }; + gpio_config(&io_conf); +} diff --git a/components/rpc/include/CommunicationRouter.h b/components/rpc/include/CommunicationRouter.h index 9127e56..2142cc0 100644 --- a/components/rpc/include/CommunicationRouter.h +++ b/components/rpc/include/CommunicationRouter.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include "freertos/FreeRTOS.h" @@ -40,6 +41,7 @@ public: m_pc_connection(std::move(pc_connection)), m_module_id(ConfigManager::get_module_id()), m_last_leader_updated(std::chrono::system_clock::now()){ + OrientationDetection::init(); update_leader(); xTaskCreate(router_thread, "communication_router", 4096, this, 3, &this->m_router_thread); diff --git a/components/rpc/include/OrientationDetection.h b/components/rpc/include/OrientationDetection.h new file mode 100644 index 0000000..c4ac2fa --- /dev/null +++ b/components/rpc/include/OrientationDetection.h @@ -0,0 +1,20 @@ +// +// Created by Johnathon Slightham on 2025-07-26. +// + +#ifndef ORIENTATIONDETECTION_H +#define ORIENTATIONDETECTION_H +#include +#include "driver/gpio.h" + +class OrientationDetection { +public: + static void init(); + static Orientation get_orientation(uint8_t channel); + +private: + static void setup_gpio(gpio_num_t pin); + +}; + +#endif //ORIENTATIONDETECTION_H diff --git a/main/main.cpp b/main/main.cpp index 0014a47..9e03187 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -18,6 +18,7 @@ extern "C" [[noreturn]] void app_main(void) { ConfigManager::init_config(); + const auto loop_manager = std::make_unique(); xTaskCreate(reinterpret_cast(LoopManager::metadata_tx_loop), "metadata_tx", 3096, loop_manager.get(), 3, nullptr); loop_manager->control_loop();