Giter Site home page Giter Site logo

frp-arduino's Introduction

Introduction

We believe that programming the Arduino can be more fun if we don't have to use the C language to program it. We aim to create a new language that allows us to program the Arduino using higher-level constructs. Our mission:

Arduino programming without the hassle of C

The language

The language we create has the following properties:

  • It is based on the functional reactive programming (FRP) paradigm
  • It is implemented as a deeply embedded domain specific language (EDSL) in Haskell
  • It compiles to C code

Lets explore them in more detail.

FRP

This section introduces FRP and shows how it fits in the domain of programming an Arduino.

The central building block in FRP is a stream. A stream contains values that change over time. Consider an input pin on the Arduino. If we constantly read the value of the pin we will get different values (high or low) over time:

Example input stream.

We could take this stream and assign it to an output pin. Whenever there is a new value on the input stream, that value will be sent to the output pin. In this example we have a led connected to the output pin:

Stream connected to Arduino.

So building an Arduino application using FRP involves capturing inputs as streams, doing some interesting calculations (we'll come to that), and assigning streams to outputs.

Transforming

The most common thing we do with streams is to transform the values in some way. This operation is called map (mapS). Let's say we have a stream of numbers:

A stream of numbers.

We can transform this stream to a stream of booleans by mapping a function that converts even numbers to true and odd numbers to false:

Mapping numbers to booleans.

We now have a stream that alternates its boolean value at a time interval.

Mapping is always a one-to-one conversion.

Keeping state

Streams can also be used to keep track of state. We achieve that with the fold (foldpS) operation.

A fold is like a map where we also have access to a state and the output is the new state.

Let's say we have a stream of booleans representing if a button is pressed or not. Now we want a stream that keeps track of the number of button presses. We can do that by folding the following function (pseudo code) with an initial clickCount value of 0:

if buttonIsPressed
    clickCount + 1
else
    clickCount

Counting number of clicks.

The very first time clickCount is 0. Subsequent values are incremented by one if the boolean value is true, otherwise we just pass the current clickCount along.

Filtering

Sometimes we would like to discard values from a stream. We do that with the filter (filterS) operation.

We can for example keep all even numbers in a stream:

Filtering a stream.

EDSL

Our language is embedded in the Haskell language. That means that when we write programs in our language, we are actually writing Haskell programs.

However, our programs will not look like standard Haskell because they use custom operators that are more suited to the FRP paradigm.

By hosting our language inside Haskell, as opposed to making up our own custom syntax, we gain a few things:

  • We don't have to write our own parser
  • We can take advantage of Haskell's advanced type system

When we combine our program with the language library, we get an executable that, when run, will produce a C file:

The EDSL workflow.

The executable is a compiler from our EDSL to C.

Compiles to C

In order to make our EDSL execute on the Arduino, we compile it to a C source file which we then turn into avr assembly code by using the avr gcc toolchain.

Examples

In this section we will see what our EDSL looks like and what kinds of programs we can write using it.

Running the examples

Command to compile an example:

./make [name of example]

Command to compile and upload an example to a connected Arduino:

./make [name of example] upload

A board name can be specified as an environment variable if using a board other than the Arduino Uno. Currently supported board names include "Uno" (default Arduino Uno) and "Nano" (Arduino Nano).

BOARD=[name of board] ./make [name of example] upload

Before we can run these commands, we need to install a few dependencies:

Haskell should be installed system wide, but Arduino-Makefile should just be copied to the root of this repository.

In order to use Arduino-Makefile, we also need standard build tools like make and gcc, and in particular, the gcc toolchain for avr.

On a Fedora system, we can install all dependencies with the following commands:

yum install haskell-platform
yum install arduino-core
git clone https://github.com/sudar/Arduino-Makefile.git

Hspec is required for tests to pass:

cabal update && cabal install hspec

The arduino-core package depends on the following packages:

  • avr-gcc
  • avr-gcc-c++
  • avr-libc
  • avrdude

Example: Blinking led

import Arduino.Uno

main = compileProgram $ do

    digitalOutput pin13 =: clock ~> toggle

This is the hello world of Arduino programs.

Lets examine this example line by line:

import Arduino.Uno

This imports functions that allow us to define a program in the EDSL.

main = compileProgram $ do

The main function is the standard main function in Haskell. The compileProgram function has the following type:

compileProgram :: Action a -> IO ()

That means that we can define a set of actions in the do-block that we pass to compileProgram. It takes those actions, builds an internal representation of the program, and then generates C code and writes that to a file.

So what action is defined by the last line in the example?

digitalOutput pin13 =: clock ~> toggle

Let's look at the type for the =: operator:

(=:) :: Output a -> Stream a -> Action ()

It takes an output of a specific type and connects it to a stream of values of the same type.

The types of digitalOutput and pin13 reveal that we have an output for bits:

digitalOutput :: GPIO -> Output Bit

pin13 :: GPIO

That means that the stream we define on the right hand side has to be a stream of bits. The stream is created with the following expression:

clock ~> toggle

Let's look at the types of the individual components:

clock :: Stream Word

(~>) :: Stream a -> (Stream a -> Stream b) -> Stream b

toggle :: Stream Word -> Stream Bit

clock is a built in stream that produces incrementing integers at a given time interval.

toggle is a function that converts a stream of words to a stream of bits by mapping the isEven function: Even words are converted to 1 and odd words are converted to 0.

~> is an operator that takes a stream on the left hand side and a function on the right hand side. The result is a stream that we get by applying the function to the stream on the left hand side.

The resulting stream in the example is a stream of bits that toggles between 1 and 0 values at a specific time interval. When we connect that stream to the pin where the led is connect, the led will blink at a specific time interval.

Example: Blinking pair of leds

import Arduino.Uno

main = compileProgram $ do

    let doubleOutput = output2 (digitalOutput pin12) (digitalOutput pin13)

    doubleOutput =: every 5000 ~> flip2TupleStream

flip2TupleStream :: Stream a -> Stream (Bit, Bit)
flip2TupleStream = foldpS (\_ -> flip2Tuple) (pack2 (bitLow, bitHigh))
    where
        flip2Tuple :: Expression (a, b) -> Expression (b, a)
        flip2Tuple tuple = let (aValue, bValue) = unpack2 tuple
                           in pack2 (bValue, aValue)

This example shows how to group two values together and output them to two different outputs.

Example: Blinking with variable frequency

import Arduino.Uno
import Data.Tuple (swap)

main = compileProgram $ do

    setupAlternateBlink pin11 pin12 (createVariableTick a0)

setupAlternateBlink :: GPIO -> GPIO -> Stream a -> Action ()
setupAlternateBlink pin1 pin2 triggerStream = do
    output2 (digitalOutput pin1) (digitalOutput pin2) =: alternate triggerStream
    where
        alternate :: Stream a -> Stream (Bit, Bit)
        alternate = foldpS2Tuple (\_ -> swap) (bitLow, bitHigh)

createVariableTick :: AnalogInput -> Stream ()
createVariableTick limitInput = accumulator limitStream timerDelta
    where
        limitStream :: Stream Arduino.Uno.Word
        limitStream = analogRead limitInput ~> mapS analogToLimit
        analogToLimit :: Expression Arduino.Uno.Word -> Expression Arduino.Uno.Word
        analogToLimit analog = 1000 + analog * 20

This is like blinking a pair of leds except that the frequency of the blinks in this example depends on an analog input.

Example: Writing bytes on UART

import Arduino.Uno

main = compileProgram $ do

    digitalOutput pin13 =: clock ~> toggle

    uart =: timerDelta ~> mapSMany formatDelta ~> flattenS

formatDelta :: Expression Arduino.Uno.Word -> [Expression [Byte]]
formatDelta delta = [ formatString "delta: "
                    , formatNumber delta
                    , formatString "\r\n"
                    ]

This example shows how to write bytes to the UART output.

Example: Displaying text on LCD

import Arduino.Uno
import qualified Arduino.Library.LCD as LCD

main = compileProgram $ do

    tick <- def clock

    digitalOutput pin13 =: tick ~> toggle

    setupLCD [ bootup ~> mapSMany (const introText)
             , timerDelta ~> mapSMany statusText
             ]

introText :: [Expression LCD.Command]
introText = concat
    [ LCD.position 0 0
    , LCD.text "FRP Arduino"
    ]

statusText :: Expression Arduino.Uno.Word -> [Expression LCD.Command]
statusText delta = concat
    [ LCD.position 1 0
    , LCD.text ":-)"
    ]

setupLCD :: [Stream LCD.Command] -> Action ()
setupLCD streams = do
    LCD.output rs d4 d5 d6 d7 enable =: mergeS streams
    where
        rs     = digitalOutput pin3
        d4     = digitalOutput pin5
        d5     = digitalOutput pin6
        d6     = digitalOutput pin7
        d7     = digitalOutput pin8
        enable = digitalOutput pin4

This example shows how to display text on an LCD display.

API

The API documentation for the latest version is hosted in the Modules section on Hackage:

http://hackage.haskell.org/package/frp-arduino

Questions

We want to be welcoming to newcomers.

In particular, if there is something you don't understand, please let us know and we'll try to explain it and improve our documentation.

To ask a question, create a new issue and attach the question label.

Contributing

The contributors are listed in AUTHORS (add yourself).

We use the C4.1 (Collective Code Construction Contract) process for contributions. More discussions and explanations of the process can be found in the The ZeroMQ Community, in particular here.

Comments on the process:

A patch MUST compile cleanly and pass project self-tests on at least the principle target platform.

In our case, this means that ./test should run without failure.

Build Status

Developer Documentation

Below is a collection of information to help developers extend and improve frp-arduino.

Resources

License

The Haskell library that implements the language and all examples are free software, distributed under the GNU General Public License, version 3. For more information, see COPYING.

This document

This document (README.md) is automatically generated from the sources in the doc folder by running python doc/generate_readme.py.

frp-arduino's People

Contributors

archaeron avatar jmwright avatar mvcisback avatar rickardlindberg avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

frp-arduino's Issues

test Fails Because of Missing Files in dist

@rickardlindberg The tests are currently failing on my fork because the src files don't match what's in dist/src.

cabal file
  sdist
    contains all source code FAILED [1]
...
Failures:

  Spec.hs:78: 
  1) cabal file, sdist, contains all source code
       dist/frp-arduino-0.1.0.3> diff -r ../../src src > /home/jwright/Downloads/repos/frp-arduino/test_report.txt 2>&1
       
       Only in ../../src/Arduino: Nano.hs

Is this to force a release each time a significant change is made to the codebase? If so, could you explain the procedure for doing the release properly?

Question: Why is there no pin9?

My Uno has 14 pins, 0-13. I understand that with 0 and 1 being Rx and Tx we don't need them much. But why is there no pin9 definition?

Problem: There is no cabal file

Using cabal is the default way to install Haskell packages.

This project would probably attract more people if it followed that standard convention.

Support for stack

Hi,
I don't have GHC globally installed, but I do have Stack, so in my local environment (Mac), I made this modification and everything works:

$ git diff
diff --git a/make b/make
index b74fec1..8c07a1b 100755
--- a/make
+++ b/make
@@ -35,7 +35,7 @@ then
     rm -rf $OUTPUT_DIR
 else
     mkdir -p $OUTPUT_DIR
-    ghc \
+    stack exec -- ghc \
         --make \
         -Werror \
         -fwarn-unused-imports \

It would be nice if this were auto-detected.

C code generation using Ivory or Copilot

So I've been looking at the C code generation, it reminds me a lot of 2 projects from Galois that we might consider leveraging (although that can sometime be painful in Haskell).

The first is Ivory which is EDSL for systems programming.

The second is CoPilot which came before Ivory. This actually almost exactly matches the current Stream transformations.

Project status

Is the codebase currently suitable for production on GHC 7.10.x/7.10.2? The last commit was 7 months ago but the project looks appealing.

Problem: IC2 missing from API

IC2 is a bus protocol for interchipset communication. This can be used for expanding the number of pins, or having to arduinos communicate. I think that it'd be nice to abstract above this and have the DSL treat them like streams.

Problem: Can not use LCD display from DSL

I don't have a particular project I want to build using this DSL. I have a Arduino starter kit with a book full of examples. I've been trying to implement some examples in the DSL to have something to work on. As the examples get more complex, the language has to be extended or improved.

The next thing I'm interested in using is a LCD display.

I first solution would be just to print a single character on the first cell of the LCD.

Then extend to being able to print strings at arbitrary positions.

Not able to run make succesfully

BOARD=Uno make Blink upload
make: *** No rule to make target 'Blink'. Stop.

Output of BOARD=Uno make -np Blink upload

Pastbin: https://pastebin.com/raw/6diutKXr

Github (seems to interpret it as markdown unfortunately):

BOARD=Uno make -np Blink upload ``` # GNU Make 4.2.1 # Built for x86_64-pc-linux-gnu # Copyright (C) 1988-2016 Free Software Foundation, Inc. # License GPLv3+: GNU GPL version 3 or later # This is free software: you are free to change and redistribute it. # There is NO WARRANTY, to the extent permitted by law.

Make data base, printed on Wed Apr 17 22:23:04 2019

Variables

automatic

<D = $(patsubst %/,%,$(dir $<))

automatic

?F = $(notdir $?)

environment

DESKTOP_SESSION = /nix/store/19k6msw4lcfszk7iak0h9ba3navqzffv-desktops/share/xsessions/xterm

default

.SHELLFLAGS := -c

environment

__NIXOS_SET_ENVIRONMENT_DONE = 1

environment

XDG_SESSION_CLASS = user

environment

XDG_SESSION_TYPE = x11

default

CWEAVE = cweave

automatic

?D = $(patsubst %/,%,$(dir $?))

automatic

@d = $(patsubst %/,%,$(dir $@))

environment

XAUTHORITY = /home/chris/.Xauthority

automatic

@f = $(notdir $@)

default

MAKE_VERSION := 4.2.1

makefile

CURDIR := /home/chris/fromLaptopt/usbflash/Haskell/AstatineAlphaAvocado/frp-arduino

makefile

SHELL = /bin/sh

default

RM = rm -f

environment

NIXPKGS_CONFIG = /etc/nix/nixpkgs-config.nix

environment

VTE_VERSION = 5202

environment

_ = /run/current-system/sw/bin/make

default

PREPROCESS.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -F

default

LINK.m = $(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

environment

XDG_CONFIG_DIRS = /home/chris/.nix-profile/etc/xdg:/nix/var/nix/profiles/default/etc/xdg:/run/current-system/sw/etc/xdg:/etc/profiles/per-user/chris/etc/xdg

default

OUTPUT_OPTION = -o $@

default

COMPILE.cpp = $(COMPILE.cc)

makefile

MAKEFILE_LIST :=

'override' directive

GNUMAKEFLAGS :=

default

LINK.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

environment

XDG_DATA_DIRS = /nix/store/rgzydxvigsp2jfdxl5kfws449q9970hc-gnome-terminal-3.28.2/share:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/share/gsettings-schemas/gsettings-desktop-schemas-3.28.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/share/gsettings-schemas/nautilus-3.28.1:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/share/gsettings-schemas/gsettings-desktop-schemas-3.28.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/share/gsettings-schemas/gtk+3-3.22.30:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/share/gsettings-schemas/nautilus-3.28.1:/nix/store/rgzydxvigsp2jfdxl5kfws449q9970hc-gnome-terminal-3.28.2/share/gsettings-schemas/gnome-terminal-3.28.2:/run/opengl-driver/share:/home/chris/.nix-profile/share:/nix/var/nix/profiles/default/share:/run/current-system/sw/share:/etc/profiles/per-user/chris/share

environment

STRIGI_PLUGIN_PATH = /home/chris/.nix-profile/lib/strigi/:/nix/var/nix/profiles/default/lib/strigi/:/run/current-system/sw/lib/strigi/:/etc/profiles/per-user/chris/lib/strigi/

environment

GI_TYPELIB_PATH = /nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/7y7v5n4jcd7i7m80dw52hlr4wkc3d1rc-librsvg-2.42.4/lib/girepository-1.0:/nix/store/xgj5fwrgcpgwjgg0w48hfpi041b87l9m-pango-1.42.4/lib/girepository-1.0:/nix/store/myr7211aysclk97jbqx4j5jcdg0kcnjw-gdk-pixbuf-2.36.12/lib/girepository-1.0:/nix/store/5vcsl5z90zs2dpvws3fh1vzd0x9l0khn-atk-2.28.1/lib/girepository-1.0:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/lib/girepository-1.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/2xkiybrkc43z7pmizmngyg2vkg5axj47-vte-0.52.2/lib/girepository-1.0:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/lib/girepository-1.0:/nix/store/jybinc27bqsral9837rl3gzc9f8aj4sg-gnome-autoar-0.2.3/lib/girepository-1.0:/nix/store/8nqchqk71xv9b6rswkasc6bflqml95fv-gobject-introspection-1.56.0/lib/girepository-1.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/7y7v5n4jcd7i7m80dw52hlr4wkc3d1rc-librsvg-2.42.4/lib/girepository-1.0:/nix/store/xgj5fwrgcpgwjgg0w48hfpi041b87l9m-pango-1.42.4/lib/girepository-1.0:/nix/store/myr7211aysclk97jbqx4j5jcdg0kcnjw-gdk-pixbuf-2.36.12/lib/girepository-1.0:/nix/store/5vcsl5z90zs2dpvws3fh1vzd0x9l0khn-atk-2.28.1/lib/girepository-1.0:/nix/store/bfh60vmi54fshkir5x7i28wqbzlj77fj-gsettings-desktop-schemas-3.28.0/lib/girepository-1.0:/nix/store/n5ryp9j18r3kp5pzm8jhsa34d25m6wy7-gtk+3-3.22.30/lib/girepository-1.0:/nix/store/2xkiybrkc43z7pmizmngyg2vkg5axj47-vte-0.52.2/lib/girepository-1.0:/nix/store/j0kslmr2njl81cn1v0292xs4fjgfffdi-nautilus-3.28.1/lib/girepository-1.0:/nix/store/jybinc27bqsral9837rl3gzc9f8aj4sg-gnome-autoar-0.2.3/lib/girepository-1.0:/nix/store/8nqchqk71xv9b6rswkasc6bflqml95fv-gobject-introspection-1.56.0/lib/girepository-1.0

environment

QT_PLUGIN_PATH = /home/chris/.nix-profile/lib/qt4/plugins:/home/chris/.nix-profile/lib/kde4/plugins:/nix/var/nix/profiles/default/lib/qt4/plugins:/nix/var/nix/profiles/default/lib/kde4/plugins:/run/current-system/sw/lib/qt4/plugins:/run/current-system/sw/lib/kde4/plugins:/etc/profiles/per-user/chris/lib/qt4/plugins:/etc/profiles/per-user/chris/lib/kde4/plugins

environment

INFOPATH = /home/chris/.nix-profile/info:/home/chris/.nix-profile/share/info:/nix/var/nix/profiles/default/info:/nix/var/nix/profiles/default/share/info:/run/current-system/sw/info:/run/current-system/sw/share/info:/etc/profiles/per-user/chris/info:/etc/profiles/per-user/chris/share/info

default

CHECKOUT,v = +$(if $(wildcard $@),,$(CO) $(COFLAGS) $&lt; $@)

environment

LIBEXEC_PATH = /home/chris/.nix-profile/lib/libexec:/nix/var/nix/profiles/default/lib/libexec:/run/current-system/sw/lib/libexec:/etc/profiles/per-user/chris/lib/libexec

default

LINK.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

environment

XDG_SESSION_PATH = /org/freedesktop/DisplayManager/Session1

default

MAKE_HOST := x86_64-pc-linux-gnu

environment

PATH = /home/chris/.local/bin/:/home/chris/bin:/run/wrappers/bin:/home/chris/.nix-profile/bin:/nix/var/nix/profiles/default/bin:/run/current-system/sw/bin:/etc/profiles/per-user/chris/bin

default

LD = ld

default

TEXI2DVI = texi2dvi

environment

LOCALE_ARCHIVE = /run/current-system/sw/lib/locale/locale-archive

environment

INFINALITY_FT = ultimate3

default

COMPILE.mod = $(M2C) $(M2FLAGS) $(MODFLAGS) $(TARGET_ARCH)

environment

XDG_RUNTIME_DIR = /run/user/1000

environment

GDK_PIXBUF_MODULE_FILE = /nix/store/7y7v5n4jcd7i7m80dw52hlr4wkc3d1rc-librsvg-2.42.4/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache

default

ARFLAGS = rv

default

LINK.r = $(FC) $(FFLAGS) $(RFLAGS) $(LDFLAGS) $(TARGET_ARCH)

default

LINT = lint

default

COMPILE.f = $(FC) $(FFLAGS) $(TARGET_ARCH) -c

default

LINT.c = $(LINT) $(LINTFLAGS) $(CPPFLAGS) $(TARGET_ARCH)

default

YACC.m = $(YACC) $(YFLAGS)

environment

NIX_USER_PROFILE_DIR = /nix/var/nix/profiles/per-user/chris

environment

QTWEBKIT_PLUGIN_PATH = /home/chris/.nix-profile/lib/mozilla/plugins/:/nix/var/nix/profiles/default/lib/mozilla/plugins/:/run/current-system/sw/lib/mozilla/plugins/:/etc/profiles/per-user/chris/lib/mozilla/plugins/

default

YACC.y = $(YACC) $(YFLAGS)

default

PREPROCESS.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -F

default

AR = ar

default

.FEATURES := target-specific order-only second-expansion else-if shortest-stem undefine oneshell archives jobserver output-sync check-symlink load

default

TANGLE = tangle

environment

XDG_SESSION_DESKTOP =

environment

GITHUB_API_TOKEN = 5bdf1b07e2f409b589763b340775d03a79803168

default

GET = get

automatic

%F = $(notdir $%)

environment

KDEDIRS = /home/chris/.nix-profile:/nix/var/nix/profiles/default:/run/current-system/sw:/etc/profiles/per-user/chris

environment

DISPLAY = :0

default

COMPILE.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

environment

XCURSOR_PATH = /home/chris/.icons:/home/chris/.nix-profile/share/icons:/nix/var/nix/profiles/default/share/icons:/run/current-system/sw/share/icons:/etc/profiles/per-user/chris/share/icons

default

CTANGLE = ctangle

environment

__ETC_PROFILE_DONE = 1

environment

HOME = /home/chris

default

.LIBPATTERNS = lib%.so lib%.a

default

LINK.C = $(LINK.cc)

environment

PWD = /home/chris/Haskell/AstatineAlphaAvocado/frp-arduino

default

.LOADED :=

default

LINK.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_MACH)

environment

XDG_SEAT = seat0

environment

GTK_PATH = /home/chris/.nix-profile/lib/gtk-2.0:/home/chris/.nix-profile/lib/gtk-3.0:/nix/var/nix/profiles/default/lib/gtk-2.0:/nix/var/nix/profiles/default/lib/gtk-3.0:/run/current-system/sw/lib/gtk-2.0:/run/current-system/sw/lib/gtk-3.0:/etc/profiles/per-user/chris/lib/gtk-2.0:/etc/profiles/per-user/chris/lib/gtk-3.0

default

LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

default

LINK.s = $(CC) $(ASFLAGS) $(LDFLAGS) $(TARGET_MACH)

environment

DBUS_SESSION_BUS_ADDRESS = unix:abstract=/tmp/dbus-JzthXTRqnh,guid=fe8e57c527664edba32d1d3f5cb1d521

environment

LD_LIBRARY_PATH = /run/opengl-driver/lib

environment

LOGNAME = chris

automatic

+F = $(notdir $+)

default

M2C = m2c

environment

GTK_DATA_PREFIX = /nix/store/b8ailgzkc5sbbhiz6izsylrjaf198788-system-path

default

CO = co

automatic

^D = $(patsubst %/,%,$(dir $^))

environment

XDG_VTNR = 7

environment

MAKELEVEL := 0

default

COMPILE.m = $(OBJC) $(OBJCFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

environment

SSH_ASKPASS = /nix/store/p74iqqs165jwjxkbhp5383ia0h76l4ks-x11-ssh-askpass-1.2.4.1/libexec/x11-ssh-askpass

environment

COLORTERM = truecolor

default

MAKE = $(MAKE_COMMAND)

default

MAKECMDGOALS := Blink upload

environment

SHLVL = 3

environment

NIX_PATH = /home/chris/.nix-defexpr/channels:nixpkgs=/nix/var/nix/profiles/per-user/root/channels/nixos:nixos-config=/etc/nixos/configuration.nix:/nix/var/nix/profiles/per-user/root/channels

environment

NIX_PROFILES = /etc/profiles/per-user/chris /run/current-system/sw /nix/var/nix/profiles/default /home/chris/.nix-profile

default

AS = as

default

PREPROCESS.S = $(CC) -E $(CPPFLAGS)

default

COMPILE.p = $(PC) $(PFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

environment

XDG_SESSION_ID = 2

environment

USER = chris

default

FC = f77

makefile

.DEFAULT_GOAL :=

environment

XDG_CURRENT_DESKTOP =

automatic

%D = $(patsubst %/,%,$(dir $%))

default

CPP = $(CC) -E

default

WEAVE = weave

default

MAKE_COMMAND := make

default

LINK.cpp = $(LINK.cc)

default

F77 = $(FC)

environment

OLDPWD = /home/chris/Haskell/AstatineAlphaAvocado/frp-arduino/makefiles

default

.VARIABLES :=

default

PC = pc

automatic

F = $(notdir $)

environment

XDG_SEAT_PATH = /org/freedesktop/DisplayManager/Seat0

default

COMPILE.def = $(M2C) $(M2FLAGS) $(DEFFLAGS) $(TARGET_ARCH)

default

LEX = lex

makefile

MAKEFLAGS = np

environment

MFLAGS = -np

automatic

D = $(patsubst %/,%,$(dir $))

default

LEX.l = $(LEX) $(LFLAGS) -t

default

LEX.m = $(LEX) $(LFLAGS) -t

automatic

+D = $(patsubst %/,%,$(dir $+))

default

COMPILE.r = $(FC) $(FFLAGS) $(RFLAGS) $(TARGET_ARCH) -c

environment

BOARD = Uno

environment

NO_AT_BRIDGE = 1

environment

TERMINFO_DIRS = /home/chris/.nix-profile/share/terminfo:/nix/var/nix/profiles/default/share/terminfo:/run/current-system/sw/share/terminfo:/etc/profiles/per-user/chris/share/terminfo

default

CC = cc

environment

TZDIR = /etc/zoneinfo

environment

GITHUB_USER = chrissound

default

MAKEFILES :=

default

YACC = yacc

default

COMPILE.cc = $(CXX) $(CXXFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

automatic

<F = $(notdir $&lt;)

default

CXX = g++

default

COFLAGS =

environment

EDITOR = nvim

environment

PAGER = less -R

default

COMPILE.C = $(COMPILE.cc)

environment

GNOME_TERMINAL_SCREEN = /org/gnome/Terminal/screen/9d8c856e_b747_4cad_bb7d_28b6d866e22d

automatic

^F = $(notdir $^)

default

COMPILE.S = $(CC) $(ASFLAGS) $(CPPFLAGS) $(TARGET_MACH) -c

default

LINK.F = $(FC) $(FFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)

environment

GNOME_TERMINAL_SERVICE = :1.55

default

SUFFIXES := .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el

default

COMPILE.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c

default

COMPILE.s = $(AS) $(ASFLAGS) $(TARGET_MACH)

environment

MOZ_PLUGIN_PATH = /home/chris/.nix-profile/lib/mozilla/plugins:/nix/var/nix/profiles/default/lib/mozilla/plugins:/run/current-system/sw/lib/mozilla/plugins:/etc/profiles/per-user/chris/lib/mozilla/plugins

default

.INCLUDE_DIRS = /nix/store/8m2ld502dsx6rbsvv05597qzxha4cnc1-gnumake-4.2.1/include

environment

GIO_EXTRA_MODULES = /nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules:/nix/store/ka37r5lv7p9j4lary3n0bih4yhzlzj99-dconf-0.28.0-lib/lib/gio/modules

default

.RECIPEPREFIX :=

default

MAKEINFO = makeinfo

default

MAKE_TERMERR := /dev/pts/3

default

OBJC = cc

default

LINK.f = $(FC) $(FFLAGS) $(LDFLAGS) $(TARGET_ARCH)

default

TEX = tex

environment

LANG = en_US.UTF-8

environment

TERM = xterm-256color

default

F77FLAGS = $(FFLAGS)

default

LINK.o = $(CC) $(LDFLAGS) $(TARGET_ARCH)

variable set hash-table stats:

Load=160/1024=16%, Rehash=0, Collisions=24/182=13%

Pattern-specific Variable Values

No pattern-specific variable values.

Directories

SCCS: could not be stat'd.

. (device 66307, inode 3058513): 21 files, 76 impossibilities.

RCS: could not be stat'd.

21 files, 76 impossibilities in 3 directories.

Implicit Rules

%.out:

%.a:

%.ln:

%.o:

%: %.o

recipe to execute (built-in):

$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.c:

%: %.c

recipe to execute (built-in):

$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.ln: %.c

recipe to execute (built-in):

$(LINT.c) -C$* $<

%.o: %.c

recipe to execute (built-in):

$(COMPILE.c) $(OUTPUT_OPTION) $<

%.cc:

%: %.cc

recipe to execute (built-in):

$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.cc

recipe to execute (built-in):

$(COMPILE.cc) $(OUTPUT_OPTION) $<

%.C:

%: %.C

recipe to execute (built-in):

$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.C

recipe to execute (built-in):

$(COMPILE.C) $(OUTPUT_OPTION) $<

%.cpp:

%: %.cpp

recipe to execute (built-in):

$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.cpp

recipe to execute (built-in):

$(COMPILE.cpp) $(OUTPUT_OPTION) $<

%.p:

%: %.p

recipe to execute (built-in):

$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.p

recipe to execute (built-in):

$(COMPILE.p) $(OUTPUT_OPTION) $<

%.f:

%: %.f

recipe to execute (built-in):

$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.f

recipe to execute (built-in):

$(COMPILE.f) $(OUTPUT_OPTION) $<

%.F:

%: %.F

recipe to execute (built-in):

$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.F

recipe to execute (built-in):

$(COMPILE.F) $(OUTPUT_OPTION) $<

%.f: %.F

recipe to execute (built-in):

$(PREPROCESS.F) $(OUTPUT_OPTION) $<

%.m:

%: %.m

recipe to execute (built-in):

$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.m

recipe to execute (built-in):

$(COMPILE.m) $(OUTPUT_OPTION) $<

%.r:

%: %.r

recipe to execute (built-in):

$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.r

recipe to execute (built-in):

$(COMPILE.r) $(OUTPUT_OPTION) $<

%.f: %.r

recipe to execute (built-in):

$(PREPROCESS.r) $(OUTPUT_OPTION) $<

%.y:

%.ln: %.y

recipe to execute (built-in):

$(YACC.y) $< 
 $(LINT.c) -C$* y.tab.c 
 $(RM) y.tab.c

%.c: %.y

recipe to execute (built-in):

$(YACC.y) $< 
 mv -f y.tab.c $@

%.l:

%.ln: %.l

recipe to execute (built-in):

@$(RM) $*.c
 $(LEX.l) $< > $*.c
$(LINT.c) -i $*.c -o $@
 $(RM) $*.c

%.c: %.l

recipe to execute (built-in):

@$(RM) $@ 
 $(LEX.l) $< > $@

%.r: %.l

recipe to execute (built-in):

$(LEX.l) $< > $@ 
 mv -f lex.yy.r $@

%.ym:

%.m: %.ym

recipe to execute (built-in):

$(YACC.m) $< 
 mv -f y.tab.c $@

%.yl:

%.s:

%: %.s

recipe to execute (built-in):

$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.s

recipe to execute (built-in):

$(COMPILE.s) -o $@ $<

%.S:

%: %.S

recipe to execute (built-in):

$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@

%.o: %.S

recipe to execute (built-in):

$(COMPILE.S) -o $@ $<

%.s: %.S

recipe to execute (built-in):

$(PREPROCESS.S) $< > $@

%.mod:

%: %.mod

recipe to execute (built-in):

$(COMPILE.mod) -o $@ -e $@ $^

%.o: %.mod

recipe to execute (built-in):

$(COMPILE.mod) -o $@ $<

%.sym:

%.def:

%.sym: %.def

recipe to execute (built-in):

$(COMPILE.def) -o $@ $<

%.h:

%.info:

%.dvi:

%.tex:

%.dvi: %.tex

recipe to execute (built-in):

$(TEX) $<

%.texinfo:

%.info: %.texinfo

recipe to execute (built-in):

$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@

%.dvi: %.texinfo

recipe to execute (built-in):

$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<

%.texi:

%.info: %.texi

recipe to execute (built-in):

$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@

%.dvi: %.texi

recipe to execute (built-in):

$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<

%.txinfo:

%.info: %.txinfo

recipe to execute (built-in):

$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@

%.dvi: %.txinfo

recipe to execute (built-in):

$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<

%.w:

%.c: %.w

recipe to execute (built-in):

$(CTANGLE) $< - $@

%.tex: %.w

recipe to execute (built-in):

$(CWEAVE) $< - $@

%.ch:

%.web:

%.p: %.web

recipe to execute (built-in):

$(TANGLE) $<

%.tex: %.web

recipe to execute (built-in):

$(WEAVE) $<

%.sh:

%: %.sh

recipe to execute (built-in):

cat $< >$@ 
 chmod a+x $@

%.elc:

%.el:

(%): %

recipe to execute (built-in):

$(AR) $(ARFLAGS) $@ $<

%.out: %

recipe to execute (built-in):

@rm -f $@ 
 cp $< $@

%.c: %.w %.ch

recipe to execute (built-in):

$(CTANGLE) $^ $@

%.tex: %.w %.ch

recipe to execute (built-in):

$(CWEAVE) $^ $@

%:: %,v

recipe to execute (built-in):

$(CHECKOUT,v)

%:: RCS/%,v

recipe to execute (built-in):

$(CHECKOUT,v)

%:: RCS/%

recipe to execute (built-in):

$(CHECKOUT,v)

%:: s.%

recipe to execute (built-in):

$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<

%:: SCCS/s.%

recipe to execute (built-in):

$(GET) $(GFLAGS) $(SCCS_OUTPUT_OPTION) $<

92 implicit rules, 5 (5.4%) terminal.

Files

Not a target:

.web.p:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(TANGLE) $<

Not a target:

.l.r:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LEX.l) $< > $@ 
 mv -f lex.yy.r $@

Not a target:

.dvi:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.ym:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.f.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.f) $(OUTPUT_OPTION) $<

Not a target:

Blink:

Command line target.

Implicit rule search has been done.

File does not exist.

File has not been updated.

Not a target:

.l:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.m:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.m) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.ln:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.y:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.def.sym:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.def) -o $@ $<

Not a target:

.p.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.p) $(OUTPUT_OPTION) $<

Not a target:

.p:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.p) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.txinfo.dvi:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<

Not a target:

.a:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.yl:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.l.ln:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

@$(RM) $*.c
 $(LEX.l) $< > $*.c
$(LINT.c) -i $*.c -o $@
 $(RM) $*.c

Not a target:

.F.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.F) $(OUTPUT_OPTION) $<

Not a target:

.texi.info:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@

Not a target:

.w.c:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(CTANGLE) $< - $@

Not a target:

.texi.dvi:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<

Not a target:

.ch:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.m.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.m) $(OUTPUT_OPTION) $<

Not a target:

.cc:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.cc.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.cc) $(OUTPUT_OPTION) $<

Not a target:

.def:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.SUFFIXES: .out .a .ln .o .c .cc .C .cpp .p .f .F .m .r .y .l .ym .yl .s .S .mod .sym .def .h .info .dvi .tex .texinfo .texi .txinfo .w .ch .web .sh .elc .el

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.c.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.c) $(OUTPUT_OPTION) $<

Not a target:

Makefile:

Implicit rule search has been done.

File does not exist.

File has been updated.

Failed to be updated.

Not a target:

.r.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.r) $(OUTPUT_OPTION) $<

Not a target:

.r:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.r) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.ym.m:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(YACC.m) $< 
 mv -f y.tab.c $@

Not a target:

.y.ln:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(YACC.y) $< 
 $(LINT.c) -C$* y.tab.c 
 $(RM) y.tab.c

Not a target:

makefile:

Implicit rule search has been done.

File does not exist.

File has been updated.

Failed to be updated.

Not a target:

.elc:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.l.c:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

@$(RM) $@ 
 $(LEX.l) $< > $@

Not a target:

.out:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.C:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.C) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.r.f:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(PREPROCESS.r) $(OUTPUT_OPTION) $<

Not a target:

.S:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.S) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.texinfo.info:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@

Not a target:

.c:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.w.tex:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(CWEAVE) $< - $@

Not a target:

.c.ln:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINT.c) -C$* $<

Not a target:

.s.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.s) -o $@ $<

Not a target:

.s:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.s) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.texinfo.dvi:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(TEXI2DVI) $(TEXI2DVI_FLAGS) $<

Not a target:

.el:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.lm.m:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

@$(RM) $@ 
 $(LEX.m) $< > $@

Not a target:

.y.c:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(YACC.y) $< 
 mv -f y.tab.c $@

Not a target:

.web.tex:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(WEAVE) $<

Not a target:

.texinfo:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.DEFAULT:

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.h:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.tex.dvi:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(TEX) $<

Not a target:

.cpp.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.cpp) $(OUTPUT_OPTION) $<

Not a target:

.cpp:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.cpp) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.C.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.C) $(OUTPUT_OPTION) $<

Not a target:

.texi:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.txinfo:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.tex:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.txinfo.info:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(MAKEINFO) $(MAKEINFO_FLAGS) $< -o $@

Not a target:

GNUmakefile:

Implicit rule search has been done.

File does not exist.

File has been updated.

Failed to be updated.

Not a target:

.sh:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

cat $< >$@ 
 chmod a+x $@

Not a target:

.S.s:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(PREPROCESS.S) $< > $@

Not a target:

.mod:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.mod) -o $@ -e $@ $^

Not a target:

.mod.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.mod) -o $@ $<

Not a target:

.F.f:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(PREPROCESS.F) $(OUTPUT_OPTION) $<

Not a target:

.w:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.S.o:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(COMPILE.S) -o $@ $<

Not a target:

.F:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.F) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

upload:

Command line target.

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.web:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.sym:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

Not a target:

.f:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

recipe to execute (built-in):

$(LINK.f) $^ $(LOADLIBES) $(LDLIBS) -o $@

Not a target:

.info:

Builtin rule

Implicit rule search has not been done.

Modification time never checked.

File has not been updated.

files hash-table stats:

Load=77/1024=8%, Rehash=0, Collisions=522/1941=27%

VPATH Search Paths

No 'vpath' search paths.

No general ('VPATH' variable) search path.

strcache buffers: 1 (0) / strings = 618 / storage = 8026 B / avg = 12 B

current buf: size = 8162 B / used = 8026 B / count = 618 / avg = 12 B

strcache performance: lookups = 1020 / hit rate = 39%

hash-table stats:

Load=618/8192=8%, Rehash=0, Collisions=262/1020=26%

Finished Make data base on Wed Apr 17 22:23:04 2019

</details>

Problem: Num TypeClass not finished

From https://github.com/frp-arduino/frp-arduino/blob/master/src/Arduino/DSL.hs#L87

instance Num (Expression a) where
    (+) left right = Expression $ DAG.Add (unExpression left) (unExpression right)
    (-) left right = Expression $ DAG.Sub (unExpression left) (unExpression right)
    (*) = error "* not yet implemented"
    abs = error "abs not yet implemented"
    signum = error "signum not yet implemented"
    fromInteger value = Expression $ DAG.WordConstant $ fromIntegral value

How much optimization can we get from gcc?

The C code that we generate is quite verbose. Does it matter?

In the standard makefile, the LCD example looks like this:

Program:    8258 bytes (25.2% Full)
(.text + .data + .bootloader)

Data:          4 bytes (0.2% Full)
(.data + .bss + .noinit)

When setting gcc optimization level to 3, we get this:

Program:    1390 bytes (4.2% Full)
(.text + .data + .bootloader)

Data:          4 bytes (0.2% Full)
(.data + .bss + .noinit)

Quite an improvement in program size :-)

Question: Should DAG.Expression remain untyped?

If I have time, I may try to tackle this. The main idea is changing the definition of DAG.Expression to DAG.Expression a

for Example:

{-# LANGUAGE GADTs #-}

data Expression a where
  Input :: Int -> Expression Int
  Not :: Expression Bool -> Expression (Bool -> Bool)
  Even :: Integral a => Expression a -> Expression Bool
  ByteConstant :: Byte -> Expression Byte
  ...
  ...
  -- new proposed expression
  Apply :: Expression (a -> b) -> Expression a -> Expression b

Aside from helping check the correctness of the Code Generator, this might allow DAG.Expression to just merge with DSL.Expression since they're likely be isomorphic.

Question: Could we use linear types to avoid duplicate resource allocation

In the now resolved #1, the main problem is that after having used the resource it was still available for binding.

Linear types (based on linear logic) encode this kind of invariant directly. Here's a slide deck that overviews how to emulate these in Haskell.... but this is the kind of situation where Haskell's type system is abit wanting

Lastly as a bonus, languages like Rust have linear logic built-in for memory safety. That might make it a better target language (and there is even work showing it working on Arduino)

Question: Potentially add support for random sampling

Hey, I was wondering how hard it'd be to add support for random delays between samples.

The primary motivation is compressive sensing, where by assuming the signal is sparse, you can reconstruct signals given way fewer samples.

A good example is the single pixel camera from Rice University, which uses a similar technique to reconstruct a scene given only 1 pixel and random samples from the environment.

I think this matches well with the arduino since it has a relatively low possible sample rate (~9.5 kHz), but many processes (near field acoustics for example) require ~44.1kHz given uniform sampling. <-- I'm working on a process where I have to use expensive audio cards, but would really like to just use arduinos

Reforumlate Arduino Controller as Hybrid I/O Automata (HIOA)

Currently, the generated Arduino code seems to act like a single state machine where the dynamics are governed by the Stream binding to pins (which can be seen as the variables)

I propose introducing Events (which correspond to guards in HIOA) for transitioning between states.

These could look like

twostates

or perhaps

diagram

The syntax for the two state system could look like:

type Behavior a = Stream a

switcher :: Behavior a -> Event (Behavior a) -> Behavior a

s1 :: Behavior Int
s2 :: Behavior Int

s3 :: Behavior Bool
s3 = isEven `mapS` s1

s4 :: Behavior (Int, Bool)
s4 = s3 <> s1

s5 :: Behavior (Bool, Int)
s5 = s3 <> s2

-- Triggered if First element is True, Holds behavior to be used if Triggered
buttonEvent :: Behavior (Bool, a) -> Event (Behavior (Bool, a))

e :: Event (Behavior (Bool, Int))
e = buttonEvent s5

pin1 := switch s4 e

Which would change from behavior s4 to behavior s5 when s1 is even

Issue handling process

I'm trying to enforce the C4 process to our issue handling. Specifically this part:

The user or Contributor SHOULD write the issue by describing the problem they face or observe.

The user or Contributor SHOULD seek consensus on the accuracy of their observation, and the value of solving the problem.

Users SHALL NOT log feature requests, ideas, suggestions, or any solutions to problems that are not explicitly documented and provable.

Problems that we agree on can get the "agreed problem" label. Questions and general discussions can get the "question" label.

Question: Reading inputs via interrupts

I'm curious, as it seems to be quite common that some inputs are needed to be read via interrupts (say, an encoder input that can change fast, and normal 'polling' in a loop would have ended in some state changes missed) - is there something implemented/planned to handle such scenario?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.