(phy band.Band, r io.Reader, isUplink bool, cmd *ttnpb.MACCommand)
| 1474 | ) |
| 1475 | |
| 1476 | func (spec MACCommandSpec) read(phy band.Band, r io.Reader, isUplink bool, cmd *ttnpb.MACCommand) error { |
| 1477 | b := make([]byte, 1) |
| 1478 | _, err := r.Read(b) |
| 1479 | if err != nil { |
| 1480 | return err |
| 1481 | } |
| 1482 | |
| 1483 | cid := ttnpb.MACCommandIdentifier(b[0]) |
| 1484 | |
| 1485 | desc, ok := spec[cid] |
| 1486 | if !ok || desc == nil { |
| 1487 | b, err := io.ReadAll(r) |
| 1488 | if err != nil { |
| 1489 | return err |
| 1490 | } |
| 1491 | |
| 1492 | payload := &ttnpb.MACCommand_RawPayload{ |
| 1493 | RawPayload: b, |
| 1494 | } |
| 1495 | return cmd.SetFields(&ttnpb.MACCommand{Payload: payload, Cid: cid}, ttnpb.MACCommandFieldPathsTopLevel...) |
| 1496 | } |
| 1497 | |
| 1498 | var n uint16 |
| 1499 | var unmarshaler func(phy band.Band, b []byte, cmd *ttnpb.MACCommand) error |
| 1500 | if isUplink { |
| 1501 | n = desc.UplinkLength |
| 1502 | unmarshaler = desc.UnmarshalUplink |
| 1503 | } else { |
| 1504 | n = desc.DownlinkLength |
| 1505 | unmarshaler = desc.UnmarshalDownlink |
| 1506 | } |
| 1507 | if unmarshaler == nil { |
| 1508 | return errNoUnmarshaler.WithAttributes("cid", fmt.Sprintf("0x%X", int32(cid))) |
| 1509 | } |
| 1510 | |
| 1511 | if n == 0 { |
| 1512 | b = nil |
| 1513 | } else { |
| 1514 | b = make([]byte, n) |
| 1515 | _, err = r.Read(b) |
| 1516 | if err != nil { |
| 1517 | return err |
| 1518 | } |
| 1519 | } |
| 1520 | if err := unmarshaler(phy, b, cmd); err != nil { |
| 1521 | return errDecodingMACCommand.WithAttributes("cid", fmt.Sprintf("0x%X", int32(cid))).WithCause(err) |
| 1522 | } |
| 1523 | return nil |
| 1524 | } |
| 1525 | |
| 1526 | // ReadUplink reads an uplink MACCommand from r into cmd and returns any errors encountered. |
| 1527 | func (spec MACCommandSpec) ReadUplink(phy band.Band, r io.Reader, cmd *ttnpb.MACCommand) error { |
no test coverage detected