kopia lustrzana https://github.com/cyoung/stratux
				
				
				
			
		
			
				
	
	
		
			76 wiersze
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
			
		
		
	
	
			76 wiersze
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"bufio"
 | |
| 	"encoding/hex"
 | |
| 	"fmt"
 | |
| 	"os"
 | |
| 	"strings"
 | |
| )
 | |
| 
 | |
| const (
 | |
| 	UPLINK_FRAME_DATA_BYTES = 432
 | |
| )
 | |
| 
 | |
| func decodeUplink(frame []byte) {
 | |
| 	raw_lat := (uint32(frame[0]) << 15) | (uint32(frame[1]) << 7) | (uint32(frame[2]) >> 1)
 | |
| 
 | |
| 	raw_lon := ((uint32(frame[2]) & 0x01) << 23) | (uint32(frame[3]) << 15) | (uint32(frame[4]) << 7) | (uint32(frame[5]) >> 1)
 | |
| 	lat := float64(raw_lat) * 360.0 / 16777216.0
 | |
| 	lon := float64(raw_lon) * 360.0 / 16777216.0
 | |
| 
 | |
| 	if lat > 90 {
 | |
| 		lat = lat - 180
 | |
| 	}
 | |
| 	if lon > 180 {
 | |
| 		lon = lon - 360
 | |
| 	}
 | |
| 	
 | |
| 	fmt.Printf("%.04f, %.04f\n", lat, lon)
 | |
| 
 | |
| }
 | |
| 
 | |
| func parseInput(buf string) {
 | |
| 	buf = strings.Trim(buf, "\r\n") // Remove newlines.
 | |
| 	x := strings.Split(buf, ";")    // We want to discard everything before the first ';'.
 | |
| 	if len(x) == 0 {
 | |
| 		return
 | |
| 	}
 | |
| 	s := x[0]
 | |
| 	if len(s) == 0 {
 | |
| 		return
 | |
| 	}
 | |
| 	if s[0] != '+' {
 | |
| 		return // Only want + ("Uplink") messages currently. - (Downlink) or messages that start with other are discarded.
 | |
| 	}
 | |
| 
 | |
| 	s = s[1:]
 | |
| 
 | |
| 	if len(s)%2 != 0 { // Bad format.
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	if len(s)/2 != UPLINK_FRAME_DATA_BYTES {
 | |
| 		fmt.Printf("UPLINK_FRAME_DATA_BYTES=%d, len(s)=%d\n", UPLINK_FRAME_DATA_BYTES, len(s))
 | |
| 		panic("Error")
 | |
| 	}
 | |
| 
 | |
| 	// Now, begin converting the string into a byte array.
 | |
| 	frame := make([]byte, UPLINK_FRAME_DATA_BYTES)
 | |
| 	hex.Decode(frame, []byte(s))
 | |
| 
 | |
| 	// Decode the frame.
 | |
| 	decodeUplink(frame)
 | |
| }
 | |
| 
 | |
| func main() {
 | |
| 	reader := bufio.NewReader(os.Stdin)
 | |
| 	for {
 | |
| 		buf, err := reader.ReadString('\n')
 | |
| 		if err != nil {
 | |
| 			break
 | |
| 		}
 | |
| 		parseInput(buf)
 | |
| 	}
 | |
| }
 |