Documentation
¶
Index ¶
- Constants
- Variables
- func CRC(in []byte) uint16
- func CalculateHammingDistance(a, b uint32) int
- func CalculateSyndrome(codeword uint32) uint16
- func DecodeCallsign(encoded []byte) (string, error)
- func DecodeLICH(inp []SoftBit) []byte
- func Encode24(data uint16) uint32
- func EncodeLICH(inp []uint8) []byte
- func EuclNorm(s1, s2 []Symbol, n int) float64
- func GetErrorCorrectionCapability() int
- func GetMinimumDistance() int
- func HardDecode24(codeword uint32) (uint16, error)
- func IntToSoft(out []SoftBit, value uint16, size uint8)
- func IsValidCodeword(codeword uint32) bool
- func NormalizeCallsignModule(callsign string) string
- func SoftCalcChecksum(out, value []SoftBit)
- func SoftDecode24(codeword [24]SoftBit) uint16
- func SoftDetectErrors(codeword []SoftBit) uint32
- func SoftPopCount(in []uint16, size uint8) uint32
- func SoftToInt(in []SoftBit, size uint8) uint16
- func SoftXOR(out, a, b []SoftBit, size uint8)
- func SyncDistance(symbols []Symbol, offset int, sps int) (float32, uint16)
- type Bit
- type Decoder
- type ECD
- type EncodedCallsign
- type GNSS
- type LSF
- func (l *LSF) CAN() byte
- func (l *LSF) CalcCRC() uint16
- func (l *LSF) CheckCRC() bool
- func (l *LSF) DataType() LSFDataType
- func (l *LSF) ECD() *ECD
- func (l *LSF) EncryptionSubtype() byte
- func (l *LSF) EncryptionType() LSFEncryptionType
- func (l *LSF) GNSS() *GNSS
- func (l *LSF) LSFType() LSFType
- func (l *LSF) SetECD(slot1, slot2 *EncodedCallsign)
- func (l LSF) String() string
- func (l *LSF) ToBytes() []byte
- func (l *LSF) ToLSDBytes() []byte
- type LSFDataType
- type LSFEncryptionType
- type LSFType
- type Packet
- type PacketType
- type PayloadBits
- type Preamble
- type PuncturePattern
- type SoftBit
- type StreamDatagram
- type Symbol
- type ViterbiDecoder
Constants ¶
const ( SymbolsPerSyncword = 8 //symbols per syncword SymbolsPerPayload = 184 //symbols per payload in a frame SymbolsPerFrame = 192 //symbols per whole 40 ms frame, 40ms * 4800 = 192 BytesPerFrame = SymbolsPerFrame * BitsPerSymbol / 8 BitsPerSymbol = 2 BitsPerPayload = SymbolsPerPayload * BitsPerSymbol FrameTime = 40 * time.Millisecond FramesPerSecond = time.Second / FrameTime )
const ( PacketModeFinalBit = 5 // use 6 bits of final byte LSFFinalBit = 7 // use entire final byte )
const ( ConvolutionK = 5 //constraint length K=5 ConvolutionStates = (1 << (ConvolutionK - 1)) //number of states of the convolutional encoder )
const ( SoftTrue = 0xFFFF SoftMaybe = SoftTrue / 2 SoftFalse = 0 )
const ( LSFSync = uint16(0x55F7) StreamSync = uint16(0xFF5D) PacketSync = uint16(0x75FF) BERTSync = uint16(0xDF55) EOTMarker = uint16(0x555D) )
const ( EncodedCallsignLen = 6 MaxCallsignLen = 9 DestinationAll = "@ALL" EncodedDestinationAll = 0xFFFFFFFFFFFF MaxEncodedCallsign = 0xEE6B27FFFFFF SpecialEncodedRange = 268697600000000 //40^9+40^8 )
const ( // SoftZero represents a confident 0 bit SoftZero = 0x0000 // SoftOne represents a confident 1 bit SoftOne = 0xFFFF // SoftErasure represents an uncertain/erased bit SoftErasure = 0x7FFF // SoftThreshold is the decision boundary SoftThreshold = 0x7FFF )
Constants for soft-decision logic
const ( LSFLen = 30 LSDLen = 28 )
const ( MagicLen = 4 MagicACKN = "ACKN" MagicCONN = "CONN" MagicDISC = "DISC" MagicLSTN = "LSTN" MagicNACK = "NACK" MagicPING = "PING" MagicPONG = "PONG" MagicM17Stream = "M17 " MagicM17Packet = "M17P" )
M17_inet datagram magics. They are part of the wire format of StreamDatagram, so they live with the protocol.
const CRCLen = 2
const ErrorDetectionFailed = 0xFFFFFFFF
ErrorDetectionFailed indicates the decoder could not correct the errors
Variables ¶
var ( // TX symbols SymbolMap = []Symbol{+1, +3, -1, -3} // symbol list (RX) SymbolList = []Symbol{-3, -1, +1, +3} // End of Transmission symbol pattern EOTSymbols = []Symbol{+3, +3, +3, +3, +3, +3, -3, +3} )
var ( LSFPreambleSymbols = []float64{+3, -3, +3, -3, +3, -3, +3, -3} LSFSyncSymbols = []float64{+3, +3, +3, +3, -3, -3, +3, -3} // 0x55F7 ExtLSFSyncSymbols = append(LSFPreambleSymbols, LSFSyncSymbols...) StreamSyncSymbols = []float64{-3, -3, -3, -3, +3, +3, -3, +3} // 0xFF5D PacketSyncSymbols = []float64{+3, -3, +3, +3, -3, -3, -3, -3} // 0x75FF BERTSyncSymbols = []float64{-3, +3, -3, -3, +3, +3, +3, +3} // 0xDF55 EOTMarkerSymbols = []float64{+3, +3, +3, +3, +3, +3, -3, +3} // 0x555D )
var ( LSFSyncBytes = []byte{0x55, 0xF7} StreamSyncBytes = []byte{0xFF, 0x5D} PacketSyncBytes = []byte{0x75, 0xFF} BERTSyncBytes = []byte{0xDF, 0x55} EOTMarkerBytes = []byte{0x55, 0x5D} )
var CallsignRegex = regexp.MustCompile(`([a-zA-Z0-9]{1,3}/)?[a-zA-Z0-9]{1,3}[0-9][a-zA-Z0-9]{0,3}[a-zA-Z](/[a-zA-Z0-9]{1,3})?`)
var EncodedDestinationAllBytes = EncodedCallsign{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}
var LSFPuncturePattern = PuncturePattern{ true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, true, false, true, true, }
var PacketPuncturePattern = PuncturePattern{true, true, true, true, true, true, true, false}
Functions ¶
func CalculateHammingDistance ¶
CalculateHammingDistance calculates the Hamming distance between two codewords
func CalculateSyndrome ¶
CalculateSyndrome calculates the syndrome for error detection
func DecodeCallsign ¶
func DecodeLICH ¶
DecodeLICH decodes LICH into a 6-byte array inp: pointer to an array of 96 soft bits
func Encode24 ¶
Encode24 encodes a 12-bit value with Golay(24, 12) data: 12-bit input value (right justified) returns: 24-bit Golay codeword
func EncodeLICH ¶
EncodeLICH encodes 6 bytes into 12 bytes using Golay encoding
func GetErrorCorrectionCapability ¶
func GetErrorCorrectionCapability() int
GetErrorCorrectionCapability returns the maximum number of errors that can be corrected
func GetMinimumDistance ¶
func GetMinimumDistance() int
GetMinimumDistance returns the minimum Hamming distance of the code
func HardDecode24 ¶
HardDecode24 performs hard-decision decoding of a Golay(24,12) codeword This is a simpler version that works with hard bits (0 or 1)
func IsValidCodeword ¶
IsValidCodeword checks if a 24-bit word is a valid Golay codeword
func NormalizeCallsignModule ¶
For regular callsigns, if the callsign ends with a space followed by a module letter, put the module letter in position 9 (the convention) with spaces preceding it
func SoftCalcChecksum ¶
func SoftCalcChecksum(out, value []SoftBit)
SoftCalcChecksum calculates checksum for soft-valued data This follows the C implementation exactly
func SoftDecode24 ¶
SoftDecode24 performs soft decode of Golay(24, 12) codeword
func SoftDetectErrors ¶
SoftDetectErrors detects errors in a soft-valued Golay(24, 12) codeword
func SoftPopCount ¶
SoftPopCount performs soft-valued equivalent of popcount
Types ¶
type Bit ¶
type Bit bool
func ConvolutionalEncode ¶
func ConvolutionalEncode(in []byte, puncturePattern PuncturePattern, finalBit byte) ([]Bit, error)
ConvolutionalEncode takes a slice of bytes and a puncture pattern and returns an a slice of bool with each element representing one bit in the encoded message
in Input bytes puncturePattern the puncture pattern to use finalBit The last bit of the final byte to encode. A number between 0 and 7. (That is, the number of bits from the last byte to use minus one.)
func ConvolutionalEncodeStream ¶
func ConvolutionalEncodeStream(lichBits []Bit, sd StreamDatagram) ([]Bit, error)
type Decoder ¶
type Decoder struct {
// contains filtered or unexported fields
}
func NewDecoder ¶
func NewDecoder( receivedRFLSF func(lsf LSF, ber float64) error, receivedRFStream func(lsf LSF, payload []byte, sid, fn uint16, ber float64) error, receivedRFStreamLICH func(lsf LSF, ber float64) error, receivedRFStreamEOT func(lsf LSF, sid, fn uint16, ber float64) error, receivedRFPacket func(lsf LSF, payload []byte, ber float64) error, ) *Decoder
func (*Decoder) DecodeFrame ¶ added in v0.2.0
type ECD ¶ added in v0.1.21
type ECD struct {
Callsign1 *EncodedCallsign
Callsign2 *EncodedCallsign
}
func NewECDFromMeta ¶ added in v0.1.21
type EncodedCallsign ¶
type EncodedCallsign [EncodedCallsignLen]byte
func EncodeCallsign ¶
func EncodeCallsign(callsign string) (*EncodedCallsign, error)
func (EncodedCallsign) Callsign ¶
func (e EncodedCallsign) Callsign() string
type GNSS ¶ added in v0.1.21
type GNSS struct {
DataSource byte
StationType byte
Radius byte
Bearing uint16
Latitude float32
Longitude float32
Altitude float32
Speed float32
ValidLatLon bool
ValidAltitude bool
ValidBearingSpeed bool
ValidRadius bool
}
func NewGNSSFromMeta ¶ added in v0.1.21
type LSF ¶
type LSF struct {
Dst EncodedCallsign
Src EncodedCallsign
Type [typeLen]byte
Meta [metaLen]byte
CRC [CRCLen]byte
}
Link Setup Frame
func NewEmptyLSF ¶
func NewEmptyLSF() LSF
func NewLSFFromBytes ¶
func NewLSFFromLSD ¶
func (*LSF) DataType ¶ added in v0.1.21
func (l *LSF) DataType() LSFDataType
func (*LSF) EncryptionSubtype ¶ added in v0.1.21
func (*LSF) EncryptionType ¶ added in v0.1.21
func (l *LSF) EncryptionType() LSFEncryptionType
func (*LSF) SetECD ¶ added in v0.2.11
func (l *LSF) SetECD(slot1, slot2 *EncodedCallsign)
Replace META with Extended Callsign Data
func (*LSF) ToLSDBytes ¶
Convert this LSF to a byte slice suitable for transmission
type LSFDataType ¶
type LSFDataType byte
const ( LSFDataTypeReserved LSFDataType = iota LSFDataTypeData LSFDataTypeVoice LSFDataTypeVoiceData )
func (LSFDataType) String ¶ added in v0.1.21
func (t LSFDataType) String() string
type LSFEncryptionType ¶
type LSFEncryptionType byte
const ( LSFEncryptionTypeNone LSFEncryptionType = iota LSFEncryptionTypeScrambler LSFEncryptionTypeAES LSFEncryptionTypeOther )
func (LSFEncryptionType) String ¶ added in v0.1.21
func (t LSFEncryptionType) String() string
type Packet ¶
type Packet struct {
LSF *LSF
Type PacketType
Payload []byte
CRC uint16
}
M17 packet
func NewPacketFromBytes ¶
func (*Packet) PayloadBytes ¶
Convert the payload (type, message and CRC) to a byte slice suitable for transmission
type PacketType ¶
type PacketType rune
const ( PacketTypeRAW PacketType = 0x00 PacketTypeAX25 PacketType = 0x01 PacketTypeAPRS PacketType = 0x02 PacketType6LoWPAN PacketType = 0x03 PacketTypeIPv4 PacketType = 0x04 PacketTypeSMS PacketType = 0x05 PacketTypeWinlink PacketType = 0x06 )
type PayloadBits ¶ added in v0.2.0
type PayloadBits [BitsPerPayload]Bit
func NewPayloadBits ¶ added in v0.2.0
func NewPayloadBits(bs []Bit) *PayloadBits
func RandomizeBits ¶
func RandomizeBits(bits *PayloadBits) *PayloadBits
type PuncturePattern ¶
type PuncturePattern []Bit
type SoftBit ¶
type SoftBit uint16
func CalcSoftbits ¶ added in v0.6.0
func DeinterleaveSoftBits ¶
func DerandomizeSoftBits ¶
func SoftBitXOR ¶
SoftBitXOR performs XOR operation on soft-valued bits This should match the C test expectations exactly
type StreamDatagram ¶
type StreamDatagram struct {
StreamID uint16
FrameNumber uint16
LastFrame bool
LSF *LSF
Payload [16]byte
}
func NewStreamDatagram ¶
func NewStreamDatagram(streamID uint16, frameNumber uint16, lsf *LSF, payload []byte) StreamDatagram
func NewStreamDatagramFromBytes ¶ added in v0.1.23
func NewStreamDatagramFromBytes(buffer []byte) (StreamDatagram, error)
func (StreamDatagram) String ¶ added in v0.1.23
func (sd StreamDatagram) String() string
func (StreamDatagram) ToBytes ¶ added in v0.1.23
func (sd StreamDatagram) ToBytes() []byte
type Symbol ¶
type Symbol float32
func AppendBits ¶
func AppendBits(out []Symbol, data *PayloadBits) []Symbol
func AppendPreamble ¶
AppendPreamble generates symbol stream for a preamble.
func AppendSyncwordSymbols ¶ added in v0.2.0
AppendSyncwordSymbols generates the symbol stream for a syncword.
type ViterbiDecoder ¶
type ViterbiDecoder struct {
// contains filtered or unexported fields
}
func (*ViterbiDecoder) DecodePunctured ¶
func (v *ViterbiDecoder) DecodePunctured(puncturedSoftBits []SoftBit, puncturePattern PuncturePattern) ([]byte, int)
func (*ViterbiDecoder) Init ¶
func (v *ViterbiDecoder) Init(l int)
Source Files
¶
Directories
¶
| Path | Synopsis |
|---|---|
|
cmd
|
|
|
m17-bridge
command
|
|
|
m17-gateway
command
|
|
|
m17-inet
command
|
|
|
m17-message
command
|
|
|
m17-text-cli
command
|
|
|
modem-emulator
command
|
|