vbantxt/packet.go
2024-11-03 15:46:14 +00:00

73 lines
1.6 KiB
Go

package vbantxt
import (
"encoding/binary"
log "github.com/sirupsen/logrus"
)
const (
vbanProtocolTxt = 0x40
streamNameSz = 16
headerSz = 4 + 1 + 1 + 1 + 1 + 16 + 4
)
var BpsOpts = []int{0, 110, 150, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 31250,
38400, 57600, 115200, 128000, 230400, 250000, 256000, 460800, 921600,
1000000, 1500000, 2000000, 3000000}
type packet struct {
name string
bpsIndex int
channel int
framecounter []byte
}
// newPacket returns a packet struct with default values, framecounter at 0.
func newPacket(streamname string) packet {
return packet{
name: streamname,
bpsIndex: 0,
channel: 0,
framecounter: make([]byte, 4),
}
}
// sr defines the samplerate for the request
func (p *packet) sr() byte {
return byte(vbanProtocolTxt + p.bpsIndex)
}
// nbc defines the channel of the request
func (p *packet) nbc() byte {
return byte(p.channel)
}
// streamname defines the stream name of the text request
func (p *packet) streamname() []byte {
b := make([]byte, streamNameSz)
copy(b, p.name)
return b
}
// header returns a fully formed packet header
func (p *packet) header() []byte {
h := make([]byte, 0, headerSz)
h = append(h, []byte("VBAN")...)
h = append(h, p.sr())
h = append(h, byte(0))
h = append(h, p.nbc())
h = append(h, byte(0x10))
h = append(h, p.streamname()...)
h = append(h, p.framecounter...)
return h
}
// bumpFrameCounter increments the frame counter by 1
func (p *packet) bumpFrameCounter() {
x := binary.LittleEndian.Uint32(p.framecounter)
binary.LittleEndian.PutUint32(p.framecounter, x+1)
log.Tracef("framecounter: %d", x)
}