tape: Progress on dynamically decoding OTAs

This commit is contained in:
Sasha Koshka 2025-06-28 06:23:51 -04:00
parent 08fe3d45dd
commit 37eccc91c0

View File

@ -157,7 +157,7 @@ func decodeAny(decoder *Decoder, destination reflect.Value, tag Tag) (n int, err
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
itemTag, nn, err := decoder.ReadTag() itemTag, nn, err := decoder.ReadTag()
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
value, err := skeletonValue(itemTag) value, err := skeletonValue(decoder, itemTag)
if err != nil { return n, err } if err != nil { return n, err }
nn, err = decodeAny(decoder, value.Elem(), itemTag) nn, err = decodeAny(decoder, value.Elem(), itemTag)
n += nn; if err != nil { return n, err } n += nn; if err != nil { return n, err }
@ -304,7 +304,7 @@ func decodeAndSetFloat(decoder *Decoder, destination reflect.Value, bytes int) (
// skeletonValue returns a pointer value. In order for it to be set, it must be // skeletonValue returns a pointer value. In order for it to be set, it must be
// dereferenced using Elem(). // dereferenced using Elem().
func skeletonValue(tag Tag) (reflect.Value, error) { func skeletonValue(decoder *Decoder, tag Tag) (reflect.Value, error) {
switch tag.WithoutCN() { switch tag.WithoutCN() {
case SI: case SI:
value := uint8(0) value := uint8(0)
@ -325,12 +325,20 @@ func skeletonValue(tag Tag) (reflect.Value, error) {
return reflect.Value { }, fmt.Errorf("unknown CN %d for FP", tag.CN()) return reflect.Value { }, fmt.Errorf("unknown CN %d for FP", tag.CN())
case SBA: value := []byte { }; return reflect.ValueOf(&value), nil case SBA: value := []byte { }; return reflect.ValueOf(&value), nil
case LBA: value := []byte { }; return reflect.ValueOf(&value), nil case LBA: value := []byte { }; return reflect.ValueOf(&value), nil
case OTA: value := unknownSlicePlaceholder { }; return reflect.ValueOf(&value), nil case OTA: return skeletonValueSlice(decoder, tag)
case KTV: value := map[uint16] any { }; return reflect.ValueOf(&value), nil case KTV: value := map[uint16] any { }; return reflect.ValueOf(&value), nil
} }
return reflect.Value { }, fmt.Errorf("unknown TN %d", tag.TN()) return reflect.Value { }, fmt.Errorf("unknown TN %d", tag.TN())
} }
// skeletonValueSlice returns a pointer value. In order for it to be set, it
// must be dereferenced using Elem().
func skeletonValueSlice(decoder *Decoder, tag Tag) (reflect.Value, error) {
// TODO
}
// TODO: delete fucntion below
// skeletonValueSlice returns a pointer value. In order for it to be set, it // skeletonValueSlice returns a pointer value. In order for it to be set, it
// must be dereferenced using Elem(). // must be dereferenced using Elem().
func skeletonValueSlice(tag Tag, length int) (reflect.Value, error) { func skeletonValueSlice(tag Tag, length int) (reflect.Value, error) {