diff options
-rw-r--r-- | .gitignore | 5 | ||||
-rw-r--r-- | .vscode/settings.json | 4 | ||||
-rw-r--r-- | .vscode/tasks.json | 58 | ||||
-rw-r--r-- | client/main.c | 1 | ||||
-rw-r--r-- | client/makefile | 27 | ||||
-rw-r--r-- | makefile | 44 | ||||
-rw-r--r-- | readme.md | 88 | ||||
-rw-r--r-- | robot/main.c (renamed from main.c) | 0 | ||||
-rw-r--r-- | robot/makefile | 42 | ||||
-rw-r--r-- | robot/readme.md | 10 |
10 files changed, 223 insertions, 56 deletions
@@ -1,6 +1,7 @@ compile_commands.json *.o -out.hex -a.out +robot/out.hex +robot/a.out +client/main .cache *.log diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5647e49..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "makefile.extensionOutputFolder": "./.vscode", - "makefile.makefilePath": "makefile" -}
\ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..056c4b9 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,58 @@ +{ + "version": "2.0.0", + "command": "sh", + "options": { "cwd": "${workspaceFolder}" }, + "args": [ "-c" ], + "tasks": [ + { + "label": "build client", + "group": { + "isDefault": false, + "kind": "build" + }, + "args": [ "make", "-C", "client" ], + "command": "", + "type": "shell" + }, + { + "label": "build robot", + "group": { + "isDefault": false, + "kind": "build" + }, + "args": [ "make", "-C", "robot" ], + "command": "", + "type": "shell" + }, + { + "label": "flash robot", + "group": { + "isDefault": false, + "kind": "test" + }, + "args": [ "make", "flash", "-C", "robot" ], + "command": "", + "type": "shell" + }, + { + "label": "clean directories", + "group": { + "isDefault": false, + "kind": "none" + }, + "args": [ "make", "clean" ], + "command": "", + "type": "shell" + }, + { + "label": "format source files", + "group": { + "isDefault": false, + "kind": "none" + }, + "args": [ "make", "format" ], + "command": "", + "type": "shell" + }, + ] +} diff --git a/client/main.c b/client/main.c new file mode 100644 index 0000000..76e8197 --- /dev/null +++ b/client/main.c @@ -0,0 +1 @@ +int main() { return 0; } diff --git a/client/makefile b/client/makefile new file mode 100644 index 0000000..dcba6f3 --- /dev/null +++ b/client/makefile @@ -0,0 +1,27 @@ +CC = gcc +LD = gcc +RM = rm -f +CFLAGS = +EXECNAME = main + +SOURCES := $(wildcard *.c) +HEADERS := $(wildcard *.h) +OBJECTS := $(patsubst %.c,%.o, $(SOURCES)) + +all: main + +.o: + $(CC) -c $(CFLAGS) $< + +$(EXECNAME): $(OBJECTS) + $(CC) $(OBJECTS) -o $(EXECNAME) + +clean: + $(RM) $(EXECNAME) *.o + +format: + clang-format -i $(SOURCES) $(HEADERS) + +compile_commands: clean + bear -- make + @@ -1,42 +1,8 @@ -DEVICE = atmega328p -MCU = atmega328p -AVRDUDE_DEVICE = m328p -DEVICE ?= atmega168 -MCU ?= atmega168 -AVRDUDE_DEVICE ?= m168 +SUBDIRS := client robot -CFLAGS=-g -Wall -mcall-prologues -mmcu=$(MCU) $(DEVICE_SPECIFIC_CFLAGS) -Os -LDFLAGS=-Wl,-gc-sections -lpololu_$(DEVICE) -Wl,-relax +all clean format compile_commands: $(SUBDIRS) FORCE -PORT ?= /dev/ttyACM0 +$(SUBDIRS): FORCE + $(MAKE) -C $@ $(MAKECMDGOALS) -SOURCES := $(wildcard *.c) -HEADERS := $(wildcard *.h) -OBJECTS := $(patsubst %.c,%.o, $(SOURCES)) - -AVRDUDE=avrdude -CC=avr-gcc -OBJ2HEX=avr-objcopy - -all: out.hex - -clean: - rm -f *.o out.hex a.out compile_commands.json - -a.out: $(OBJECTS) - $(CC) $(OBJECTS) $(CFLAGS) $(LDFLAGS) - -.o: - $(CC) -c $(CFLAGS) $< - -out.hex: a.out - $(OBJ2HEX) -R .eeprom -O ihex $< $@ - -flash: out.hex - $(AVRDUDE) -p $(AVRDUDE_DEVICE) -c avrisp2 -P $(PORT) -U flash:w:out.hex - -format: - clang-format -i $(SOURCES) $(HEADERS) - -compile_commands: clean - bear -- make +FORCE:
\ No newline at end of file @@ -3,19 +3,85 @@ - [link naar robot productpagina](https://www.pololu.com/product/975/resources) - [link naar wixel productpagina](https://www.pololu.com/product/1336/resources) -## make gedoe +het project is opgedeeld in twee submappen, een voor de code die op de robot +zelf draait, en een programma dat op een computer draait en de robot kan +aansturen. -deze commando's kun je uitvoeren op de command-line als je alle build tools -goed geïnstalleerd hebt. er hoort ook een configuratie te zijn voor visual -studio code. hievoor moet je de [makefile tools -extensie](https://marketplace.visualstudio.com/items?itemName=ms-vscode.makefile-tools) -installeren. +voor de client worden sommige externe libraries gebruikt, hier is een lijst met +gebruikte externe libraries: + +|naam|doel| +|-|-| +|[yan9a/serial](https://github.com/yan9a/serial)|cross-compatibiliteit voor seriële poorten lezen/schrijven voor windows en linux| + +## noob hoek + +hier wat korte uitleg over dingen die niet zijn uitgelegd in vorige blokken van +de opleiding: + +### make + +make is een los build-systeem. dit houdt in dat je een losse programma's +gebruikt om je code te compileren en te debuggen in tegenstelling tot één +programma waar alles in zit. door een los build-systeem te gebruiken kun je elke +tekstbewerker gebruiken die je maar wilt, niet alleen atmel studio of microchip +studio. + +make wordt geconfigureerd via een _makefile_. hier staat in hoe je code +gecompileerd moet worden. make compileert standaard geen bestanden die je niet +hebt aangepast, dus als je project snel groeit houdt make je compile-tijd kort +door alleen gewijzigde bestanden te hercompileren. hier zijn wat standaard make +commando's die voor dit project in zowel de robot map als de client map zullen +werken: ```sh -make # build -make flash # upload executable to robot -make clean # clean working directory -make format # format source and header files -make compile_commands # generate compile_commands.json (clangd) +make # alle (gewijzigde) bestanden compileren +make clean # rommel opschonen uit je werkmap (.o bestanden, etc.) +make format # alle bronbestanden (.c, .h) formatten ``` +als je deze commando's niet wil onthouden heb ik (loek) ook een visual studio +configuratie gemaakt die automatisch laadt wanneer je de projectmap opent. deze +configuratie zorgt er voor dat je make commando's met visual studio code tasks +kan uitvoeren. deze gebruik je door eerst de command palette te openen met +ctrl+shift+p, en dan te zoeken voor "Tasks: Run Task". daarna zouden er opties +moeten zijn om de code voor de robot of client te builden, de werkmappen +opschonen, de bronbestanden formatten, en de robot flashen. + +### git + +git is het versiebeheersysteem dat we in dit project gaan gebruiken. een project +in git wordt ook soms een _repository_ genoemd. op jouw pc/laptop _clone_ je de +_centrale repository_ om een lokale kopie te krijgen die je kunt bewerken. git +houdt elke 'versie' bij van je project in zogehete _commits_. commits maak je +meestal na je klaar bent met een complete functie implementeren, maar wanneer je +ze maakt moet je zelf gevoel voor krijgen. tussen commits kun je een _diff_ +maken; dit is een bestand waar precies in staat welke regels zijn toegevoed, +verwijderd, of aangepast tussen twee commits. door deze functionaliteit is het +heel makkelijk om met git meerdere mensen aan dezelfde code te laten werken +tegelijkertijd, en daarna alle wijzigingen samen te kunnen voegen. + +voor gemak werkt iedereen op zijn eigen _branch_, met hun eigen naam. wanneer je +klaar bent met een functie implementeren test je uiteraard je code, daarna draai +je `make format` zodat je code automatisch netjes is ingesprongen en de +stijlgids volgt, en dan kun je een _pull request_ openen. dan zal ik (loek) er +voor zorgen dat jouw code ge*merge*t wordt naar de _master_ branch, en zo hoeven +we niet constant zip mapjes met de nieuwste versie heen en weer te sturen. + +wanneer je een commit maakt, staat deze alleen op je eigen laptop/pc. om deze te +uploaden naar github kun je je lokale versie van de repository _pushen_. +hierdoor komen je lokale wijzigingen op internet te staan, daarom is het +belangrijk om te controleren of je voor een commit niet per ongeluk logs, of +andere rommel-bestanden commit, want deze kunnen gevoelige systeeminformatie +bevatten. + +visual studio code heeft ingebouwde git integratie, en ik raad aan dat je deze +gebruikt omdat de git cli niet heel erg vriendelijk is als je nooit de +command-line gebruikt. +[hier](https://docs.microsoft.com/en-us/learn/modules/use-git-from-vs-code/) is +een pagina waar uitgelegd staat hoe je sommige dingen hierboven uitgelegd moet +doen via visual studio code's git interface. + +[dit](https://www.youtube.com/watch?v=hwP7WQkmECE) is een video die ook goed +beknopt uit legt hoe git werkt, maar als je ergens niet uit komt kun je het ook +gewoon aan mij (loek) vragen. diff --git a/robot/makefile b/robot/makefile new file mode 100644 index 0000000..d01ad30 --- /dev/null +++ b/robot/makefile @@ -0,0 +1,42 @@ +DEVICE = atmega328p +MCU = atmega328p +AVRDUDE_DEVICE = m328p +DEVICE ?= atmega168 +MCU ?= atmega168 +AVRDUDE_DEVICE ?= m168 + +CFLAGS=-g -Wall -mcall-prologues -mmcu=$(MCU) $(DEVICE_SPECIFIC_CFLAGS) -Os +LDFLAGS=-Wl,-gc-sections -lpololu_$(DEVICE) -Wl,-relax + +PORT ?= /dev/ttyACM1 + +SOURCES := $(wildcard *.c) +HEADERS := $(wildcard *.h) +OBJECTS := $(patsubst %.c,%.o, $(SOURCES)) + +AVRDUDE=avrdude +CC=avr-gcc +OBJ2HEX=avr-objcopy + +all: out.hex + +clean: + rm -f *.o out.hex a.out compile_commands.json + +a.out: $(OBJECTS) + $(CC) $(OBJECTS) $(CFLAGS) $(LDFLAGS) + +.o: + $(CC) -c $(CFLAGS) $< + +out.hex: a.out + $(OBJ2HEX) -R .eeprom -O ihex $< $@ + +flash: out.hex + $(AVRDUDE) -p $(AVRDUDE_DEVICE) -c avrisp2 -P $(PORT) -U flash:w:out.hex + +format: + clang-format -i $(SOURCES) $(HEADERS) + +compile_commands: clean + bear -- make diff --git a/robot/readme.md b/robot/readme.md new file mode 100644 index 0000000..5c2aa13 --- /dev/null +++ b/robot/readme.md @@ -0,0 +1,10 @@ +# robot code + +dit is de submap voor alle code die op de robot zelf draait + +## make gedoe + +om de code te uploaden naar de robot moet je de juiste com-poort instellen in de +makefile in deze map (regel waar `PORT ?= /dev/ttyACM0` staat). deze kun je +waarschijnlijk vinden in apparaatbeheer op windows. daarna kun je `make flash` +uitvoeren om de code te uploaden |