diff --git a/apps/iot/src/model/terminal_model.erl b/apps/iot/src/model/terminal_model.erl index 74284cf..88576c3 100644 --- a/apps/iot/src/model/terminal_model.erl +++ b/apps/iot/src/model/terminal_model.erl @@ -13,6 +13,7 @@ %% API -export([get_all_terminals/0, get_status_stat/0]). +-export([change_status/2, delete/1]). %% 获取app信息 get_all_terminals() -> @@ -64,14 +65,14 @@ insert(Id, HostId, Name, ProductId, VendorId, Model, CellId) -> {error, Error} end. -change_status(Id, Status) -> +change_status(TerminalId, Status) when is_binary(TerminalId), is_integer(Status) -> Fun = fun() -> - case mnesia:read(host, Id) of + case mnesia:read(terminal, TerminalId) of [] -> - mnesia:abort(<<"appinfo not found">>); - [Host] -> - NHost = Host#host{status = Status}, - mnesia:write(host, NHost, write) + mnesia:abort(<<"terminal not found">>); + [Terminal] -> + NTerminal = Terminal#host{status = Status}, + mnesia:write(terminal, NTerminal, write) end end, case mnesia:transaction(Fun) of @@ -81,8 +82,51 @@ change_status(Id, Status) -> {error, Reason} end. -delete(Id) -> - case mnesia:transaction(fun() -> mnesia:delete(host, Id, write) end) of +update_metric(TerminalId, MetricName, MetricSymbol, MetricValue) when is_binary(TerminalId), is_binary(MetricName), is_binary(MetricSymbol), is_number(MetricValue) -> + Fun = fun() -> + case mnesia:read(terminal, TerminalId) of + [] -> + mnesia:abort(<<"terminal not found">>); + [Terminal = #terminal{metrics = Metrics}] -> + NMetrics = case lists:any(fun(#terminal_metric{symbol = Symbol}) -> Symbol =:= MetricSymbol end, Metrics) of + true -> + lists:map(fun(Metric=#terminal_metric{symbol = Symbol, serial_values = SerialValues}) -> + case Symbol =:= MetricSymbol of + true -> + NSerialValues = case queue:len(SerialValues) >= 100 of + true -> + SerialValues0 = queue:drop(SerialValues), + queue:in(MetricValue, SerialValues0); + false -> + queue:in(MetricValue, SerialValues) + end, + Metric#terminal_metric{ + name = MetricName, + last_value = MetricValue, + update_ts = iot_util:current_time(), + serial_values = NSerialValues + }; + false -> + Metric + end + end, Metrics); + false -> + Metrics#terminal_metric{} + end, + mnesia:write(terminal, Terminal#terminal{metrics = NMetrics}, write) + end + end, + + case mnesia:transaction(Fun) of + {atomic, ok} -> + ok; + {aborted, Reason} -> + {error, Reason} + end. + + +delete(TerminalId) when is_binary(TerminalId) -> + case mnesia:transaction(fun() -> mnesia:delete(terminal, TerminalId, write) end) of {atomic, ok} -> ok; {aborted, Reason} ->