Current section
Files
Jump to
Current section
Files
src/cangaroo.erl
-module(cangaroo).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/cangaroo.gleam").
-export([start_link/1, close/1, send/2, set_loopback/2, recv_own_messages/2, set_filters/2, set_error_filter/2]).
-file("src/cangaroo.gleam", 13).
-spec start() -> {ok, cangaroo@types:can_socket()} |
{error, cangaroo@errors:can_error()}.
start() ->
{Status, Pid} = 'Elixir.Excansock':start_link(),
case erlang:atom_to_binary(Status) of
<<"ok"/utf8>> ->
{ok, cangaroo@types:new_socket(Pid)};
Other_msg ->
{error, {start_link_error, Other_msg}}
end.
-file("src/cangaroo.gleam", 21).
-spec open(cangaroo@types:can_socket(), binary()) -> {ok, nil} |
{error, cangaroo@errors:can_error()}.
open(Socket, Interface) ->
Raw = 'Elixir.Excansock':open(
cangaroo@types:socket_pid(Socket),
Interface,
false
),
cangaroo@internal:decode_result(Raw).
-file("src/cangaroo.gleam", 68).
-spec error_to_string(cangaroo@errors:can_error()) -> binary().
error_to_string(Err) ->
case Err of
{start_link_error, Reason} ->
Reason;
{interface_bound_error, Interface} ->
<<"interface_bound:"/utf8, Interface/binary>>;
{unknown_error, Reason@1} ->
Reason@1;
invalid_message_type_error ->
<<"invalid_message_type"/utf8>>
end.
-file("src/cangaroo.gleam", 77).
-spec handle_message(
cangaroo@types:can_client(),
cangaroo@types:actor_message()
) -> gleam@otp@actor:next(cangaroo@types:can_client(), cangaroo@types:actor_message()).
handle_message(Client, Msg) ->
case Msg of
{raw_can_data, Raw_data} ->
Frame = bridge_ffi:unwrap_frame(Raw_data),
Id = bridge_ffi:get_id(Frame),
Data = bridge_ffi:get_data(Frame),
Gleam_frame = {can_frame, Id, Data},
gleam@erlang@process:send(
cangaroo@types:messages(Client),
Gleam_frame
),
gleam@otp@actor:continue(Client);
shutdown ->
Socket = cangaroo@types:client_socket(Client),
_ = 'Elixir.Excansock':close(cangaroo@types:socket_pid(Socket)),
_ = 'Elixir.GenServer':stop(cangaroo@types:socket_pid(Socket)),
gleam@otp@actor:stop()
end.
-file("src/cangaroo.gleam", 26).
-spec start_link(binary()) -> {ok, cangaroo@types:can_client()} |
{error, cangaroo@errors:can_error()}.
start_link(Interface) ->
User_frames = gleam@erlang@process:new_subject(),
Actor_result = begin
_pipe@7 = (gleam@otp@actor:new_with_initialiser(
5000,
fun(Self_subject) ->
Can_tag = erlang:binary_to_atom(<<"can_data_frame"/utf8>>),
Selector = begin
_pipe = gleam_erlang_ffi:new_selector(),
_pipe@1 = gleam@erlang@process:select(_pipe, Self_subject),
gleam@erlang@process:select_record(
_pipe@1,
Can_tag,
1,
fun(Field@0) -> {raw_can_data, Field@0} end
)
end,
gleam@result:'try'(
begin
_pipe@2 = start(),
gleam@result:map_error(_pipe@2, fun error_to_string/1)
end,
fun(Socket) ->
gleam@result:'try'(
begin
_pipe@3 = open(Socket, Interface),
gleam@result:map_error(
_pipe@3,
fun error_to_string/1
)
end,
fun(_) ->
Client = cangaroo@types:new_client(
Socket,
User_frames,
Self_subject
),
_pipe@4 = gleam@otp@actor:initialised(Client),
_pipe@5 = gleam@otp@actor:selecting(
_pipe@4,
Selector
),
_pipe@6 = gleam@otp@actor:returning(
_pipe@5,
Client
),
{ok, _pipe@6}
end
)
end
)
end
)),
_pipe@8 = gleam@otp@actor:on_message(_pipe@7, fun handle_message/2),
gleam@otp@actor:start(_pipe@8)
end,
case Actor_result of
{ok, Started} ->
{ok, erlang:element(3, Started)};
{error, {init_failed, Reason}} ->
{error, {start_link_error, Reason}};
{error, {init_exited, _}} ->
{error, {start_link_error, <<"exited"/utf8>>}};
{error, init_timeout} ->
{error, {start_link_error, <<"timeout"/utf8>>}}
end.
-file("src/cangaroo.gleam", 99).
-spec close(cangaroo@types:can_client()) -> nil.
close(Client) ->
gleam@erlang@process:send(
cangaroo@types:client_actor_subject(Client),
shutdown
),
nil.
-file("src/cangaroo.gleam", 104).
-spec send(cangaroo@types:can_client(), cangaroo@types:can_frame()) -> {ok, nil} |
{error, cangaroo@errors:can_error()}.
send(Client, Frame) ->
{can_frame, Id, Data} = Frame,
Elixir_frame = bridge_ffi:new_frame(Id, Data),
Socket = cangaroo@types:client_socket(Client),
Status = 'Elixir.Excansock':send(
cangaroo@types:socket_pid(Socket),
Elixir_frame
),
cangaroo@internal:check_status(Status).
-file("src/cangaroo.gleam", 112).
-spec set_loopback(cangaroo@types:can_client(), boolean()) -> {ok, nil} |
{error, cangaroo@errors:can_error()}.
set_loopback(Client, Value) ->
Socket = cangaroo@types:client_socket(Client),
Status = 'Elixir.Excansock':set_loopback(
cangaroo@types:socket_pid(Socket),
Value
),
cangaroo@internal:check_status(Status).
-file("src/cangaroo.gleam", 121).
-spec recv_own_messages(cangaroo@types:can_client(), boolean()) -> {ok, nil} |
{error, cangaroo@errors:can_error()}.
recv_own_messages(Client, Value) ->
Socket = cangaroo@types:client_socket(Client),
Status = 'Elixir.Excansock':recv_own_messages(
cangaroo@types:socket_pid(Socket),
Value
),
cangaroo@internal:check_status(Status).
-file("src/cangaroo.gleam", 130).
-spec set_filters(
cangaroo@types:can_client(),
list(cangaroo@types:can_filter())
) -> {ok, nil} | {error, cangaroo@errors:can_error()}.
set_filters(Client, Filters) ->
Socket = cangaroo@types:client_socket(Client),
Status = 'Elixir.Excansock':set_filters(
cangaroo@types:socket_pid(Socket),
Filters
),
cangaroo@internal:check_status(Status).
-file("src/cangaroo.gleam", 139).
-spec set_error_filter(cangaroo@types:can_client(), integer()) -> {ok, nil} |
{error, cangaroo@errors:can_error()}.
set_error_filter(Client, Filter) ->
Socket = cangaroo@types:client_socket(Client),
Status = 'Elixir.Excansock':set_error_filter(
cangaroo@types:socket_pid(Socket),
Filter
),
cangaroo@internal:check_status(Status).