diff --git a/.github/workflows/Harp.Behavior.yml b/.github/workflows/Harp.Behavior.yml index df4c0e2..2bf2904 100644 --- a/.github/workflows/Harp.Behavior.yml +++ b/.github/workflows/Harp.Behavior.yml @@ -12,9 +12,56 @@ env: DOTNET_CLI_TELEMETRY_OPTOUT: true DOTNET_GENERATE_ASPNET_CERTIFICATE: false ContinuousIntegrationBuild: true - CiBuildVersion: ${{github.event.release.tag_name || 'api42.42.42'}} + AVR_TOOLCHAIN_URL: https://ww1.microchip.com/downloads/aemDocuments/documents/OTH/ProductDocuments/SoftwareTools/avr8-gnu-toolchain-3.6.2.1778-win32.any.x86.zip jobs: - build: + build-firmware: + strategy: + fail-fast: false + matrix: + hardware-target: ['1.1', '1.2', '2.0'] + name: Build Firmware (hw${{matrix.hardware-target}}) + runs-on: windows-latest + steps: + # ----------------------------------------------------------------------- Checkout + - name: Checkout + uses: actions/checkout@v4 + + # ----------------------------------------------------------------------- Set up tools + - name: Set up AVR-GCC + run: | + Invoke-WebRequest -Uri $env:AVR_TOOLCHAIN_URL -OutFile $HOME\avr8-gnu-toolchain-win32_x86_64.zip + Expand-Archive $HOME\avr8-gnu-toolchain-win32_x86_64.zip -DestinationPath $HOME -Force + echo "$(Resolve-Path $HOME\avr8-gnu-toolchain-win32_x86\bin)" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append + + # ----------------------------------------------------------------------- Configure build + - name: Configure build + id: configure-build + uses: harp-tech/configure-build@v1 + + # ----------------------------------------------------------------------- Build firmware + - name: Build firmware + working-directory: Firmware/Behavior + id: build + shell: bash + run: make all FIRMWARE_VERSION=${{env.CiBuildVersion}} HARDWARE_VERSION=${{matrix.hardware-target}} PREVIEW_VERSION=${{env.CiFirmwarePreviewVersion}} + + # ----------------------------------------------------------------------- Collect artifacts + - name: Collect Firmware binaries + uses: actions/upload-artifact@v4 + if: steps.build.outcome == 'success' && always() + with: + name: Firmware-hw${{matrix.hardware-target}} + if-no-files-found: error + path: Firmware/Behavior/bin/*.hex + + # ----------------------------------------------------------------------- Upload release assets + - name: Upload release assets + if: github.event_name == 'release' + run: gh release upload --repo ${{github.repository}} ${{github.event.release.tag_name}} Firmware/Behavior/bin/*.hex --clobber + env: + GH_TOKEN: ${{github.token}} + + build-interface: strategy: fail-fast: false matrix: @@ -22,9 +69,8 @@ jobs: include: - configuration: Release collect-packages: true - name: Build + name: Build Interface runs-on: windows-latest - if: github.event_name != 'release' || startsWith(github.event.release.tag_name, 'api') steps: # ----------------------------------------------------------------------- Checkout - name: Checkout @@ -39,6 +85,11 @@ jobs: - name: Set up T4 run: dotnet tool install -g dotnet-t4 --version 3.0.0 + # ----------------------------------------------------------------------- Configure build + - name: Configure build + id: configure-build + uses: harp-tech/configure-build@v1 + # ----------------------------------------------------------------------- Regenerate - name: Restore generators run: dotnet restore Generators @@ -72,6 +123,13 @@ jobs: if-no-files-found: error path: Interface/bin/${{matrix.configuration}}/** + # ----------------------------------------------------------------------- Upload release assets + - name: Upload release assets + if: github.event_name == 'release' && matrix.configuration == 'Release' + run: gh release upload --repo ${{github.repository}} ${{github.event.release.tag_name}} Interface/bin/${{matrix.configuration}}/** --clobber + env: + GH_TOKEN: ${{github.token}} + publish-packages-nuget-org: name: Publish packages to NuGet.org runs-on: ubuntu-latest @@ -79,7 +137,7 @@ jobs: # Needed to attach files to releases contents: write environment: public-release - needs: build + needs: [build-firmware, build-interface] if: github.event_name == 'release' steps: # ----------------------------------------------------------------------- Set up .NET diff --git a/.gitignore b/.gitignore index fd28932..00cb6ad 100644 --- a/.gitignore +++ b/.gitignore @@ -8,5 +8,6 @@ desktop.ini bin obj Debug +Release packages *.componentinfo.xml \ No newline at end of file diff --git a/Firmware/Behavior/Behavior.cproj b/Firmware/Behavior/Behavior.cproj index 619de21..f1dfa4e 100644 --- a/Firmware/Behavior/Behavior.cproj +++ b/Firmware/Behavior/Behavior.cproj @@ -60,100 +60,100 @@ - -mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u" - True - True - True - True - True - False - True - True - - - NDEBUG - - - - - %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include - - - Optimize for size (-Os) - True - True - True - - - libm - - - - - C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Synchronizer\Firmware_\Synchronizer\Synchronizer\Synchronizer - C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Synchronizer\Firmware_\Synchronizer\Synchronizer - C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Synchronizer\Firmware\Synchronizer - C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Behavior\Firmware\Behavior - C:\Users\CR Filipe\Documents\BitBucket\Device.Behavior\Firmware\Behavior - C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Wear.Basestation\Firmware\Master - C:\Users\Filipe Carvalho\Documents\BitBucket.FilCarvalho\Harp\Corelibrary.Atxmega\Downloads - C:\Users\Work\Documents\device.behavior\Firmware\Behavior - - - - - %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include - - - + -mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u" + True + True + True + True + True + False + True + True + + + NDEBUG + + + + + %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include + + + Optimize for size (-Os) + True + True + True + + + libm + libATxmega128A1U-1.15.a + + + + + .. + + + + + %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include + + + - -mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u" - True - True - True - True - True - False - True - True - - - DEBUG - - - - - %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include - - - Optimize most (-O3) - True - True - Default (-g2) - True - - - libm - libATxmega128A1U-1.15.a - - - - - .. - - - - - %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include - - - Default (-Wa,-g) - + -mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u" + True + True + True + True + True + False + True + True + + + DEBUG + + + + + %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include + + + Optimize most (-O3) + True + True + Default (-g2) + True + + + libm + libATxmega128A1U-1.15.a + + + + + .. + + + + + %24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include + + + Default (-Wa,-g) + + True + + + all + clean + Makefile diff --git a/Firmware/Behavior/Makefile b/Firmware/Behavior/Makefile new file mode 100644 index 0000000..49c8759 --- /dev/null +++ b/Firmware/Behavior/Makefile @@ -0,0 +1,96 @@ +CORE = ATxmega128A1U +MCU = atxmega128a1u +CORE_VERSION = 1.15 +PREVIEW_VERSION ?= 0 + +# Read build metadata from app.h if not defined +APP_H_CONTENTS = $(file < app.h) +finddef = $(filter +%+,$(patsubst #define:$(1):%,+%+,$(subst #define$() $(1)$() ,#define:$(1):,$(strip $(APP_H_CONTENTS))))) +APP_VERSION_NAMES = $(sort $(filter %_VERSION,$(APP_H_CONTENTS))) +APP_VERSION_VALUES = $(subst +,,$(foreach name,$(APP_VERSION_NAMES),$(call finddef,$(name)))) +FIRMWARE_VERSION ?= $(word 1,$(APP_VERSION_VALUES)).$(word 3,$(APP_VERSION_VALUES)) +HARDWARE_VERSION ?= $(word 2,$(APP_VERSION_VALUES)).$(word 4,$(APP_VERSION_VALUES)) +PRJ_NAME = $(subst ",,$(subst +,,$(call finddef,DEVICE_NAME))) + +# Version flags +FW_VERSION_WORDS = $(subst ., ,$(firstword $(subst -, ,$(FIRMWARE_VERSION)))) +HW_VERSION_WORDS = $(subst ., ,$(firstword $(subst -, ,$(HARDWARE_VERSION)))) +MAJOR_FW_VERSION = $(word 1,$(FW_VERSION_WORDS)) +MINOR_FW_VERSION = $(word 2,$(FW_VERSION_WORDS)) +PATCH_FW_VERSION = $(or $(word 3,$(FW_VERSION_WORDS)), 0) +MAJOR_HW_VERSION = $(word 1,$(HW_VERSION_WORDS)) +MINOR_HW_VERSION = $(word 2,$(HW_VERSION_WORDS)) +PATCH_HW_VERSION = $(or $(word 3,$(HW_VERSION_WORDS)), 0) +FIRMWARE_FORMAT = $(MAJOR_FW_VERSION).$(MINOR_FW_VERSION) +HARDWARE_FORMAT = $(MAJOR_HW_VERSION).$(MINOR_HW_VERSION) + +# Files and directories +BUILD_DIR = bin +PREVIEW_SUFFIX = $(if $(PREVIEW_VERSION:v%=),-preview$(PREVIEW_VERSION),) +BUILD_NAME = $(PRJ_NAME)-fw$(FIRMWARE_FORMAT)-harp$(CORE_VERSION)-hw$(HARDWARE_FORMAT)-ass0$(PREVIEW_SUFFIX) +SRCS = $(wildcard *.c) +OBJS = $(SRCS:%.c=$(BUILD_DIR)/%.o) +LIBS = -l$(CORE)-$(CORE_VERSION) + +# Compiler flags +CC = avr-gcc +CFLAGS = \ +-x c \ +-funsigned-char \ +-funsigned-bitfields \ +-ffunction-sections \ +-fdata-sections \ +-fpack-struct \ +-fshort-enums \ +-mrelax \ +-O3 \ +-Wall \ +-mmcu=$(MCU) \ +-DMAJOR_FW_VERSION=$(MAJOR_FW_VERSION) \ +-DMINOR_FW_VERSION=$(MINOR_FW_VERSION) \ +-DPATCH_FW_VERSION=$(PATCH_FW_VERSION) \ +-DMAJOR_HW_VERSION=$(MAJOR_HW_VERSION) \ +-DMINOR_HW_VERSION=$(MINOR_HW_VERSION) \ +-DPATCH_HW_VERSION=$(PATCH_HW_VERSION) \ +-std=gnu99 + +# Linker flags +LDFLAGS = \ +-Wl,--start-group \ +-Wl,-lm \ +-Wl,$(LIBS) \ +-Wl,--end-group \ +-Wl,-L"." \ +-Wl,--gc-sections \ +-mrelax \ +-mmcu=$(MCU) + +# Object copy flags +OBJCOPY = avr-objcopy +OBJCOPY_FLAGS = \ +-O ihex \ +-R .eeprom \ +-R .fuse \ +-R .lock \ +-R .signature \ +-R .user_signatures \ + +all: $(BUILD_DIR)/$(BUILD_NAME).hex + +clean: + rm -f $(OBJS) $(OBJS:.o=.d) + rm -f $(BUILD_DIR)/$(BUILD_NAME).elf + rm -f $(BUILD_DIR)/$(BUILD_NAME).hex + rm -f $(BUILD_DIR)/$(BUILD_NAME).map + +$(BUILD_DIR): + mkdir "$(BUILD_DIR)" + +$(BUILD_DIR)/%.o: %.c $(BUILD_DIR) + $(CC) $(CFLAGS) -c $(INCS) -MD -MP -MF "$(@:.o=.d)" -MT"$(@:.o=.d)" -MT"$@" -o $@ $< + +$(BUILD_DIR)/%.elf: $(OBJS) + $(CC) -o $@ $(OBJS) -Wl,-Map="$(@:.elf=.map)" $(LDFLAGS) $(LIBS) + +$(BUILD_DIR)/%.hex: $(BUILD_DIR)/%.elf + $(OBJCOPY) $(OBJCOPY_FLAGS) $< $@ diff --git a/Firmware/Behavior/app.c b/Firmware/Behavior/app.c index 3c1cc36..2166ed0 100644 --- a/Firmware/Behavior/app.c +++ b/Firmware/Behavior/app.c @@ -28,23 +28,15 @@ extern bool (*app_func_wr_pointer[])(void*); /************************************************************************/ /* Initialize app */ /************************************************************************/ -static const uint8_t default_device_name[] = "Behavior"; +static const uint8_t default_device_name[] = DEVICE_NAME; void hwbp_app_initialize(void) -{ - /* Define versions */ - uint8_t hwH = 2; - uint8_t hwL = 0; - uint8_t fwH = 3; - uint8_t fwL = 3; - uint8_t ass = 0; - +{ /* Start core */ - core_func_start_core( - 1216, - hwH, hwL, - fwH, fwL, - ass, + core_func_start_core_V2( + WHO_AM_I, + MAJOR_HW_VERSION, MINOR_HW_VERSION, PATCH_HW_VERSION, + MAJOR_FW_VERSION, MINOR_FW_VERSION, PATCH_FW_VERSION, (uint8_t*)(&app_regs), APP_NBYTES_OF_REG_BANK, APP_REGS_ADD_MAX - APP_REGS_ADD_MIN + 1, diff --git a/Firmware/Behavior/app.h b/Firmware/Behavior/app.h index f6dbf9a..0254ba9 100644 --- a/Firmware/Behavior/app.h +++ b/Firmware/Behavior/app.h @@ -3,6 +3,36 @@ #include +/************************************************************************/ +/* Define identifiers */ +/************************************************************************/ +#define DEVICE_NAME "Behavior" +#define WHO_AM_I 1216 + + +/************************************************************************/ +/* Define versions */ +/************************************************************************/ +#ifndef MAJOR_HW_VERSION +#define MAJOR_HW_VERSION 2 +#endif +#ifndef MINOR_HW_VERSION +#define MINOR_HW_VERSION 0 +#endif +#ifndef PATCH_HW_VERSION +#define PATCH_HW_VERSION 0 +#endif +#ifndef MAJOR_FW_VERSION +#define MAJOR_FW_VERSION 3 +#endif +#ifndef MINOR_FW_VERSION +#define MINOR_FW_VERSION 3 +#endif +#ifndef PATCH_FW_VERSION +#define PATCH_FW_VERSION 0 +#endif + + /************************************************************************/ /* Enable the interrupts */ /************************************************************************/ diff --git a/Interface/Directory.Build.props b/Interface/Directory.Build.props index 1392799..5cc55f1 100644 --- a/Interface/Directory.Build.props +++ b/Interface/Directory.Build.props @@ -4,12 +4,13 @@ $(WarningsAsErrors);CS7035 $(NoWarn);CS1591 - - $(CiBuildVersion.Substring(3)) - true + + 0 + 42.42.42-dev$(DevVersion) + $(CiBuildVersion) - + - + \ No newline at end of file diff --git a/Interface/Harp.Behavior/Harp.Behavior.csproj b/Interface/Harp.Behavior/Harp.Behavior.csproj index c7a538e..04f6642 100644 --- a/Interface/Harp.Behavior/Harp.Behavior.csproj +++ b/Interface/Harp.Behavior/Harp.Behavior.csproj @@ -5,7 +5,6 @@ Copyright © harp-tech and Contributors true snupkg - true Bonsai Library containing interfaces for data acquisition and control of Harp Behavior devices. true Dependency;BonsaiLibrary @@ -17,8 +16,6 @@ README.md ..\bin\$(Configuration) net462;netstandard2.0 - 0.2.0 - 9.0 diff --git a/device.yml b/device.yml index e5ac24f..3790aff 100644 --- a/device.yml +++ b/device.yml @@ -4,7 +4,7 @@ device: Behavior whoAmI: 1216 firmwareVersion: "3.3" -hardwareTargets: "1.1" +hardwareTargets: "2.0" registers: DigitalInputState: address: 32