diff --git a/terminal/terminal.go b/terminal/terminal.go index 9e52981..70f8c83 100644 --- a/terminal/terminal.go +++ b/terminal/terminal.go @@ -35,7 +35,7 @@ type Slot struct { blocks []*dmr.DataBlock blocksExpected int blocksReceived int - header dmr.DataHeader + header *dmr.DataHeader } voice struct { lastFrame uint8 @@ -165,8 +165,7 @@ func (t *Terminal) dataBlock(p *dmr.Packet, db *dmr.DataBlock) error { if slot.data.header == nil { return errors.New("terminal: logic error, header is nil?!") } - h := slot.data.header.CommonHeader() - if h.ResponseRequested { + if slot.data.header.ResponseRequested { // Only confirmed data blocks have serial numbers stored in them. if int(db.Serial) < len(slot.data.blocks) { slot.data.blocks[db.Serial] = db @@ -201,7 +200,7 @@ func (t *Terminal) dataBlockAssemble(p *dmr.Packet) error { } if errorsFound { - _, responseOk := slot.data.header.(*dmr.ResponseDataHeader) + _, responseOk := slot.data.header.Data.(*dmr.ResponseData) switch { case responseOk: t.debugf(p, "found erroneous blocks, not sending out ACK for response") @@ -222,7 +221,7 @@ func (t *Terminal) dataBlockAssemble(p *dmr.Packet) error { if fragment.Stored > 0 { // Response with data blocks? That must be a selective ACK - if _, ok := slot.data.header.(*dmr.ResponseDataHeader); ok { + if _, ok := slot.data.header.Data.(*dmr.ResponseData); ok { // FIXME(pd0mz): deal with this shit return nil } @@ -232,7 +231,7 @@ func (t *Terminal) dataBlockAssemble(p *dmr.Packet) error { } // If we are not waiting for an ack, then the data session ended - if !slot.data.header.CommonHeader().ResponseRequested { + if !slot.data.header.ResponseRequested { return t.dataCallEnd(p) } } @@ -248,7 +247,7 @@ func (t *Terminal) dataBlockComplete(p *dmr.Packet, f *dmr.DataFragment) error { ddformat = dmr.DDFormatUTF16 ) - switch slot.data.header.CommonHeader().ServiceAccessPoint { + switch slot.data.header.ServiceAccessPoint { case dmr.ServiceAccessPointIPBasedPacketData: t.debugf(p, "SAP IP based packet data (not implemented)") break @@ -259,7 +258,7 @@ func (t *Terminal) dataBlockComplete(p *dmr.Packet, f *dmr.DataFragment) error { data = f.Data[2:] // Hytera has a 2 byte pre-padding size = f.Stored - 2 - 4 // Leave out the CRC - if sdd, ok := slot.data.header.(*dmr.ShortDataDefinedDataHeader); ok { + if sdd, ok := slot.data.header.Data.(*dmr.ShortDataDefinedData); ok { ddformat = sdd.DDFormat } break @@ -449,14 +448,14 @@ func (t *Terminal) handleData(p *dmr.Packet) error { slot.rxSequence = 0 t.debugf(p, "data header: %T", h) - switch ht := h.(type) { - case dmr.ShortDataDefinedDataHeader: - if ht.FullMessage { - slot.fullMessageBlocks = int(ht.AppendedBlocks) + switch d := h.Data.(type) { + case dmr.ShortDataDefinedData: + if d.FullMessage { + slot.fullMessageBlocks = int(d.AppendedBlocks) slot.data.blocks = make([]*dmr.DataBlock, slot.fullMessageBlocks) t.debugf(p, "expecting %d data block", slot.fullMessageBlocks) } - slot.data.blocksExpected = int(ht.AppendedBlocks) + slot.data.blocksExpected = int(d.AppendedBlocks) err = t.dataCallStart(p) break @@ -494,7 +493,7 @@ func (t *Terminal) handleRate34Data(p *dmr.Packet) error { return err } - db, err := dmr.ParseDataBlock(data, dmr.Rate34Data, slot.data.header.CommonHeader().ResponseRequested) + db, err := dmr.ParseDataBlock(data, dmr.Rate34Data, slot.data.header.ResponseRequested) if err != nil { return err }