From 6db2fa59356e97d1ec2b05d916284537383dc9f2 Mon Sep 17 00:00:00 2001 From: adb Date: Wed, 10 Feb 2021 01:06:20 +0100 Subject: [PATCH] init platformio --- .gitignore | 1 + CMakeLists.txt | 33 ++++++++++++ CMakeListsPrivate.txt | 121 ++++++++++++++++++++++++++++++++++++++++++ lib/README | 46 ++++++++++++++++ platformio.ini | 63 ++++++++++++++++++++++ src/main.cpp | 113 +++++++++++++++++++++++++++++++++++++++ test/README | 11 ++++ 7 files changed, 388 insertions(+) create mode 100644 .gitignore create mode 100644 CMakeLists.txt create mode 100644 CMakeListsPrivate.txt create mode 100644 lib/README create mode 100644 platformio.ini create mode 100644 src/main.cpp create mode 100644 test/README diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..03f4a3c --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.pio diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..bf8ce1b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,33 @@ +# !!! WARNING !!! AUTO-GENERATED FILE, PLEASE DO NOT MODIFY IT AND USE +# https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags +# +# If you need to override existing CMake configuration or add extra, +# please create `CMakeListsUser.txt` in the root of project. +# The `CMakeListsUser.txt` will not be overwritten by PlatformIO. + +cmake_minimum_required(VERSION 3.13) +set(CMAKE_SYSTEM_NAME Generic) +set(CMAKE_C_COMPILER_WORKS 1) +set(CMAKE_CXX_COMPILER_WORKS 1) + +project("ArtNet-Node" C CXX) + +include(CMakeListsPrivate.txt) + +if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/CMakeListsUser.txt) +include(CMakeListsUser.txt) +endif() + +add_custom_target( + Production ALL + COMMAND platformio -c clion run "$<$>:-e${CMAKE_BUILD_TYPE}>" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_custom_target( + Debug ALL + COMMAND platformio -c clion run --target debug "$<$>:-e${CMAKE_BUILD_TYPE}>" + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} +) + +add_executable(Z_DUMMY_TARGET ${SRC_LIST}) diff --git a/CMakeListsPrivate.txt b/CMakeListsPrivate.txt new file mode 100644 index 0000000..c52f836 --- /dev/null +++ b/CMakeListsPrivate.txt @@ -0,0 +1,121 @@ +# !!! WARNING !!! AUTO-GENERATED FILE, PLEASE DO NOT MODIFY IT AND USE +# https://docs.platformio.org/page/projectconf/section_env_build.html#build-flags +# +# If you need to override existing CMake configuration or add extra, +# please create `CMakeListsUser.txt` in the root of project. +# The `CMakeListsUser.txt` will not be overwritten by PlatformIO. + + + +set(CMAKE_CONFIGURATION_TYPES "Upload_UART;Upload_ISP;fuses_bootloader;" CACHE STRING "Build Types reflect PlatformIO Environments" FORCE) + + +SET(CMAKE_C_COMPILER "$ENV{HOME}/.platformio/packages/toolchain-atmelavr/bin/avr-gcc") +SET(CMAKE_CXX_COMPILER "$ENV{HOME}/.platformio/packages/toolchain-atmelavr/bin/avr-g++") +SET(CMAKE_CXX_FLAGS "-fno-exceptions -fno-threadsafe-statics -fpermissive -std=gnu++11 -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega644p") +SET(CMAKE_C_FLAGS "-std=gnu11 -fno-fat-lto-objects -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega644p") + +SET(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 11) + +if (CMAKE_BUILD_TYPE MATCHES "Upload_UART") + add_definitions(-D'PLATFORMIO=50100') + add_definitions(-D'ARDUINO_AVR_ATmega644') + add_definitions(-D'F_CPU=16000000L') + add_definitions(-D'ARDUINO_ARCH_AVR') + add_definitions(-D'ARDUINO=10808') + add_definitions(-D'__AVR_ATmega644P__') + + include_directories("${CMAKE_CURRENT_LIST_DIR}/include") + include_directories("${CMAKE_CURRENT_LIST_DIR}/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SPI/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/cores/MightyCore") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/variants/standard") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/AVR_examples/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/EEPROM/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Optiboot_flasher/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SD/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SPI1/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Servo/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SoftwareSerial/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Timer/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Wire/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Wire1/src") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/5.4.0/include-fixed") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/5.4.0/include") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/avr/include") + + FILE(GLOB_RECURSE EXTRA_LIB_SOURCES + ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/Upload_UART/*.* + ) +endif() + +if (CMAKE_BUILD_TYPE MATCHES "Upload_ISP") + add_definitions(-D'PLATFORMIO=50100') + add_definitions(-D'ARDUINO_AVR_ATmega644') + add_definitions(-D'F_CPU=16000000L') + add_definitions(-D'ARDUINO_ARCH_AVR') + add_definitions(-D'ARDUINO=10808') + add_definitions(-D'__AVR_ATmega644P__') + + include_directories("${CMAKE_CURRENT_LIST_DIR}/include") + include_directories("${CMAKE_CURRENT_LIST_DIR}/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SPI/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/cores/MightyCore") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/variants/standard") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/AVR_examples/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/EEPROM/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Optiboot_flasher/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SD/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SPI1/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Servo/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SoftwareSerial/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Timer/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Wire/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Wire1/src") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/5.4.0/include-fixed") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/5.4.0/include") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/avr/include") + + FILE(GLOB_RECURSE EXTRA_LIB_SOURCES + ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/Upload_ISP/*.* + ) +endif() +if (CMAKE_BUILD_TYPE MATCHES "fuses_bootloader") + add_definitions(-D'PLATFORMIO=50100') + add_definitions(-D'ARDUINO_AVR_ATmega644') + add_definitions(-D'F_CPU=16000000L') + add_definitions(-D'ARDUINO_ARCH_AVR') + add_definitions(-D'ARDUINO=10808') + add_definitions(-D'__AVR_ATmega644P__') + + include_directories("${CMAKE_CURRENT_LIST_DIR}/include") + include_directories("${CMAKE_CURRENT_LIST_DIR}/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SPI/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/cores/MightyCore") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/variants/standard") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/AVR_examples/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/EEPROM/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Optiboot_flasher/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SD/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SPI1/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Servo/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/SoftwareSerial/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Timer/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Wire/src") + include_directories("$ENV{HOME}/.platformio/packages/framework-arduino-avr-mightycore/libraries/Wire1/src") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/5.4.0/include-fixed") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/5.4.0/include") + include_directories("$ENV{HOME}/.platformio/packages/toolchain-atmelavr/avr/include") + + FILE(GLOB_RECURSE EXTRA_LIB_SOURCES + ${CMAKE_CURRENT_LIST_DIR}/.pio/libdeps/fuses_bootloader/*.* + ) +endif() + +FILE(GLOB_RECURSE SRC_LIST + ${CMAKE_CURRENT_LIST_DIR}/src/*.* + ${CMAKE_CURRENT_LIST_DIR}/lib/*.* +) + +list(APPEND SRC_LIST ${EXTRA_LIB_SOURCES}) diff --git a/lib/README b/lib/README new file mode 100644 index 0000000..6debab1 --- /dev/null +++ b/lib/README @@ -0,0 +1,46 @@ + +This directory is intended for project specific (private) libraries. +PlatformIO will compile them to static libraries and link into executable file. + +The source code of each library should be placed in a an own separate directory +("lib/your_library_name/[here are source files]"). + +For example, see a structure of the following two libraries `Foo` and `Bar`: + +|--lib +| | +| |--Bar +| | |--docs +| | |--examples +| | |--src +| | |- Bar.c +| | |- Bar.h +| | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html +| | +| |--Foo +| | |- Foo.c +| | |- Foo.h +| | +| |- README --> THIS FILE +| +|- platformio.ini +|--src + |- main.c + +and a contents of `src/main.c`: +``` +#include +#include + +int main (void) +{ + ... +} + +``` + +PlatformIO Library Dependency Finder will find automatically dependent +libraries scanning project source files. + +More information about PlatformIO Library Dependency Finder +- https://docs.platformio.org/page/librarymanager/ldf.html diff --git a/platformio.ini b/platformio.ini new file mode 100644 index 0000000..fa317f7 --- /dev/null +++ b/platformio.ini @@ -0,0 +1,63 @@ +; PlatformIO Project Configuration File +; +; Build options: build flags, source filter +; Upload options: custom upload port, speed and extra flags +; Library options: dependencies, extra library storages +; Advanced options: extra scripting +; +; Please visit documentation for the other options and examples +; https://docs.platformio.org/page/projectconf.html + +[platformio] +default_envs = Upload_UART + +[env] +platform = atmelavr +framework = arduino +board = ATmega644P +board_build.f_cpu = 16000000L +board_build.variant = standard +build_unflags = -flto +build_flags = +monitor_port = ${env:Upload_UART.upload_port} +monitor_speed = 9600 + +[env:Upload_UART] +upload_protocol = arduino +upload_port = /dev/cu.usbserial* +board_upload.speed = ${env:fuses_bootloader.board_bootloader.speed} +lib_deps = + tmrh20/RF24@^1.3.11 + arduino-libraries/ArduinoDMX@^1.0.1 + arduino-libraries/ArduinoRS485@^1.0.0 + uipethernet/UIPEthernet@^2.0.8 + +[env:Upload_ISP] +upload_protocol = custom +upload_flags = + -C$PROJECT_PACKAGES_DIR/tool-avrdude/avrdude.conf + -p$BOARD_MCU + -PUSB + -cusbasp +upload_command = avrdude $UPLOAD_FLAGS -U flash:w:$SOURCE:i +lib_deps = + tmrh20/RF24@^1.3.11 + arduino-libraries/ArduinoDMX@^1.0.1 + arduino-libraries/ArduinoRS485@^1.0.0 + uipethernet/UIPEthernet@^2.0.8 + +[env:fuses_bootloader] +board_hardware.oscillator = external +board_hardware.uart = uart0 +board_bootloader.speed = 115200 +board_hardware.bod = 2.7v +board_hardware.eesave = yes +upload_protocol = usbasp +upload_flags = + -PUSB + -B8 +lib_deps = + tmrh20/RF24@^1.3.11 + arduino-libraries/ArduinoDMX@^1.0.1 + arduino-libraries/ArduinoRS485@^1.0.0 + uipethernet/UIPEthernet@^2.0.8 diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..5344b8f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,113 @@ +#include + +//DMX stuff +#include +#include +const int universeSize = 512; + +//ArtNet stuff +#include +ArtnetReceiver artnet; +uint32_t universe0 = 0; +uint32_t universe1 = 1; + +// ethernet stuff +const IPAddress ip(10, 255, 255, 255); +uint8_t mac[] = {0xAA, 0xDD, 0xBB, 0xAA, 0xDD, 0xBB}; + +//NRF stuff +#include +#include +#include +RF24 radio (0, 1); + +const uint16_t address = 0xADB0; +uint64_t datasend; + +//RGB LED +const int statusLED[] = {23,22, 21}; //RGB +const int statusLEDlength = 3; +int statusLEDstat[3]; + +//define min interval to show error +unsigned long currentTime = millis(); +unsigned long previousTime = 0; +const long waitTime = 100; +const long errorTime = 5000; + +//setup +void setup() { + for (int i=0; i < statusLEDlength; i++){ + pinMode(statusLED[i], OUTPUT); + digitalWrite(statusLED[i], LOW); + } + pinMode(10, OUTPUT); + digitalWrite(10, LOW); + + //start DMX + DMX.begin(universeSize); + + //start ethernet + Ethernet.begin(mac, ip); + + //start ArtNet + artnet.begin(); + artnet.subscribe(universe0, callback); + + //start NRF + radio.begin(); + radio.openWritingPipe(address); + radio.setPALevel(RF24_PA_LOW); + radio.setDataRate(RF24_1MBPS); + //radio.disableDynamicPayloads(); + radio.setAutoAck(false); + radio.disableCRC(); + radio.stopListening(); + + setRGB(0,0,255); + delay(200); +} + +void loop() { + currentTime = millis(); + if (artnet.parse()) { // check if artnet packet has come and execute callback + previousTime = currentTime; + setRGB(0,255,0); + }else if(currentTime - previousTime >= errorTime){ + setRGB(255,0,0); + }else if(currentTime - previousTime >= waitTime){ + setRGB(0,0,255); + } +} + +//ArtNet universe0 callback +void callback(byte* artnetdata, uint16_t size) { + digitalWrite(10, HIGH); + //RGB PWM + //setRGB(artnetdata[0], artnetdata[1], artnetdata[2]); + //DMX output + DMX.beginTransmission(); + for (int i = 0; i < universeSize; ++i) { + DMX.write(i, artnetdata[i]); + } + DMX.endTransmission(); + + //send NRF + for (int i = 0; i < 20; i++) { + datasend = i; //package ID + for (int j = 0; j < 7; j++) { + datasend = (datasend << 8) + artnetdata[7 * i + j]; + } + radio.writeFast(&datasend, sizeof(datasend)); + } + digitalWrite(10, LOW); +} + +void setRGB(int r, int g, int b){ + if (r != statusLEDstat[0]) analogWrite(statusLED[0], r); + if (g != statusLEDstat[1]) analogWrite(statusLED[1], g); + if (b != statusLEDstat[2]) analogWrite(statusLED[2], b); + statusLEDstat[0] = r; + statusLEDstat[1] = g; + statusLEDstat[2] = b; +} diff --git a/test/README b/test/README new file mode 100644 index 0000000..b94d089 --- /dev/null +++ b/test/README @@ -0,0 +1,11 @@ + +This directory is intended for PlatformIO Unit Testing and project tests. + +Unit Testing is a software testing method by which individual units of +source code, sets of one or more MCU program modules together with associated +control data, usage procedures, and operating procedures, are tested to +determine whether they are fit for use. Unit testing finds problems early +in the development cycle. + +More information about PlatformIO Unit Testing: +- https://docs.platformio.org/page/plus/unit-testing.html