Skip to content

Commit

Permalink
Enhance PR #512
Browse files Browse the repository at this point in the history
  • Loading branch information
gotthardp committed Oct 28, 2018
1 parent 0f59e8e commit cdbbeab
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 38 deletions.
65 changes: 30 additions & 35 deletions src/lorawan_application_backend.erl
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@
init(_App) ->
ok.

handle_join({_Network, #profile{app=AppID}, Device}, {_MAC, _RxQ}, DevAddr) ->
handle_join({_Network, #profile{app=AppID}=Profile, Device}, {_MAC, _RxQ}, DevAddr) ->
case mnesia:dirty_read(handler, AppID) of
[Handler] ->
send_event(joined, #{}, Handler, {Device, DevAddr});
send_event(joined, #{}, Handler, {Profile, Device, DevAddr});
[] ->
{error, {unknown_application, AppID}}
end.

handle_uplink({Network, #profile{app=AppID}, #node{devaddr=DevAddr}=Node}, _RxQ, LastMissed, Frame) ->
handle_uplink({Network, #profile{app=AppID}=Profile, #node{devaddr=DevAddr}=Node}, _RxQ, LastMissed, Frame) ->
case mnesia:dirty_read(handler, AppID) of
[#handler{downlink_expires=Expires}=Handler] ->
case LastMissed of
Expand All @@ -36,18 +36,18 @@ handle_uplink({Network, #profile{app=AppID}, #node{devaddr=DevAddr}=Node}, _RxQ,
List when length(List) > 0, Expires == <<"never">> ->
retransmit;
_Else ->
handle_uplink0(Handler, Network, Node, Frame)
handle_uplink0(Handler, {Network, Profile, Node}, Frame)
end;
undefined ->
handle_uplink0(Handler, Network, Node, Frame)
handle_uplink0(Handler, {Network, Profile, Node}, Frame)
end;
[] ->
{error, {unknown_application, AppID}}
end.

handle_uplink0(#handler{app=AppID, parse_uplink=Parse, uplink_fields=Fields}=Handler,
Network, Node, #frame{data=Data}=Frame) ->
Vars = parse_uplink(Handler, Network, Node, Frame),
{Network, Profile, Node}, #frame{data=Data}=Frame) ->
Vars = parse_uplink(Handler, {Network, Profile, Node}, Frame),
case any_is_member([<<"freq">>, <<"datr">>, <<"codr">>, <<"best_gw">>,
<<"mac">>, <<"lsnr">>, <<"rssi">>, <<"all_gw">>], Fields) of
true ->
Expand Down Expand Up @@ -80,13 +80,14 @@ any_is_member(List1, List2) ->
end,
List1).

parse_uplink(#handler{app=AppID, payload=Payload, uplink_fields=Fields},
#network{netid=NetID},
#node{appargs=AppArgs, devstat=DevStat, profile=Profile},
parse_uplink(#handler{app=AppName, payload=Payload, uplink_fields=Fields},
{#network{netid=NetID},
#profile{appid=AppID},
#node{appargs=AppArgs, devstat=DevStat}},
#frame{devaddr=DevAddr, fcnt=FCnt, port=Port, data=Data}) ->
vars_add(netid, NetID, Fields,
vars_add(app, AppID, Fields,
vars_add(appid, get_appid(Profile), Fields,
vars_add(app, AppName, Fields,
vars_add(appid, AppID, Fields,
vars_add(devaddr, DevAddr, Fields,
vars_add(deveui, get_deveui(DevAddr), Fields,
vars_add(appargs, AppArgs, Fields,
Expand Down Expand Up @@ -132,12 +133,6 @@ get_deveui(DevAddr) ->
[] -> undefined
end.

get_appid(Profile) ->
case mnesia:dirty_read(profiles, Profile) of
[#profile{appid=AppId}|_] -> AppId;
[] -> undefined
end.

get_battery([{_DateTime, Battery, _Margin, _MaxSNR}|_]) ->
Battery;
get_battery(_Else) ->
Expand All @@ -153,57 +148,57 @@ data_to_fields(AppId, {_, Fun}, Vars, Data) when is_function(Fun) ->
data_to_fields(_AppId, _Else, Vars, _) ->
Vars.

handle_delivery({_Network, #profile{app=AppID}, Node}, Result, Receipt) ->
handle_delivery({_Network, #profile{app=AppID}=Profile, Node}, Result, Receipt) ->
case mnesia:dirty_read(handler, AppID) of
[Handler] ->
send_event(Result, #{receipt => Receipt}, Handler, Node);
send_event(Result, #{receipt => Receipt}, Handler, {Profile, Node});
[] ->
{error, {unknown_application, AppID}}
end.

send_event(Event, Vars0, #handler{app=AppID, event_fields=Fields, parse_event=Parse}, DeviceOrNode) ->
send_event(Event, Vars0, #handler{app=AppName, event_fields=Fields, parse_event=Parse}, DeviceOrNode) ->
Vars =
vars_add(app, AppID, Fields,
vars_add(app, AppName, Fields,
vars_add(event, Event, Fields,
vars_add(datetime, calendar:universal_time(), Fields,
case DeviceOrNode of
{#device{deveui=DevEUI, appargs=AppArgs, profile=Profile}, DevAddr} ->
{#profile{appid=AppID}, #device{deveui=DevEUI, appargs=AppArgs}, DevAddr} ->
vars_add(appid, AppID, Fields,
vars_add(devaddr, DevAddr, Fields,
vars_add(appid, get_appid(Profile), Fields,
vars_add(deveui, DevEUI, Fields,
vars_add(appargs, AppArgs, Fields,
Vars0))));
#node{devaddr=DevAddr, appargs=AppArgs, profile=Profile} ->
{#profile{appid=AppID}, #node{devaddr=DevAddr, appargs=AppArgs}} ->
vars_add(appid, AppID, Fields,
vars_add(devaddr, DevAddr, Fields,
vars_add(appid, get_appid(Profile), Fields,
vars_add(deveui, get_deveui(DevAddr), Fields,
vars_add(appargs, AppArgs, Fields,
Vars0))))
end))),
lorawan_backend_factory:event(AppID, DeviceOrNode,
data_to_fields(AppID, Parse, Vars, Event)).
lorawan_backend_factory:event(AppName, DeviceOrNode,
data_to_fields(AppName, Parse, Vars, Event)).

handle_downlink(AppId, Vars) ->
[#handler{build=Build}=Handler] = mnesia:dirty_read(handler, AppId),
handle_downlink(AppName, Vars) ->
[#handler{build=Build}=Handler] = mnesia:dirty_read(handler, AppName),
send_downlink(Handler,
Vars,
maps:get(time, Vars, undefined),
#txdata{
confirmed = maps:get(confirmed, Vars, false),
port = maps:get(port, Vars, undefined),
data = fields_to_data(AppId, Build, Vars),
data = fields_to_data(AppName, Build, Vars),
pending = maps:get(pending, Vars, undefined),
receipt = maps:get(receipt, Vars, undefined)
}).

fields_to_data(AppId, {_, Fun}, Vars) when is_function(Fun) ->
fields_to_data(AppName, {_, Fun}, Vars) when is_function(Fun) ->
try Fun(Vars)
catch
Error:Term ->
lorawan_utils:throw_error({handler, AppId}, {build_failed, {Error, Term}}),
lorawan_utils:throw_error({handler, AppName}, {build_failed, {Error, Term}}),
<<>>
end;
fields_to_data(_AppId, _Else, Vars) ->
fields_to_data(_AppName, _Else, Vars) ->
maps:get(data, Vars, <<>>).

send_downlink(Handler, #{deveui := DevEUI}, undefined, TxData) ->
Expand Down Expand Up @@ -297,7 +292,7 @@ purge_frames(#handler{downlink_expires = <<"superseded">>}=Handler,
fun
(#txdata{confirmed=true, receipt=Receipt}) ->
lorawan_utils:throw_error({node, DevAddr}, downlink_expired),
send_event(lost, #{receipt => Receipt}, Handler, Node);
send_event(lost, #{receipt => Receipt}, Handler, {lorawan_db:get_profile(Node), Node});
(#txdata{}) ->
ok
end,
Expand Down
14 changes: 11 additions & 3 deletions src/lorawan_db.erl
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
-module(lorawan_db).

-export([ensure_tables/0, ensure_table/2, ensure_table/3]).
-export([foreach_record/3, get_group/1, get_rxframes/1]).
-export([foreach_record/3, get_profile/1, get_group/1, get_rxframes/1]).
-export([record_fields/1]).
-export([join_cluster/1, join_cluster/2, leave_cluster/1, join/1, leave/2]).

Expand Down Expand Up @@ -286,9 +286,17 @@ foreach_record(Database, Keys, Fun) ->
end)
end, Keys).

get_group(#node{profile=ProfName}) ->
get_profile(#node{profile=ProfName}) ->
case mnesia:dirty_read(profile, ProfName) of
[#profile{group=GrName}] ->
[Profile] ->
Profile;
[] ->
undefined
end.

get_group(Node) ->
case get_profile(Node) of
#profile{group=GrName} ->
case mnesia:dirty_read(group, GrName) of
[Group] ->
Group;
Expand Down

0 comments on commit cdbbeab

Please sign in to comment.