.ksy
我为两种非常相似的 Digilent 日志文件格式创建了 Kaitai 结构。第二种格式 ( openlogger
) 是第一种格式 ( ) 的扩展,openscope
结构中有两个附加字段。示波器基本上是一个单通道记录器;额外的记录器字段描述了活动通道的数量(a u1
,最大 8)和采样顺序映射的通道(a u1 x 8
)。
我试图通过为num_channels
and合成始终存在的字段来协调两种格式的界面channel_map
;这对于该num_channels
实例来说效果很好。但是我不知道如何为通道图创建一个合适的值,.ksy
下面报错:
/types/body/types/header/instances/channel_order/value: can't combine output types: ArrayType(Int1Type(false)) vs CalcBytesType
我不知道如何将if_false
部分 ( [0]
) 表示为 ArrayType。
有没有更好的方法来解决这个问题?
meta:
id: dlog
file-extension: dlog
seq:
- id: endianness
type: u1
doc: 0 - little endian 1 - big endian
- id: body
type: body
types:
body:
meta:
endian:
switch-on: _root.endianness
cases:
0: le
1: be
seq:
- id: header
type: header
instances:
data:
pos: header.start_of_data
type: data
types:
header:
seq:
- id: sample_size
type: u1
- id: header_size
type: u2
- id: start_of_data
type: u2
- id: dlog_format
type: u2
enum: dlog_formats
- id: dlog_version
type: u4
- id: voltage_units
type: u8
- id: stop_reason
type: u4
enum: stop_reasons
#...
- id: num_openlogger_channels
type: u4
if: dlog_format == dlog_formats::openlogger
doc: number of channels per sample
- id: openlogger_channel_map
type: u1
repeat: expr
repeat-expr: 8
if: dlog_format == dlog_formats::openlogger
doc: channel order
instances:
num_channels:
value: 'dlog_format == dlog_formats::openlogger ? num_openlogger_channels : 1'
channel_map:
value: 'dlog_format == dlog_formats::openlogger ? openlogger_channel_map : [0]'
data:
seq:
- id: samples
type: sample
repeat: eos
types:
sample:
seq:
- id: channel
type:
switch-on: _root.body.header.sample_size
cases:
1: s1
2: s2
4: s4
repeat: expr
repeat-expr: _root.body.header.num_channels
enums:
dlog_formats:
1: openscope
3: openlogger
stop_reasons:
0: normal
1: forced
2: error
3: overflow
4: unknown