in plc4go/tools/plc4xpcapanalyzer/internal/cbusanalyzer/analyzer.go [63:122]
func (a *Analyzer) PackageParse(packetInformation common.PacketInformation, payload []byte) (spi.Message, error) {
if !a.initialized {
log.Warn().Msg("Not initialized... doing that now")
a.Init()
}
cBusOptions := a.cBusOptions
log.Debug().
Stringer("packetInformation", packetInformation).
Stringer("requestContext", a.requestContext).
Stringer("cBusOptions", cBusOptions).
Bytes("payload", payload).
Msg("Parsing")
isResponse := a.isResponse(packetInformation)
if isResponse {
// Responses should have a checksum
cBusOptions = readWriteModel.NewCBusOptions(
cBusOptions.GetConnect(),
cBusOptions.GetSmart(),
cBusOptions.GetIdmon(),
cBusOptions.GetExstat(),
cBusOptions.GetMonitor(),
cBusOptions.GetMonall(),
cBusOptions.GetPun(),
cBusOptions.GetPcn(),
true,
)
}
mergeCallback := func(index int) {
log.Warn().Stringer("packetInformation", packetInformation).Int("index", index).Msg("we have a split at index")
}
currentPayload, err := a.getCurrentPayload(packetInformation, payload, mergeCallback, a.currentInboundPayloads, &a.lastParsePayload)
if err != nil {
return nil, err
}
if reflect.DeepEqual(currentPayload, a.lastParsePayload) {
return nil, common.ErrEcho
}
a.lastParsePayload = currentPayload
parse, err := readWriteModel.CBusMessageParse[readWriteModel.CBusMessage](context.TODO(), currentPayload, isResponse, a.requestContext, cBusOptions)
if err != nil {
if secondParse, err := readWriteModel.CBusMessageParse[readWriteModel.CBusMessage](context.TODO(), currentPayload, isResponse, readWriteModel.NewRequestContext(false), readWriteModel.NewCBusOptions(false, false, false, false, false, false, false, false, false)); err != nil {
log.Debug().Err(err).Msg("Second parse failed too")
return nil, errors.Wrap(err, "Error parsing CBusCommand")
} else {
log.Warn().
Stringer("packetInformation", packetInformation).
Stringer("secondParse", secondParse).
Msg("package got overridden by second parse... probably a MMI")
parse = secondParse
}
}
a.requestContext = CreateRequestContextWithInfoCallback(parse, func(infoString string) {
log.Debug().
Int("packetNumber", packetInformation.PacketNumber).
Str("infoString", infoString).
Msg("No.[packetNumber] infoString")
})
log.Debug().Stringer("parse", parse).Msg("Parsed c-bus command")
return parse, nil
}