Initial commit

This commit is contained in:
Mikko Ahlroth 2017-10-24 20:42:02 +03:00
commit fbfdfb5b61
15 changed files with 311 additions and 0 deletions

12
.gitignore vendored Normal file
View file

@ -0,0 +1,12 @@
# App artifacts
/_build
/db
/deps
/*.ez
# Nerves artifacts
/_images
/.nerves
# Generate on crash by the VM
erl_crash.dump

29
README.md Normal file
View file

@ -0,0 +1,29 @@
# DuckTag
## Targets
Nerves applications produce images for hardware targets based on the
`MIX_TARGET` environment variable. If `MIX_TARGET` is unset, `mix` builds an
image that runs on the host (e.g., your laptop). This is useful for executing
logic tests, running utilities, and debugging. Other targets are represented by
a short name like `rpi3` that maps to a Nerves system image for that platform.
All of this logic is in the generated `mix.exs` and may be customized. For more
information about targets see:
https://hexdocs.pm/nerves/targets.html#content
## Getting Started
To start your Nerves app:
* `export MIX_TARGET=my_target` or prefix every command with
`MIX_TARGET=my_target`. For example, `MIX_TARGET=rpi3`
* Install dependencies with `mix deps.get`
* Create firmware with `mix firmware`
* Burn to an SD card with `mix firmware.burn`
## Learn more
* Official docs: https://hexdocs.pm/nerves/getting-started.html
* Official website: http://www.nerves-project.org/
* Discussion Slack elixir-lang #nerves ([Invite](https://elixir-slackin.herokuapp.com/))
* Source: https://github.com/nerves-project/nerves

32
config/config.exs Normal file
View file

@ -0,0 +1,32 @@
# This file is responsible for configuring your application
# and its dependencies with the aid of the Mix.Config module.
#
# This configuration file is loaded before any dependency and
# is restricted to this project.
use Mix.Config
# Customize the firmware. Uncomment all or parts of the following
# to add files to the root filesystem or modify the firmware
# archive.
# config :nerves, :firmware,
# rootfs_overlay: "rootfs_overlay",
# fwup_conf: "config/fwup.conf"
# Use bootloader to start the main application. See the bootloader
# docs for separating out critical OTP applications such as those
# involved with firmware updates.
config :bootloader,
init: [:nerves_runtime, :nerves_init_gadget],
app: :duck_tag
config :nerves_firmware_ssh,
authorized_keys: [
File.read!(Path.join(['ssh', 'id_nerves.pub']))
]
# Import target specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
# Uncomment to use target specific configurations
# import_config "#{Mix.Project.config[:target]}.exs"

3
lib/duck_tag.ex Normal file
View file

@ -0,0 +1,3 @@
defmodule DuckTag do
end

View file

@ -0,0 +1,20 @@
defmodule DuckTag.Application do
use Application
# See http://elixir-lang.org/docs/stable/elixir/Application.html
# for more information on OTP Applications
def start(_type, _args) do
import Supervisor.Spec, warn: false
# Define workers and child supervisors to be supervised
children = [
# worker(DuckTag.Worker, [arg1, arg2, arg3]),
worker(Nerves.IO.RC522, [{DuckTag.RFIDHandler, :tag_scanned}])
]
# See http://elixir-lang.org/docs/stable/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: DuckTag.Supervisor]
Supervisor.start_link(children, opts)
end
end

View file

@ -0,0 +1,6 @@
defmodule DuckTag.RFIDHandler do
def tag_scanned(uid) do
IO.puts("TAG SCANNED")
IO.inspect(uid)
end
end

86
mix.exs Normal file
View file

@ -0,0 +1,86 @@
defmodule DuckTag.Mixfile do
use Mix.Project
@target System.get_env("MIX_TARGET") || "host"
Mix.shell.info([:green, """
Mix environment
MIX_TARGET: #{@target}
MIX_ENV: #{Mix.env}
""", :reset])
def project do
[app: :duck_tag,
version: "0.1.0",
elixir: "~> 1.4",
target: @target,
archives: [nerves_bootstrap: "~> 0.6"],
deps_path: "deps/#{@target}",
build_path: "_build/#{@target}",
lockfile: "mix.lock.#{@target}",
build_embedded: Mix.env == :prod,
start_permanent: Mix.env == :prod,
aliases: aliases(@target),
deps: deps()]
end
# Configuration for the OTP application.
#
# Type `mix help compile.app` for more information.
def application, do: application(@target)
# Specify target specific application configurations
# It is common that the application start function will start and supervise
# applications which could cause the host to fail. Because of this, we only
# invoke DuckTag.start/2 when running on a target.
def application("host") do
[extra_applications: [:logger]]
end
def application(_target) do
[mod: {DuckTag.Application, []},
extra_applications: [:logger]]
end
# Dependencies can be Hex packages:
#
# {:my_dep, "~> 0.3.0"}
#
# Or git/path repositories:
#
# {:my_dep, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
#
# Type "mix help deps" for more examples and options
def deps do
[{:nerves, "~> 0.7", runtime: false}] ++
deps(@target)
end
# Specify target specific dependencies
def deps("host"), do: []
def deps(target) do
[
{:bootloader, "~> 0.1"},
{:nerves_runtime, "~> 0.4"},
{:nerves_init_gadget, "~> 0.2"},
{:nerves_io_rc522, "~> 0.1.0"}
] ++ system(target)
end
def system("rpi"), do: [{:nerves_system_rpi, ">= 0.0.0", runtime: false}]
def system("rpi0"), do: [{:nerves_system_rpi0, ">= 0.0.0", runtime: false}]
def system("rpi2"), do: [{:nerves_system_rpi2, ">= 0.0.0", runtime: false}]
def system("rpi3"), do: [{:nerves_system_rpi3, ">= 0.0.0", runtime: false}]
def system("bbb"), do: [{:nerves_system_bbb, ">= 0.0.0", runtime: false}]
def system("linkit"), do: [{:nerves_system_linkit, ">= 0.0.0", runtime: false}]
def system("ev3"), do: [{:nerves_system_ev3, ">= 0.0.0", runtime: false}]
def system("qemu_arm"), do: [{:nerves_system_qemu_arm, ">= 0.0.0", runtime: false}]
def system(target), do: Mix.raise "Unknown MIX_TARGET: #{target}"
# We do not invoke the Nerves Env when running on the Host
def aliases("host"), do: []
def aliases(_target) do
["deps.precompile": ["nerves.precompile", "deps.precompile"],
"deps.loadpaths": ["deps.loadpaths", "nerves.loadpaths"]]
end
end

2
mix.lock.host Normal file
View file

@ -0,0 +1,2 @@
%{"distillery": {:hex, :distillery, "1.5.2", "eec18b2d37b55b0bcb670cf2bcf64228ed38ce8b046bb30a9b636a6f5a4c0080", [], [], "hexpm"},
"nerves": {:hex, :nerves, "0.7.5", "3aa6a336b2ad6c1c9589cc2b577511b3c4c375c1ba6c533ab9f88adb8c21f0c3", [], [{:distillery, "~> 1.4", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"}}

19
mix.lock.rpi0 Normal file
View file

@ -0,0 +1,19 @@
%{"bootloader": {:hex, :bootloader, "0.1.2", "835ddcf50b796714658f342061d5d48ebc34cbd0d81cdbd5a5a8ae00705d72b1", [], [{:distillery, "~> 1.0", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"},
"distillery": {:hex, :distillery, "1.5.2", "eec18b2d37b55b0bcb670cf2bcf64228ed38ce8b046bb30a9b636a6f5a4c0080", [], [], "hexpm"},
"dns": {:hex, :dns, "1.0.1", "1d88187fdf564d937cee202949141090707fd0c9d7fcae903a6878ef24ef5d1e", [], [{:socket, "~> 0.3.12", [hex: :socket, repo: "hexpm", optional: false]}], "hexpm"},
"elixir_make": {:hex, :elixir_make, "0.4.0", "992f38fabe705bb45821a728f20914c554b276838433349d4f2341f7a687cddf", [], [], "hexpm"},
"mdns": {:hex, :mdns, "0.1.6", "b51b902b15b50e0e1522483c6a5fb073413e3d3d6ef52a44b93a541460b47d29", [], [{:dns, "~> 1.0", [hex: :dns, repo: "hexpm", optional: false]}], "hexpm"},
"nerves": {:hex, :nerves, "0.7.5", "3aa6a336b2ad6c1c9589cc2b577511b3c4c375c1ba6c533ab9f88adb8c21f0c3", [], [{:distillery, "~> 1.4", [hex: :distillery, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_firmware_ssh": {:hex, :nerves_firmware_ssh, "0.3.1", "e8b1967fa0aff255230be539c68ec868d33884193a385caff957ebad7d6aa8af", [], [{:nerves_runtime, "~> 0.4", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_init_gadget": {:hex, :nerves_init_gadget, "0.2.1", "20f36dd062fb00e2be8817ddff1b9ced9762877cfe23f6ec1d5936a37e3fc2c8", [], [{:mdns, "~> 0.1", [hex: :mdns, repo: "hexpm", optional: false]}, {:nerves_firmware_ssh, "~> 0.2", [hex: :nerves_firmware_ssh, repo: "hexpm", optional: false]}, {:nerves_network, "~> 0.3", [hex: :nerves_network, repo: "hexpm", optional: false]}, {:nerves_runtime, "~> 0.3", [hex: :nerves_runtime, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_io_rc522": {:hex, :nerves_io_rc522, "0.1.0", "5a84a23ff2ac6e4c9cc0ea2931e43cf06d175b991bfd8b0ef664192cee25b7a4", [], [{:elixir_make, "~> 0.3", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_network": {:hex, :nerves_network, "0.3.4", "c50a36b8263cda2bee18f408287d0f4474f8367702d170864325abbd5d424e4d", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:nerves_network_interface, "~> 0.4.0", [hex: :nerves_network_interface, repo: "hexpm", optional: false]}, {:nerves_wpa_supplicant, "~> 0.3.0", [hex: :nerves_wpa_supplicant, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.4", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_network_interface": {:hex, :nerves_network_interface, "0.4.2", "7a3663a07803f2f9f1e37146714d24ccec1e9349268586e4ed8c41f38641d837", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_runtime": {:hex, :nerves_runtime, "0.5.0", "5f4135fe3c94ca5c9e25d677350fbb136f279d14aac4871236961b6f5ccbcfa5", [], [{:elixir_make, "~> 0.4", [hex: :elixir_make, repo: "hexpm", optional: false]}, {:system_registry, "~> 0.5", [hex: :system_registry, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_system_br": {:hex, :nerves_system_br, "0.14.0", "bff3e310e93c7143525257289cc1ba957ebaeebbaf6e97428d0d01c13f440e49", [], [], "hexpm"},
"nerves_system_rpi0": {:hex, :nerves_system_rpi0, "0.18.1", "7d24a99b2f456af9d1d99b04618336859344e55954262c920904bc5b9f081508", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_system_br, "~> 0.14.0", [hex: :nerves_system_br, repo: "hexpm", optional: false]}, {:nerves_toolchain_armv6_rpi_linux_gnueabi, "~> 0.11.0", [hex: :nerves_toolchain_armv6_rpi_linux_gnueabi, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_toolchain_armv6_rpi_linux_gnueabi": {:hex, :nerves_toolchain_armv6_rpi_linux_gnueabi, "0.11.0", "74ee72f15baffe773e41bae1baeef3942fc8f97fa47d9d1bf9db07c17eca90bd", [], [{:nerves, "~> 0.7", [hex: :nerves, repo: "hexpm", optional: false]}, {:nerves_toolchain_ctng, "~> 1.1", [hex: :nerves_toolchain_ctng, repo: "hexpm", optional: false]}], "hexpm"},
"nerves_toolchain_ctng": {:hex, :nerves_toolchain_ctng, "1.1.0", "0f03e4a3f3beef5fe271de0148b9f106c417e57f303f635c21c74b4bd6eb68ee", [], [], "hexpm"},
"nerves_wpa_supplicant": {:hex, :nerves_wpa_supplicant, "0.3.2", "19dc7e1248336e7f542b11b2b857ceb5b088d3eb41a6ca75b7b76628dcf67aad", [], [{:elixir_make, "~> 0.3", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm"},
"socket": {:hex, :socket, "0.3.12", "4a6543815136503fee67eff0932da1742fad83f84c49130c854114153cc549a6", [], [], "hexpm"},
"system_registry": {:hex, :system_registry, "0.6.0", "31642177e6002d3cff2ada3553ed4e9c0a6ca015797d62d7d17c0ab8696185fc", [], [], "hexpm"}}

40
rel/config.exs Normal file
View file

@ -0,0 +1,40 @@
use Mix.Releases.Config,
# This sets the default release built by `mix release`
default_release: :default,
# This sets the default environment used by `mix release`
default_environment: :dev
# For a full list of config options for both releases
# and environments, visit https://hexdocs.pm/distillery/configuration.html
# You may define one or more environments in this file,
# an environment's settings will override those of a release
# when building in that environment, this combination of release
# and environment configuration is called a profile
environment :dev do
set cookie: :"JNP[nh_b9$D%]1P{_P2?()9*mv`Z1:E18T.w;kRLZX`_$E;es@1~3k7Upmg*IhH3"
end
environment :prod do
set cookie: :"JNP[nh_b9$D%]1P{_P2?()9*mv`Z1:E18T.w;kRLZX`_$E;es@1~3k7Upmg*IhH3"
end
# You may define one or more releases in this file.
# If you have not set a default release, or selected one
# when running `mix release`, the first release in the file
# will be used by default
release :duck_tag do
set version: current_version(:duck_tag)
plugin Bootloader.Plugin
if System.get_env("NERVES_SYSTEM") do
set dev_mode: false
set include_src: false
set include_erts: System.get_env("ERL_LIB_DIR")
set include_system_libs: System.get_env("ERL_SYSTEM_LIB_DIR")
set vm_args: "rel/vm.args"
end
end

25
rel/vm.args Normal file
View file

@ -0,0 +1,25 @@
## Add custom options here
## Distributed Erlang Options
## The cookie needs to be configured prior to vm boot for
## for read only filesystem.
# -name duck_tag@0.0.0.0
-setcookie QzZpjmW58COOicHqloZZKRdTN688yjYr6XL8Klbcr6cCT0br3dlKjVeABjGp5nOr
## Use Ctrl-C to interrupt the current shell rather than invoking the emulator's
## break handler and possibly exiting the VM.
+Bc
## Save the shell history between reboots
## See http://erlang.org/doc/man/kernel_app.html for additional options
-kernel shell_history enabled
## Start the Elixir shell
-noshell
-user Elixir.IEx.CLI
## Options added after -extra are interpreted as plain arguments and
## can be retrieved using :init.get_plain_arguments().
-extra --no-halt

27
ssh/id_nerves Normal file
View file

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAusMwKRvBtC39nz5qKC3AeeF9iwYWGNZ/Oj8EfyWdcbji4wCv
3x3UvxcGAGY307yVNGHRdC8WRUXutpzr5ry/pgs6w8q9P/jUx+MZlRXDJ6/XOeqh
95yrV45AdlP6Ke6kP/Gthy9G8pgVjCkwxi8w30EC4FAtvUzaIVWvT9vrflgg93zB
9wfnLXM535G8UArz4B+t1+ciWqg/gxF5C9WSvg/hI7dONW0yFpc27oboVOnM+HaH
wx0eI5IQ/EtB95EJnWb5wwJGy03M9qHVEj/ueBkZP6WdCquDK87OT7gaWIWcDo9O
bSVjRyLGXGEzX7huEMxh8ceySiSgO2z11vXFCQIDAQABAoIBAGMMQ415uAhb38dF
rb0zToIVMaS6jJuNnpoAc90O0OpQGJw1cBCPXJYfmsI5c+AqgqLuQcwxcMk6ZniY
zo9niOiByh+udSHpUMfVzGqBySdSHX4MzutoPoLH4a4fqWv1sUxsWxB35VOhjsPv
0Hs66dttOh5Gx4s+p+zH6Zsb0lAFezikdmAEi7YC7dljkhrbtU5505FTT7QffP1s
JxKPkLCqYqRfZTr5MiAmxB9L8hhRx5JyRNF+YuHHPtfHDhbniC1xlkeV5p5QiOG0
vfUj88WEhCWLj8+4CanqkyWGGj6/F3M1N1qMxYzOq3qLERFUGHlAkRTisVf9T48s
lq4fBeUCgYEA3jIx9GAf30v8iKwBCnjCYk4ulXQrL4I0HRnWpcngr2/sMKkdetnS
0Xno4F72pQvCMNUWqvTUTpautoUdHEVqVhWuGjVd7IHmFRvlp/cBs+OGNX9GjZ48
sIGENTOuGPr1IwsH0jjOkpD6jw7ca1uCTClbx5vD7VDa6+5F/LeM268CgYEA1yz4
YGLc5XF5nCQu4NRFu1LEf1AZTh1ZMNzYAc8pao/pfi6l+0LO0YddxAhZPYB/2xid
YGfSkEAtINS4zWRjy/+PL984WDkLoHmNE6jlQzWM46mhCX4JkU/olgAm2Zuo5R8K
oxpcQA7ImnZAuGYapWk/bcldxA4xiqsehMm5AMcCgYEAqeOdOGlq1TPnQaSqIxSU
I8/9ZD5vaqLWL836xcZmah1cbRRROwZjX9EjkrJpSWaFMwsqisoprnEd4uZCjMQy
euGWvelCCDyF7GvpG5UMEzwK+Mp46n0rkBVnPbpnCiiP2Bxt/Xl70KrTOSC2vcs5
A/y3dRaPJtukl7IWhxTcuXcCgYEAwweOpIZXI1vD1wNwvfWIsq3lTmPCW+v78G7r
FlC3gE+qWeVcKi42mPFxyoGqqTT0LhjUZBIWZwrUHILScc/BKKCdHs3bGxOxdyVU
+nHGQzGhXqRcQudLMrtT28mNbQVKg0mscYMuBB2iM2ZlaP2avzxy8kZmx5H5028g
PUk9dvcCgYEAgsdiL/IjgaCitgypZfsP01IrMOvt3iVwk4syg7Yz58OiDhrcLt8/
gxcdBAmBW705UyhNQPMsReb7kjOJ8rKq/+Ps/YGveExp8e1AcB1c4N1ub7P7hDcj
4cZXdvtqt+L5yKDXaZHwL5utMc6NWFqCjGYK8uH1sz+tDLR651LsVRQ=
-----END RSA PRIVATE KEY-----

1
ssh/id_nerves.pub Normal file
View file

@ -0,0 +1 @@
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6wzApG8G0Lf2fPmooLcB54X2LBhYY1n86PwR/JZ1xuOLjAK/fHdS/FwYAZjfTvJU0YdF0LxZFRe62nOvmvL+mCzrDyr0/+NTH4xmVFcMnr9c56qH3nKtXjkB2U/op7qQ/8a2HL0bymBWMKTDGLzDfQQLgUC29TNohVa9P2+t+WCD3fMH3B+ctcznfkbxQCvPgH63X5yJaqD+DEXkL1ZK+D+Ejt041bTIWlzbuhuhU6cz4dofDHR4jkhD8S0H3kQmdZvnDAkbLTcz2odUSP+54GRk/pZ0Kq4Mrzs5PuBpYhZwOj05tJWNHIsZcYTNfuG4QzGHxx7JKJKA7bPXW9cUJ

8
test/duck_tag_test.exs Normal file
View file

@ -0,0 +1,8 @@
defmodule DuckTagTest do
use ExUnit.Case
doctest DuckTag
test "the truth" do
assert 1 + 1 == 2
end
end

1
test/test_helper.exs Normal file
View file

@ -0,0 +1 @@
ExUnit.start