diff options
Diffstat (limited to 'lib/cosTime/src/CosTime_UTO_impl.erl')
-rw-r--r-- | lib/cosTime/src/CosTime_UTO_impl.erl | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/lib/cosTime/src/CosTime_UTO_impl.erl b/lib/cosTime/src/CosTime_UTO_impl.erl new file mode 100644 index 0000000000..b35e215e90 --- /dev/null +++ b/lib/cosTime/src/CosTime_UTO_impl.erl @@ -0,0 +1,241 @@ +%%-------------------------------------------------------------------- +%% +%% %CopyrightBegin% +%% +%% Copyright Ericsson AB 2000-2009. All Rights Reserved. +%% +%% The contents of this file are subject to the Erlang Public License, +%% Version 1.1, (the "License"); you may not use this file except in +%% compliance with the License. You should have received a copy of the +%% Erlang Public License along with this software. If not, it can be +%% retrieved online at http://www.erlang.org/. +%% +%% Software distributed under the License is distributed on an "AS IS" +%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +%% the License for the specific language governing rights and limitations +%% under the License. +%% +%% %CopyrightEnd% +%% +%% +%%---------------------------------------------------------------------- +%% File : CosTime_UTO_impl.erl +%% Purpose : +%%---------------------------------------------------------------------- + +-module('CosTime_UTO_impl'). + +%%--------------- INCLUDES ----------------------------------- +-include("cosTimeApp.hrl"). + + +%%--------------- EXPORTS ------------------------------------ +%%--------------- External ----------------------------------- +%% Attributes (external) +-export(['_get_time'/2, + '_get_inaccuracy'/2, + '_get_tdf'/2, + '_get_utc_time'/2]). + +%% Interface functions +-export([absolute_time/2, compare_time/4]). +-export([time_to_interval/3, interval/2]). + +%%--------------- gen_server specific exports ---------------- +-export([handle_info/2, code_change/3]). +-export([init/1, terminate/2]). + + +%% Data structures +-record(state, {timer, utc}). +%% Data structures constructors +-define(get_InitState(U, T), #state{timer = T, utc = U}). + +%% Data structures selectors +-define(get_Time(S), (S#state.utc)#'TimeBase_UtcT'.time). +-define(get_Inaccuracy(S), ?concat_TimeT((S#state.utc)#'TimeBase_UtcT'.inacchi, + (S#state.utc)#'TimeBase_UtcT'.inacclo)). +-define(get_Tdf(S), (S#state.utc)#'TimeBase_UtcT'.tdf). +-define(get_Utc(S), S#state.utc). +-define(get_TimeObj(S), S#state.timer). + + +%%-----------------------------------------------------------% +%% function : handle_info, code_change +%% Arguments: +%% Returns : +%% Effect : Functions demanded by the gen_server module. +%%------------------------------------------------------------ + +code_change(_OldVsn, State, _Extra) -> + {ok, State}. +handle_info(_Info, State) -> + {noreply, State}. + +%%----------------------------------------------------------% +%% function : init, terminate +%% Arguments: +%%----------------------------------------------------------- + +init([Utc, TimeObj]) -> + {ok, ?get_InitState(Utc, TimeObj)}. + +terminate(_Reason, _State) -> + ok. + +%%----------------------------------------------------------- +%%------------------------ attributes ----------------------- +%%----------------------------------------------------------- +%%----------------------------------------------------------% +%% Attribute: '_get_time' +%% Type : readonly +%% Returns : +%%----------------------------------------------------------- +'_get_time'(_OE_THIS, State) -> + {reply, ?get_Time(State), State}. + +%%----------------------------------------------------------% +%% Attribute: '_get_inaccuracy' +%% Type : readonly +%% Returns : +%%----------------------------------------------------------- +'_get_inaccuracy'(_OE_THIS, State) -> + {reply, ?get_Inaccuracy(State), State}. + +%%----------------------------------------------------------% +%% Attribute: '_get_tdf' +%% Type : readonly +%% Returns : +%%----------------------------------------------------------- +'_get_tdf'(_OE_THIS, State) -> + {reply, ?get_Tdf(State), State}. + +%%----------------------------------------------------------% +%% Attribute: '_get_utc_time' +%% Type : readonly +%% Returns : +%%----------------------------------------------------------- +'_get_utc_time'(_OE_THIS, State) -> + {reply, ?get_Utc(State), State}. + +%%----------------------------------------------------------- +%%------- Exported external functions ----------------------- +%%----------------------------------------------------------- +%%----------------------------------------------------------% +%% function : absolute_time +%% Arguments: - +%% Returns : UTO +%% NOTE : Return the base time to the relative time in the object. +%%----------------------------------------------------------- +absolute_time(_OE_THIS, State) -> + case catch 'CosTime_UTO':'_get_time'( + 'CosTime_TimeService':universal_time(?get_TimeObj(State)))+ + ?get_Time(State) of + UniTime when is_integer(UniTime) andalso UniTime =< ?max_TimeT -> + Utc=?get_Utc(State), + {reply, 'CosTime_UTO':oe_create([Utc#'TimeBase_UtcT'{time=UniTime}, + ?get_TimeObj(State)], + [{pseudo,true}|?CREATE_OPTS]), State}; + UniTime when is_integer(UniTime) -> + %% Oopss, overflow! + corba:raise(#'DATA_CONVERSION'{completion_status=?COMPLETED_NO}); + _ -> + corba:raise(#'INTERNAL'{completion_status=?COMPLETED_NO}) + end. + +%%----------------------------------------------------------% +%% function : compare_time +%% Arguments: Comparison_type - CosTime::ComparisonType +%% Uto - ObjRef +%% Returns : TimeComparison - 'TCEqualTo' | 'TCLessThan' | +%% 'TCGreaterThan' | 'TCIndeterminate' +%%----------------------------------------------------------- +compare_time(_OE_THIS, State, 'IntervalC', Uto) -> + ?time_TypeCheck(Uto, 'CosTime_UTO'), + case catch {'CosTime_UTO':'_get_time'(Uto), + 'CosTime_UTO':'_get_inaccuracy'(Uto)} of + {Time,Inaccuracy} when is_integer(Time) andalso is_integer(Inaccuracy) -> + OwnInacc = ?get_Inaccuracy(State), + if + ?get_Time(State)+OwnInacc < Time-Inaccuracy -> + {reply, 'TCLessThan', State}; + ?get_Time(State)-OwnInacc > Time+Inaccuracy -> + {reply, 'TCGreaterThan', State}; + ?get_Time(State) == Time, Inaccuracy==0, OwnInacc==0 -> + %% TimeService specification (july 1997, p14-7:2) states + %% that they are only equal if both UTO's Inaccuracy + %% equals zero. + {reply, 'TCEqualTo', State}; + true -> + {reply, 'TCIndeterminate', State} + end; + _ -> + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}) + end; +compare_time(_OE_THIS, State, 'MidC', Uto) -> + ?time_TypeCheck(Uto, 'CosTime_UTO'), + case catch 'CosTime_UTO':'_get_time'(Uto) of + Time when is_integer(Time) -> + if + ?get_Time(State) < Time -> + {reply, 'TCLessThan', State}; + ?get_Time(State) > Time -> + {reply, 'TCGreaterThan', State}; + true -> + {reply, 'TCEqualTo', State} + end; + _ -> + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}) + end; +compare_time(_OE_THIS, _State, _, _) -> + %% Comparison_type given not correct?! + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}). + +%%----------------------------------------------------------% +%% function : time_to_interval +%% Arguments: +%% Returns : TIO +%%----------------------------------------------------------- +time_to_interval(_OE_THIS, State, Uto) -> + ?time_TypeCheck(Uto, 'CosTime_UTO'), + case catch 'CosTime_UTO':'_get_time'(Uto) of + Time when is_integer(Time) -> + OwnTime = ?get_Time(State), + if + Time > OwnTime -> + {reply, 'CosTime_TIO':oe_create([#'TimeBase_IntervalT'{lower_bound=OwnTime, + upper_bound=Time}, + ?get_Tdf(State), + ?get_TimeObj(State)], + [{pseudo,true}|?CREATE_OPTS]), State}; + true -> + {reply, 'CosTime_TIO':oe_create([#'TimeBase_IntervalT'{lower_bound=Time, + upper_bound=OwnTime}, + ?get_Tdf(State), + ?get_TimeObj(State)], + [{pseudo,true}|?CREATE_OPTS]), State} + end; + _ -> + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}) + end. + +%%----------------------------------------------------------% +%% function : interval +%% Arguments: +%% Returns : TIO +%%----------------------------------------------------------- +interval(_OE_THIS, State) -> + Lower = ?get_Time(State) - ?get_Inaccuracy(State), + Upper = ?get_Time(State) + ?get_Inaccuracy(State), + {reply, 'CosTime_TIO':oe_create([#'TimeBase_IntervalT'{lower_bound=Lower, + upper_bound=Upper}, + ?get_Tdf(State), + ?get_TimeObj(State)], + [{pseudo,true}|?CREATE_OPTS]), State}. + + +%%--------------- LOCAL FUNCTIONS ---------------------------- + +%%--------------- MISC FUNCTIONS, E.G. DEBUGGING ------------- +%%--------------- END OF MODULE ------------------------------ + |