/// <summary>
        /// Takes a 6-character string gridsquare and processes it using LookupTablesHelper and GridsquareHelper to return a DDMCoordinate object.
        /// If solution cannot be found a null DDMCoordinate type is returned.
        /// </summary>
        /// <param name="gridsquare"></param>
        /// <returns></returns>
        public DDMCoordinate ConvertGridsquareToDDM(string gridsquare)
        {
            DDMCoordinate DdmResult = null;

            if (!string.IsNullOrEmpty(gridsquare) && !string.IsNullOrWhiteSpace(gridsquare))
            {
                if (LookuptablesHelper.GenerateTableLookups() && GridsquareHelper.ValidateGridsquareInput(gridsquare, out string validGridsquare))
                {
                    decimal tempLatDegrees          = ConversionHelper.GetLatDegrees(LookuptablesHelper, validGridsquare, out short latDirection);
                    decimal latDegreesWithRemainder = ConversionHelper.AddLatDegreesRemainder(tempLatDegrees, latDirection, validGridsquare);
                    decimal DDMlatMinutes           = ConversionHelper.GetLatMinutes(
                        LookuptablesHelper, latDegreesWithRemainder, latDirection, validGridsquare, out decimal adjustedLatDegrees);

                    decimal tempLonDegrees          = ConversionHelper.GetLonDegrees(LookuptablesHelper, validGridsquare, out short lonDirection);
                    decimal lonDegreesWithRemainder = ConversionHelper.AddLonDegreesRemainder(tempLonDegrees, lonDirection, validGridsquare);
                    decimal DDMlonMinutes           = ConversionHelper.GetLonMinutes(
                        LookuptablesHelper, lonDegreesWithRemainder, lonDirection, validGridsquare, out decimal adjustedLonDegrees);

                    DdmResult = new DDMCoordinate(
                        adjustedLatDegrees, DDMlatMinutes,
                        adjustedLonDegrees, DDMlonMinutes);
                }
            }

            return(DdmResult);
        }
        /// <summary>
        /// Takes a DDMCoordinate objects and processes it using ConversionHelper an GridSquareHelper to return a Gridsquare string.
        /// If solution cannot be found a string with encoded error condition is returned and should be handled by the caller.
        /// </summary>
        /// <param name="ddmCoordinates"></param>
        /// <returns></returns>
        public string ConvertDDMtoGridsquare(DDMCoordinate ddmCoordinates)
        {
            if (ddmCoordinates == null)
            {
                return("BadInp");
            }

            if (false == LookuptablesHelper.GenerateTableLookups())
            {
                return("NoTbls");
            }

            var GridsquareResult = new StringBuilder();

            decimal DDMlatDegrees = ddmCoordinates.GetShortDegreesLat();
            decimal DDMlonDegrees = ddmCoordinates.GetShortDegreesLon();
            decimal DDMlatMinutes = ddmCoordinates.MinutesLattitude;
            decimal DDMlonMinutes = ddmCoordinates.MinutesLongitude;

            short LatDirection = ConversionHelper.ExtractPolarityNS(ddmCoordinates.ToString());
            short LonDirection = ConversionHelper.ExtractPolarityEW(ddmCoordinates.ToString());

            GridsquareResult.Append(GridsquareHelper.GetFirstGridsquareCharacter(DDMlonDegrees, LonDirection, out decimal remainderLon));
            GridsquareResult.Append(GridsquareHelper.GetSecondGridsquareCharacter(DDMlatDegrees, LatDirection, out decimal remainderLat));

            GridsquareResult.Append(GridSquareHelper.GetThirdGridsquareCharacter(remainderLon, LonDirection, out decimal minsRemainderLon));
            GridsquareResult.Append(GridSquareHelper.GetFourthGridsquareCharacter(remainderLat, LatDirection));

            decimal ddmLonMinsWithRemainder = LonDirection * (minsRemainderLon + DDMlonMinutes);
            decimal nearestEvenMultipleLon  = ConversionHelper.GetNearestEvenMultiple(ddmLonMinsWithRemainder, 2);

            GridsquareResult.Append(GridsquareHelper.GetFifthGridsquareCharacter(LonDirection, nearestEvenMultipleLon));

            decimal ddmLatMinsWithRemainder = LatDirection * DDMlatMinutes;
            decimal nearestEvenMultipleLat  = ConversionHelper.GetNearestEvenMultiple(ddmLatMinsWithRemainder, 1);

            GridsquareResult.Append(GridsquareHelper.GetSixthGridsquareCharacter(LatDirection, nearestEvenMultipleLat));

            if (GridsquareResult.Length != 6)
            {
                return("NoCalc");
            }

            return(GridsquareResult.ToString());
        }