diff --git a/src/grl-coordinates.adb b/src/grl-coordinates.adb index 99edd20..aeae82b 100644 --- a/src/grl-coordinates.adb +++ b/src/grl-coordinates.adb @@ -5,17 +5,33 @@ package body Grl.Coordinates is begin case DM_Base.Form is - when Relative => null; - when DD_Fine => null; - when DD => DD_Target := DM_Base; + when Relative => + null; + when DD_Fine => + null; + when DD => + DD_Target := DM_Base; when DDM => if DM_Base.DDM.Cardinal_Lat = North then DD_Target.DD.Latitude := - DD_Meter_Scale_Lat (DM_Base.DDM.Degree_Lat) - + - DD_Meter_Scale_Lat (DM_Base.DDM.Minutes_Lat / 60.0); + DD_Meter_Scale_Lat (DM_Base.DDM.Degree_Lat) + + DD_Meter_Scale_Lat (DM_Base.DDM.Minutes_Lat / 60.0); + else + DD_Target.DD.Latitude := + -1.0 * DD_Meter_Scale_Lat (DM_Base.DDM.Degree_Lat) + + DD_Meter_Scale_Lat (DM_Base.DDM.Minutes_Lat / 60.0); end if; - when DMS => null; + if DM_Base.DDM.Cardinal_Lon = East then + DD_Target.DD.Longitude := + DD_Meter_Scale_Lon (DM_Base.DDM.Degree_Lon) + + DD_Meter_Scale_Lon (DM_Base.DDM.Minutes_Lon / 60.0); + else + DD_Target.DD.Longitude := + -1.00 * DD_Meter_Scale_Lon (DM_Base.DDM.Degree_Lon) + + DD_Meter_Scale_Lon (DM_Base.DDM.Minutes_Lon / 60.0); + end if; + when DMS => + null; end case; return DD_Target; diff --git a/src/grl-coordinates.ads b/src/grl-coordinates.ads index 3f4b962..862ce3f 100644 --- a/src/grl-coordinates.ads +++ b/src/grl-coordinates.ads @@ -1,5 +1,5 @@ -package Grl.Coordinates -with SPARK_Mode => On +package Grl.Coordinates with + SPARK_Mode => On is -- ------------ -- @@ -34,53 +34,51 @@ is -- Meter precision DD coordinates type Format_DD is record - Latitude : DD_Meter_Scale_Lat; - Longitude : DD_Meter_Scale_Lon; - end record; + Latitude : DD_Meter_Scale_Lat; + Longitude : DD_Meter_Scale_Lon; + end record; -- Centimeter precision DD coordinates type Format_DD_Fine is record - Latitude : DD_Centimeter_Scale_Lat; - Longitude : DD_Centimeter_Scale_Lon; - end record; + Latitude : DD_Centimeter_Scale_Lat; + Longitude : DD_Centimeter_Scale_Lon; + end record; -- DMS type Format_DMS is record - Degree_Lat : DM_Degree_Lat; - Degree_Lon : DM_Degree_Lon; - Minutes_Lat : DM_Minutes; - Minutes_Lon : DM_Minutes; - Seconds_Lat : DM_Seconds; - Seconds_Lon : DM_Seconds; - Cardinal_Lat : Cardinal; - Cardinal_Lon : Cardinal; - end record - with Dynamic_Predicate => + Degree_Lat : DM_Degree_Lat; + Degree_Lon : DM_Degree_Lon; + Minutes_Lat : DM_Minutes; + Minutes_Lon : DM_Minutes; + Seconds_Lat : DM_Seconds; + Seconds_Lon : DM_Seconds; + Cardinal_Lat : Cardinal; + Cardinal_Lon : Cardinal; + end record with + Dynamic_Predicate => Format_DMS.Cardinal_Lat in North | South - and then - Format_DMS.Cardinal_Lon in East | West; + and then Format_DMS.Cardinal_Lon in East | West; -- DDM type Format_DDM is record - Degree_Lat : DM_Degree_Lat; - Degree_Lon : DM_Degree_Lon; - Minutes_Lat : DDM_Minutes; - Minutes_Lon : DDM_Minutes; + Degree_Lat : DM_Degree_Lat; + Degree_Lon : DM_Degree_Lon; + Minutes_Lat : DDM_Minutes; + Minutes_Lon : DDM_Minutes; Cardinal_Lat : Cardinal; Cardinal_Lon : Cardinal; - end record - with Dynamic_Predicate => + end record with + Dynamic_Predicate => Format_DDM.Cardinal_Lat in North | South - and then - Format_DDM.Cardinal_Lon in East | West; + and then Format_DDM.Cardinal_Lon in East | West; - -- -------------------------- -- - -- Coordinate Type Definition -- - -- -------------------------- -- + -- -------------------------- -- + -- Coordinate Type Definition -- + -- -------------------------- -- type Format is (Relative, DD, DD_Fine, DMS, DDM); type Coordinate (Form : Format := Relative) is record - case Form is + case Form is when Relative => null; when DD => @@ -92,7 +90,7 @@ is when DDM => DDM : Format_DDM; end case; - end record; + end record; -- ---------------------------- -- -- Converter / helper functions -- @@ -101,12 +99,11 @@ is -- Converter with DD target -- @name To_DD -- @return Coordinate - -- @parameter DM_Base : Coordinate - -- @description Take any coordinate and return a DD formatted coordinate. - function To_DD (DM_Base : Coordinate) return Coordinate - with Pre => - (DM_Base.Form = DD) or else - (DM_Base.Form = DMS) or else - (DM_Base.Form = DDM); + -- @parameter DM_Base : Coordinate + -- @description Take any coordinate and return a DD formatted coordinate. + function To_DD (DM_Base : Coordinate) return Coordinate with + Pre => + (DM_Base.Form = DD) or else (DM_Base.Form = DMS) + or else (DM_Base.Form = DDM); end Grl.Coordinates;