diff options
Diffstat (limited to 'lib/cosTime/src/CosTime_TIO_impl.erl')
-rw-r--r-- | lib/cosTime/src/CosTime_TIO_impl.erl | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/lib/cosTime/src/CosTime_TIO_impl.erl b/lib/cosTime/src/CosTime_TIO_impl.erl new file mode 100644 index 0000000000..d6d4ee894b --- /dev/null +++ b/lib/cosTime/src/CosTime_TIO_impl.erl @@ -0,0 +1,200 @@ +%%-------------------------------------------------------------------- +%% +%% %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_TIO_impl.erl +%% Purpose : +%%---------------------------------------------------------------------- + +-module('CosTime_TIO_impl'). + +%%--------------- INCLUDES ----------------------------------- +-include("cosTimeApp.hrl"). + +%%--------------- EXPORTS ------------------------------------ +%%--------------- External ----------------------------------- +%% Attributes (external) +-export(['_get_time_interval'/2]). + +%% Interface functions +-export([spans/3, overlaps/3, time/2]). + +%%--------------- gen_server specific exports ---------------- +-export([handle_info/2, code_change/3]). +-export([init/1, terminate/2]). + + +%% Data structures +-record(state, {interval, + tdf, + timer}). +%% Data structures constructors +-define(get_InitState(I,T,TO), + #state{interval = I, + tdf = T, + timer = TO}). + +%% Data structures selectors +-define(get_IntervalT(S), S#state.interval). +-define(get_Lower(S), (S#state.interval)#'TimeBase_IntervalT'.lower_bound). +-define(get_Upper(S), (S#state.interval)#'TimeBase_IntervalT'.upper_bound). +-define(get_Tdf(S), S#state.tdf). +-define(get_TimerObj(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([Interval, Tdf, Timer]) -> + {ok, ?get_InitState(Interval, Tdf, Timer)}. + +terminate(_Reason, _State) -> + ok. + +%%----------------------------------------------------------- +%%------------------------ attributes ----------------------- +%%----------------------------------------------------------- +%%----------------------------------------------------------% +%% Attribute: '_get_time_interval' +%% Type : readonly +%% Returns : +%%----------------------------------------------------------- +'_get_time_interval'(_OE_THIS, State) -> + {reply, ?get_IntervalT(State), State}. + +%%----------------------------------------------------------- +%%------- Exported external functions ----------------------- +%%----------------------------------------------------------- +%%----------------------------------------------------------% +%% function : spans +%% Arguments: Time - UTO +%% Returns : CosTime::OverLapType - enum() +%% TIO - out-parameter. +%%----------------------------------------------------------- +spans(_OE_THIS, State, Time) -> + ?time_TypeCheck(Time, 'CosTime_UTO'), + case catch 'CosTime_UTO':'_get_utc_time'(Time) of + #'TimeBase_UtcT'{time = Btime, inacclo = InaccL, inacchi=InaccH} -> + Inaccuarcy = ?concat_TimeT(InaccH, InaccL), + BL = Btime - Inaccuarcy, + BU = Btime + Inaccuarcy, + L = ?get_Lower(State), + U = ?get_Upper(State), + {Type, NewL, NewU} = + if + L=<BL, U>=BU -> + {'OTContainer',BL,BU}; + L>=BL, U=<BU -> + {'OTContained',L,U}; + L<BL, U=<BU, U>=BL -> + {'OTOverlap',BL,U}; + L>=BL, L=<BU, U>BU -> + {'OTOverlap',L,BU}; + L>BU -> + {'OTNoOverlap',BU,L}; + true -> + {'OTNoOverlap',U,BL} + end, + {reply, + {Type, + 'CosTime_TIO':oe_create([#'TimeBase_IntervalT'{lower_bound=NewL, + upper_bound=NewU}, + ?get_Tdf(State), + ?get_TimerObj(State)], + [{pseudo,true}|?CREATE_OPTS])}, + State}; + _ -> + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}) + end. + + +%%----------------------------------------------------------% +%% function : overlaps +%% Arguments: Interval - TIO +%% Returns : CosTime::OverLapType - enum() +%% TIO - out-parameter. +%%----------------------------------------------------------- +overlaps(_OE_THIS, State, Interval) -> + ?time_TypeCheck(Interval, 'CosTime_TIO'), + case catch 'CosTime_TIO':'_get_time_interval'(Interval) of + #'TimeBase_IntervalT'{lower_bound=BL, upper_bound=BU} -> + L = ?get_Lower(State), + U = ?get_Upper(State), + {Type, NewL, NewU} = + if + L=<BL, U>=BU -> + {'OTContainer',BL,BU}; + L>=BL, U=<BU -> + {'OTContained',L,U}; + L<BL, U=<BU, U>=BL -> + {'OTOverlap',BL,U}; + L>=BL, L=<BU, U>BU -> + {'OTOverlap',L,BU}; + L>BU -> + {'OTNoOverlap',BU,L}; + true -> + {'OTNoOverlap',U,BL} + end, + {reply, + {Type, + 'CosTime_TIO':oe_create([#'TimeBase_IntervalT'{lower_bound=NewL, + upper_bound=NewU}, + ?get_Tdf(State), + ?get_TimerObj(State)], + [{pseudo,true}|?CREATE_OPTS])}, + State}; + _ -> + corba:raise(#'BAD_PARAM'{completion_status=?COMPLETED_NO}) + end. + +%%----------------------------------------------------------% +%% function : time +%% Arguments: - +%% Returns : UTO +%%----------------------------------------------------------- +time(_OE_THIS, State) -> + L = ?get_Lower(State), + H = ?get_Upper(State), + Utc = #'TimeBase_UtcT'{time=(erlang:trunc(((H-L)/2))+L), + inacclo=L, + inacchi=H, + tdf=?get_Tdf(State)}, + {reply, + 'CosTime_UTO':oe_create([Utc, ?get_TimerObj(State)], [{pseudo,true}|?CREATE_OPTS]), + State}. + + +%%--------------- LOCAL FUNCTIONS ---------------------------- + +%%--------------- MISC FUNCTIONS, E.G. DEBUGGING ------------- +%%--------------- END OF MODULE ------------------------------ |