diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5f37c65c5..7e1b3481d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -18,6 +18,8 @@ jobs: uses: r-lib/actions/setup-r@v2 - name: Setup pandoc uses: r-lib/actions/setup-pandoc@v2 + - name: Setup pandocfilters + run: pip install pandocfilters; - name: Setup tinytex uses: r-lib/actions/setup-tinytex@v2 - name: Setup dependencies diff --git a/cpp_inst02.md b/cpp_inst02.md index 637707165..cd2fbdb91 100644 --- a/cpp_inst02.md +++ b/cpp_inst02.md @@ -31,7 +31,7 @@ Akronim ten, pomimo dość tajemniczo brzmiącego rozwinięcia, opisuje bardzo p Dzięki temu kod konieczny do zarządzania zasobem piszemy w jednym miejscu, a następnie wykorzystujemy go w trakcie normalnej pracy z danym obiektem. Takie podejście ma następujące zalety: -- Zwiększa poprawność kodu. Obiekty są automatycznie niszczone przy wyjściu ze scope'u, także nigdy nie zapomnimy już np. zwolnić pamięci! Znak "`}`" jest naszym przyjacielem. +- Zwiększa poprawność kodu. Obiekty są automatycznie niszczone przy wyjściu ze scope'u, także nigdy nie zapomnimy już np. zwolnić pamięci! Znaki `{...}` są naszym przyjacielem. - Zmniejsza liczbę linijek kodu, które musimy napisać. - Pozwala zachować poprawność programu w sytuacjach wyjątkowych. diff --git a/info1_lab11.md b/info1_lab11.md index a8b5bef08..17dfa39ca 100644 --- a/info1_lab11.md +++ b/info1_lab11.md @@ -11,7 +11,7 @@ Mikrokontroler to mały układ scalony, który (zazwyczaj) ma w sobie zintegrowa Na tych zajęciach użyjemy płytkę prototypową kompatybilną z Arduino. Urządzenia takie mają zintegrowane na jednej płytce: mikrokontroler i interfejs USB, a dodatkowo wgrany mają fabrycznie tak zwany "bootloader". Bootloader pełni rolę programatora, pozwalając wgrać programy do pamiecy stałej mikrokontrollera przez interfejs szeregowy. Bootloader Arduino stał się tak popularny, że wiele innych firm produkuje płytki z mikrokontolerami z wgranym ich bootloaderem. Pozwala to na programowanie wszelkich takich płytek przy pomocy tego samego zestawu narzędzi. -## Zaczynamy +# Zaczynamy Dziś będziemy używać narzędzia Arduino IDE. @@ -25,11 +25,11 @@ while (1) { } ``` -### `Piny` +## `Piny` Nasza płytka ma piny typu General Purpose Input Output (GPIO). Oznacza to, że możemy ustawić je w różne stany służące do odczytu danych (input) i wysyłania danych (output). Do ustawiania stanu służy funkcja `pinMode(pin, typ)`. Dziś użyjemy dwóch typów: -#### `OUTPUT` +### `OUTPUT` `OUTPUT` pozwala na ustawianie wyjscia na pinie na logiczne `0` (`LOW`) i `1` (`HIGH`). Zero to samo co uziemienie (ground), a jedyna to napięcie operacyjne układu (u nas 3V). Jesli podlaczymy taki pin (np. 2) do lampki (jak na rysunku), bedziemy mogli ja zapalac i gasic ustawiajac pin za pomoca `digitalWrite(2,HIGH);` i `digitalWrite(2,LOW);`. ![](figures/info1/micro/led.png) @@ -38,12 +38,12 @@ Jesli zas do takiego pinu (np 10) podlaczymy buzzer (jak na rysunku) i uzyjemy k ![](figures/info1/micro/buzzer.png) -#### `INPUT_PULLUP` +### `INPUT_PULLUP` `INPUT_PULLUP` pozwala na sprawdzanie na pinie czy jest on podłączony (`LOW`) czy nie (`HIGH`) do zera (ground). Jesli do takiego pina (np 3) podlaczymy przelacznik, a jego drugi styk podlaczymy do ziemi, bedziemy mogli wykryc czy przelacznik jest nacisniety sprawdzajac czy `digitalRead(3) == LOW`. ![](figures/info1/micro/button.png) -### Buzzer +## Buzzer Pierw wybróbujemy buzzer. Buzzer to mały piezoelektryczny głosnik zaprojektowany do wydawania tonów. Możemy podłączyć jedno wyjście buzzera do zera (`GND`) a drugi do pinu 10 (`D10`). Możemy wtedy użyć komendy `tone(pin, frequency, duration)`, żeby wysłać na pinie kwadratową falę o zadanej czestotliwości, i funkcji `delay(duration)` by poczekać zadany czas. ``` void setup() { @@ -73,7 +73,7 @@ void loop() { ``` -## Nasz uklad +# Nasz uklad Możemy teraz podłączyć przyciski. Każdy przycisk ma 4 porty, dwa styki przełącznika i dwa styki LED. Dioda LED jest w obudowie zlutowana w opornikiem limitującym natężenie, wiec nie bedziemy potrzebować dodatkowych komponentów. **Nigdy nie należy podłączać diody LED bez rezystora**. @@ -104,7 +104,7 @@ void loop() { } ``` -### Przyciski +## Przyciski Teraz możemy obsłużyć przyciski: ``` void loop() { @@ -122,7 +122,7 @@ void loop() { Użyj funkcji `tone(pin, frequency)` i `notone(pin)` by wydać dzwięk przy naciśnięciu przycisku. Stwórz tablice częstotliwości które chcesz zagrać. -### Naduś guzik +## Naduś guzik Przy pomocy `digitalRead(switch_pin) == LOW` możemy wykryć czy dany przycisk jest wciśnięty. Zadeklaruj funkcję `keydown(k)`: ``` void keydown(int k) { @@ -134,8 +134,8 @@ void keydown(int k) { ``` Zmodyfikuj `loop` tak, by funkcja `keydown` została wywoła **raz** w momencie naciśnięcia przycisku. -## Gry -### Memory +# Gry +## Memory Główne zdanie na dziś polega na napisaniu małej gry: - Wygeneruj losową sekwencję 5 przycisków, użyjąc funkcję `random(4)`, i umieść ją w tablicy. @@ -144,10 +144,10 @@ Główne zdanie na dziś polega na napisaniu małej gry: Gdy wszystko będzie działać, zmodyfukuj kod tak, by sekwencja zaczynała od jednego elementu i zwiekszała się za każdym razem gdy użytkownik poprawnie ją wykona. -### Speed (dodatkowe) +## Speed (dodatkowe) Spróbuj napisać następującą grę, w której zapala się losowy przycisk i trzeba go nacisnąć zanim zgaśnie. Każdy następny przycisk zapala się na coraz krótrzy czas i odstępy po miedzy nimi maleją. -### Multi-speed (dodatkowe) +## Multi-speed (dodatkowe) Zmodyfikuj powyższą grę tak, by podświetlała się dowolna kombinacja przycisków i trzeba było nacisnąć je wszystkie zanim zgasną. diff --git a/tools/pandoc_minted.py b/tools/pandoc_minted.py new file mode 100755 index 000000000..b7a1cc354 --- /dev/null +++ b/tools/pandoc_minted.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +"""A pandoc filter to use minted for typesetting code in the LaTeX mode.""" + +# This file is copied from megabyde/pandoc-minted repo +# which is under a mixed open-source license + +from string import Template + +from pandocfilters import Header, RawBlock, RawInline, toJSONFilters + + +def unpack_code(value): + """Unpack the body and language of a pandoc code element.""" + (_, classes, attributes), contents = value + + language = classes[0] if classes else "text" + params = ", ".join("=".join(kv) for kv in attributes) + + return { + "contents": contents, + "language": language, + "attributes": params, + } + + +def fragile(key, value, format, meta): + """Make headers/frames fragile.""" + if format != "beamer": + return None + + if key == "Header": + level, meta, contents = value + # Add the attribute + meta[1].append("fragile") + return Header(level, meta, contents) + return None + + +def minted(key, value, format, meta): + """Use minted for code in LaTeX.""" + if format not in ("latex", "beamer"): + return None + + if key == "CodeBlock": + template = Template("\\begin{minted}[$attributes]{$language}\n$contents\n\\end{minted}") + klass = RawBlock + elif key == "Code": + template = Template("\\mintinline[$attributes]{$language}{$contents}") + klass = RawInline + else: + return None + + text = template.substitute(unpack_code(value)) + return klass("latex", text) + + +if __name__ == "__main__": + toJSONFilters([fragile, minted]) diff --git a/tools/pdf_full.R b/tools/pdf_full.R index 6dec26bc8..e5b3e9bf9 100644 --- a/tools/pdf_full.R +++ b/tools/pdf_full.R @@ -1,9 +1,10 @@ pdf_full = function( ... ) { - ret = pdf_document(template = "tools/pdf_small_template.tex", ...) + add_pandoc_args = c("--filter","tools/pandoc_minted.py") + ret = pdf_document(template = "tools/pdf_small_template.tex", pandoc_args=add_pandoc_args, ...) ret$post_processor = function(yaml, input, output,...) { post_doc = pdf_document( - pandoc_args = c("--variable",paste("pdffile",output,sep=":")), + pandoc_args = c(add_pandoc_args, "--variable",paste("pdffile",output,sep=":")), template = "tools/pdf_full_template.tex" ) cat("And now running again ",input," with ",output,"\n") diff --git a/tools/pdf_small_template.tex b/tools/pdf_small_template.tex index 0e2f65329..f8a95ddb6 100644 --- a/tools/pdf_small_template.tex +++ b/tools/pdf_small_template.tex @@ -7,6 +7,11 @@ \usepackage[utf8]{inputenc} \usepackage[usenames,dvipsnames,svgnames,table]{xcolor} \usepackage{calc} % for calculating minipage widths +\usepackage{minted} +\definecolor{bg}{rgb}{0.95,0.95,0.95} +\setminted{bgcolor=bg} +\setmintedinline{bgcolor=none} + \IfFileExists{upquote.sty}{\usepackage{upquote}}{} \DeclareUnicodeCharacter{2660}{\ensuremath{\spadesuit}}