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 IsBroadcast(dst EncodedCallsign) bool
- func IsParrot(dst EncodedCallsign) bool
- 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) SetCAN(can byte)
- 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 Probe
- 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 IsBroadcast ¶ added in v0.8.0
func IsBroadcast(dst EncodedCallsign) bool
IsBroadcast reports whether dst is a broadcast: the broadcast address (@ALL), or the callsigns ALL or #ALL.
func IsParrot ¶ added in v0.8.0
func IsParrot(dst EncodedCallsign) bool
IsParrot reports whether dst is PARROT. Like mrefd, any callsign containing PARROT counts.
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) CAN ¶
CAN returns the Channel Access Number: Type[0] bits 2–0, then Type[1] bit 7 (spec 2.0; the 3.0 draft moves it to the low nibble of Type[1]).
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) SetCAN ¶ added in v0.9.0
SetCAN puts the low four bits of can where CAN reads them, keeping the other TYPE bits, and updates the CRC.
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 ¶
NewPacketFromBytes parses an LSF followed by a packet type, payload and CRC. The input comes from RF or the network, so its length is checked before slicing: a short buffer would otherwise panic and take the process down.
func ParrotReply ¶ added in v0.8.0
ParrotReply returns a reflector's reply to a packet sent to PARROT: the same packet readdressed to broadcast, as mrefd sends it. pkt is not changed.
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 Probe ¶ added in v0.8.0
type Probe struct {
// contains filtered or unexported fields
}
A Probe is a raw packet to PARROT carrying a random tag.
func NewProbe ¶ added in v0.8.0
func NewProbe() Probe
NewProbe returns a probe with a new random tag.
func (Probe) IsReply ¶ added in v0.8.0
IsReply reports whether pkt is the reply to the probe. Only the payload is compared: the reflector readdresses the reply to broadcast.
func (Probe) Packet ¶ added in v0.8.0
func (p Probe) Packet(src EncodedCallsign) Packet
Packet returns the probe as a packet from src, with valid LSF and payload CRCs (mrefd answers a packet with a bad CRC with an SMS saying so, not an echo).
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)
DecodePunctured depunctures and decodes soft bits. It returns the decoded bytes and the path cost in bits: how far the received soft bits sat from the decoded path, summed over the bits actually received. A punctured bit is filled with SoftMaybe, which adds half a bit to every path whatever was sent, so that is subtracted here, as libm17 does.
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
|
|