-- RRLP-Components.asn
-- $Id: RRLP-Components.asn 25809 2008-07-23 21:55:56Z etxrab $
-- Taken from 3GPP TS 44.031 V7.4.0 (2007-03)
-- http://www.3gpp.org/ftp/Specs/archive/44_series/44.031/44031-740.zip/44031-740.doc
--
-- 4 Components
-- 5 Elements of Components
--

RRLP-Components
-- { RRLP-Components }

DEFINITIONS AUTOMATIC TAGS ::=

BEGIN

IMPORTS
	Ext-GeographicalInformation, VelocityEstimate
FROM
	MAP-LCS-DataTypes {
	ccitt identified-organization (4) etsi (0) mobileDomain (0)
    -- Alon - changed version 5 to 11 to match the version provided by MAP-LCS-Datatypes.asn
	gsm-Network (1) modules (3) map-LCS-DataTypes (25) version5 (11)}

	ExtensionContainer
FROM MAP-ExtensionDataTypes {
	ccitt identified-organization (4) etsi (0) mobileDomain (0)
    -- Alon - changed version 4 to 11 to match the version provided by MAP-LCS-Datatypes.asn
	gsm-Network (1) modules (3) map-ExtensionDataTypes (21) version4 (11)}
    
    LAC
FROM MAP-MS-DataTypes
;

-- Add here other ASN.1 definitions presented below
-- in chapters 4 and 5.

-- Measurement Position request component
MsrPosition-Req ::= SEQUENCE {
	positionInstruct		PositionInstruct,
	referenceAssistData		ReferenceAssistData		OPTIONAL,
	msrAssistData			MsrAssistData			OPTIONAL,
	systemInfoAssistData	SystemInfoAssistData	OPTIONAL,
	gps-AssistData			GPS-AssistData			OPTIONAL,
	extensionContainer		ExtensionContainer		OPTIONAL,
	...,
	-- Release 98 extension element
rel98-MsrPosition-Req-extension			Rel98-MsrPosition-Req-Extension			OPTIONAL,	
	-- Release 5 extension element
rel5-MsrPosition-Req-extension			Rel5-MsrPosition-Req-Extension			OPTIONAL,
	-- Release 7 extension element
rel7-MsrPosition-Req-extension			Rel7-MsrPosition-Req-Extension			OPTIONAL
}

-- Measurement Position response component
MsrPosition-Rsp ::= SEQUENCE {
	multipleSets			MultipleSets			OPTIONAL,
	referenceIdentity		ReferenceIdentity		OPTIONAL,
	otd-MeasureInfo			OTD-MeasureInfo			OPTIONAL,
	locationInfo			LocationInfo			OPTIONAL,
	gps-MeasureInfo			GPS-MeasureInfo			OPTIONAL,
	locationError			LocationError			OPTIONAL,
	extensionContainer		ExtensionContainer		OPTIONAL,
	...,	
	-- Release extension here
	rel-98-MsrPosition-Rsp-Extension		
							Rel-98-MsrPosition-Rsp-Extension		OPTIONAL,
	rel-5-MsrPosition-Rsp-Extension
							Rel-5-MsrPosition-Rsp-Extension		OPTIONAL,
	-- rel-5-MsrPosition-Rsp-Extension and other possible future extensions
	-- are the only information elements that may be included in the 2nd
	-- MsrPosition-Rsp component when RRLP pseudo-segmentation is used
	rel-7-MsrPosition-Rsp-Extension
							Rel-7-MsrPosition-Rsp-Extension		OPTIONAL
}

-- Assistance Data component
AssistanceData ::= SEQUENCE {
	referenceAssistData	ReferenceAssistData			OPTIONAL,
	msrAssistData			MsrAssistData			OPTIONAL,
	systemInfoAssistData	SystemInfoAssistData	OPTIONAL,
	gps-AssistData			GPS-AssistData			OPTIONAL,	
	moreAssDataToBeSent		MoreAssDataToBeSent		OPTIONAL,	-- If not present, interpret as only
																-- Assistance Data component used to
																-- deliver entire set of assistance
																-- data.
	extensionContainer		ExtensionContainer		OPTIONAL,
	...,
	-- Release extension here
	rel98-AssistanceData-Extension	Rel98-AssistanceData-Extension	OPTIONAL,
	rel5-AssistanceData-Extension	Rel5-AssistanceData-Extension	OPTIONAL,
 rel7-AssistanceData-Extension Rel7-AssistanceData-Extension OPTIONAL	
}

-- Protocol Error component
ProtocolError ::= SEQUENCE {
	errorCause				ErrorCodes,	
	extensionContainer		ExtensionContainer		OPTIONAL,
	...,
	-- Release extensions here
	rel-5-ProtocolError-Extension Rel-5-ProtocolError-Extension		OPTIONAL
}

-- Position instructions
PositionInstruct ::= SEQUENCE {
	-- Method type
	methodType				MethodType,	
	positionMethod			PositionMethod,
	measureResponseTime		MeasureResponseTime,		
	useMultipleSets			UseMultipleSets,		
	environmentCharacter	EnvironmentCharacter	OPTIONAL	
}

--
MethodType ::= CHOICE {
	msAssisted		AccuracyOpt,	-- accuracy is optional
	msBased			Accuracy,		-- accuracy is mandatory
	msBasedPref		Accuracy,		-- accuracy is mandatory
	msAssistedPref	Accuracy 		-- accuracy is mandatory
}

-- Accuracy of the location estimation
AccuracyOpt ::= SEQUENCE {
	accuracy		Accuracy	OPTIONAL
}

-- The values of this field are defined in 3GPP TS 23.032 (Uncertainty code)
Accuracy ::= INTEGER (0..127)


-- Position Method
PositionMethod ::= ENUMERATED {
	eotd (0),
	gps (1),
	gpsOrEOTD (2)
}

-- Measurement request response time
MeasureResponseTime ::= INTEGER (0..7)

-- useMultiple Sets, FFS!
UseMultipleSets ::= ENUMERATED {
	multipleSets (0),		-- multiple sets are allowed
	oneSet (1)				-- sending of multiple is not allowed
}

-- Environment characterization
EnvironmentCharacter ::= ENUMERATED {
	badArea (0),		-- bad urban or suburban, heavy multipath and NLOS
	notBadArea (1),		-- light multipath and NLOS
	mixedArea (2),		-- not defined or mixed environment
	...
}

-- E-OTD reference BTS for Assitance data IE
ReferenceAssistData ::= SEQUENCE {
	bcchCarrier		BCCHCarrier,						-- BCCH carrier
	bsic			BSIC,								-- BSIC
	timeSlotScheme	TimeSlotScheme, 					-- Timeslot scheme
	btsPosition		BTSPosition			OPTIONAL
}

-- ellipsoid point and
-- ellipsoid point with altitude and uncertainty ellipsoid shapes are supported
BTSPosition ::= Ext-GeographicalInformation

-- RF channel number of BCCH
BCCHCarrier ::= INTEGER (0..1023)

-- Base station Identity Code
BSIC ::= INTEGER (0..63)

-- Timeslot scheme
TimeSlotScheme ::= ENUMERATED {
	equalLength (0),
	variousLength (1)
}

-- Time slot (modulo)
ModuloTimeSlot ::= INTEGER (0..3)

-- E-OTD measurement assistance data IE
-- The total number of neighbors in this element (MsrAssistData)
-- and in SystemInfoAssistData element (presented neighbors
-- can be at a maximum 15!)
MsrAssistData ::= SEQUENCE {
	 msrAssistList SeqOfMsrAssistBTS
}
SeqOfMsrAssistBTS ::= SEQUENCE (SIZE(1..15)) OF MsrAssistBTS

MsrAssistBTS ::= SEQUENCE {
	bcchCarrier			BCCHCarrier,		-- BCCH carrier
	bsic				BSIC,				-- BSIC
	multiFrameOffset	MultiFrameOffset, 	-- multiframe offset
	timeSlotScheme		TimeSlotScheme,		-- Timeslot scheme
	roughRTD			RoughRTD,			-- rough RTD value

	-- Location Calculation Assistance data is moved here
	calcAssistanceBTS	CalcAssistanceBTS	OPTIONAL
}

-- Multiframe offset
MultiFrameOffset ::= INTEGER (0..51)
-- The Multiframe Offset value 51 shall not be encoded by the transmitting entity and
-- shall be treated by the receiving entity as 0.

-- Rough RTD value between one base station and reference BTS
RoughRTD ::= INTEGER (0..1250)
-- The RoughRTD value 1250 shall not be encoded by the transmitting entity and shall
-- be treated by the receiving entity as 0.

-- E-OTD Measurement assistance data for system information List IE
-- The total number of base stations in this element (SystemInfoAssistData
-- presented neighbors) and in MsrAssistData element can be at a maximum 15.
SystemInfoAssistData ::= SEQUENCE {
	systemInfoAssistList 	SeqOfSystemInfoAssistBTS
}
SeqOfSystemInfoAssistBTS::= SEQUENCE (SIZE(1..32)) OF SystemInfoAssistBTS

-- whether n.th is present or not ?
SystemInfoAssistBTS ::= CHOICE {
	notPresent		NULL,
	present			AssistBTSData
}

-- Actual assistance data for system information base station
AssistBTSData ::= SEQUENCE {
	bsic				BSIC,				-- BSIC
	multiFrameOffset	MultiFrameOffset,	-- multiframe offset
	timeSlotScheme		TimeSlotScheme,		-- Timeslot scheme
	roughRTD			RoughRTD,			-- rough RTD value

	-- Location Calculation Assistance data
	calcAssistanceBTS	CalcAssistanceBTS	OPTIONAL
}

-- E-OTD Location calculation assistance data,
-- CalcAssistanceBTS element is optional not subfields
CalcAssistanceBTS ::= SEQUENCE {
	fineRTD				FineRTD,		-- fine RTD value between base stations
	referenceWGS84		ReferenceWGS84	-- reference coordinates
}

-- Coordinates of neighbour BTS, WGS-84 ellipsoid
ReferenceWGS84 ::= SEQUENCE {
	relativeNorth	RelDistance,				-- relative distance (south negative)
	relativeEast	RelDistance,				-- relative distance (west negative)
	-- Relative Altitude is not always known
	relativeAlt		RelativeAlt		OPTIONAL	-- relative altitude
}

-- Fine RTD value between this BTS and the reference BTS	
FineRTD ::= INTEGER (0..255)

-- Relative north/east distance
RelDistance ::= INTEGER (-200000..200000)

-- Relative altitude
RelativeAlt ::= INTEGER (-4000..4000)

-- Measure position response IEs
-- Reference Identity
-- Multiple sets
MultipleSets ::= SEQUENCE {
	-- number of reference sets
	nbrOfSets			INTEGER (2..3),		

	-- This field actually tells the number of reference BTSs
	nbrOfReferenceBTSs	INTEGER (1..3),

	-- This field is conditional and included optionally only if
	-- nbrOfSets is 3 and number of reference BTSs is 2.
	referenceRelation		ReferenceRelation		OPTIONAL
}

-- Relation between refence BTSs and sets
ReferenceRelation ::= ENUMERATED {
	secondBTSThirdSet (0),	-- 1st BTS related to 1st and 2nd sets
	secondBTSSecondSet (1),	-- 1st BTS related to 1st and 3rd sets
	firstBTSFirstSet (2)	-- 1st BTS related to 1st set
}

-- Reference BTS Identity, this element contains number of
-- BTSs told nbrOfReferenceBTSs field in Multiple sets element)
ReferenceIdentity ::= SEQUENCE {
	-- Reference BTS list
	refBTSList		SeqOfReferenceIdentityType
}
SeqOfReferenceIdentityType ::= SEQUENCE (SIZE(1..3)) OF ReferenceIdentityType

-- Cell identity
ReferenceIdentityType ::= CHOICE {
	bsicAndCarrier	BSICAndCarrier,		-- BSIC and Carrier
	ci				CellID,				-- Cell ID, LAC not needed
	requestIndex	RequestIndex,		-- Index to Requested Neighbor List
	systemInfoIndex	SystemInfoIndex,	-- Index to System info list, this type of ref. identity
										-- shall not be used by the MS unless it has received
										-- the SystemInfoAssistData from the SMLC for this cell.
	ciAndLAC		CellIDAndLAC		-- CI and LAC
}

BSICAndCarrier ::= SEQUENCE {
	carrier	BCCHCarrier,
	bsic		BSIC
}

RequestIndex ::= INTEGER (1..16)

SystemInfoIndex ::= INTEGER (1..32)

CellIDAndLAC ::= SEQUENCE {
	referenceLAC	LAC,				-- Location area code
	referenceCI		CellID				-- Cell identity
}
CellID ::= INTEGER (0..65535)
-- Alon - removed following line, already defined in MAP-MS-Datatypes.asn
--LAC ::= INTEGER (0..65535)

-- OTD-MeasureInfo
OTD-MeasureInfo ::= SEQUENCE {
	-- Measurement info elements, OTD-MsrElement is repeated number of times
	-- told in nbrOfReferenceBTSs in MultipleSets, default value is 1
	otdMsrFirstSets		OTD-MsrElementFirst,

	-- if more than one sets are present this element is repeated
	-- NumberOfSets - 1 (-1 = first set)
	otdMsrRestSets		SeqOfOTD-MsrElementRest		OPTIONAL
}

SeqOfOTD-MsrElementRest ::= SEQUENCE (SIZE(1..2)) OF OTD-MsrElementRest

-- OTD measurent information for 1 set
OTD-MsrElementFirst ::= SEQUENCE {
	refFrameNumber			INTEGER (0..42431), 				-- Frame number modulo 42432
	referenceTimeSlot		ModuloTimeSlot,
	toaMeasurementsOfRef	TOA-MeasurementsOfRef	OPTIONAL,
	stdResolution			StdResolution,
	taCorrection			INTEGER (0..960)		OPTIONAL,	-- TA correction

	-- measured neighbors in OTD measurements
	otd-FirstSetMsrs 		SeqOfOTD-FirstSetMsrs 	OPTIONAL
}
SeqOfOTD-FirstSetMsrs ::= SEQUENCE (SIZE(1..10)) OF OTD-FirstSetMsrs

-- OTD measurent information 2 and 3 sets if exist
OTD-MsrElementRest ::= SEQUENCE {
	refFrameNumber			INTEGER (0..42431), 					-- Frame number modulo 42432
	referenceTimeSlot		ModuloTimeSlot,
	toaMeasurementsOfRef	TOA-MeasurementsOfRef		OPTIONAL,
	stdResolution			StdResolution,
	taCorrection			INTEGER (0..960)			OPTIONAL,	-- TA correction

	-- measured neighbors in OTD measurements
	otd-MsrsOfOtherSets 	SeqOfOTD-MsrsOfOtherSets	OPTIONAL
}
SeqOfOTD-MsrsOfOtherSets ::= SEQUENCE (SIZE(1..10)) OF OTD-MsrsOfOtherSets

-- Standard deviation of the TOA measurements from the reference BTS
TOA-MeasurementsOfRef ::= SEQUENCE {
	refQuality			RefQuality,
	numOfMeasurements	NumOfMeasurements
}

RefQuality ::= INTEGER (0..31)			-- St Dev of TOA of reference as defined in annex
NumOfMeasurements ::= INTEGER (0..7)	-- No. of measurements for RefQuality as defined in annex
StdResolution ::= INTEGER (0..3)		-- Values of resolution are defined in annex

OTD-FirstSetMsrs ::= OTD-MeasurementWithID

-- Neighbour info in OTD measurements 0-10 times in TD measurement info
OTD-MsrsOfOtherSets ::= CHOICE {
	identityNotPresent	OTD-Measurement,	
	identityPresent		OTD-MeasurementWithID
}

-- For this OTD measurement identity is same as the identity of BTS
-- in the first set with same sequence number
OTD-Measurement ::= SEQUENCE {
	nborTimeSlot	ModuloTimeSlot,
	eotdQuality		EOTDQuality,
	otdValue		OTDValue
}

-- This measurement contains the BTS identity and measurement
OTD-MeasurementWithID ::=SEQUENCE {
	neighborIdentity	NeighborIdentity,
	nborTimeSlot		ModuloTimeSlot,
	eotdQuality			EOTDQuality,
	otdValue			OTDValue
}

EOTDQuality ::= SEQUENCE {
	nbrOfMeasurements	INTEGER	(0..7),
	stdOfEOTD			INTEGER (0..31)
}

NeighborIdentity ::= CHOICE {
	bsicAndCarrier		BSICAndCarrier,		-- BSIC and Carrier
	ci					CellID,				-- Cell ID, LAC not needed
	multiFrameCarrier	MultiFrameCarrier, 	-- MultiFrameOffest and BSIC
	requestIndex		RequestIndex,		-- Index to Requested Neighbor List
	systemInfoIndex		SystemInfoIndex,	-- Index to System info list, this type of neighbour
											-- identity shall not be used by the MS unless it has
											-- received the SystemInfoAssistData from the SMLC for
											-- this cell.
	ciAndLAC			CellIDAndLAC		-- CI and LAC
}

-- Multiframe and carrier
MultiFrameCarrier ::= SEQUENCE {
	bcchCarrier			BCCHCarrier,
	multiFrameOffset	MultiFrameOffset
}

-- OTD measurement value for neighbour
OTDValue ::= INTEGER (0..39999)

-- Location information IE
LocationInfo ::= SEQUENCE {
	refFrame		INTEGER (0..65535),			-- Reference Frame number
	-- If refFrame is within (42432..65535), it shall be ignored by the receiver
	-- in that case the MS should provide GPS TOW if available
	gpsTOW			INTEGER (0..14399999)	OPTIONAL,	-- GPS TOW
	fixType			FixType,
	-- Note that applicable range for refFrame is 0 - 42431
	-- Possible shapes carried in posEstimate are
	-- ellipsoid point,
	-- ellipsoid point with uncertainty circle
	-- ellipsoid point with uncertainty ellipse
	-- ellipsoid point with altitude and uncertainty ellipsoid
	posEstimate		Ext-GeographicalInformation
}

FixType ::= INTEGER {
	twoDFix (0),
	threeDFix (1)
} (0..1)

-- GPS-Measurement information
GPS-MeasureInfo ::= SEQUENCE {
	-- Measurement info elements
	-- user has to make sure that in this element is number of elements
	-- defined in reference BTS identity
	gpsMsrSetList	SeqOfGPS-MsrSetElement	
}
SeqOfGPS-MsrSetElement ::= SEQUENCE (SIZE(1..3)) OF GPS-MsrSetElement

-- OTD measurent information 1-3 times in message
GPS-MsrSetElement ::= SEQUENCE {
	refFrame		INTEGER (0..65535)	OPTIONAL, 	-- Reference Frame number
	gpsTOW			GPSTOW24b,						-- GPS TOW
	-- Note that applicable range for refFrame is 0 - 42431

--N_SAT can be read from number of elements of gps-msrList

	gps-msrList		SeqOfGPS-MsrElement
}

-- 24 bit presentation for GPSTOW
GPSTOW24b ::= INTEGER (0..14399999)

-- measured elements in measurement parameters field
SeqOfGPS-MsrElement ::= SEQUENCE (SIZE(1..16)) OF GPS-MsrElement

GPS-MsrElement ::= SEQUENCE {
	satelliteID		SatelliteID,				-- Satellite identifier
	cNo				INTEGER (0..63),			-- carrier noise ratio
	doppler			INTEGER (-32768..32767), 	-- doppler, mulltiply by 0.2
	wholeChips		INTEGER (0..1022),			-- whole value of the code phase measurement
	fracChips		INTEGER (0..1024),			-- fractional value of the code phase measurement
											-- a value of 1024 shall not be encoded by the sender
											-- the receiver shall consider a value of 1024 to be
											-- invalid data
	mpathIndic		MpathIndic,					-- multipath indicator
	pseuRangeRMSErr	INTEGER (0..63)				-- index		
}

-- Multipath indicator
MpathIndic ::= ENUMERATED {
	notMeasured (0),
	low (1),
	medium (2),
	high (3)
}

-- Location error IE
LocationError ::= SEQUENCE {
	locErrorReason				LocErrorReason,
	additionalAssistanceData	AdditionalAssistanceData	OPTIONAL,
	...
}

LocErrorReason ::= ENUMERATED {
	unDefined (0),	
	notEnoughBTSs (1),
	notEnoughSats (2),
	eotdLocCalAssDataMissing (3),
	eotdAssDataMissing (4),
	gpsLocCalAssDataMissing (5),
	gpsAssDataMissing (6),
	methodNotSupported (7),
	notProcessed (8),
	refBTSForGPSNotServingBTS (9),
	refBTSForEOTDNotServingBTS (10),
	...,
	notEnoughGANSSSats (11),	
 ganssAssDataMissing (12),
	refBTSForGANSSNotServingBTS (13)
}

-- exception handling:
-- an unrecognized value shall be treated the same as value 0


-- defines additional assistance data needed for any new location attempt
-- MS shall retain any assistance data already received
AdditionalAssistanceData ::= SEQUENCE {
	gpsAssistanceData		GPSAssistanceData		OPTIONAL,
	extensionContainer		ExtensionContainer		OPTIONAL,
	...,
	ganssAssistanceData GANSSAssistanceData OPTIONAL
}

GPSAssistanceData ::= OCTET STRING (SIZE (1..maxGPSAssistanceData))
-- GPSAssistanceData has identical structure and encoding to octets 3 to n of the
-- GPS Assistance Data IE in 3GPP TS 49.031

maxGPSAssistanceData	INTEGER ::= 40

GANSSAssistanceData ::= OCTET STRING (SIZE (1..maxGANSSAssistanceData))
-- GANSSAssistanceData has identical structure and encoding to octets 3 to n of the
-- GANSS Assistance Data IE in 3GPP TS 49.031

maxGANSSAssistanceData	INTEGER ::= 40


-- Protocol Error Causes
ErrorCodes ::= ENUMERATED {
	unDefined (0),
missingComponet (1),			
incorrectData (2),			
missingIEorComponentElement (3),		
messageTooShort (4),			
unknowReferenceNumber (5),		
...
}

-- exception handling:
-- an unrecognized value shall be treated the same as value 0

-- GPS assistance data IE
GPS-AssistData ::= SEQUENCE {
	controlHeader		ControlHeader
}

-- More Assistance Data To Be Sent IE
-- More Assistance Data Components On the Way indication for delivery of an entire set of assistance
-- data in multiple Assistance Data components.

MoreAssDataToBeSent ::= ENUMERATED {
	noMoreMessages (0),			-- This is the only or last Assistance Data message used to deliver
								-- the entire set of assistance data.
	moreMessagesOnTheWay (1)	-- The SMLC will send more Assistance Data messages or a final RRLP
								-- Measure Position Request message to deliver the
								-- the entire set of assistance data.
}

-- Control header of the GPS assistance data
ControlHeader ::= SEQUENCE {

	-- Field type Present information
	referenceTime		ReferenceTime		OPTIONAL,
	refLocation			RefLocation			OPTIONAL,
	dgpsCorrections		DGPSCorrections		OPTIONAL,
	navigationModel		NavigationModel		OPTIONAL,
	ionosphericModel		IonosphericModel		OPTIONAL,
	utcModel			UTCModel			OPTIONAL,
	almanac			Almanac			OPTIONAL,
	acquisAssist		AcquisAssist		OPTIONAL,
	realTimeIntegrity SeqOf-BadSatelliteSet OPTIONAL
}

ReferenceTime ::= SEQUENCE {
	gpsTime				GPSTime,
	gsmTime				GSMTime				OPTIONAL,
	gpsTowAssist		GPSTOWAssist		OPTIONAL
}

-- GPS Time includes week number and time-of-week (TOW)
GPSTime ::= SEQUENCE {
	gpsTOW23b			GPSTOW23b,
	gpsWeek				GPSWeek
}

-- GPSTOW, range 0-604799.92, resolution 0.08 sec, 23-bit presentation
GPSTOW23b ::= INTEGER (0..7559999)

-- GPS week number
GPSWeek ::= INTEGER (0..1023)

-- GPSTOWAssist consists of TLM message, Anti-spoof flag, Alert flag, and 2 reserved bits in TLM Word
-- for each visible satellite.
-- N_SAT can be read from number of elements in GPSTOWAssist
GPSTOWAssist ::= SEQUENCE (SIZE(1..12)) OF GPSTOWAssistElement

GPSTOWAssistElement ::= SEQUENCE {
	satelliteID			SatelliteID,
	tlmWord				TLMWord,
	antiSpoof			AntiSpoofFlag,
	alert				AlertFlag,
	tlmRsvdBits			TLMReservedBits
}

-- TLM Word, 14 bits
TLMWord ::= INTEGER (0..16383)

-- Anti-Spoof flag
AntiSpoofFlag ::= INTEGER (0..1)

-- Alert flag
AlertFlag ::= INTEGER (0..1)

-- Reserved bits in TLM word, MSB occurs earlier in TLM Word transmitted by satellite
TLMReservedBits ::= INTEGER (0..3)

GSMTime ::= SEQUENCE {
	bcchCarrier		BCCHCarrier,	-- BCCH carrier
	bsic			BSIC,			-- BSIC
	frameNumber		FrameNumber,
	timeSlot		TimeSlot,
	bitNumber		BitNumber
}

-- Frame number
FrameNumber ::= INTEGER (0..2097151)

-- Time slot number
TimeSlot ::= INTEGER (0..7)

-- Bit number
BitNumber ::= INTEGER (0..156)


-- Reference Location IE
RefLocation ::= SEQUENCE {
	threeDLocation			Ext-GeographicalInformation
}

-- DGPS Corrections IE
DGPSCorrections ::= SEQUENCE {

	gpsTOW		INTEGER (0..604799),	-- DGPS reference time
	status		INTEGER (0..7),
	-- N_SAT can be read from number of elements of satList
	satList		SeqOfSatElement 	
}
SeqOfSatElement ::= SEQUENCE (SIZE (1..16)) OF SatElement

-- number of correction for satellites
SatElement ::= SEQUENCE {
	satelliteID		SatelliteID,


--- Sequence number for ephemeris
	iode 			INTEGER (0..239),
	-- User Differential Range Error
	udre			INTEGER (0..3),		

	-- Pseudo Range Correction, range is
	-- -655.04 - +655.04,
	pseudoRangeCor	INTEGER (-2047..2047), 	

	-- Pseudo Range Rate Correction, range is
	-- -4.064 - +4.064,
	rangeRateCor	INTEGER (-127..127),

-- Delta Pseudo Range Correction 2 	
	deltaPseudoRangeCor2 	INTEGER (-127..127),	-- This IE shall be ignored by the receiver and
													-- set to zero by the sender
	-- Delta Pseudo Range Correction 2	
	deltaRangeRateCor2		INTEGER (-7..7),		-- This IE shall be ignored by the receiver and
													-- set to zero by the sender
	-- Delta Pseudo Range Correction 3
	deltaPseudoRangeCor3 	INTEGER (-127..127),	-- This IE shall be ignored by the receiver and
													-- set to zero by the sender
	-- Delta Pseudo Range Correction 3
	deltaRangeRateCor3		INTEGER (-7..7)			-- This IE shall be ignored by the receiver and
													-- set to zero by the sender
}

SatelliteID ::= INTEGER (0..63)	-- identifies satellite

-- Navigation Model IE
NavigationModel ::= SEQUENCE {
	navModelList	SeqOfNavModelElement	
}

-- navigation model satellite list
SeqOfNavModelElement ::= SEQUENCE (SIZE(1..16)) OF NavModelElement

NavModelElement ::= SEQUENCE {
	satelliteID		SatelliteID,			
	satStatus		SatStatus		-- satellite status
}

-- the Status of the navigation model
SatStatus ::= CHOICE {
	-- New satellite, new Navigation Model
	newSatelliteAndModelUC	UncompressedEphemeris,

	-- Existing satellite, Existing Navigation Model
	oldSatelliteAndModel	NULL,

	-- Existing satellite, new Navigation Model
	newNaviModelUC			UncompressedEphemeris,
	...
}

-- Uncompressed satellite emhemeris and clock corrections
UncompressedEphemeris ::= SEQUENCE {
	ephemCodeOnL2	INTEGER (0..3),
	ephemURA		INTEGER (0..15),
	ephemSVhealth	INTEGER (0..63),
	ephemIODC		INTEGER	(0..1023),
	ephemL2Pflag	INTEGER (0..1),
	ephemSF1Rsvd	EphemerisSubframe1Reserved,
	ephemTgd		INTEGER (-128..127),
	ephemToc		INTEGER (0..37799),
	ephemAF2		INTEGER (-128..127),
	ephemAF1		INTEGER (-32768..32767),
	ephemAF0		INTEGER (-2097152..2097151),
	ephemCrs		INTEGER (-32768..32767),
	ephemDeltaN		INTEGER (-32768..32767),
	ephemM0			INTEGER (-2147483648..2147483647),
	ephemCuc		INTEGER (-32768..32767),
	ephemE			INTEGER (0..4294967295),
	ephemCus		INTEGER (-32768..32767),
	ephemAPowerHalf	INTEGER (0..4294967295),
	ephemToe		INTEGER (0..37799),
	ephemFitFlag	INTEGER (0..1),
	ephemAODA		INTEGER (0..31),
	ephemCic		INTEGER (-32768..32767),
	ephemOmegaA0	INTEGER (-2147483648..2147483647),
	ephemCis		INTEGER (-32768..32767),
	ephemI0			INTEGER (-2147483648..2147483647),
	ephemCrc		INTEGER (-32768..32767),
	ephemW			INTEGER (-2147483648..2147483647),
	ephemOmegaADot	INTEGER (-8388608..8388607),
	ephemIDot		INTEGER (-8192..8191)
}

-- Reserved bits in subframe 1 of navigation message
EphemerisSubframe1Reserved ::= SEQUENCE {
	reserved1		INTEGER (0..8388607),	-- 23-bit field
	reserved2		INTEGER (0..16777215),	-- 24-bit field
	reserved3		INTEGER (0..16777215),	-- 24-bit field
	reserved4		INTEGER (0..65535)		-- 16-bit field
}

-- Ionospheric Model IE
IonosphericModel ::= SEQUENCE {
	alfa0			INTEGER (-128..127),
	alfa1			INTEGER (-128..127),
	alfa2			INTEGER (-128..127),
	alfa3			INTEGER (-128..127),
	beta0			INTEGER (-128..127),
	beta1			INTEGER (-128..127),
	beta2			INTEGER (-128..127),
	beta3			INTEGER (-128..127)
}

-- Universal Time Coordinate Model
UTCModel ::= SEQUENCE {
	utcA1			INTEGER (-8388608..8388607),
	utcA0			INTEGER (-2147483648..2147483647),
	utcTot			INTEGER (0..255),
	utcWNt			INTEGER (0..255),
	utcDeltaTls		INTEGER (-128..127),
	utcWNlsf		INTEGER (0..255),
	utcDN			INTEGER (-128..127),
	utcDeltaTlsf	INTEGER (-128..127)
}

-- Almanac, Long term model
-- NOTE: These are parameters are subset of the ephemeris
-- NOTE: But with reduced resolution and accuracy
Almanac ::= SEQUENCE {
	alamanacWNa		INTEGER (0..255),	-- Once per message

	-- navigation model satellite list.
	-- The size of almanacList is actually Nums_Sats_Total field
	almanacList		SeqOfAlmanacElement		
}
SeqOfAlmanacElement ::= SEQUENCE (SIZE(1..64)) OF AlmanacElement

-- Almanac info once per satellite
AlmanacElement ::= SEQUENCE {
	satelliteID			SatelliteID,
	almanacE			INTEGER (0..65535),
	alamanacToa			INTEGER (0..255),
	almanacKsii			INTEGER (-32768..32767),
	almanacOmegaDot		INTEGER (-32768..32767),
	almanacSVhealth		INTEGER (0..255),
	almanacAPowerHalf	INTEGER (0..16777215),
	almanacOmega0		INTEGER (-8388608..8388607),
	almanacW			INTEGER (-8388608..8388607),
	almanacM0			INTEGER (-8388608..8388607),
	almanacAF0			INTEGER (-1024..1023),
	almanacAF1			INTEGER (-1024..1023)
}

-- Acquisition Assistance
AcquisAssist ::= SEQUENCE {

	-- Number of Satellites can be read from acquistList
	timeRelation	TimeRelation,

	-- Acquisition assistance list
	-- The size of Number of Satellites is actually Number of Satellites field
	acquisList		SeqOfAcquisElement		
}
SeqOfAcquisElement ::= SEQUENCE (SIZE(1..16)) OF AcquisElement

-- the relationship between GPS time and air-interface timing
TimeRelation ::= SEQUENCE {
	--
	gpsTOW		GPSTOW23b,		-- 23b presentation
	gsmTime		GSMTime		OPTIONAL
}

-- data occuring per number of satellites
AcquisElement ::= SEQUENCE {
	svid					SatelliteID,

	-- Doppler 0th order term,
	-- -5120.0 - 5117.5 Hz (= -2048 - 2047 with 2.5 Hz resolution)
	doppler0				INTEGER (-2048..2047),	
	addionalDoppler			AddionalDopplerFields	OPTIONAL,
	codePhase				INTEGER (0..1022),	-- Code Phase
	intCodePhase			INTEGER (0..19),	-- Integer Code Phase
	gpsBitNumber			INTEGER (0..3), 	-- GPS bit number
	codePhaseSearchWindow	INTEGER (0..15),	-- Code Phase Search Window
	addionalAngle			AddionalAngleFields		OPTIONAL
}

AddionalDopplerFields ::= SEQUENCE {
	-- Doppler 1st order term, -1.0 - +0.5 Hz/sec
 -- (= -42 + (0 to 63) with 1/42 Hz/sec. resolution)
	doppler1				INTEGER (0..63),
	dopplerUncertainty		INTEGER (0..7)
 -- a sender shall not encode any DopplerUncertainty value in the range 5 to 7
 -- a receiver shall ignore any value between 5 and 7.
}

AddionalAngleFields	::= SEQUENCE {
	-- azimuth angle, 0 - 348.75 deg (= 0 - 31 with 11.25 deg resolution)
	azimuth					INTEGER (0..31),
	-- elevation angle, 0 - 78.75 deg (= 0 - 7 with 11.25 deg resolution)
	elevation				INTEGER (0..7)
}

-- Real-Time Integrity
-- number of bad satellites can be read from this element
SeqOf-BadSatelliteSet ::= SEQUENCE (SIZE(1..16)) OF SatelliteID

-- Extension Elements

-- Release 98 Extensions here
Rel98-MsrPosition-Req-Extension ::= SEQUENCE {
	rel98-Ext-ExpOTD			Rel98-Ext-ExpOTD		OPTIONAL,	-- ExpectedOTD extension
	..., 
 gpsTimeAssistanceMeasurementRequest NULL OPTIONAL, 
 gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL

-- Further R98 extensions here
}
Rel98-AssistanceData-Extension ::= SEQUENCE {
	rel98-Ext-ExpOTD			Rel98-Ext-ExpOTD		OPTIONAL,	-- ExpectedOTD extension
	..., 
 gpsTimeAssistanceMeasurementRequest NULL OPTIONAL,
 gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL

-- Further R98 extensions here
}

-- Release 98 ExpOTD extension
Rel98-Ext-ExpOTD ::= SEQUENCE {
-- If MsrAssistBTS is included in message, msrAssistData-R98-ExpOTD shall be included.
	msrAssistData-R98-ExpOTD			MsrAssistData-R98-ExpOTD			OPTIONAL,

-- If SystemInfoAssistaData is included in message, systemInfoAssistData-R98-ExpOTD shall be
-- included.
	systemInfoAssistData-R98-ExpOTD	SystemInfoAssistData-R98-ExpOTD	OPTIONAL
}

-- MsrAssistData R98 extension
MsrAssistData-R98-ExpOTD ::= SEQUENCE {
	 msrAssistList-R98-ExpOTD			 SeqOfMsrAssistBTS-R98-ExpOTD
}

-- Indexes in SeqOfMsrAssistBTS-R98-ExpOTD refer to SeqOfMsrAssistBTS
-- If the index exceeds the SegOfMsrAssistBTS range or if there is other
-- inconsistencies between the BTS indices, the MS shall apply protocol
-- error cause incorrectData
SeqOfMsrAssistBTS-R98-ExpOTD ::= SEQUENCE (SIZE(1..15)) OF MsrAssistBTS-R98-ExpOTD

-- This element completes MsrAssistBTS IE
MsrAssistBTS-R98-ExpOTD ::= SEQUENCE {
	expectedOTD				ExpectedOTD,
	expOTDUncertainty		ExpOTDUncertainty
}

-- SystemInfoAssistData R98 extension
SystemInfoAssistData-R98-ExpOTD ::= SEQUENCE {
	systemInfoAssistListR98-ExpOTD 	SeqOfSystemInfoAssistBTS-R98-ExpOTD
}

-- SeqOfSystemInfoAssistBTS-R98-ExpOTD index refer to SeqOfSystemInfoAssistBTS
-- If the index exceeds the SegOfSystemInfoAssistBTS range or if there is other
-- inconsistencies between the BTS indices, the MS shall apply protocol
-- error cause incorrectData
SeqOfSystemInfoAssistBTS-R98-ExpOTD ::= SEQUENCE (SIZE(1..32)) OF SystemInfoAssistBTS-R98-ExpOTD

-- whether n.th is present or not ?
SystemInfoAssistBTS-R98-ExpOTD ::= CHOICE {
	notPresent		NULL,
	present			AssistBTSData-R98-ExpOTD
}

-- This element completes AssistBTSData IE
AssistBTSData-R98-ExpOTD ::= SEQUENCE {
	expectedOTD				ExpectedOTD,
	expOTDuncertainty		ExpOTDUncertainty	-- Uncertainty of expected OTD
}

-- Expected OTD value between nbor base station and reference BTS
-- at MS's current estimated location.
ExpectedOTD ::= INTEGER (0..1250)
-- The ExpectedOTD value 1250 shall not be encoded by the transmitting entity and
-- shall be treated by the receiving entity as 0.
-- Uncertainty of Exptected OTD in bits
ExpOTDUncertainty ::= INTEGER(0..7)

-- Release 98 extensions

GPSReferenceTimeUncertainty ::= INTEGER (0 .. 127) -- Coding according to Annex

GPSTimeAssistanceMeasurements ::= SEQUENCE {
 referenceFrameMSB INTEGER (0 .. 63), -- MSB of frame number
 gpsTowSubms INTEGER (0 .. 9999) OPTIONAL, -- in units of 100ns, for MS based AGPS
 deltaTow INTEGER (0 .. 127) OPTIONAL, -- for MS assisted AGPS
 gpsReferenceTimeUncertainty GPSReferenceTimeUncertainty OPTIONAL
}

Rel-98-MsrPosition-Rsp-Extension ::= SEQUENCE {

	-- First extension to Release 98
	rel-98-Ext-MeasureInfo	SEQUENCE {
		otd-MeasureInfo-R98-Ext	OTD-MeasureInfo-R98-Ext		OPTIONAL
	},
	..., 
 timeAssistanceMeasurements GPSTimeAssistanceMeasurements OPTIONAL 
 -- Further R98 extensions here
}

-- This is an addition to OTD-MeasureInfo element defined in original message,
-- If OTD-MeasureInfo is absent, or if one or more OTD-MsrElementRest are present
-- OTD-MeasureInfo-R98-Ext shall be absent.
-- OTD-MeasureInfo-R98-Ext
OTD-MeasureInfo-R98-Ext ::= SEQUENCE {
	-- Measurement info elements
	otdMsrFirstSets-R98-Ext		OTD-MsrElementFirst-R98-Ext
}

-- OTD measurement information Ext for the first set only
OTD-MsrElementFirst-R98-Ext ::= SEQUENCE {
	-- additional measured neighbors in OTD measurements
	otd-FirstSetMsrs-R98-Ext 	SeqOfOTD-FirstSetMsrs-R98-Ext 	OPTIONAL
}
SeqOfOTD-FirstSetMsrs-R98-Ext ::= SEQUENCE (SIZE(1..5)) OF OTD-FirstSetMsrs

Rel-5-MsrPosition-Rsp-Extension ::= SEQUENCE {

	extended-reference	Extended-reference 	OPTIONAL,
	-- The extended-reference shall be included by the MS if and only if previously
	-- received from the SMLC in a Measure Position Request. When included, the value sent
	-- by the MS shall equal the value received from the SMLC.

	-- extension to Release 5, for RRLP pseudo-segmentation here
	otd-MeasureInfo-5-Ext	OTD-MeasureInfo-5-Ext	OPTIONAL,
	ulPseudoSegInd			UlPseudoSegInd			OPTIONAL,	-- Included when uplink RRLP
	-- Pseudo-segmentation is used, not included when no uplink pseudo-segmentation is used
	...
					-- Possibly more extensions for Release 5 here later
}

Extended-reference ::= SEQUENCE {
	smlc-code			INTEGER (0..63),
	transaction-ID		INTEGER (0..262143)
}

OTD-MeasureInfo-5-Ext ::= SeqOfOTD-MsrElementRest
	-- if more than one measurement sets are present this element is repeated
	-- NumberOfSets - 1 (-1 = first set) combined in OTD-MeasureInfo-5-Ext and
	-- OTD-MeasureInfo (e.g. if NumberOfSets is 3, then one otdMsrRestSets may
	-- be sent in OTD-MeasureInfo-5-Ext and one in OTD-MeasureInfo)

-- First part of Uplink RRLP Pseudo-segmentation indication, possibly more may be defined
-- in the future for segmentation with more than two segments.
UlPseudoSegInd ::= ENUMERATED {
	firstOfMany (0),
	secondOfMany(1)
}

Rel5-MsrPosition-Req-Extension ::= SEQUENCE {
	extended-reference			Extended-reference,
	...
	-- Possibly more extensions for Release 5 here later
}

Rel5-AssistanceData-Extension ::= SEQUENCE {
	extended-reference			Extended-reference,
	...

-- Possibly more extensions for Release 5 here later
}

Rel-5-ProtocolError-Extension::= SEQUENCE {
	extended-reference			Extended-reference 	OPTIONAL,
	-- The extended-reference shall be included by the MS if and only if previously
	-- received from the SMLC.
	-- When included, the value sent by the MS shall equal the value received from the SMLC.
	...

	-- Possibly more extensions for Release 5 here later
}

-- Release 7 Extensions here

Rel7-MsrPosition-Req-Extension ::= SEQUENCE {
velocityRequested		 NULL		 OPTIONAL,
 ganssPositionMethod GANSSPositioningMethod OPTIONAL,
 ganss-AssistData GANSS-AssistData OPTIONAL,
 ganssCarrierPhaseMeasurementRequest NULL OPTIONAL,
 ganssTODGSMTimeAssociationMeasurementRequest NULL OPTIONAL,
requiredResponseTime	RequiredResponseTime	OPTIONAL,
	...
	-- Further Release 7 extentions here
}

-- additional satellite systems may be added in future versions of the protocol
GANSSPositioningMethod ::= BIT STRING {
	gps (0),
	galileo (1)} (SIZE (2..16))

GANSS-AssistData ::= SEQUENCE {
	ganss-controlHeader	GANSS-ControlHeader
}

GANSS-ControlHeader ::= SEQUENCE {
 ganssCommonAssistData GANSSCommonAssistData OPTIONAL,
 ganssGenericAssistDataList SeqOfGANSSGenericAssistDataElement OPTIONAL
}

-- GANSS Common Assistance Data Elements
GANSSCommonAssistData ::= SEQUENCE {
	ganssReferenceTime		 GANSSReferenceTime		 OPTIONAL,
	ganssRefLocation			GANSSRefLocation		 OPTIONAL,
	ganssIonosphericModel		GANSSIonosphericModel	 OPTIONAL,
	...
}

-- List of GANSS Generic Assistance Data Elements, up to 8 GANSS
SeqOfGANSSGenericAssistDataElement ::= SEQUENCE (SIZE (1..8)) OF GANSSGenericAssistDataElement

-- GANSS Generic Assistance Data Elements
GANSSGenericAssistDataElement ::= SEQUENCE {
 ganssID INTEGER (0..7) OPTIONAL, -- Coding according to Annex
 ganssTimeModel SeqOfGANSSTimeModel OPTIONAL,
	ganssDiffCorrections		 GANSSDiffCorrections	 OPTIONAL,
	ganssNavigationModel		 GANSSNavModel OPTIONAL,
	ganssRealTimeIntegrity	 GANSSRealTimeIntegrity	 OPTIONAL,
	ganssDataBitAssist			 GANSSDataBitAssist		 OPTIONAL,
	ganssRefMeasurementAssist	 GANSSRefMeasurementAssist OPTIONAL,
 ganssAlmanacModel GANSSAlmanacModel OPTIONAL,
 ganssUTCModel GANSSUTCModel OPTIONAL,
	...
}

-- GANSS COMMON ASSISTANCE DATA ELEMENTS

-- GANSS Reference Time IE
GANSSReferenceTime ::= SEQUENCE {
	ganssRefTimeInfo			 GANSSRefTimeInfo,
	ganssTOD-GSMTimeAssociation GANSSTOD-GSMTimeAssociation OPTIONAL
}

-- GANSS Reference Time includes GANSS TOD, GANSS Day, uncertainty
GANSSRefTimeInfo ::= SEQUENCE {
	ganssDay			 INTEGER(0 .. 8191) OPTIONAL,
 ganssTOD GANSSTOD,
	ganssTODUncertainty	 GANSSTODUncertainty OPTIONAL,
 ganssTimeID INTEGER (0 .. 7) OPTIONAL
}

-- GANSS TOD integer seconds
GANSSTOD ::= INTEGER (0 .. 86399)

-- GANSS TOD uncertainty
GANSSTODUncertainty ::= INTEGER (0 .. 127) -- Coding according to Annex

-- GANSS TOD-GSM Time association 
GANSSTOD-GSMTimeAssociation ::= SEQUENCE {
	bcchCarrier		BCCHCarrier,	-- BCCH carrier
	bsic			BSIC,			-- BSIC
	frameNumber		FrameNumber,
	timeSlot		TimeSlot,
	bitNumber		BitNumber,
 frameDrift FrameDrift OPTIONAL
}

-- Frame drift
FrameDrift ::= INTEGER(-64 .. 63)

-- GANSS Reference Location IE
GANSSRefLocation ::= SEQUENCE {
	threeDLocation			Ext-GeographicalInformation
}

-- GANSS Ionospheric Model IE
-- GANSS Ionospheric Model consists of NeQuick model parameters and storm flags

GANSSIonosphericModel ::= SEQUENCE {
 ganssIonoModel GANSSIonosphereModel,
 ganssIonoStormFlags GANSSIonoStormFlags OPTIONAL,
 ...
}

-- GANSS ionosphere model. Coding according to Annex 
GANSSIonosphereModel ::= SEQUENCE {
 ai0 INTEGER (0 .. 4095),
 ai1 INTEGER (0 .. 4095),
 ai2 INTEGER (0 .. 4095)
}

-- GANSS ionosphere storm flags
GANSSIonoStormFlags ::= SEQUENCE {
	ionoStormFlag1	INTEGER (0 .. 1),
	ionoStormFlag2	INTEGER (0 .. 1),
	ionoStormFlag3	INTEGER (0 .. 1),
	ionoStormFlag4	INTEGER (0 .. 1),
	ionoStormFlag5	INTEGER (0 .. 1)
}

-- GANSS GENERIC ASSISTANCE DATA ELEMENTS

-- GANSS Time Model IE consists of time offset and first and second order parameters to relate GNSS
-- specific system time to selected time reference
SeqOfGANSSTimeModel ::= SEQUENCE (SIZE(1..7)) OF GANSSTimeModelElement

GANSSTimeModelElement ::= SEQUENCE {
	ganssTimeModelRefTime		INTEGER(0 .. 65535),
	tA0		 TA0,
	tA1		 TA1 OPTIONAL,
	tA2		 TA2 OPTIONAL,
 gnssTOID INTEGER (0 .. 7),
 weekNumber INTEGER (0 .. 8191) OPTIONAL 
}

-- GANSS time model parameter A0
TA0 ::= INTEGER (-2147483648 .. 2147483647)

-- GANSS time model parameter A1
TA1 ::= INTEGER (-8388608 .. 8388607)

-- GANSS time model parameter A2
TA2 ::= INTEGER (-64 .. 63)

-- DGANSS Corrections IE
GANSSDiffCorrections ::= SEQUENCE {
	dganssRefTime		INTEGER (0 .. 119),	 -- DGANSS reference time

	-- N_SGN_TYPE can be read from number of elements of sgnTypeList
	sgnTypeList		 SeqOfSgnTypeElement
}

SeqOfSgnTypeElement ::= SEQUENCE (SIZE (1..3)) OF SgnTypeElement -- max three signals per GNSS

-- DGANSS signal type element, once per GNSS signal type included in DGANSS
SgnTypeElement ::= SEQUENCE {
	ganssSignalID		 GANSSSignalID OPTIONAL, -- signal type identity
 ganssStatusHealth INTEGER (0 .. 7),
	-- N_SGN can be read from number of elements of dganssSgnList
 dganssSgnList SeqOfDGANSSSgnElement
}

GANSSSignalID ::= INTEGER (0 .. 3)	-- Coding according to Annex
SeqOfDGANSSSgnElement ::= SEQUENCE (SIZE (1..16)) OF DGANSSSgnElement

-- number of correction for signals
DGANSSSgnElement ::= SEQUENCE {
	svID		 SVID, -- Satellite identity

--- Sequence number for GANSS Navigation Model that matches the DGANSS correction set
	iod 			INTEGER (0 .. 1023),

	-- User Differential Range Error
	udre			INTEGER (0..3),		

	-- Pseudo Range Correction, range is
	-- -655.04 - +655.04,
	pseudoRangeCor	INTEGER (-2047..2047), 	

	-- Pseudo Range Rate Correction, range is
	-- -4.064 - +4.064,
	rangeRateCor	INTEGER (-127..127)
}

SVID ::= INTEGER (0 .. 63)	-- Coding according to Annex

-- GANSS Navigation Model IE
GANSSNavModel ::= SEQUENCE {
 nonBroadcastIndFlag INTEGER (0 .. 1),
 toeMSB INTEGER (0 .. 31) OPTIONAL, -- 5 MSB of toe and toc 
 eMSB INTEGER (0 .. 127) OPTIONAL,
 sqrtAMBS INTEGER (0 .. 63) OPTIONAL,
	ganssSatelliteList SeqOfGANSSSatelliteElement
}

SeqOfGANSSSatelliteElement ::= SEQUENCE (SIZE(1..32)) OF GANSSSatelliteElement

GANSSSatelliteElement ::= SEQUENCE {
	svID SVID,
 svHealth INTEGER (-7 .. 13), -- Coding according to Annex
 iod INTEGER (0 .. 1023), -- Coding according to Annex
 ganssClockModel GANSSClockModel, 
 ganssOrbitModel GANSSOrbitModel, 
 ...
}

-- GANSS orbit model for the GNSS satellite according to the choice
GANSSOrbitModel ::= CHOICE {
	keplerianSet	 NavModel-KeplerianSet,	
 ...
}

-- Navigation model in Keplerian parameters
NavModel-KeplerianSet ::= SEQUENCE {
 keplerToeLSB INTEGER (0 .. 511), -- 9LSB are given in GANSSNavigationModel
	keplerW			 INTEGER (-2147483648..2147483647),
	keplerDeltaN	 INTEGER (-32768..32767),
	keplerM0		 INTEGER (-2147483648..2147483647),
	keplerOmegaDot	 INTEGER (-8388608..8388607),
	keplerELSB 	 INTEGER (0..33554431),
	keplerIDot		 INTEGER (-8192..8191),
	keplerAPowerHalfLSB INTEGER (0.. 67108863),
	keplerI0		 INTEGER (-2147483648..2147483647),
	keplerOmega0 INTEGER (-2147483648..2147483647),
	keplerCrs		 INTEGER (-32768..32767),
	keplerCis		 INTEGER (-32768..32767),
	keplerCus		 INTEGER (-32768..32767),
	keplerCrc		 INTEGER (-32768..32767),
	keplerCic		 INTEGER (-32768..32767),
	keplerCuc		 INTEGER (-32768..32767)
}

-- GANSS clock model for the GNSS satellite according to the choice
GANSSClockModel ::= CHOICE {
	standardClockModelList	 SeqOfStandardClockModelElement,	
 ...
}

SeqOfStandardClockModelElement ::= SEQUENCE (SIZE(1..2)) OF StandardClockModelElement

StandardClockModelElement ::= SEQUENCE {
 stanClockTocLSB INTEGER (0 .. 511), -- 9LSB of time of clock
 stanClockAF2 INTEGER (-2048 .. 2047), 
 stanClockAF1 INTEGER (-131072 .. 131071), 
 stanClockAF0 INTEGER (-134217728 .. 134217727),
 stanClockTgd INTEGER (-512 .. 511) OPTIONAL,
 stanModelID INTEGER (0 .. 1) OPTIONAL,
 ...
} 

-- GANSS Real-Time Integrity IE
GANSSRealTimeIntegrity ::= SEQUENCE {
 -- list of bad signals
 -- NBS can be read from number of elements in SeqOf-BadSignalSet
 ganssBadSignalList SeqOfBadSignalElement
}

SeqOfBadSignalElement ::= SEQUENCE (SIZE(1..16)) OF BadSignalElement

BadSignalElement ::= SEQUENCE {
 badSVID SVID, -- Coding according to Annex
 badSignalID INTEGER (0 .. 3) OPTIONAL -- Coding according to Annex
}


-- GANSS Data Bit Assistance IE
GANSSDataBitAssist ::= SEQUENCE {
 ganssTOD INTEGER (0 .. 59),
 svID SVID,
 ganssDataTypeID INTEGER (0 .. 2), -- Coding according to Annex
 -- list of navigation data bits
 -- N_BIT can be read from number of elements in SeqOf-DataBits
 ganssDataBits SeqOf-GANSSDataBits
}

SeqOf-GANSSDataBits ::= SEQUENCE (SIZE(1 .. 1024)) OF GANSSDataBit
GANSSDataBit ::= INTEGER(0 .. 1)

-- GANSS Reference Measurement Assistance IE
-- Code and Doppler assistance from the network. 
GANSSRefMeasurementAssist ::= SEQUENCE {
 ganssSignalID INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex
 ganssRefMeasAssitList SeqOfGANSSRefMeasurementElement
}

SeqOfGANSSRefMeasurementElement ::= SEQUENCE (SIZE(1 .. 16)) OF GANSSRefMeasurementElement

GANSSRefMeasurementElement ::= SEQUENCE {
 svID SVID,
	-- Doppler 0th order term,
	-- -1024 m/s to 1023.5 m/s with 0.5 m/s resolution)
	doppler0				INTEGER (-2048 .. 2047),	-- Coding according to Annex
	additionalDoppler		AdditionalDopplerFields	 OPTIONAL,
	codePhase				INTEGER (0 .. 1022),	 -- Code Phase in ms
	intCodePhase			INTEGER (0 .. 127),	 -- Integer Code Phase in ms
	codePhaseSearchWindow	INTEGER (0 .. 31),	 -- Code Phase Search Window, see Annex
	additionalAngle			AddionalAngleFields		 OPTIONAL,
 ...
}

AdditionalDopplerFields ::= SEQUENCE {
	-- Doppler 1st order term, -0.2 - +0.1 m/s2
	doppler1				INTEGER (0..63),
	dopplerUncertainty		INTEGER (0..4)
}

-- GANSS Almanac Model IE
GANSSAlmanacModel ::= SEQUENCE {
 weekNumber INTEGER (0 .. 255),
 svIDMask SVIDMASK,
 toa INTEGER (0 .. 255) OPTIONAL,
 ioda INTEGER (0 .. 3) OPTIONAL,
 ganssAlmanacList SeqOfGANSSAlmanacElement
}

-- SV ID Mask, LSB for ID 1 and MSB for ID 36
SVIDMASK ::= BIT STRING (SIZE (1..36))

SeqOfGANSSAlmanacElement ::= SEQUENCE (SIZE(1 .. 36)) OF GANSSAlmanacElement

-- GANSS Almanac Model 
GANSSAlmanacElement ::= CHOICE {
	keplerianAlmanacSet	 Almanac-KeplerianSet,	
 ...
}

-- Almanac parameters according to Keplerian parameters
Almanac-KeplerianSet ::= SEQUENCE {
 	kepAlmanacE			 INTEGER (0 .. 2047),
	kepAlmanacDeltaI		INTEGER (-1024 .. 1023),
	kepAlmanacOmegaDot		INTEGER (-1024 .. 1023),
 kepSVHealth INTEGER (0 .. 15), -- Coding according to Annex
	kepAlmanacAPowerHalf	INTEGER (-65536 .. 65535),
	kepAlmanacOmega0		INTEGER (-32768 .. 32767),
	kepAlmanacW			 INTEGER (-32768 .. 32767),
	kepAlmanacM0			INTEGER (-32768 .. 32767),
	kepAlmanacAF0			INTEGER (-8192 .. 8191),
	kepAlmanacAF1			INTEGER (-1024..1023)
}

-- GANSS Universal Time Coordinate Model
GANSSUTCModel ::= SEQUENCE {
	ganssUtcA1			INTEGER (-8388608..8388607),
	ganssUtcA0			INTEGER (-2147483648..2147483647),
	ganssUtcTot			INTEGER (0..255),
	ganssUtcWNt			INTEGER (0..255),
	ganssUtcDeltaTls	INTEGER (-128..127),
	ganssUtcWNlsf		INTEGER (0..255),
	ganssUtcDN			INTEGER (-128..127),
	ganssUtcDeltaTlsf	INTEGER (-128..127)
}

--Required Measurement Request Response Time, range is 1 to 128 seconds. 
RequiredResponseTime ::= INTEGER  (1..128)

Rel-7-MsrPosition-Rsp-Extension ::= SEQUENCE {

	velEstimate 	VelocityEstimate OPTIONAL,
 -- Horizontal Velocity
 -- Horizontal with Vertical Velocity
 -- Horizontal Velocity with Uncertainty
 -- Horizontal with Vertical Velocity and Uncertainty
 ganssLocationInfo GANSSLocationInfo OPTIONAL,
 ganssMeasureInfo GANSSMeasureInfo OPTIONAL,
	...
-- Further Release 7 extensions here
}

-- GANSS Location Information contains location estimate, time stamp with uncertainty 
-- and optionally Reference Frame field
GANSSLocationInfo ::= SEQUENCE {
 referenceFrame ReferenceFrame OPTIONAL, -- Reference Frame Number
 ganssTODm GANSSTODm OPTIONAL, -- GNSS TOD modulo
 ganssTODFrac INTEGER (0 .. 16384) OPTIONAL, -- Coding according to Annex
	ganssTODUncertainty GANSSTODUncertainty OPTIONAL, -- Coding according to Annex
 ganssTimeID INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex
	fixType			 FixType,
 posData PositionData,
 stationaryIndication INTEGER(0 .. 1) OPTIONAL, -- '0' if moving or motion not known 
	-- Possible shapes carried in posEstimate are
	-- ellipsoid point,
	-- ellipsoid point with uncertainty circle
	-- ellipsoid point with uncertainty ellipse
	-- ellipsoid point with altitude and uncertainty ellipsoid
	posEstimate		 Ext-GeographicalInformation,
 ...
}

PositionData ::= BIT STRING {
 e-otd(0),
	gps (1),
	galileo (2) } (SIZE (3..16))


-- GANSS TOD modulo 1 hour
GANSSTODm ::= INTEGER (0 .. 3599999)

ReferenceFrame ::= SEQUENCE {
 referenceFN INTEGER (0 .. 65535),
	-- Note that applicable range for referenceFN is 0 - 42431
 referenceFNMSB INTEGER (0 .. 63) OPTIONAL -- MSB of Reference Frame Number
}



-- GANSS Measurement Information 
GANSSMeasureInfo ::= SEQUENCE {
	-- Measurement info elements
	-- user has to make sure that in this element is number of elements
	-- defined in reference BTS identity
 ganssMsrSetList SeqOfGANSS-MsrSetElement
}
SeqOfGANSS-MsrSetElement ::= SEQUENCE (SIZE(1..3)) OF GANSS-MsrSetElement

-- GANSS measurement information 1-3 times in a message
GANSS-MsrSetElement ::= SEQUENCE {
 referenceFrame ReferenceFrame OPTIONAL, -- Reference Frame Number
 ganssTODm GANSSTODm OPTIONAL, -- GANSS TOD modulo
 deltaGNASSTOD INTEGER (0 .. 127) OPTIONAL,
	ganssTODUncertainty GANSSTODUncertainty OPTIONAL, -- Coding accoring to Annex

 --N_SGN_TYPE can be read from number of elements of SeqOfGANSS-SgnTypeElement
 ganss-SgnTypeList SeqOfGANSS-SgnTypeElement
}

-- Measurements can be returned up to 6 different signal types 
SeqOfGANSS-SgnTypeElement ::= SEQUENCE (SIZE(1..6)) OF GANSS-SgnTypeElement

GANSS-SgnTypeElement ::= SEQUENCE {
	ganssSignalID		INTEGER (0 .. 15), -- Coding accroding to Annex
 --N_SGN can be read from number of elements of SeqOfGANSS-SgnElement
 ganss-SgnList SeqOfGANSS-SgnElement
}

-- Measurements can be returned up to 16 per signal types 
SeqOfGANSS-SgnElement ::= SEQUENCE (SIZE(1..16)) OF GANSS-SgnElement


GANSS-SgnElement ::= SEQUENCE {
 svID SVID,
 cNo INTEGER (0 .. 63),
 mpathDet MpathIndic, -- Coding according to Annex
 carrierQualityInd INTEGER (0 .. 3) OPTIONAL, -- Coding according to Annex
 codePhase INTEGER (0 .. 2097151),
 integerCodePhase INTEGER (0 .. 63) OPTIONAL,
 codePhaseRMSError INTEGER (0..63), -- Coding accoring to Annex
 doppler INTEGER (-32768 .. 32767) OPTIONAL,
 adr INTEGER (0 .. 33554431) OPTIONAL
}

Rel7-AssistanceData-Extension ::= SEQUENCE {
 ganss-AssistData GANSS-AssistData OPTIONAL,
 ganssCarrierPhaseMeasurementRequest NULL OPTIONAL,
 ganssTODGSMTimeAssociationMeasurementRequest NULL OPTIONAL,
	...
-- Possibly more extensions for Release 7 here
}

END
