diff --git a/.gitmodules b/.gitmodules index 797a817..3ad179b 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "fprime-arduino"] path = fprime-arduino url = https://github.com/fprime-community/fprime-arduino.git +[submodule "lib/Adafruit_NeoPixel"] + path = lib/Adafruit_NeoPixel + url = https://github.com/adafruit/Adafruit_NeoPixel.git diff --git a/Components/CMakeLists.txt b/Components/CMakeLists.txt index b46227b..40b944f 100644 --- a/Components/CMakeLists.txt +++ b/Components/CMakeLists.txt @@ -4,3 +4,5 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BroncoOreMessageHandler/") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Radio/") + +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Drv/") diff --git a/Components/Drv/CMakeLists.txt b/Components/Drv/CMakeLists.txt new file mode 100644 index 0000000..fc775b2 --- /dev/null +++ b/Components/Drv/CMakeLists.txt @@ -0,0 +1 @@ +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/NeoPixelDriver/") diff --git a/Components/Drv/NeoPixelDriver/CMakeLists.txt b/Components/Drv/NeoPixelDriver/CMakeLists.txt new file mode 100644 index 0000000..ed462fc --- /dev/null +++ b/Components/Drv/NeoPixelDriver/CMakeLists.txt @@ -0,0 +1,18 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# UT_SOURCE_FILES: list of source files for unit tests +# +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/NeoPixelDriver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/NeoPixelDriver.cpp" +) + +set(MOD_DEPS + Adafruit_NeoPixel +) + +register_fprime_module() diff --git a/Components/Drv/NeoPixelDriver/NeoPixelDriver.cpp b/Components/Drv/NeoPixelDriver/NeoPixelDriver.cpp new file mode 100644 index 0000000..e58e785 --- /dev/null +++ b/Components/Drv/NeoPixelDriver/NeoPixelDriver.cpp @@ -0,0 +1,41 @@ +// ====================================================================== +// \title NeoPixelDriver.cpp +// \author nate +// \brief cpp file for NeoPixelDriver component implementation class +// ====================================================================== + +#include "Components/Drv/NeoPixelDriver/NeoPixelDriver.hpp" +#include "FpConfig.hpp" + +namespace Drv { + +// ---------------------------------------------------------------------- +// Component construction and destruction +// ---------------------------------------------------------------------- + +#define PIN 24 +#define NUMPIXELS 1 + +NeoPixelDriver ::NeoPixelDriver(const char* const compName) : NeoPixelDriverComponentBase(compName), + pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800) +{ + pixels.begin(); +} + +NeoPixelDriver ::~NeoPixelDriver() {} + +// ---------------------------------------------------------------------- +// Handler implementations for user-defined typed input ports +// ---------------------------------------------------------------------- + +Drv::NeoPixelColor NeoPixelDriver ::neoPixelRead_handler(NATIVE_INT_TYPE portNum) { + uint16_t color = pixels.getPixelColor(0); + return Drv::NeoPixelColor((color >> 16) & 0xFF, (color >> 8) & 0xFF, color & 0xFF); +} + +void NeoPixelDriver ::neoPixelSet_handler(NATIVE_INT_TYPE portNum, const Drv::NeoPixelColor& color) { + pixels.setPixelColor(0, pixels.Color(color.getred(), color.getgreen(), color.getblue())); + pixels.show(); +} + +} // namespace Drv diff --git a/Components/Drv/NeoPixelDriver/NeoPixelDriver.fpp b/Components/Drv/NeoPixelDriver/NeoPixelDriver.fpp new file mode 100644 index 0000000..7d6ebb6 --- /dev/null +++ b/Components/Drv/NeoPixelDriver/NeoPixelDriver.fpp @@ -0,0 +1,43 @@ +# Type definition +module Drv { + struct NeoPixelColor { + $red: U8 @< Red color value. + green: U8 @< Green color value. + blue: U8 @< Blue color value. + } +} + +# Port definition +module Drv { + port NeoPixelSet(color: NeoPixelColor) + port NeoPixelRead -> NeoPixelColor +} + +# Component definition +module Drv { + @ FPrime driver implmementation for Adafruit NeoPixel. + passive component NeoPixelDriver { + @ Port to turn modify the NeoPixel state. + sync input port neoPixelSet: NeoPixelSet + + @ Port to read the current NeoPixel state. + sync input port neoPixelRead: NeoPixelRead + + @ Event to report current NeoPixel state. + event NeoPixelState($red: U8, green: U8, blue: U8) \ + severity activity low \ + format "LED is set to ({}, {}, {})" + + ############################################################################### + # Standard AC Ports: Required for Channels, Events, Commands, and Parameters # + ############################################################################### + @ Port for requesting the current time + time get port timeCaller + + @ Port for sending textual representation of events + text event port logTextOut + + @ Port for sending events to downlink + event port logOut + } +} diff --git a/Components/Drv/NeoPixelDriver/NeoPixelDriver.hpp b/Components/Drv/NeoPixelDriver/NeoPixelDriver.hpp new file mode 100644 index 0000000..cf25d33 --- /dev/null +++ b/Components/Drv/NeoPixelDriver/NeoPixelDriver.hpp @@ -0,0 +1,51 @@ +// ====================================================================== +// \title NeoPixelDriver.hpp +// \author nate +// \brief hpp file for NeoPixelDriver component implementation class +// ====================================================================== + +#ifndef Drv_NeoPixelDriver_HPP +#define Drv_NeoPixelDriver_HPP + +#include "Components/Drv/NeoPixelDriver/NeoPixelDriverComponentAc.hpp" +#include "lib/Adafruit_NeoPixel/Adafruit_NeoPixel.h" + +namespace Drv { + +class NeoPixelDriver : public NeoPixelDriverComponentBase { + public: + // ---------------------------------------------------------------------- + // Component construction and destruction + // ---------------------------------------------------------------------- + + //! Construct NeoPixelDriver object + NeoPixelDriver(const char* const compName //!< The component name + ); + + //! Destroy NeoPixelDriver object + ~NeoPixelDriver(); + + PRIVATE: + // ---------------------------------------------------------------------- + // Handler implementations for user-defined typed input ports + // ---------------------------------------------------------------------- + + //! Handler implementation for neoPixelRead + //! + //! Port to read the current NeoPixel state. + Drv::NeoPixelColor neoPixelRead_handler(NATIVE_INT_TYPE portNum //!< The port number + ) override; + + //! Handler implementation for neoPixelSet + //! + //! Port to turn modify the NeoPixel state. + void neoPixelSet_handler(NATIVE_INT_TYPE portNum, //!< The port number + const Drv::NeoPixelColor& color) override; + + PRIVATE: + Adafruit_NeoPixel pixels; +}; + +} // namespace Drv + +#endif diff --git a/lib/Adafruit_NeoPixel b/lib/Adafruit_NeoPixel new file mode 160000 index 0000000..aa798ff --- /dev/null +++ b/lib/Adafruit_NeoPixel @@ -0,0 +1 @@ +Subproject commit aa798ff5e9bb9d7299190627d2454ccd6f599ae8 diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt new file mode 100644 index 0000000..b676a39 --- /dev/null +++ b/lib/CMakeLists.txt @@ -0,0 +1,14 @@ +#### +# F prime CMakeLists.txt: +# +# SOURCE_FILES: combined list of source and autocoding files +# MOD_DEPS: (optional) module dependencies +# +# Note: using PROJECT_NAME as EXECUTABLE_NAME +#### +set(SOURCE_FILES + "${CMAKE_CURRENT_LIST_DIR}/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp" +) + +add_library(Adafruit_NeoPixel ${SOURCE_FILES}) +target_include_directories(Adafruit_NeoPixel PUBLIC "${CMAKE_CURRENT_LIST_DIR}/Adafruit_NeoPixel") diff --git a/project.cmake b/project.cmake index 1adf2c1..deebb0a 100644 --- a/project.cmake +++ b/project.cmake @@ -3,3 +3,4 @@ add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/Components") add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/BroncoDeployment/") +add_fprime_subdirectory("${CMAKE_CURRENT_LIST_DIR}/lib")