%%%------------------------------------------------------------------- %%% @author Arkadiusz %%% @copyright (C) 2021, %%% @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 .