Compare commits

...

7 Commits

Author SHA1 Message Date
jakeg00dwin 87aae7719b removed the older make and exexcutable files 2024-04-10 10:47:17 -07:00
jakeg00dwin 18009c9b1f added all the needed template files 2024-04-10 10:47:04 -07:00
jakeg00dwin f4c29d1ac5 added the main.c and a cmakelists file 2024-04-10 10:46:35 -07:00
jakeg00dwin 688603ecfb removed the prebuild binary/hex files 2024-04-10 10:46:25 -07:00
jakeg00dwin 0ec455a53c added mocks dir 2024-04-10 10:46:15 -07:00
jakeg00dwin c1a6528a1f added docs dir 2024-04-10 10:46:08 -07:00
jakeg00dwin 0ca80bdef6 added cmake style build dir 2024-04-10 10:46:02 -07:00
23 changed files with 3331 additions and 22572 deletions

8
.gitignore vendored
View File

@ -1,3 +1,11 @@
main.o
main.map
main.elf
build/CMakeFiles
build/src
build/tests
build/CMakeCache.txt
build/CTestTestfile.cmake
build/Makefile
build/cmake_install.cmake
build/compile_commands.json

68
CMakeLists.txt Normal file
View File

@ -0,0 +1,68 @@
cmake_minimum_required(VERSION 3.20)
# Use the fancy version substitution
project(cmake-cpputest-template
VERSION 1.0
DESCRIPTION "template for cmake + cpputest"
LANGUAGES C CXX
)
enable_testing()
set(TARGET_GROUP production CACHE STRING "Group to build")
if(MSVC OR MSYS OR MINGW)
message("### SETUP FOR WINDOWS ###")
add_definitions(-DWINDOWS)
else()
message("### SETUP FOR UNIX ###")
add_definitions(-DUNIX)
endif()
# For being able to used LSP
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
# Request C 17 standard features
set(CMAKE_C_STANDARD 17)
set(CMAKE_C_STANDARD_REQUIRED True)
set(CMAKE_C_FLAGS "-Wall -Werror -Wpedantic")
# SETUP THE CXX flags for .cpp
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_CXX_FLAGS "-Wall -Werror -Wpedantic")
# #######################################
# TESTING STUFF
# #######################################
if (UNIT_TESTING)
if(DEFINED ENV{CPPUTEST_HOME})
message(STATUS "Using CppUTest home: $ENV{CPPUTEST_HOME}")
set(CPPUTEST_INCLUDE_DIRS $ENV{CPPUTEST_HOME}/include)
set(CPPUTEST_LIBRARIES $ENV{CPPUTEST_HOME}/lib)
set(CPPUTEST_LDFLAGS CppUTest CppUTestExt)
else()
find_package(PkgConfig REQUIRED)
pkg_search_module(CPPUTEST REQUIRED cpputest>=3.8)
message(STATUS "Found CppUTest version ${CPPUTEST_VERSION}")
endif()
include_directories(
${CPPUTEST_INCLUDE_DIRS}
/usr/include/c++/11/
)
link_directories(${CPPUTEST_LIBRARIES})
add_subdirectory(tests)
endif()
# #######################################
# PROJECT SPECIFIC
# #######################################
add_subdirectory(src)

2854
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

101
README.md
View File

@ -1,101 +0,0 @@
# AVR ATiny13 Project 002
This is the firmware for a latching dual relay system. It allows the user to
switch two DPDT relays by with two separate switches.
## Components:
**Micro:** AVR ATiny13, ATiny25/45/85
## Instructions:
1. Power the system using a 1.8v~5.5v power supply
2. Set/program the AVR to use a 1MHz clock rate.
3. Connect the pins as described above.
**ACTIVATING RELAYS:**
1. Activate the desired button with a quick press <= 350ms.
2. Repeat to toggle the relay.
**TEMPORARY TOGGLE:**
1. Press and hold the desired button >= 350ms.
2. Let go to disable.
**SAVING SETTINGS:**
1. Press and hold the target button.
2. While holding the button power cycle the device.
3. When the setting is successfully saved the relay/led will blink/toggle.
4. repeat until desired preset is saved.
## Technical Aspects:
The use of C style bitfields has been used inside a struct to maintain a global
state. It minimizes the size of the binary once compiled.
The majority of the code is blocking/polling; overhead from introducing
interrupts and ISR(interrupt service routines) wasn't as clean and made it more
platform dependent.
The code right now can for the most part be ported to any AVR micro-controller
with no changes.
## Timings
The current setup is calculated for a attiny13/a running at 4.8Mhz without the
clock divider fuse set.
This means that the actual f_cpu is 4.8Mhz to calculate the delay times
we can use this formula:
$$
msPerOverflow = 1000ms / (\frac{4.8Mhz}{64} * \frac{1}{256}) \approx 6.8ms
$$
Where $64$ is the pre scaler setting and $256$ is the maximum value of the 8bit
timer.
## BUILDING PROJECT:
**On Unix**
```sh
git clone <REPOURL>
cd <REPO>
make flash
```
## Flashing the Project
**On Windows(usbtinyisp)**
1. Install the usbtiny driver:
1. plug in usbtiny device
2. Install the drivers from: [adafruit](https://learn.adafruit.com/usbtinyisp/drivers)
2. open Powershell
3. navigate to the repo directory *cd Downloads\gf_002*
4. enter the command below.
```ps1
./avrdude.exe -p t13 -c usbtiny -B 125kHz -U flash:w:.\pre_built\attiny13_4-8Mhz.hex -U lfuse:w:0x79:m -U hfuse:w:0xFF:m -U lock:w:0xFF:m
```
**On Windows(usbASP)**
1. Install the usbasp driver:
1. plug in usbasp device
2. run the 'zadig-2.8.exe' program
3. select the libusb 32 on the right by clicking the down arrow to select.
2. open Powershell
3. navigate to the repo directory *cd Downloads\gf_002*
4. enter the command below.
```ps1
./avrdude.exe -p t13 -c usbasp -B 125kHz -U flash:w:.\pre_built\attiny13_4-8Mhz.hex -U lfuse:w:0x79:m -U hfuse:w:0xFF:m -U lock:w:0xFF:m
```

22341
avrdude.conf

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

0
build/.build_git_dir Normal file
View File

1
compile_commands.json Symbolic link
View File

@ -0,0 +1 @@
./build/compile_commands.json

0
docs/.docs_git_dir Normal file
View File

View File

@ -1,65 +0,0 @@
# Author: Jake Goodwin
# DATE: 2023-12-07
# Descripion: A simple makefile for building and flashing hex files
# Makefile for ATtiny13A
# Compiler
CC = avr-gcc
#Default cpu frequency is 9.8Mhz, 4.8 gives us less power consumption
#F_CPU = 1000000UL
F_CPU = 4800000UL
#F_CPU = 9800000UL
MCU = attiny13a
# Flags
CFLAGS = -g -Os -mmcu=$(MCU) -DF_CPU=$(F_CPU)
LDFLAGS = -Wl,-Map,$(TARGET).map
# Source files
SRC = main.c
# Object files
OBJ = $(SRC:.c=.o)
# Target HEX file
TARGET = main
# Flashing options
AVRDUDE = avrdude
AVRDUDE_PROGRAMMER = -c usbasp
BUADRATE = -B 125kHz
AVRDUDE_PORT = -P /dev/ttyUSB0
AVRDUDE_MCU = -p $(MCU)
# Compile and generate HEX file
all: $(TARGET).hex
$(TARGET).hex: $(TARGET).elf
avr-objcopy -j .text -j .data -O ihex $< $@
$(TARGET).elf: $(OBJ)
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^
%.o: %.c
$(CC) $(CFLAGS) -c $< -o $@
size: $(TARGET).o
avr-size --mcu=$(MCU) -t ./$(TARGET).o
# Default for the attiny13a is going to be 9.6Mhz
flash_defualt_fuses:
$(AVRDUDE) $(AVRDUDE_PROGRAMMER) $(AVRDUDE_PORT) $(AVRDUDE_MCU) $(BUADRATE) -U lfuse:w:0x6A:m -U hfuse:w:0xFF:m -U lock:w:0xFF:m
# This is for 4.8Mhz
flash_slow_fuse:
$(AVRDUDE) $(AVRDUDE_PROGRAMMER) $(AVRDUDE_PORT) $(AVRDUDE_MCU) $(BUADRATE) -U lfuse:w:0x69:m -U hfuse:w:0xFF:m -U lock:w:0xFF:m
flash_slow_nodiv8:
$(AVRDUDE) $(AVRDUDE_PROGRAMMER) $(AVRDUDE_PORT) $(AVRDUDE_MCU) $(BUADRATE) -U lfuse:w:0x79:m -U hfuse:w:0xFF:m -U lock:w:0xFF:m
flash: $(TARGET).hex
$(AVRDUDE) $(AVRDUDE_PROGRAMMER) $(AVRDUDE_PORT) $(AVRDUDE_MCU) $(BUADRATE) -U flash:w:$(TARGET).hex:i
clean:
rm -f $(OBJ) $(TARGET).elf $(TARGET).hex $(TARGET).map
.PHONY: all clean

0
mocks/.mocks_git_dir Normal file
View File

4
mocks/CMakeLists.txt Normal file
View File

@ -0,0 +1,4 @@

242
otto.sh Executable file
View File

@ -0,0 +1,242 @@
#!/bin/sh
# Author: Jake Goodwin
# Date: 2024
# Filename: otto.sh
CROSS_TC_WIN="$(pwd)/i686-w64-mingw32_toolchain.cmake"
CMAKE_VERBOSE="ON"
CROSS_COMPILE=1
TEMPLATE_FILES=".template_files"
MODULE_DIR="${TEMPLATE_FILES}/modules"
add_compile_commands () {
if [ -f ./compile_commands.json ]; then
echo "compile_commands.json already exists!\n"
else
echo "Creating new symlink for compile commands!\n"
ln -s ./build/compile_commands.json ./compile_commands.json
fi
}
clear_cmake_cache () {
cd ./build
rm -rf CMakeCache.txt CMakeFiles/
}
does_module_exist () {
local basename="$1"
if [ -d "src/${basename}" ]; then
echo "1"
else
echo "0"
fi
}
add_module_to_cmakes () {
local basename="$1"
echo "add_subdirectory(${basename})" >> ./src/CMakeLists.txt
# Tests cmake file needs to be edited in place.
sed -i'' "s/# TEST_DIRS.*$/# TEST_DIRS\r\nadd_subdirectory(${basename})/g" ./tests/CMakeLists.txt
sed -i'' "s/# TEST_LINKS.*$/# TEST_LINKS\r\n\t${basename}/g" ./tests/CMakeLists.txt
}
remove_module_from_cmakes () {
local basename="$1"
sed -i'' "s/^.*add_subdirectory(${basename}).*$//g" ./src/CMakeLists.txt
sed -i'' "s/^.*add_subdirectory(${basename}).*$//g" ./tests/CMakeLists.txt
sed -i'' "s/^.*${basename}.*$//g" ./tests/CMakeLists.txt
}
git_add_module () {
local basename="$1"
read -p "Auto add to git?(y/n):" CHOICE
if [ "${CHOICE}" = "n" ]; then
echo "not being added!"
return 0
fi
modsrc_dir="./src/${basename}"
modtest_dir="./tests/${basename}"
# Now we add the new files to the git tracked files
git add ${modsrc_dir}/*
git add ${modsrc_dir}
git add ${modtest_dir}/*
git add ${modtest_dir}
git add ./src/CMakeLists.txt
git add ./tests/CMakeLists.txt
}
git_remove_module () {
local basename="$1"
read -p "Auto del from git?(y/n):" CHOICE
if [ "${CHOICE}" -eq "n" ]; then
echo "not being removed!"
return 0
fi
modsrc_dir="./src/${basename}"
modtest_dir="./tests/${basename}"
# Now we add the new files to the git tracked files
git rm -r ${modsrc_dir}/*
git rm -r ${modsrc_dir}
git rm -r ${modtest_dir}/*
git rm -r ${modtest_dir}
git rm -r ./src/CMakeLists.txt
git rm -r ./tests/CMakeLists.txt
}
add_new_module () {
read -p "Enter the name of the module:" modname
result=$(does_module_exist "$modname")
if [ "${result}" -eq "1" ]; then
echo "Module already exists!"
echo "Exiting without changing anything"
exit
fi
modname_cap=$(echo $modname | sed 's/[a-z]/\U&/g')
modsrc_dir="./src/${modname}"
modtest_dir="./tests/${modname}"
echo "creating: ${modsrc_dir}, ${modtest_dir}"
mkdir $modsrc_dir
mkdir $modtest_dir
#copy the template files.
echo "copying & customizing template files..."
sed "s/module_name/${modname}/" $MODULE_DIR/module_name.c > $modsrc_dir/${modname}.c
sed -i'' "3s/todays_date/$(date +%Y)/" $modsrc_dir/${modname}.c
sed "s/module_name/${modname_cap}/" $MODULE_DIR/module_name.h > $modsrc_dir/${modname}.h
sed -i'' "3s/todays_date/$(date +%Y)/" $modsrc_dir/${modname}.h
sed "s/module_name/${modname}/" $MODULE_DIR/CMakeLists.txt > $modsrc_dir/CMakeLists.txt
sed "s/module_name/${modname}/" $MODULE_DIR/test_module_name.cpp > $modtest_dir/test_${modname}.cpp
sed "s/module_name/${modname}/" $MODULE_DIR/TestCMakeLists.txt > $modtest_dir/CMakeLists.txt
# Add the module to the cmake lists files.
add_module_to_cmakes "${modname}"
echo "Resulting files/dirs:"
tree -L 2 $modsrc_dir
tree -L 2 $modtest_dir
# Now we add the new files to the git tracked files
git_add_module "${modname}"
}
del_module () {
read -p "Enter the name of the module:" modname
rm -r ./tests/${modname}
rm -r ./src/${modname}
remove_module_from_cmakes "${modname}"
}
cross_compile () {
echo "ERROR: Currently no toolchain / target!"
}
build_release() {
clear_cmake_cache
cmake -DCAM_HANDLER_LIB=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../
make
}
build_main () {
clear_cmake_cache
cmake -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../
make main
}
run_c_tests () {
clear_cmake_cache
cmake -DUNIT_TESTING=ON -DCMAKE_VERBOSE_MAKEFILE=${CMAKE_VERBOSE} ../
make AllTests && ./tests/AllTests
}
print_menu () {
echo "BUILD MENU:"
echo "1. Run Tests"
echo "2. Build Project"
echo "3. Build for release"
echo "4. cross compile for XXXXXX"
echo "5. Add new module to project"
echo "6. Delete module from project"
echo "7. Exit"
}
main() {
add_compile_commands
valid_choice=false
while [ "$valid_choice" != true ]; do
print_menu
read -p "Enter your choice: " choice
case $choice in
1)
echo "You selected Option 1"
valid_choice=true
run_c_tests
;;
2)
echo "You selected Option 2"
valid_choice=true
build_main
;;
3)
echo "You selected Option 3"
valid_choice=true
build_release
;;
4)
echo "You selected Option 4"
valid_choice=true
cross_compile
;;
5)
echo "You selected Option 5"
valid_choice=true
add_new_module
;;
6)
echo "You selected Option 6"
valid_choice=true
del_module
;;
7)
echo "Exiting..."
exit 0
;;
*)
echo "Invalid choice. Please select a valid option."
;;
esac
done
}
main

View File

@ -1,65 +0,0 @@
:1000000009C016C015C067C113C012C011C010C00E
:100010000FC00EC011241FBECFE9CDBF20E0A0E667
:10002000B0E001C01D92A637B207E1F79ED1DFC153
:10003000E7CFFC0180811182887F877F8083628384
:10004000438397B321E030E0A90101C0440F6A95D2
:10005000EAF7842F8095892387BB48B3C9010280C2
:1000600002C0880F991F0A94E2F7842B88BB47B31C
:10007000C901038002C0880F991F0A94E2F7842BFC
:1000800087BB88B3038002C0220F331F0A94E2F7B4
:100090002095282328BB0895FC019081338191FD90
:1000A0000BC09260908328B381E090E001C0880F7C
:1000B0003A95EAF7822B0BC09D7F908328B381E0AD
:1000C00090E001C0880F3A95EAF78095822388BBBB
:1000D0000895CF93DF93EC01888180FF13C0982FA0
:1000E0009C7039F4CE01D8DF888119828B7F8860BB
:1000F00007C083FF10C09981923468F08460877FC5
:10010000888309C082FF02C0CE01C6DF8881877F55
:100110008B7F88831982DF91CF9108958FEF809331
:10012000750041E062E081E790E083DF44E063E056
:100130008AE690E07EDF8FE697E10197F1F700C055
:100140000000E199FECF80E090E03DD18A3A99F439
:1001500081E090E038D19091710080FB91F990930B
:10016000710082E090E02FD190916A0080FB91F9BC
:1001700090936A000CC06AEA80E090E02BD160E0C6
:1001800081E090E027D160E082E090E023D186B367
:1001900090E00090730002C0959587950A94E2F76D
:1001A0008170992721E082272091710080FB20F93E
:1001B0002093710086B390E000906C0002C095958A
:1001C00087950A94E2F78170992731E0832790910F
:1001D0006A0080FB90F990936A0020FD05C0809131
:1001E0006A0080FF3AC01DC021FB662760F981E0EC
:1001F000682760FB21F92093710081E090E0EAD04C
:1002000084E022E098B3922798BB4FEF9DEE32E056
:10021000415090403040E1F700C00000815091F71C
:10022000DECF81FB662760F991E0692760FB81F9E9
:1002300080936A0082E090E0CDD084E020E198B322
:10024000922798BB4FEF9DEE32E0415090403040F6
:10025000E1F700C00000815091F78091710081FFAB
:100260000CC028B381E090E00090740002C0880FB9
:10027000991F0A94E2F7822B88BB80916A0081FF64
:100280000CC028B381E090E000906D0002C0880FA0
:10029000991F0A94E2F7822B88BB10926F0010928C
:1002A0006E001FBC13BE83B7836083BF789412BEF9
:1002B00089B7826089BF0895BB9A98E088B389277F
:1002C00088BB2FE739EA83E0215030408040E1F7D6
:1002D00000C00000F3CF1F920F920FB60F921124AF
:1002E0002F933F938F939F93EF93FF93F894E09115
:1002F0007000F0E086B3E05AFF4F80838091700079
:100300008F5F8093700080E090E02FEFFC01E05A57
:10031000FF4F3081232301968A309105B9F720934E
:100320007500809170008A3010F0109270008091FA
:10033000710083FF05C0809172008F5F809372000F
:1003400080916A0083FF05C080916B008F5F80936E
:100350006B007894FF91EF919F918F913F912F9136
:100360000F900FBE0F901F901895D8DE81E790E098
:10037000B0DE8AE690E0ADDE2091750030E00090BE
:10038000730002C0359527950A94E2F780917100B9
:1003900020FF02C08E7F01C0816080937100209198
:1003A000750030E000906C0002C0359527950A94E6
:1003B000E2F780916A0020FF02C08E7F01C0816059
:1003C00080936A00D3CFE199FECF8EBBE09A992744
:1003D0008DB30895262FE199FECF1CBA8EBB2DBB9D
:1003E0000FB6F894E29AE19A0FBE01960895F89438
:0203F000FFCF3D
:00000001FF

86
setup.sh Executable file
View File

@ -0,0 +1,86 @@
#!/bin/sh
#Author: Jake G
#Date: 2024
#Filename: setup.sh
PKG_MNGR=""
DEBIAN=0
FBSD=0
SYSINSTALL=0
DEV_UTILS="vim tmux fzf"
install_dev_utils () {
ICMD=""
if [ $DEBIAN -eq 1 ]; then
ICMD="sudo apt install"
elif [ $FBSD -eq 1 ]; then
ICMD="sudo pkg install"
fi
for util in $DEV_UTILS
do
${ICMD} ${util}
done
}
check_os () {
if [ -f /etc/debian_version ]; then
DEBIAN=1
elif [ -f /etc/freebsd-update.conf ]; then
FBSD=1
fi
}
remove_template_examples () {
echo "does nothing right now"
}
install_needed_dependencies () {
# Check the OS
echo "checking the OS..."
# If it's debian based then apt install
# If it's freeBSD then pkg
# If it's windows....you're SOL
}
create_project_symlinks () {
# Allows the clangd LSP to find it.
ln -s ./build/compile_commands.json ./compile_commands.json
}
build_cpputest () {
git submodule add https://github.com/cpputest/cpputest.git
git sumodule status
cd ./cpputest/build
cmake ../
if [ SYSINSTALL -eq 1]; then
make install
else
make
fi
}
# The default setup stuff.
default () {
remove_template_examples
install_needed_dependencies
create_project_symlinks
}
setup() {
echo "Setting up env"
check_os
install_dev_utils
}
setup

3
src/CMakeLists.txt Normal file
View File

@ -0,0 +1,3 @@
add_executable(main
main.c
)

View File

12
tests/AllTests.cpp Normal file
View File

@ -0,0 +1,12 @@
#include "CppUTest/CommandLineTestRunner.h"
//ImportTestGroups
IMPORT_TEST_GROUP(simple_test);
//START: main
int main(int argc, char** argv)
{
return RUN_ALL_TESTS(argc, argv);
}
//END: main

16
tests/CMakeLists.txt Normal file
View File

@ -0,0 +1,16 @@
project(Tests)
# TEST_DIRS
add_subdirectory(simple_test)
# TEST_RUNNER
add_executable(AllTests
AllTests.cpp
)
target_link_libraries(AllTests
${CPPUTEST_LIBRARIES}/libCppUTest.a
${CPPUTEST_LIBRARIES}/libCppUTestExt.a
# TEST_LINKS
simple_test
)

View File

@ -0,0 +1,11 @@
# TEST_RUNNER
add_library(simple_test
simple_test.cpp
)
target_link_libraries(simple_test
${CPPUTEST_LIBRARIES}/libCppUTest.a
${CPPUTEST_LIBRARIES}/libCppUTestExt.a
)

View File

@ -0,0 +1,26 @@
#include "CppUTest/TestHarness.h"
/*
extern C
{
#include "simple.h"
}
*/
TEST_GROUP(simple_test)
{
void setup()
{
}
void teardown()
{
}
};
TEST(simple_test, passing_test)
{
CHECK_TRUE(1);
}

Binary file not shown.