package TLE import ( "fmt" "math" "strconv" "strings" ) func NewTLE(RawTLE string) (TLE, error) { // split the TLE var SplitTLE []string = strings.Split(RawTLE, "\n") // Line One // parse the line number LineOneLinenumber, err := strconv.Atoi(string(SplitTLE[1][0])) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the line number", SplitTLE[1][1], err) } // Parse the Satellite Number SatelliteNumber, err := strconv.Atoi(SplitTLE[1][2:7]) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Satellite Number", SplitTLE[1][2:7], err) } // Parse the launch year LaunchYear, err := strconv.Atoi(SplitTLE[1][9:11]) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Launch Year", SplitTLE[1][9:11], err) } // Parse the launch number LaunchNumber, err := strconv.Atoi(SplitTLE[1][11:14]) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Launch Number", SplitTLE[1][11:14], err) } // Parse the epoch year EpochYear, err := strconv.Atoi(SplitTLE[1][18:20]) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Epoch Year", SplitTLE[1][18:20], err) } // Parse the epoch day fraction EpochDayFraction, err := strconv.ParseFloat(SplitTLE[1][20:32], 64) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Epoch Day Fraction", SplitTLE[1][20:32], err) } // Parse the First Time Derivative of the Mean Motion RawFirstDeriv := strings.TrimSpace(SplitTLE[1][33:43]) FirstDeriv, err := strconv.ParseFloat(RawFirstDeriv, 64) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the First Time Derivative of the Mean Motion", SplitTLE[1][33:43], err) } /* Parse the Second Time Derivative of the Mean Motion */ RawSecondDerivBase := strings.TrimSpace(SplitTLE[1][44:50]) SecondDerivBase, err := strconv.Atoi(RawSecondDerivBase) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Second Time Derivative of the Mean Motion Base", SplitTLE[1][44:50], err) } RawSecondDerivPower := strings.TrimSpace(SplitTLE[1][50:52]) SecondDerivPower, err := strconv.Atoi(RawSecondDerivPower) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Second Time Derivative of the Mean Motion Power", SplitTLE[1][50:52], err) } // This converts the following format: (67960-4 = 0.000067960) // Also: (00000-0 = 0.00000) SecondDeriv := float64(SecondDerivBase) / math.Pow(10, (-1*float64(SecondDerivPower))+5) /* Parse the Second Time Derivative of the Mean Motion */ RawBSTARBase := strings.TrimSpace(SplitTLE[1][53:59]) BSTARBase, err := strconv.Atoi(RawBSTARBase) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the BSTAR Drag Term Base", SplitTLE[1][53:59], err) } RawBSTARPower := strings.TrimSpace(SplitTLE[1][59:61]) BSTARPower, err := strconv.Atoi(RawBSTARPower) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the BSTAR Drag Term Power", SplitTLE[1][59:61], err) } // This converts the following format: (67960-4 = 0.000067960) // Also: (00000-0 = 0.00000) BSTAR := float64(BSTARBase) / math.Pow(10, (-1*float64(BSTARPower))+5) // Parse the Element set number RawElementSetNumber := strings.TrimSpace(SplitTLE[1][64:68]) ElementSetNumber, err := strconv.Atoi(RawElementSetNumber) if err != nil { return TLE{}, fmt.Errorf("%s: %#v\n%v", "Could not parse the Element set number", SplitTLE[1][64:68], err) } // fill the generatedTLE struct var generatedTLE TLE = TLE{ TitleLine: TitleLine{ Satname: fmt.Sprintf("%-25s", SplitTLE[0][0:24]), }, LineOne: LineOne{ Linenumber: int8(LineOneLinenumber), SatelliteNumber: SatelliteNumber, Classification: string(SplitTLE[1][7]), InternationalDesignator: InternationalDesignator{ Launchyear: int8(LaunchYear), Launchnumber: LaunchNumber, Launchpiece: string(SplitTLE[1][14]), }, Epoch: Epoch{ Year: int8(EpochYear), Dayfraction: EpochDayFraction, }, Firstderiv: FirstDeriv, Secondderiv: SecondDeriv, BSTAR: BSTAR, Numberzero: int8(SplitTLE[1][62]), ElementSetNumber: ElementSetNumber, Checksum: int8(SplitTLE[1][68]), }, LineTwo: LineTwo{}, } return generatedTLE, nil }