forked from pd0mz/go-dmr
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
207 additions
and
81 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -22,3 +22,9 @@ _testmain.go | |
*.exe | ||
*.test | ||
*.prof | ||
|
||
# Editor remains | ||
*.swp | ||
|
||
# Dump files | ||
*.dump |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
// Package dmr contains generic message structures for the Digital Mobile Radio standard | ||
package dmr | ||
|
||
import ( | ||
"fmt" | ||
|
||
"github.com/pd0mz/go-dmr/bit" | ||
) | ||
|
||
const ( | ||
InfoPartBits = 98 | ||
InfoBits = InfoPartBits * 2 | ||
SlotPartBits = 10 | ||
SlotBits = SlotPartBits * 2 | ||
PayloadPartBits = InfoPartBits + SlotPartBits | ||
PayloadBits = PayloadPartBits * 2 | ||
SignalBits = 48 | ||
BurstBits = PayloadBits + SignalBits | ||
) | ||
|
||
// Table 9.2: SYNC Patterns | ||
var SYNCPatterns = map[string]struct { | ||
ControlMode string | ||
PDU string | ||
}{ | ||
"\x07\x05\x05\x0f\x0d\x07\x0d\x0f\x07\x05\x0f\x07": {"BS sourced", "voice"}, | ||
"\x0d\x0f\x0f\x05\x07\x0d\x07\x05\x0d\x0f\x05\x0d": {"BS sourced", "data"}, | ||
"\x07\x0f\x07\x0d\x05\x0d\x0d\x05\x07\x0d\x0f\x0d": {"MS sourced", "voice"}, | ||
"\x0d\x05\x0d\x07\x0f\x07\x07\x0f\x0d\x07\x05\x07": {"MS sourced", "data"}, | ||
"\x07\x07\x0d\x05\x05\x0f\x07\x0d\x0f\x0d\x07\x07": {"MS sourced", "rc sync"}, | ||
"\x05\x0d\x05\x07\x07\x0f\x07\x07\x05\x07\x0f\x0f": {"TDMA direct mode time slot 1", "voice"}, | ||
"\x0f\x07\x0f\x0d\x0d\x05\x0d\x0d\x0f\x0d\x05\x05": {"TDMA direct mode time slot 1", "data"}, | ||
"\x07\x0d\x0f\x0f\x0d\x05\x0f\x05\x05\x0d\x05\x0f": {"TDMA direct mode time slot 2", "voice"}, | ||
"\x0d\x07\x05\x05\x07\x0f\x05\x0f\x0f\x07\x0f\x05": {"TDMA direct mode time slot 2", "data"}, | ||
"\x0d\x0d\x07\x0f\x0f\x05\x0d\x07\x05\x07\x0d\x0d": {"Reserved SYNC pattern", "reserved"}, | ||
} | ||
|
||
// Burst contains data from a single burst, see 4.2.2 Burst and frame structure | ||
type Burst struct { | ||
bits bit.Bits | ||
} | ||
|
||
func NewBurst(raw []byte) (*Burst, error) { | ||
if len(raw)*8 != BurstBits { | ||
return nil, fmt.Errorf("dmr: expected %d bits, got %d", BurstBits, len(raw)*8) | ||
} | ||
b := &Burst{} | ||
b.bits = bit.NewBits(raw) | ||
return b, nil | ||
} | ||
|
||
// Info returns the 196 bits of info in the burst. The data is usually BPTC(196, 96) encoded. | ||
func (b *Burst) Info() bit.Bits { | ||
// The info is contained in bits 0..98 and 166..216 for a total of 196 bits | ||
var n = make(bit.Bits, InfoBits) | ||
copy(n[0:InfoPartBits], b.bits[0:InfoPartBits]) | ||
copy(n[InfoPartBits:InfoBits], b.bits[InfoPartBits+SignalBits+SlotBits:BurstBits]) | ||
return n | ||
} | ||
|
||
// Payload returns the 216 bits of payload in the burst. | ||
func (b *Burst) Payload() bit.Bits { | ||
// The payload is contained in bits 0..108 and 156..264 for a total of 216 bits | ||
var p = make(bit.Bits, PayloadBits) | ||
copy(p[0:PayloadPartBits], b.bits[0:PayloadPartBits]) | ||
copy(p[PayloadPartBits:PayloadBits], b.bits[PayloadPartBits+SignalBits:BurstBits]) | ||
return p | ||
} | ||
|
||
// Signal returns the 48 bits of signal or SYNC information in the burst. | ||
func (b *Burst) Signal() bit.Bits { | ||
// The signal bits are contained in bits 108..156 for a total of 48 bits | ||
var s = make(bit.Bits, SignalBits) | ||
copy(s, b.bits[PayloadPartBits:PayloadPartBits+SignalBits]) | ||
return s | ||
} | ||
|
||
func (b *Burst) SlotType() uint32 { | ||
/* The slottype is 20 bits, starting after the payload info */ | ||
var s uint32 | ||
for i := InfoPartBits; i < InfoPartBits+SlotBits; i++ { | ||
var shift = uint32(20 - (i - InfoPartBits)) | ||
s = s | uint32(b.bits[i]<<shift) | ||
} | ||
return s | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters