Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 40 additions & 3 deletions .github/workflows/Harp.Behavior.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,16 +13,53 @@ env:
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
if: github.event_name != 'release'
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

# ----------------------------------------------------------------------- Build firmware
- name: Build firmware
working-directory: Firmware/Behavior
id: build
shell: bash
run: make all HARDWARE_VERSION=${{matrix.hardware-target}} PREVIEW_VERSION=${{github.run_number}}

# ----------------------------------------------------------------------- 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

build-interface:
strategy:
fail-fast: false
matrix:
configuration: ['Release']
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:
Expand Down Expand Up @@ -79,7 +116,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
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,6 @@ desktop.ini
bin
obj
Debug
Release
packages
*.componentinfo.xml
176 changes: 88 additions & 88 deletions Firmware/Behavior/Behavior.cproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,100 +60,100 @@
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u"</avrgcc.common.Device>
<avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.linker.libraries.LibrarySearchPaths>
<ListValues>
<Value>C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Synchronizer\Firmware_\Synchronizer\Synchronizer\Synchronizer</Value>
<Value>C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Synchronizer\Firmware_\Synchronizer\Synchronizer</Value>
<Value>C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Synchronizer\Firmware\Synchronizer</Value>
<Value>C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Behavior\Firmware\Behavior</Value>
<Value>C:\Users\CR Filipe\Documents\BitBucket\Device.Behavior\Firmware\Behavior</Value>
<Value>C:\Users\Filipe Carvalho\Documents\BitBucket\Device.Wear.Basestation\Firmware\Master</Value>
<Value>C:\Users\Filipe Carvalho\Documents\BitBucket.FilCarvalho\Harp\Corelibrary.Atxmega\Downloads</Value>
<Value>C:\Users\Work\Documents\device.behavior\Firmware\Behavior</Value>
</ListValues>
</avrgcc.linker.libraries.LibrarySearchPaths>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</AvrGcc>
<avrgcc.common.Device>-mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u"</avrgcc.common.Device>
<avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>NDEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize for size (-Os)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
<Value>libATxmega128A1U-1.15.a</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.linker.libraries.LibrarySearchPaths>
<ListValues>
<Value>..</Value>
</ListValues>
</avrgcc.linker.libraries.LibrarySearchPaths>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
</AvrGcc>
</ToolchainSettings>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<ToolchainSettings>
<AvrGcc>
<avrgcc.common.Device>-mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u"</avrgcc.common.Device>
<avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize most (-O3)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
<Value>libATxmega128A1U-1.15.a</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.linker.libraries.LibrarySearchPaths>
<ListValues>
<Value>..</Value>
</ListValues>
</avrgcc.linker.libraries.LibrarySearchPaths>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
<avrgcc.common.Device>-mmcu=atxmega128a1u -B "%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\gcc\dev\atxmega128a1u"</avrgcc.common.Device>
<avrgcc.common.optimization.RelaxBranches>True</avrgcc.common.optimization.RelaxBranches>
<avrgcc.common.outputfiles.hex>True</avrgcc.common.outputfiles.hex>
<avrgcc.common.outputfiles.lss>True</avrgcc.common.outputfiles.lss>
<avrgcc.common.outputfiles.eep>True</avrgcc.common.outputfiles.eep>
<avrgcc.common.outputfiles.srec>True</avrgcc.common.outputfiles.srec>
<avrgcc.common.outputfiles.usersignatures>False</avrgcc.common.outputfiles.usersignatures>
<avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>True</avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned>
<avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>True</avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned>
<avrgcc.compiler.symbols.DefSymbols>
<ListValues>
<Value>DEBUG</Value>
</ListValues>
</avrgcc.compiler.symbols.DefSymbols>
<avrgcc.compiler.directories.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.compiler.directories.IncludePaths>
<avrgcc.compiler.optimization.level>Optimize most (-O3)</avrgcc.compiler.optimization.level>
<avrgcc.compiler.optimization.PackStructureMembers>True</avrgcc.compiler.optimization.PackStructureMembers>
<avrgcc.compiler.optimization.AllocateBytesNeededForEnum>True</avrgcc.compiler.optimization.AllocateBytesNeededForEnum>
<avrgcc.compiler.optimization.DebugLevel>Default (-g2)</avrgcc.compiler.optimization.DebugLevel>
<avrgcc.compiler.warnings.AllWarnings>True</avrgcc.compiler.warnings.AllWarnings>
<avrgcc.linker.libraries.Libraries>
<ListValues>
<Value>libm</Value>
<Value>libATxmega128A1U-1.15.a</Value>
</ListValues>
</avrgcc.linker.libraries.Libraries>
<avrgcc.linker.libraries.LibrarySearchPaths>
<ListValues>
<Value>..</Value>
</ListValues>
</avrgcc.linker.libraries.LibrarySearchPaths>
<avrgcc.assembler.general.IncludePaths>
<ListValues>
<Value>%24(PackRepoDir)\atmel\XMEGAA_DFP\1.1.68\include</Value>
</ListValues>
</avrgcc.assembler.general.IncludePaths>
<avrgcc.assembler.debugging.DebugLevel>Default (-Wa,-g)</avrgcc.assembler.debugging.DebugLevel>
</AvrGcc>
</ToolchainSettings>
<UsesExternalMakeFile>True</UsesExternalMakeFile>
<OutputDirectory>
</OutputDirectory>
<BuildTarget>all</BuildTarget>
<CleanTarget>clean</CleanTarget>
<ExternalMakeFilePath>Makefile</ExternalMakeFilePath>
</PropertyGroup>
<ItemGroup>
<Compile Include="app.c">
Expand Down
78 changes: 78 additions & 0 deletions Firmware/Behavior/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
PRJ_NAME = Behavior
CORE = ATxmega128A1U
MCU = atxmega128a1u
CORE_VERSION = 1.15
FIRMWARE_VERSION ?= 3.3
HARDWARE_VERSION ?= 2.0
PREVIEW_VERSION ?= 0

# Files and directories
BUILD_DIR = bin
PREVIEW_SUFFIX = $(if $(PREVIEW_VERSION:v%=),-preview$(PREVIEW_VERSION),)
BUILD_NAME = $(PRJ_NAME)-fw$(FIRMWARE_VERSION)-harp$(CORE_VERSION)-hw$(HARDWARE_VERSION)-ass0$(PREVIEW_SUFFIX)
FW_VERSION_WORDS = $(subst ., ,$(FIRMWARE_VERSION))
HW_VERSION_WORDS = $(subst ., ,$(HARDWARE_VERSION))
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=$(word 1,$(FW_VERSION_WORDS)) \
-DMINOR_FW_VERSION=$(word 2,$(FW_VERSION_WORDS)) \
-DMAJOR_HW_VERSION=$(word 1,$(HW_VERSION_WORDS)) \
-DMINOR_HW_VERSION=$(word 2,$(HW_VERSION_WORDS)) \
-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) $< $@
10 changes: 5 additions & 5 deletions Firmware/Behavior/app.c
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,11 @@ static const uint8_t default_device_name[] = "Behavior";
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;
uint8_t hwH = MAJOR_HW_VERSION;
uint8_t hwL = MINOR_HW_VERSION;
uint8_t fwH = MAJOR_FW_VERSION;
uint8_t fwL = MINOR_FW_VERSION;
uint8_t ass = ASSEMBLY_VERSION;

/* Start core */
core_func_start_core(
Expand Down
20 changes: 20 additions & 0 deletions Firmware/Behavior/app.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,26 @@
#include <avr/io.h>


/************************************************************************/
/* Define versions */
/************************************************************************/
#ifndef MAJOR_HW_VERSION
#define MAJOR_HW_VERSION 2
#endif
#ifndef MINOR_HW_VERSION
#define MINOR_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 ASSEMBLY_VERSION
#define ASSEMBLY_VERSION 0
#endif


/************************************************************************/
/* Enable the interrupts */
/************************************************************************/
Expand Down