aboutsummaryrefslogblamecommitdiffstats
path: root/lib/dialyzer/test/small_SUITE_data/src/codec_can.erl
blob: 8abf872b375b84e0b90a420964c48c5f4a0e2e1e (plain) (tree)


































                                                                         
%%---------------------------------------------------------------------
%% From: Peer Stritzinger
%% Date: 1 May 2011
%% Subject: Dialyzer v2.2.0 crash
%%
%% Binaries of the form <<_:N,_:_*M>> in specs resulted in a crash:
%%     dialyzer: Analysis failed with error: {{case_clause,8},
%%		 [{erl_types,t_form_to_string,1},
%%		  {erl_types,t_form_to_string,1},
%%		  {dialyzer_contracts,contract_to_string_1,1},
%%		  {dialyzer_contracts,extra_contract_warning,6},
%%		  {dialyzer_contracts,picky_contract_check,7},
%% because function erl_types:t_form_to_string/1 was not the inverse
%% of erl_types:t_to_string/2.
%%
%% Fixed on the same date and send to OTP for inclusion.
%%---------------------------------------------------------------------
-module(codec_can).

-export([recv/3, decode/1]).

-record(can_pkt, {id, data :: binary(), timestamp}).

-type can_pkt() :: #can_pkt{}.
-type channel() :: atom() | pid() | {atom(),_}.

-spec recv(<<_:64,_:_*8>>, fun((can_pkt()) -> R), channel()) -> R.
recv(Packet, Fun, Chan) ->
  #can_pkt{id = Can_id, data = Can_data} = P = decode(Packet),
  Fun(P).

-spec decode(<<_:64,_:_*8>>) -> #can_pkt{id::<<_:11>>,timestamp::char()}.
decode(<<_:12, Len:4, Timestamp:16, 0:3, Id:11/bitstring, 0:18,
	 Data:Len/binary, _/binary>>) ->
  #can_pkt{id = Id, data = Data, timestamp = Timestamp}.