Packages

A few sentences (a paragraph) describing the project.

Current section

Files

Jump to
cwikla_pollution lib pollution_gen_server.erl
Raw

lib/pollution_gen_server.erl

%%%-------------------------------------------------------------------
%%% @author Arkadiusz
%%% @copyright (C) 2021, <COMPANY>
%%% @doc
%%% @end
%%%-------------------------------------------------------------------
-module(pollution_gen_server).
-behaviour(gen_server).
-export([start_link/0, crash/0, start/0, stop/0]).
-export([init/1, handle_call/3,terminate/2, code_change/3]).
-export([addStation/2, addValue/4, removeValue/3, getOneValue/3, getStationMean/2, getDailyMean/2, getDailyMaxMean/2, getDailyMinMean/2, getMinimumDistanceStations/2]).
-define(SERVER, ?MODULE).
%%%===================================================================
%%% Spawning and gen_server implementation
%%%===================================================================
start() ->
start_link().
start_link() ->
gen_server:start_link({local, ?SERVER}, ?MODULE, [], []).
init([]) ->
{ok, pollution:createMonitor()}.
%%% client API
addStation(StationName, Coordinates) ->
gen_server:call(?SERVER, [addStation, StationName, Coordinates])
.
addValue(Station, Date, Type, Value) ->
gen_server:call(?SERVER, [addValue, Station, Date, Type, Value])
.
removeValue(Station, Date, Type) ->
gen_server:call(?SERVER, [removeValue, Station, Date, Type])
.
getOneValue(Station, Date, Type) ->
gen_server:call(?SERVER, [getOneValue, Station, Date, Type])
.
getStationMean(Station, Type) ->
gen_server:call(?SERVER, [getStationMean, Station, Type])
.
getDailyMean(Type, DateTime) ->
gen_server:call(?SERVER, [getDailyMean, Type, DateTime])
.
getDailyMaxMean(Type, DateTime) ->
gen_server:call(?SERVER, [getDailyMaxMean, Type, DateTime])
.
getDailyMinMean(Type, DateTime) ->
gen_server:call(?SERVER, [getDailyMinMean, Type, DateTime])
.
getMinimumDistanceStations(Coords, Distance) ->
gen_server:call(?SERVER, [getMinimumDistanceStations, Coords, Distance])
.
handle_call([addStation, StationName, Coordinates], _From, Monitor) ->
NewMonitor = pollution:addStation(StationName, Coordinates, Monitor),
{reply, checkMonitor(NewMonitor == Monitor), NewMonitor};
handle_call([addValue, Station, Date, Type, Value], _From, Monitor) ->
NewMonitor = pollution:addValue(Station, Date, Type, Value, Monitor),
{reply, checkMonitor(NewMonitor == Monitor), NewMonitor};
handle_call([removeValue, Station, Date, Type], _From, Monitor) ->
NewMonitor = pollution:removeValue(Station, Date, Type, Monitor),
{reply, checkMonitor(NewMonitor == Monitor), NewMonitor};
handle_call([getOneValue, Station, Date, Type], _From, Monitor) ->
Value = pollution:getOneValue(Station, Date, Type, Monitor),
{reply, Value, Monitor};
handle_call([getStationMean, Station, Type], _From, Monitor) ->
StationMean = pollution:getStationMean(Station, Type, Monitor),
{reply, StationMean, Monitor};
handle_call([getDailyMean, Type, DateTime], _From, Monitor) ->
DailyMean = pollution:getDailyMean(Type, DateTime, Monitor),
{reply, DailyMean, Monitor};
handle_call([getDailyMaxMean, Type, DateTime], _From, Monitor) ->
DailyMaxMean = pollution:getDailyMaxMean(Type, DateTime, Monitor),
{reply, DailyMaxMean, Monitor};
handle_call([getDailyMinMean, Type, DateTime], _From, Monitor) ->
DailyMinMean = pollution:getDailyMinMean(Type, DateTime, Monitor),
{reply, DailyMinMean, Monitor};
handle_call([getMinimumDistanceStations, Coords, Distance], _From, Monitor) ->
MinimumDistanceStations = pollution:getMinimumDistanceStations(Coords, Distance, Monitor),
{reply, MinimumDistanceStations, Monitor}
.
crash() ->
1/0
.
stop() ->
terminate(1, 1).
terminate(_Reason, _State) ->
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
%%%===================================================================
%%% Internal functions
%%%===================================================================
checkMonitor(true) -> error;
checkMonitor(false) -> ok
.