diff --git a/internal/module/serial-client.go b/internal/module/serial-client.go index 9d9eb4e..e0e942d 100644 --- a/internal/module/serial-client.go +++ b/internal/module/serial-client.go @@ -56,12 +56,14 @@ func init() { return nil, fmt.Errorf("serial.client framing error: %w", err) } - framer := framer.GetFramer(framingMethodString) + inFramer := framer.GetFramer(framingMethodString) - if framer == nil { + if inFramer == nil { return nil, fmt.Errorf("serial.client unknown framing method: %s", framingMethodString) } + outFramer := framer.GetFramer(framingMethodString) + baudRateInt, err := params.GetInt("baudRate") if err != nil { return nil, fmt.Errorf("serial.client baudRate error: %w", err) @@ -71,7 +73,7 @@ func init() { BaudRate: baudRateInt, } - return &SerialClient{config: config, Port: portString, Framer: framer, Mode: &mode, logger: CreateLogger(config)}, nil + return &SerialClient{config: config, Port: portString, inFramer: inFramer, outFramer: outFramer, Mode: &mode, logger: CreateLogger(config)}, nil }, }) } @@ -81,7 +83,8 @@ type SerialClient struct { ctx context.Context inputHandler common.InputHandler Port string - Framer framer.Framer + inFramer framer.Framer + outFramer framer.Framer Mode *serial.Mode port serial.Port logger *slog.Logger @@ -142,13 +145,13 @@ func (sc *SerialClient) Start(ctx context.Context, inputHandler common.InputHand byteCount, err := sc.port.Read(buffer) if err != nil { - sc.Framer.Clear() + sc.inFramer.Clear() break READ } - if sc.Framer != nil { + if sc.inFramer != nil { if byteCount > 0 { - messages := sc.Framer.Decode(buffer[0:byteCount]) + messages := sc.inFramer.Decode(buffer[0:byteCount]) for _, message := range messages { if sc.inputHandler != nil { sc.inputHandler(sc.ctx, sc.Id(), message) @@ -175,7 +178,7 @@ func (sc *SerialClient) Output(ctx context.Context, payload any) error { return errors.New("serial.client can only output bytes") } - _, err := sc.port.Write(sc.Framer.Encode(payloadBytes)) + _, err := sc.port.Write(sc.outFramer.Encode(payloadBytes)) return err } @@ -188,4 +191,12 @@ func (sc *SerialClient) Stop() { if sc.port != nil { sc.port.Close() } + + if sc.inFramer != nil { + sc.inFramer.Clear() + } + + if sc.outFramer != nil { + sc.outFramer.Clear() + } } diff --git a/internal/module/tcp-client.go b/internal/module/tcp-client.go index 425b84f..07b25df 100644 --- a/internal/module/tcp-client.go +++ b/internal/module/tcp-client.go @@ -66,19 +66,22 @@ func init() { return nil, fmt.Errorf("net.tcp.client framing error: %w", err) } - framer := framer.GetFramer(framingMethodString) + inFramer := framer.GetFramer(framingMethodString) - if framer == nil { + if inFramer == nil { return nil, fmt.Errorf("net.tcp.client unknown framing method: %s", framingMethodString) } - return &TCPClient{framer: framer, Addr: addr, config: config, logger: CreateLogger(config)}, nil + + outFramer := framer.GetFramer(framingMethodString) + return &TCPClient{inFramer: inFramer, outFramer: outFramer, Addr: addr, config: config, logger: CreateLogger(config)}, nil }, }) } type TCPClient struct { config config.ModuleConfig - framer framer.Framer + inFramer framer.Framer + outFramer framer.Framer conn *net.TCPConn ctx context.Context inputHandler common.InputHandler @@ -135,9 +138,9 @@ CONNECT_RETRY: break READ } - if tc.framer != nil { + if tc.inFramer != nil { if byteCount > 0 { - messages := tc.framer.Decode(buffer[0:byteCount]) + messages := tc.inFramer.Decode(buffer[0:byteCount]) for _, message := range messages { if tc.inputHandler != nil { tc.inputHandler(tc.ctx, tc.Id(), message) @@ -172,7 +175,7 @@ func (tc *TCPClient) Output(ctx context.Context, payload any) error { if !ok { return errors.New("net.tcp.client is only able to output bytes") } - _, err := tc.conn.Write(tc.framer.Encode(payloadBytes)) + _, err := tc.conn.Write(tc.inFramer.Encode(payloadBytes)) return err } @@ -185,4 +188,12 @@ func (tc *TCPClient) Stop() { if tc.conn != nil { tc.conn.Close() } + + if tc.inFramer != nil { + tc.inFramer.Clear() + } + + if tc.outFramer != nil { + tc.outFramer.Clear() + } } diff --git a/internal/module/tcp-server.go b/internal/module/tcp-server.go index 9143b52..59e2091 100644 --- a/internal/module/tcp-server.go +++ b/internal/module/tcp-server.go @@ -81,7 +81,7 @@ func init() { if err != nil { return nil, err } - return &TCPServer{InFramer: inFramer, OutFramer: outFramer, framerType: framingMethodString, Addr: addr, config: moduleConfig, logger: CreateLogger(moduleConfig)}, nil + return &TCPServer{inFramer: inFramer, outFramer: outFramer, framerType: framingMethodString, Addr: addr, config: moduleConfig, logger: CreateLogger(moduleConfig)}, nil }, }) } @@ -94,8 +94,8 @@ type tcpConnection struct { type TCPServer struct { config config.ModuleConfig Addr *net.TCPAddr - InFramer framer.Framer - OutFramer framer.Framer + inFramer framer.Framer + outFramer framer.Framer framerType string ctx context.Context inputHandler common.InputHandler @@ -149,9 +149,9 @@ func (ts *TCPServer) handleClient(client *net.TCPConn) { } break } - if ts.InFramer != nil { + if ts.inFramer != nil { if byteCount > 0 { - messages := ts.InFramer.Decode(buffer[0:byteCount]) + messages := ts.inFramer.Decode(buffer[0:byteCount]) for _, message := range messages { if ts.inputHandler != nil { ts.inputHandler(ts.ctx, ts.Id(), message) @@ -219,11 +219,11 @@ func (ts *TCPServer) Output(ctx context.Context, payload any) error { defer ts.connectionsMu.Unlock() var errorString strings.Builder - if ts.OutFramer == nil { + if ts.outFramer == nil { return errors.New("no output framer configured") } - outputBytes := ts.OutFramer.Encode(payloadBytes) + outputBytes := ts.outFramer.Encode(payloadBytes) for _, connection := range ts.connections { _, err := connection.conn.Write(outputBytes)