%%%-----------------------------------------------------------------------------
%% @doc GRiSP.io High Level API.
%% @end
%%%-----------------------------------------------------------------------------
-module(grisp_connect).
-include_lib("kernel/include/logger.hrl").
%--- Exports -------------------------------------------------------------------
% API functions
-export([connect/0]).
-export([is_connected/0]).
-export([ping/0]).
-export([link_device/0]).
-export([link_device/1]).
-export([log/2]).
-export([test_log_encoding/0]).
%--- API Functions -------------------------------------------------------------
% @doc Connect to GRiSP.io.
-spec connect() -> ok.
connect() ->
grisp_connect_client:connect().
% @doc Check if board is connected to GRiSP.io.
-spec is_connected() -> true | false.
is_connected() ->
grisp_connect_client:is_connected().
% @doc Ping GRiSP.io.
% Returns 'pong' if the board is linked to an account, 'pang' otherwise.
-spec ping() -> {ok, binary()} | {error, atom()}.
ping() ->
grisp_connect_client:request(post, ping, #{}).
% @doc Links the board to a GRiSP.io account.
% The token is took from the device_linking_token app env.
-spec link_device() -> {ok, binary()} | {error, token_undefined | invalid_token}.
link_device() ->
case application:get_env(grisp_connect, device_linking_token) of
undefined -> {error, token_undefined};
{ok, Token} -> link_device(Token)
end.
% @doc Links the board to the GRiSP.io account
% that generated of the specified token.
-spec link_device(Token :: binary()) ->
{ok, binary()} | {error, invalid_token}.
link_device(Token) ->
grisp_connect_client:request(post, device_linking_token, #{token => Token}).
% @doc Log from inside grisp_connect for testing.
log(Level, Args) -> apply(logger, Level, Args).
% @doc For manually testing the log encoding.
% Alternative to shell commands. The shell double encodes unicode strings.
test_log_encoding() ->
String = "@#$%^&*()_ +{}|:\"<>?-[];'./,\\`~!\néäüßóçøáîùêñÄÖÜÉÁÍÓÚàèìòùÂÊÎÔÛ",
Binary = <<"@#$%^&*()_ +{}|:\"<>?-[];'./,\\`~!\néäüßóçøáîùêñÄÖÜÉÁÍÓÚàèìòùÂÊÎÔÛ"/utf8>>,
?LOG_NOTICE("List:\n" ++ String),
?LOG_NOTICE(<<"Binary: \n", Binary/binary>>),
?LOG_NOTICE("List:~n~tp~nBinary:~n~tp~n", [String, Binary]),
?LOG_NOTICE(#{list => String, binary => Binary}).