You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2022/08/29 13:58:26 UTC

[plc4x] branch develop updated: fix(plc4go/cbus): fixed transaction not ending on reads

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 2deddcd57 fix(plc4go/cbus): fixed transaction not ending on reads
2deddcd57 is described below

commit 2deddcd57ba4489f862335f51d59c1d486c9bd5e
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Mon Aug 29 15:58:19 2022 +0200

    fix(plc4go/cbus): fixed transaction not ending on reads
---
 plc4go/internal/cbus/Reader.go | 27 +++++++++++++++------------
 1 file changed, 15 insertions(+), 12 deletions(-)

diff --git a/plc4go/internal/cbus/Reader.go b/plc4go/internal/cbus/Reader.go
index 3eaf2f9b8..7d7de8d48 100644
--- a/plc4go/internal/cbus/Reader.go
+++ b/plc4go/internal/cbus/Reader.go
@@ -135,6 +135,10 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 					}
 					return confirmation.GetConfirmation().GetAlpha().GetCharacter() == messageToSend.(readWriteModel.CBusMessageToServer).GetRequest().(readWriteModel.RequestCommand).GetAlpha().GetCharacter()
 				}, func(receivedMessage spi.Message) error {
+					defer func(transaction *spi.RequestTransaction) {
+						// This is just to make sure we don't forget to close the transaction here
+						_ = transaction.EndRequest()
+					}(transaction)
 					// Convert the response into an
 					log.Trace().Msg("convert response to ")
 					cbusMessage := receivedMessage.(readWriteModel.CBusMessage)
@@ -157,7 +161,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 						case readWriteModel.ConfirmationType_NOT_TRANSMITTED_TOO_LONG:
 							responseCode = apiModel.PlcResponseCode_INVALID_DATA
 						default:
-							panic("Every code should be mapped here")
+							return transaction.FailRequest(errors.Errorf("Every code should be mapped here: %v", replyOrConfirmationConfirmation.GetConfirmation().GetConfirmationType()))
 						}
 						log.Trace().Msgf("Was no success %s:%v", fieldNameCopy, responseCode)
 						addResponseCode(fieldNameCopy, responseCode)
@@ -236,7 +240,7 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 									case readWriteModel.LevelInformationNormalExactly:
 										plcListValues[i] = spiValues.NewPlcUSINT(levelInformation.GetActualLevel())
 									default:
-										panic("Impossible case")
+										return transaction.FailRequest(errors.Errorf("Impossible case %v", levelInformation))
 									}
 								}
 								addPlcValue(fieldNameCopy, spiValues.NewPlcList(plcListValues))
@@ -324,12 +328,14 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 								volts := identifyReplyCommand.GetVolts()
 								voltsFloat, err := strconv.ParseFloat(volts, 0)
 								if err != nil {
-									return errors.Wrap(err, "Error parsing volts")
+									addResponseCode(fieldNameCopy, apiModel.PlcResponseCode_INTERNAL_ERROR)
+									return transaction.FailRequest(errors.Wrap(err, "Error parsing volts"))
 								}
 								voltsDecimalPlace := identifyReplyCommand.GetVoltsDecimalPlace()
 								voltsDecimalPlaceFloat, err := strconv.ParseFloat(voltsDecimalPlace, 0)
 								if err != nil {
-									return errors.Wrap(err, "Error parsing volts decimal place")
+									addResponseCode(fieldNameCopy, apiModel.PlcResponseCode_INTERNAL_ERROR)
+									return transaction.FailRequest(errors.Wrap(err, "Error parsing volts decimal place"))
 								}
 								voltsFloat += voltsDecimalPlaceFloat / 10
 								addPlcValue(fieldNameCopy, spiValues.NewPlcLREAL(voltsFloat))
@@ -360,9 +366,8 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 							case readWriteModel.IdentifyReplyCommandTypeExactly:
 								addPlcValue(fieldNameCopy, spiValues.NewPlcSTRING(identifyReplyCommand.GetUnitType()))
 							default:
-								log.Error().Msgf("Unmapped type %T", identifyReplyCommand)
 								addResponseCode(fieldNameCopy, apiModel.PlcResponseCode_INVALID_DATA)
-								return transaction.EndRequest()
+								return transaction.FailRequest(errors.Errorf("Unmapped type %T", identifyReplyCommand))
 							}
 						default:
 							wbpcb := spiValues.NewWriteBufferPlcValueBased()
@@ -374,22 +379,20 @@ func (m *Reader) Read(ctx context.Context, readRequest apiModel.PlcReadRequest)
 							}
 						}
 					default:
-						panic(fmt.Sprintf("All types should be mapped here. Not mapped: %T", reply))
+						return transaction.FailRequest(errors.Errorf("All types should be mapped here. Not mapped: %T", reply))
 					}
 					return transaction.EndRequest()
 				}, func(err error) error {
-					log.Debug().Msgf("Error waiting for field %s", fieldNameCopy)
 					addResponseCode(fieldNameCopy, apiModel.PlcResponseCode_REQUEST_TIMEOUT)
-					// TODO: ok or not ok?
-					return transaction.EndRequest()
+					return transaction.FailRequest(err)
 				}, time.Second*1); err != nil {
 					log.Debug().Err(err).Msgf("Error sending message for field %s", fieldNameCopy)
 					addResponseCode(fieldNameCopy, apiModel.PlcResponseCode_INTERNAL_ERROR)
-					_ = transaction.EndRequest()
+					_ = transaction.FailRequest(errors.Errorf("timeout after %ss", time.Second*1))
 				}
 			})
 			if err := transaction.AwaitCompletion(); err != nil {
-				addResponseCode(fieldName, apiModel.PlcResponseCode_INTERNAL_ERROR)
+				log.Warn().Err(err).Msg("Error while awaiting completion")
 			}
 		}
 		readResponse := spiModel.NewDefaultPlcReadResponse(readRequest, responseCodes, plcValues)