diff --git a/.gitmodules b/.gitmodules index bccc42a..29265b1 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,9 +1,4 @@ -[submodule "RpiLedBars/libs/log.c"] - path = RpiLedBars/libs/log.c - url = https://github.com/rxi/log.c.git + [submodule "RpiLedBars/cava"] path = RpiLedBars/cava url = https://github.com/karlstav/cava.git -[submodule "RpiLedBars/libs/wsServer"] - path = RpiLedBars/libs/wsServer - url = https://github.com/Theldus/wsServer diff --git a/RpiLedBars/.gitignore b/RpiLedBars/.gitignore deleted file mode 100644 index 8d4a6c0..0000000 --- a/RpiLedBars/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -bin -obj \ No newline at end of file diff --git a/RpiLedBars/Makefile b/RpiLedBars/Makefile deleted file mode 100644 index 3be3ca3..0000000 --- a/RpiLedBars/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -CC := gcc -CFLAGS := -Wall -g -Ilibs/log.c/src -Ilibs/wsServer/include -LDFLAGS := -L.libs -lws -lwiringPi -lasound -lfftw3 -lpthread -lm - -SRC := src -OBJ := obj -BIN := bin/pixled - -SOURCES := $(shell find $(SRC) -type f -name "*.c") -OBJECTS := $(patsubst $(SRC)/%.c, $(OBJ)/%.o, $(SOURCES)) - -.PHONY: all clean install - -all: $(BIN) - -libs/log.c/obj/log.o: libs/log.c/src/log.c - if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi - $(CC) -c $< -o $@ -DLOG_USE_COLOR - -.libs/log.la: libs/log.c/obj/log.o - if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi - ar r $@ $^ - ranlib $@ - -$(OBJ)/%.o: $(SRC)/%.c - if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi - $(CC) -c $< -o $@ $(CFLAGS) - -$(BIN): $(OBJECTS) .libs/log.la - if [ ! -d "$(dir $@)" ]; then mkdir -p "$(dir $@)"; fi - $(CC) -o $@ $^ $(LDFLAGS) - -install: - $(shell install --backup bin/pixled /usr/local/bin/) - - -clean: - rm -rf $(OBJ) .libs libs/*/obj \ No newline at end of file diff --git a/RpiLedBars/.clang-format b/RpiLedBars/backend/.clang-format similarity index 100% rename from RpiLedBars/.clang-format rename to RpiLedBars/backend/.clang-format diff --git a/RpiLedBars/backend/.gitignore b/RpiLedBars/backend/.gitignore new file mode 100644 index 0000000..3df4a25 --- /dev/null +++ b/RpiLedBars/backend/.gitignore @@ -0,0 +1,14 @@ +bin +obj +CMakeLists.txt.user +CMakeCache.txt +CMakeFiles +CMakeScripts +Testing +Makefile +cmake_install.cmake +install_manifest.txt +compile_commands.json +CTestTestfile.cmake +_deps +build \ No newline at end of file diff --git a/RpiLedBars/backend/CMakeLists.txt b/RpiLedBars/backend/CMakeLists.txt new file mode 100644 index 0000000..1f184dc --- /dev/null +++ b/RpiLedBars/backend/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.12) + +# set the project name +project(RpiLedBars VERSION 0.5 LANGUAGES C) + +set(CMAKE_C_STANDARD 99) + +add_subdirectory(libs) + +add_subdirectory(src) \ No newline at end of file diff --git a/RpiLedBars/README.md b/RpiLedBars/backend/README.md similarity index 100% rename from RpiLedBars/README.md rename to RpiLedBars/backend/README.md diff --git a/RpiLedBars/cava_config b/RpiLedBars/backend/cava_config similarity index 82% rename from RpiLedBars/cava_config rename to RpiLedBars/backend/cava_config index be06609..f6075e6 100644 --- a/RpiLedBars/cava_config +++ b/RpiLedBars/backend/cava_config @@ -12,14 +12,13 @@ source = plughw:1 method = raw channels = mono mono_option = left -;raw_target = /dev/stdout data_format = ascii ascii_max_range=65535 bit_format = 16bit [smoothing] -integral = 0 -monstercat = 1 +integral = 77 +monstercat = 0 waves = 0 gravity = 0 diff --git a/RpiLedBars/cava_config_namedpipe b/RpiLedBars/backend/cava_config_namedpipe similarity index 100% rename from RpiLedBars/cava_config_namedpipe rename to RpiLedBars/backend/cava_config_namedpipe diff --git a/RpiLedBars/cava_test b/RpiLedBars/backend/cava_test similarity index 100% rename from RpiLedBars/cava_test rename to RpiLedBars/backend/cava_test diff --git a/RpiLedBars/install.sh b/RpiLedBars/backend/install.sh similarity index 100% rename from RpiLedBars/install.sh rename to RpiLedBars/backend/install.sh diff --git a/RpiLedBars/backend/libs/CMakeLists.txt b/RpiLedBars/backend/libs/CMakeLists.txt new file mode 100644 index 0000000..32e4307 --- /dev/null +++ b/RpiLedBars/backend/libs/CMakeLists.txt @@ -0,0 +1,14 @@ +include(FetchContent) + +FetchContent_Declare( + logc + GIT_REPOSITORY "https://github.com/Tropicananass/log.c.git" +) + +FetchContent_Declare( + ws + GIT_REPOSITORY "https://github.com/Tropicananass/wsServer.git" +) + +# add the log.c and ws libraries +FetchContent_MakeAvailable(logc ws) \ No newline at end of file diff --git a/RpiLedBars/pixled.service b/RpiLedBars/backend/pixled.service similarity index 100% rename from RpiLedBars/pixled.service rename to RpiLedBars/backend/pixled.service diff --git a/RpiLedBars/sgdb.sh b/RpiLedBars/backend/sgdb.sh similarity index 100% rename from RpiLedBars/sgdb.sh rename to RpiLedBars/backend/sgdb.sh diff --git a/RpiLedBars/backend/src/CMakeLists.txt b/RpiLedBars/backend/src/CMakeLists.txt new file mode 100644 index 0000000..bebe7fe --- /dev/null +++ b/RpiLedBars/backend/src/CMakeLists.txt @@ -0,0 +1,14 @@ + +add_subdirectory(tasks) +add_subdirectory(drivers) + +# add the executable +add_executable(${PROJECT_NAME} + rpi_midi_controller.c + rpi_param.c + rpi_pattern.c + main.c) + +target_link_libraries(${PROJECT_NAME} PRIVATE m asound) +target_link_libraries(${PROJECT_NAME} PRIVATE logc) +target_link_libraries(${PROJECT_NAME} PRIVATE ${PROJECT_NAME}_tasks ${PROJECT_NAME}_drivers) \ No newline at end of file diff --git a/RpiLedBars/backend/src/drivers/CMakeLists.txt b/RpiLedBars/backend/src/drivers/CMakeLists.txt new file mode 100644 index 0000000..e16bcb6 --- /dev/null +++ b/RpiLedBars/backend/src/drivers/CMakeLists.txt @@ -0,0 +1,14 @@ +# add the executable +add_library(${PROJECT_NAME}_drivers + common.c + dma/rpi_dma.c + dma/rpi_videocore.c + gpio/rpi_gpio.c + leddriver/rpi_leddriver.c + selector/rpi_selector.c + smi/rpi_smi.c) + +target_link_libraries(${PROJECT_NAME}_drivers PRIVATE wiringPi) +target_link_libraries(${PROJECT_NAME}_drivers PRIVATE logc) + +target_include_directories(${PROJECT_NAME}_drivers PUBLIC dma gpio leddriver selector smi) \ No newline at end of file diff --git a/RpiLedBars/src/drivers/common.c b/RpiLedBars/backend/src/drivers/common.c similarity index 100% rename from RpiLedBars/src/drivers/common.c rename to RpiLedBars/backend/src/drivers/common.c diff --git a/RpiLedBars/src/drivers/common.h b/RpiLedBars/backend/src/drivers/common.h similarity index 100% rename from RpiLedBars/src/drivers/common.h rename to RpiLedBars/backend/src/drivers/common.h diff --git a/RpiLedBars/src/drivers/dma/rpi_dma.c b/RpiLedBars/backend/src/drivers/dma/rpi_dma.c similarity index 100% rename from RpiLedBars/src/drivers/dma/rpi_dma.c rename to RpiLedBars/backend/src/drivers/dma/rpi_dma.c diff --git a/RpiLedBars/src/drivers/dma/rpi_dma.h b/RpiLedBars/backend/src/drivers/dma/rpi_dma.h similarity index 100% rename from RpiLedBars/src/drivers/dma/rpi_dma.h rename to RpiLedBars/backend/src/drivers/dma/rpi_dma.h diff --git a/RpiLedBars/src/drivers/dma/rpi_videocore.c b/RpiLedBars/backend/src/drivers/dma/rpi_videocore.c similarity index 100% rename from RpiLedBars/src/drivers/dma/rpi_videocore.c rename to RpiLedBars/backend/src/drivers/dma/rpi_videocore.c diff --git a/RpiLedBars/src/drivers/dma/rpi_videocore.h b/RpiLedBars/backend/src/drivers/dma/rpi_videocore.h similarity index 100% rename from RpiLedBars/src/drivers/dma/rpi_videocore.h rename to RpiLedBars/backend/src/drivers/dma/rpi_videocore.h diff --git a/RpiLedBars/src/drivers/gpio/rpi_gpio.c b/RpiLedBars/backend/src/drivers/gpio/rpi_gpio.c similarity index 100% rename from RpiLedBars/src/drivers/gpio/rpi_gpio.c rename to RpiLedBars/backend/src/drivers/gpio/rpi_gpio.c diff --git a/RpiLedBars/src/drivers/gpio/rpi_gpio.h b/RpiLedBars/backend/src/drivers/gpio/rpi_gpio.h similarity index 100% rename from RpiLedBars/src/drivers/gpio/rpi_gpio.h rename to RpiLedBars/backend/src/drivers/gpio/rpi_gpio.h diff --git a/RpiLedBars/src/drivers/leddriver/rpi_leddriver.c b/RpiLedBars/backend/src/drivers/leddriver/rpi_leddriver.c similarity index 100% rename from RpiLedBars/src/drivers/leddriver/rpi_leddriver.c rename to RpiLedBars/backend/src/drivers/leddriver/rpi_leddriver.c diff --git a/RpiLedBars/src/drivers/leddriver/rpi_leddriver.h b/RpiLedBars/backend/src/drivers/leddriver/rpi_leddriver.h similarity index 100% rename from RpiLedBars/src/drivers/leddriver/rpi_leddriver.h rename to RpiLedBars/backend/src/drivers/leddriver/rpi_leddriver.h diff --git a/RpiLedBars/src/drivers/selector/rpi_selector.c b/RpiLedBars/backend/src/drivers/selector/rpi_selector.c similarity index 97% rename from RpiLedBars/src/drivers/selector/rpi_selector.c rename to RpiLedBars/backend/src/drivers/selector/rpi_selector.c index 8b91e16..0ba9fb2 100644 --- a/RpiLedBars/src/drivers/selector/rpi_selector.c +++ b/RpiLedBars/backend/src/drivers/selector/rpi_selector.c @@ -44,12 +44,13 @@ void selector_setup() { } int selector_get_position() { + int newPosition = -1; for (size_t i = 0; i < selectorPinNumber; ++i) { if (digitalRead(selectorPins[i])) { - return i; + newPosition = i; } } - return -1; + return newPosition; } char *selector_tostr() { diff --git a/RpiLedBars/src/drivers/selector/rpi_selector.h b/RpiLedBars/backend/src/drivers/selector/rpi_selector.h similarity index 98% rename from RpiLedBars/src/drivers/selector/rpi_selector.h rename to RpiLedBars/backend/src/drivers/selector/rpi_selector.h index 0ef97c0..a6e4fa3 100644 --- a/RpiLedBars/src/drivers/selector/rpi_selector.h +++ b/RpiLedBars/backend/src/drivers/selector/rpi_selector.h @@ -1,11 +1,13 @@ /** @file rpi_selector.h * @brief This module is used to manage selector on gpio */ +#if !defined(__RPI_SELECTOR_H__) +#define __RPI_SELECTOR_H__ + /*************************************************************************************************** * Includes **************************************************************************************************/ -#if !defined(__RPI_SELECTOR_H__) -#define __RPI_SELECTOR_H__ +#include /*************************************************************************************************** * Preprocessor Constants and Macros diff --git a/RpiLedBars/src/drivers/smi/rpi_smi.c b/RpiLedBars/backend/src/drivers/smi/rpi_smi.c similarity index 100% rename from RpiLedBars/src/drivers/smi/rpi_smi.c rename to RpiLedBars/backend/src/drivers/smi/rpi_smi.c diff --git a/RpiLedBars/src/drivers/smi/rpi_smi.h b/RpiLedBars/backend/src/drivers/smi/rpi_smi.h similarity index 100% rename from RpiLedBars/src/drivers/smi/rpi_smi.h rename to RpiLedBars/backend/src/drivers/smi/rpi_smi.h diff --git a/RpiLedBars/src/main.c b/RpiLedBars/backend/src/main.c similarity index 97% rename from RpiLedBars/src/main.c rename to RpiLedBars/backend/src/main.c index 21e4968..7dae59c 100644 --- a/RpiLedBars/src/main.c +++ b/RpiLedBars/backend/src/main.c @@ -19,11 +19,11 @@ #include "log.h" #include "drivers/leddriver/rpi_leddriver.h" -#include "drivers/selector/rpi_selector.h" -#include "tasks/artnet/rpi_artnet.h" -#include "tasks/cava/rpi_cava.h" -#include "tasks/websocket/rpi_websocket.h" +#include "artnet.h" +#include "cava.h" +#include "selector.h" +#include "websocket.h" #include "rpi_midi_controller.h" #include "rpi_param.h" @@ -93,9 +93,9 @@ int main(int argc, char const *argv[]) { param_setup(); midi_controller_setup(); - selector_setup(); leddriver_setup(); websocket_start(); + selector_start(); parseCommandLineArgs(argc, argv); @@ -114,7 +114,7 @@ int main(int argc, char const *argv[]) { mode = 2; } } else { - mode = selector_get_position(); + mode = param_access->pixled.mode; } /* todo thread ? */ midi_controller_execute(); diff --git a/RpiLedBars/src/rpi_midi_controller.c b/RpiLedBars/backend/src/rpi_midi_controller.c similarity index 100% rename from RpiLedBars/src/rpi_midi_controller.c rename to RpiLedBars/backend/src/rpi_midi_controller.c diff --git a/RpiLedBars/src/rpi_midi_controller.h b/RpiLedBars/backend/src/rpi_midi_controller.h similarity index 100% rename from RpiLedBars/src/rpi_midi_controller.h rename to RpiLedBars/backend/src/rpi_midi_controller.h diff --git a/RpiLedBars/src/rpi_param.c b/RpiLedBars/backend/src/rpi_param.c similarity index 91% rename from RpiLedBars/src/rpi_param.c rename to RpiLedBars/backend/src/rpi_param.c index 76eaef1..e859de9 100644 --- a/RpiLedBars/src/rpi_param.c +++ b/RpiLedBars/backend/src/rpi_param.c @@ -9,10 +9,14 @@ #include "rpi_param.h" #include +#include #include #include "log.h" +#include "drivers/selector/rpi_selector.h" +#include "websocket.h" + /*************************************************************************************************** * Preprocessor Constants and Macros **************************************************************************************************/ @@ -21,9 +25,9 @@ * Type and Contant Definitions **************************************************************************************************/ -pixled_param_t const dummyPixledParam = {.chanLedCount = 0}; +pixled_param_t const dummyPixledParam = {.mode = 0, .chanLedCount = 0}; auton_param_t const dummyAutonParam = { - .sensitivity = 10, .gravity = 80, .pattern = 1, .isHueAutoShiftEnabled = true}; + .sensitivity = 10, .gravity = 80, .pattern = 0, .isHueAutoShiftEnabled = true}; ledbar_param_t const dummyLedbarParam = {.sensitivity = 1., .hueBase = 121, .hueInterval = -100, @@ -40,6 +44,8 @@ ledbar_param_t const dummyLedbarParam = {.sensitivity = 1., param_t param; +pthread_mutex_t paramLockMutex = PTHREAD_MUTEX_INITIALIZER; + /*************************************************************************************************** * Internal Function Prototypes **************************************************************************************************/ @@ -57,10 +63,22 @@ void param_setup() { param_access = ¶m; } +void set_mode(unsigned int mode) { + if (mode != param.pixled.mode) { + pthread_mutex_lock(¶mLockMutex); + param.pixled.mode = mode; + log_debug("Mode : %d", mode); + websocket_send_mode(mode); + pthread_mutex_unlock(¶mLockMutex); + } +} + void set_pattern(unsigned int pattern) { if (pattern != param.auton.pattern) { + pthread_mutex_lock(¶mLockMutex); param.auton.pattern = pattern; log_debug("Pattern : %d", pattern); + pthread_mutex_unlock(¶mLockMutex); } } diff --git a/RpiLedBars/src/rpi_param.h b/RpiLedBars/backend/src/rpi_param.h similarity index 97% rename from RpiLedBars/src/rpi_param.h rename to RpiLedBars/backend/src/rpi_param.h index 148e590..590304c 100644 --- a/RpiLedBars/src/rpi_param.h +++ b/RpiLedBars/backend/src/rpi_param.h @@ -39,6 +39,7 @@ * */ typedef struct { + int mode; unsigned int chanLedCount; } pixled_param_t; @@ -91,6 +92,13 @@ param_t *param_access; */ void param_setup(); +/** + * @brief + * + * @param[in] mode + */ +void set_mode(unsigned int mode); + /** * @brief * diff --git a/RpiLedBars/src/rpi_pattern.c b/RpiLedBars/backend/src/rpi_pattern.c similarity index 99% rename from RpiLedBars/src/rpi_pattern.c rename to RpiLedBars/backend/src/rpi_pattern.c index 52e6a1c..a0d41e3 100644 --- a/RpiLedBars/src/rpi_pattern.c +++ b/RpiLedBars/backend/src/rpi_pattern.c @@ -93,7 +93,6 @@ void bounce_led_and_color(uint16_t *spectrumArray, unsigned int spectrumLength) increment_autoshift(ledBarIndex); } - leddriver_refresh(); } diff --git a/RpiLedBars/src/rpi_pattern.h b/RpiLedBars/backend/src/rpi_pattern.h similarity index 100% rename from RpiLedBars/src/rpi_pattern.h rename to RpiLedBars/backend/src/rpi_pattern.h diff --git a/RpiLedBars/backend/src/tasks/CMakeLists.txt b/RpiLedBars/backend/src/tasks/CMakeLists.txt new file mode 100644 index 0000000..c8f3416 --- /dev/null +++ b/RpiLedBars/backend/src/tasks/CMakeLists.txt @@ -0,0 +1,11 @@ +# add the executable +add_library(${PROJECT_NAME}_tasks + artnet/artnet.c + cava/cava.c + selector/selector.c + websocket/websocket.c) + +target_link_libraries(${PROJECT_NAME}_tasks PRIVATE pthread) +target_link_libraries(${PROJECT_NAME}_tasks PRIVATE logc ws) + +target_include_directories(${PROJECT_NAME}_tasks PUBLIC includes) \ No newline at end of file diff --git a/RpiLedBars/src/tasks/artnet/rpi_artnet.c b/RpiLedBars/backend/src/tasks/artnet/artnet.c similarity index 98% rename from RpiLedBars/src/tasks/artnet/rpi_artnet.c rename to RpiLedBars/backend/src/tasks/artnet/artnet.c index 28e2645..03d6904 100644 --- a/RpiLedBars/src/tasks/artnet/rpi_artnet.c +++ b/RpiLedBars/backend/src/tasks/artnet/artnet.c @@ -7,7 +7,7 @@ /*************************************************************************************************** * Includes **************************************************************************************************/ -#include "rpi_artnet.h" +#include "artnet.h" #include #include @@ -20,8 +20,9 @@ #include #include +#include "artnet_packets.h" +#include "artnet_utils.h" #include "log.h" -#include "rpi_artnet_utils.h" /*************************************************************************************************** * Preprocessor Constants and Macros diff --git a/RpiLedBars/src/tasks/artnet/rpi_artnet_op_codes.h b/RpiLedBars/backend/src/tasks/artnet/artnet_op_codes.h similarity index 100% rename from RpiLedBars/src/tasks/artnet/rpi_artnet_op_codes.h rename to RpiLedBars/backend/src/tasks/artnet/artnet_op_codes.h diff --git a/RpiLedBars/src/tasks/artnet/rpi_artnet_packets.h b/RpiLedBars/backend/src/tasks/artnet/artnet_packets.h similarity index 98% rename from RpiLedBars/src/tasks/artnet/rpi_artnet_packets.h rename to RpiLedBars/backend/src/tasks/artnet/artnet_packets.h index 30fb25f..b643838 100644 --- a/RpiLedBars/src/tasks/artnet/rpi_artnet_packets.h +++ b/RpiLedBars/backend/src/tasks/artnet/artnet_packets.h @@ -3,8 +3,8 @@ #include -#include "rpi_artnet_op_codes.h" -#include "rpi_artnet_utils.h" +#include "artnet_op_codes.h" +#include "artnet_utils.h" typedef struct { char id[8]; diff --git a/RpiLedBars/src/tasks/artnet/rpi_artnet_utils.h b/RpiLedBars/backend/src/tasks/artnet/artnet_utils.h similarity index 100% rename from RpiLedBars/src/tasks/artnet/rpi_artnet_utils.h rename to RpiLedBars/backend/src/tasks/artnet/artnet_utils.h diff --git a/RpiLedBars/src/tasks/cava/rpi_cava.c b/RpiLedBars/backend/src/tasks/cava/cava.c similarity index 99% rename from RpiLedBars/src/tasks/cava/rpi_cava.c rename to RpiLedBars/backend/src/tasks/cava/cava.c index 0016aa1..552b302 100644 --- a/RpiLedBars/src/tasks/cava/rpi_cava.c +++ b/RpiLedBars/backend/src/tasks/cava/cava.c @@ -5,7 +5,7 @@ /*************************************************************************************************** * Includes **************************************************************************************************/ -#include "rpi_cava.h" +#include "cava.h" #include #include diff --git a/RpiLedBars/src/tasks/artnet/rpi_artnet.h b/RpiLedBars/backend/src/tasks/includes/artnet.h similarity index 92% rename from RpiLedBars/src/tasks/artnet/rpi_artnet.h rename to RpiLedBars/backend/src/tasks/includes/artnet.h index eb5c443..236ee02 100644 --- a/RpiLedBars/src/tasks/artnet/rpi_artnet.h +++ b/RpiLedBars/backend/src/tasks/includes/artnet.h @@ -1,16 +1,16 @@ -/** @file rpi_artnet.h +/** @file artnet.h * @brief This module contains continuous tasks for artnet node communications. * * This is the header file for the definition of services to allow managing thread acting as artnet * node. */ -#if !defined(__RPI_ARTNET_H__) -#define __RPI_ARTNET_H__ +#if !defined(__ARTNET_H__) +#define __ARTNET_H__ /*************************************************************************************************** * Includes **************************************************************************************************/ -#include "rpi_artnet_packets.h" +#include /*************************************************************************************************** * Preprocessor Constants and Macros @@ -47,4 +47,4 @@ void artnet_stop(); */ int artnet_get_dmx_data(unsigned int univerve, uint8_t *dmxData[]); -#endif /* __RPI_ARTNET_H__ */ +#endif /* __ARTNET_H__ */ diff --git a/RpiLedBars/src/tasks/cava/rpi_cava.h b/RpiLedBars/backend/src/tasks/includes/cava.h similarity index 88% rename from RpiLedBars/src/tasks/cava/rpi_cava.h rename to RpiLedBars/backend/src/tasks/includes/cava.h index 817bd4b..086b358 100644 --- a/RpiLedBars/src/tasks/cava/rpi_cava.h +++ b/RpiLedBars/backend/src/tasks/includes/cava.h @@ -1,8 +1,8 @@ -/** @file rpi_cava.h +/** @file cava.h * @brief This module contains continuous tasks for cava (spectrum analyzer) comunication */ -#if !defined(__RPI_CAVA_H__) -#define __RPI_CAVA_H__ +#if !defined(__CAVA_H__) +#define __CAVA_H__ /*************************************************************************************************** * Includes @@ -28,17 +28,10 @@ * External Function Prototypes **************************************************************************************************/ -/** - * @brief Start artnet node module - **/ -void setup_cava(); - int cava_get_buffer(uint16_t **buffer_dst); -void close_cava(); - void cava_start(); void cava_stop(); -#endif /* __RPI_CAVA_H__ */ \ No newline at end of file +#endif /* __CAVA_H__ */ \ No newline at end of file diff --git a/RpiLedBars/backend/src/tasks/includes/selector.h b/RpiLedBars/backend/src/tasks/includes/selector.h new file mode 100644 index 0000000..74fabf3 --- /dev/null +++ b/RpiLedBars/backend/src/tasks/includes/selector.h @@ -0,0 +1,34 @@ +/** @file selector.h + * @brief This module contains continuous tasks for cava (spectrum analyzer) comunication + */ +#if !defined(__SELECTOR_TASK_H__) +#define __SELECTOR_TASK_H__ + +/*************************************************************************************************** + * Includes + **************************************************************************************************/ + +/*************************************************************************************************** + * Preprocessor Constants and Macros + **************************************************************************************************/ + +/*************************************************************************************************** + * Type and Contant Definitions + **************************************************************************************************/ + +/*************************************************************************************************** + * Global Variables + **************************************************************************************************/ + +/*************************************************************************************************** + * External Function Prototypes + **************************************************************************************************/ + +/** + * @brief Start selector listener module + **/ +void selector_start(); + +void selector_stop(); + +#endif /* __SELECTOR_TASK_H__ */ \ No newline at end of file diff --git a/RpiLedBars/src/tasks/websocket/rpi_websocket.h b/RpiLedBars/backend/src/tasks/includes/websocket.h similarity index 82% rename from RpiLedBars/src/tasks/websocket/rpi_websocket.h rename to RpiLedBars/backend/src/tasks/includes/websocket.h index 997df2b..38f8a30 100644 --- a/RpiLedBars/src/tasks/websocket/rpi_websocket.h +++ b/RpiLedBars/backend/src/tasks/includes/websocket.h @@ -1,9 +1,9 @@ -/** @file rpi_websocket..h +/** @file websocket.h * @brief This module */ -#if !defined(__RPI_WEBSOCKET_H__) -#define __RPI_WEBSOCKET_H__ +#if !defined(__WEBSOCKET_H__) +#define __WEBSOCKET_H__ /*************************************************************************************************** * Includes @@ -30,4 +30,14 @@ **/ void websocket_start(); -#endif /* __RPI_WEBSOCKET_H__ */ +/** + * @brief Start websocket module + **/ +void websocket_stop(); + +/** + * @brief Send mode to websocket client + **/ +void websocket_send_mode(int mode); + +#endif /* __WEBSOCKET_H__ */ diff --git a/RpiLedBars/backend/src/tasks/selector/selector.c b/RpiLedBars/backend/src/tasks/selector/selector.c new file mode 100644 index 0000000..44dadea --- /dev/null +++ b/RpiLedBars/backend/src/tasks/selector/selector.c @@ -0,0 +1,87 @@ +/** @file selector.c + * @brief This module contains continuous tasks for cava (spectrum analyzer) comunication + */ + +/*************************************************************************************************** + * Includes + **************************************************************************************************/ +#include "selector.h" + +#include +#include +#include +#include + +#include "../../drivers/selector/rpi_selector.h" +#include "../../rpi_param.h" + +#include "log.h" + +/*************************************************************************************************** + * Preprocessor Constants and Macros + **************************************************************************************************/ + +#define LISTENER_INTERVAL 500000 + +/*************************************************************************************************** + * Type and Contant Definitions + **************************************************************************************************/ + +/*************************************************************************************************** + * Persistent Variables + **************************************************************************************************/ + +pthread_t selectorListener; +/** + * Boolean for interrupting the main thread loop + */ +bool isSelectorListenerRunning = false; + +/*************************************************************************************************** + * Internal Function Prototypes + **************************************************************************************************/ + +/** + * @brief This function is used to thread main execution function + * + * @param arg not used. + * + * @return NULL. + */ +static void *listen_to_selector(void *arg); + +/*************************************************************************************************** + * External Function Definitions + **************************************************************************************************/ + +void selector_start() { + isSelectorListenerRunning = true; + pthread_create(&selectorListener, NULL, listen_to_selector, NULL); +} + +void selector_stop() { + isSelectorListenerRunning = false; + if (pthread_join(selectorListener, NULL) != 0) { + log_error("pthread_join: %s", strerror(errno)); + } +} + +/*************************************************************************************************** + * Internal Function Definitions + **************************************************************************************************/ + +static void *listen_to_selector(void *arg) { + int previousPosition; + selector_setup(); + + while (isSelectorListenerRunning) { + int newPosition = selector_get_position(); + if (newPosition != -1 && newPosition != previousPosition) { + set_mode(newPosition); + previousPosition = newPosition; + } + usleep(LISTENER_INTERVAL); + } + + return NULL; +} \ No newline at end of file diff --git a/RpiLedBars/src/tasks/websocket/rpi_websocket.c b/RpiLedBars/backend/src/tasks/websocket/websocket.c similarity index 61% rename from RpiLedBars/src/tasks/websocket/rpi_websocket.c rename to RpiLedBars/backend/src/tasks/websocket/websocket.c index cf26364..b75718d 100644 --- a/RpiLedBars/src/tasks/websocket/rpi_websocket.c +++ b/RpiLedBars/backend/src/tasks/websocket/websocket.c @@ -1,4 +1,4 @@ -/** @file rpi_websocket..c +/** @file websocket.c * @brief This module */ @@ -6,14 +6,15 @@ * Includes **************************************************************************************************/ -#include "rpi_websocket.h" +#include "websocket.h" -#include #include #include #include #include -#include + +#include "log.h" +#include "ws.h" #include "../../rpi_param.h" @@ -31,7 +32,7 @@ * Persistent Variables **************************************************************************************************/ -char *tokenArray[MAX_TOKEN] = {NULL}; +int client_fd = -1; /*************************************************************************************************** * Internal Function Prototypes @@ -70,6 +71,12 @@ void onclose(int fd); */ void onmessage(int fd, const unsigned char *msg, uint64_t size, int type); +void mode_command_handler(char *payload); + +void pattern_command_handler(char *payload); + +void color_command_handler(char *payload); + /*************************************************************************************************** * External Function Definitions **************************************************************************************************/ @@ -84,6 +91,15 @@ void websocket_start() { void websocket_stop() {} +void websocket_send_mode(int mode) { + char msg[] = "m:0"; + msg[2] = '0' + mode; + if (client_fd != -1) { + log_debug("Sending mode \"%s\"", msg); + ws_sendframe_txt(client_fd, msg, true); + } +} + /*************************************************************************************************** * Internal Function Definitions **************************************************************************************************/ @@ -93,6 +109,7 @@ void onopen(int fd) { cli = ws_getaddress(fd); log_debug("Connection opened, client: %d | addr: %s", fd, cli); free(cli); + client_fd = fd; } void onclose(int fd) { @@ -100,40 +117,78 @@ void onclose(int fd) { cli = ws_getaddress(fd); log_debug("Connection closed, client: %d | addr: %s", fd, cli); free(cli); + client_fd = -1; } void onmessage(int fd, const unsigned char *msg, uint64_t size, int type) { - char msgStr[size]; - char *cli; - cli = ws_getaddress(fd); + char msgStr[size + 1]; + char *command, *payload; + char *cli = ws_getaddress(fd); log_trace("Received message: %s (size: %" PRId64 ", type: %d), from: %s/%d", msg, size, type, cli, fd); - if (msg[0] == '{' && msg[size - 1] == '}') { - int i = 0; - memcpy(msgStr, msg + 1, size - 2); - msgStr[size - 2] = '\0'; - tokenArray[i] = strtok(msgStr, ","); - while (tokenArray[i] && i < MAX_TOKEN - 1) { - tokenArray[++i] = strtok(NULL, ","); - } - log_debug("tokens[%d]", i); - for (size_t n = 0; n < i; ++n) { - log_debug(" - %s", tokenArray[n]); - } - if (atoi(tokenArray[0]) == 0) { - set_hue_base(LED_NCHANS, atoi(tokenArray[1]) * INT8_MAX / HUE_MAX); - set_saturation(LED_NCHANS, atoi(tokenArray[2]) * INT8_MAX / 100); - set_luminosity(LED_NCHANS, atoi(tokenArray[3]) * INT8_MAX / 100); - } else if (atoi(tokenArray[0]) == 1) { - /* code */ + strcpy(msgStr, (char *)msg); + command = strtok(msgStr, ":"); + if (command != NULL) { + payload = strtok(NULL, ":"); + if (payload != NULL && strlen(command) == 1) { + switch (command[0]) { + case 'm': + mode_command_handler(payload); + break; + case 'p': + pattern_command_handler(payload); + break; + case 'c': + color_command_handler(payload); + break; + + default: + log_warn("Unkown command in \"%s\"", msgStr); + break; + } } else { - /* code */ + log_warn("Empty payload in \"%s\"", msgStr); } } else { - log_warn("Invalid json format: %s (size: %" PRId64 ", type: %d), from: %s/%d", msg, size, type, - cli, fd); + log_warn("No command found in \"%s\"", msgStr); } free(cli); +} + +void mode_command_handler(char *payload) { + int newMode = atoi(payload); + if (0 <= newMode && newMode <= 3) { + set_mode(newMode); + } else { + log_warn("Unknown mode : %s", payload); + } +} + +void pattern_command_handler(char *payload) { + int newPattern = atoi(payload); + if (0 <= newPattern && newPattern <= 3) { + set_pattern(newPattern); + } else { + log_warn("Unknown pattern : %s", payload); + } +} + +void color_command_handler(char *payload) { + int i = 0; + char *tokenArray[MAX_TOKEN] = {NULL}; + tokenArray[i] = strtok(payload, ","); + while (tokenArray[i] && i < MAX_TOKEN - 1) { + tokenArray[++i] = strtok(NULL, ","); + } + log_debug("tokens[%d]", i); + for (size_t n = 0; n < i; ++n) { + log_debug(" - %s", tokenArray[n]); + } + if (atoi(tokenArray[0]) == 0) { + set_hue_base(LED_NCHANS, atoi(tokenArray[1]) * INT8_MAX / HUE_MAX); + set_saturation(LED_NCHANS, atoi(tokenArray[2]) * INT8_MAX / 100); + set_luminosity(LED_NCHANS, atoi(tokenArray[3]) * INT8_MAX / 100); + } } \ No newline at end of file diff --git a/RpiLedBars/cava b/RpiLedBars/cava index 1b7c395..4c0acb7 160000 --- a/RpiLedBars/cava +++ b/RpiLedBars/cava @@ -1 +1 @@ -Subproject commit 1b7c395bac21877bfb18db8378559e10f8661b32 +Subproject commit 4c0acb788535beac6b3c142d5a8abc9aee4cf93e diff --git a/RpiLedBars/libs/log.c b/RpiLedBars/libs/log.c deleted file mode 160000 index f9ea349..0000000 --- a/RpiLedBars/libs/log.c +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f9ea34994bd58ed342d2245cd4110bb5c6790153 diff --git a/RpiLedBars/libs/wsServer b/RpiLedBars/libs/wsServer deleted file mode 160000 index db03ae8..0000000 --- a/RpiLedBars/libs/wsServer +++ /dev/null @@ -1 +0,0 @@ -Subproject commit db03ae8487cca3d2919a96af920eb65653d9da99