Packages
nerves
0.4.1
1.15.0
1.14.3
1.14.2
1.14.1
1.14.0
1.13.2
1.13.1
1.13.0
1.12.0
1.11.3
1.11.2
1.11.1
1.11.0
1.10.5
1.10.4
1.10.3
1.10.2
1.10.1
1.10.0
1.9.3
1.9.2
retired
1.9.1
1.9.0
1.8.0
1.7.17
1.7.16
1.7.15
1.7.14
retired
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
retired
1.7.1
retired
1.7.0
retired
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.1
1.2.0
1.1.1
1.1.0
1.0.1
1.0.0
1.0.0-rc.2
1.0.0-rc.1
1.0.0-rc.0
0.11.0
0.10.1
0.10.0
0.9.4
0.9.3
0.9.2
0.9.1
0.9.0
0.8.3
0.8.2
0.8.1
0.8.0
0.7.5
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.1
0.6.0
0.5.2
0.5.1
0.5.0
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.4.0-rc.0
0.3.4
0.3.3
0.3.2
0.3.1
0.3.0
0.2.0
Craft and deploy bulletproof embedded software
Current section
Files
Jump to
Current section
Files
lib/nerves/utils/stream.ex
defmodule Nerves.Utils.Stream do
use GenServer
@timer 10_000
def start_link(opts) do
GenServer.start_link(__MODULE__, opts)
end
def init(opts) do
file = opts[:file]
if file != nil do
File.write(file, "", [:write])
end
{:ok, %{
file: opts[:file],
timer: Process.send_after(self(), :keep_alive, @timer)
}}
end
def handle_info({:io_request, from, reply_as, {:put_chars, _encoding, chars}} = data, s) do
if s.file != nil do
File.write(s.file, chars, [:append])
end
reply(from, reply_as, :ok)
{:noreply, stdout(chars, data, s)}
end
def handle_info(:keep_alive, s) do
IO.write "."
{:noreply, reset_timer(s)}
end
def stdout(<<"\e[7m>>>", tail :: binary>>, _message, s) do
IO.write "\n"
[tail | _] =
tail
|> String.split("\e[7m")
"\e[7m" <> tail
|> String.strip
|> IO.write
reset_timer(s)
end
def stdout(_, _, s), do: s
defp reset_timer(s) do
Process.cancel_timer(s.timer)
%{s | timer: Process.send_after(self(), :keep_alive, @timer)}
end
def reply(from, reply_as, reply) do
send from, {:io_reply, reply_as, reply}
end
end