From 98cd6ae3e02ddeb0db17ef906bc885ddef0eacbd Mon Sep 17 00:00:00 2001 From: Tobias Jaster Date: Wed, 15 Apr 2026 20:22:08 +0000 Subject: [PATCH 1/2] Dependency Update --- .devcontainer/Dockerfile | 13 ++- .devcontainer/devcontainer.json | 10 +- common/generic.go | 22 ---- .../generated/canopenrest/canopenrest.go | 104 +++++++++++------ .../generated/canopenrest/generate.go | 4 + .../generated/canopenrest/generate.yaml | 6 + .../generated/canopenrest/openapi.yaml | 27 +++-- .../persistence/filestorage/filestorage.go | 21 ++-- go.mod | 37 +++--- go.sum | 110 +++++++++--------- usecases/canopenuc/canopenuc.go | 36 +++--- 11 files changed, 218 insertions(+), 172 deletions(-) create mode 100644 external/echoserver/generated/canopenrest/generate.go create mode 100644 external/echoserver/generated/canopenrest/generate.yaml diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index 66e6423..ba7c034 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -10,21 +10,22 @@ RUN apt-get install -y ca-certificates openssl wget git git-lfs tar gnupg2 gcc RUN wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz \ && tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz -ENV PATH /usr/local/go/bin:$PATH +ENV PATH=/usr/local/go/bin:$PATH -ENV GOPATH /go -ENV PATH $GOPATH/bin:$PATH +ENV GOPATH=/go +ENV PATH=$GOPATH/bin:$PATH RUN mkdir -p "$GOPATH/src" "$GOPATH/bin" && chmod -R 1777 "$GOPATH" WORKDIR $GOPATH RUN go install -v golang.org/x/tools/gopls@latest \ && go install github.com/go-delve/delve/cmd/dlv@latest \ && go install honnef.co/go/tools/cmd/staticcheck@latest \ + && go install golang.org/x/vuln/cmd/govulncheck@latest \ && go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest \ - && go install gotest.tools/gotestsum@latest + && go install gotest.tools/gotestsum@latest \ + && go install github.com/segmentio/golines@latest FROM base AS dev RUN go install github.com/pact-foundation/pact-go/v2@v2.0.2 \ && go install github.com/CycloneDX/cyclonedx-gomod/cmd/cyclonedx-gomod@latest \ - && go install github.com/google/go-licenses@latest \ - && go install golang.org/x/vuln/cmd/govulncheck@latest + && go install github.com/google/go-licenses@latest diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 88793e5..b5b0844 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,14 +1,18 @@ { "name": "CANOPENREST", - "image": "devcontainer-go-dev:latest", + "image": "ghcr.io/jaster-prj/devcontainer-go-base:latest", "runArgs": [ - "--name=CANOPENREST_Devcontainer" + "--name", + "CANOPENREST_Devcontainer" ], "customizations": { // Configure properties specific to VS Code. "vscode": { // Add the IDs of extensions you want installed when the container is created. - "extensions": ["golang.Go"], + "extensions": [ + "golang.Go", + "stkb.rewrap" + ], "settings": { "extensions.verifySignature": false } diff --git a/common/generic.go b/common/generic.go index e4600ce..af894dd 100644 --- a/common/generic.go +++ b/common/generic.go @@ -4,18 +4,6 @@ import ( "reflect" ) -func POINTER[T any](val T) *T { - return &val -} - -func NEWSTRINGPOINTER[T *string](val T) T { - if val == nil { - return nil - } - tmp := *val - return &tmp -} - func MATCHSLICES[T any](slice1 []T, slice2 []T) []T { return_slice := []T{} for _, value1 := range slice1 { @@ -27,13 +15,3 @@ func MATCHSLICES[T any](slice1 []T, slice2 []T) []T { } return return_slice } - -// CONTAINS checks if list contains e -func CONTAINS[C comparable](list []C, e C) bool { - for _, element := range list { - if element == e { - return true - } - } - return false -} diff --git a/external/echoserver/generated/canopenrest/canopenrest.go b/external/echoserver/generated/canopenrest/canopenrest.go index 54a771e..747ea5d 100644 --- a/external/echoserver/generated/canopenrest/canopenrest.go +++ b/external/echoserver/generated/canopenrest/canopenrest.go @@ -1,6 +1,6 @@ // Package canopenrest provides primitives to interact with the openapi HTTP API. // -// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.4.1 DO NOT EDIT. +// Code generated by github.com/oapi-codegen/oapi-codegen/v2 version v2.6.0 DO NOT EDIT. package canopenrest import ( @@ -18,6 +18,42 @@ import ( "github.com/oapi-codegen/runtime" ) +// Defines values for PostNMTTextBody. +const ( + INITIALISING PostNMTTextBody = "INITIALISING" + OPERATIONAL PostNMTTextBody = "OPERATIONAL" + PREOPERATIONAL PostNMTTextBody = "PRE-OPERATIONAL" + RESET PostNMTTextBody = "RESET" + RESETCOMMUNICATION PostNMTTextBody = "RESET COMMUNICATION" + SLEEP PostNMTTextBody = "SLEEP" + STANDBY PostNMTTextBody = "STANDBY" + STOPPED PostNMTTextBody = "STOPPED" +) + +// Valid indicates whether the value is a known member of the PostNMTTextBody enum. +func (e PostNMTTextBody) Valid() bool { + switch e { + case INITIALISING: + return true + case OPERATIONAL: + return true + case PREOPERATIONAL: + return true + case RESET: + return true + case RESETCOMMUNICATION: + return true + case SLEEP: + return true + case STANDBY: + return true + case STOPPED: + return true + default: + return false + } +} + // GetFlashParams defines parameters for GetFlash. type GetFlashParams struct { // Id uuid of TestOrder @@ -39,8 +75,8 @@ type GetNMTParams struct { Node string `form:"node" json:"node"` } -// PostNMTJSONBody defines parameters for PostNMT. -type PostNMTJSONBody = string +// PostNMTTextBody defines parameters for PostNMT. +type PostNMTTextBody string // PostNMTParams defines parameters for PostNMT. type PostNMTParams struct { @@ -81,8 +117,8 @@ type PostSDOParams struct { Subindex *int `form:"subindex,omitempty" json:"subindex,omitempty"` } -// PostNMTJSONRequestBody defines body for PostNMT for application/json ContentType. -type PostNMTJSONRequestBody = PostNMTJSONBody +// PostNMTTextRequestBody defines body for PostNMT for text/plain ContentType. +type PostNMTTextRequestBody PostNMTTextBody // PostSDOTextRequestBody defines body for PostSDO for text/plain ContentType. type PostSDOTextRequestBody = PostSDOTextBody @@ -125,7 +161,7 @@ func (w *ServerInterfaceWrapper) GetFlash(ctx echo.Context) error { var params GetFlashParams // ------------- Required query parameter "id" ------------- - err = runtime.BindQueryParameter("form", true, true, "id", ctx.QueryParams(), ¶ms.Id) + err = runtime.BindQueryParameterWithOptions("form", true, true, "id", ctx.QueryParams(), ¶ms.Id, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter id: %s", err)) } @@ -143,14 +179,14 @@ func (w *ServerInterfaceWrapper) PostFlash(ctx echo.Context) error { var params PostFlashParams // ------------- Required query parameter "node" ------------- - err = runtime.BindQueryParameter("form", true, true, "node", ctx.QueryParams(), ¶ms.Node) + err = runtime.BindQueryParameterWithOptions("form", true, true, "node", ctx.QueryParams(), ¶ms.Node, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter node: %s", err)) } // ------------- Optional query parameter "version" ------------- - err = runtime.BindQueryParameter("form", true, false, "version", ctx.QueryParams(), ¶ms.Version) + err = runtime.BindQueryParameterWithOptions("form", true, false, "version", ctx.QueryParams(), ¶ms.Version, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter version: %s", err)) } @@ -168,7 +204,7 @@ func (w *ServerInterfaceWrapper) GetNMT(ctx echo.Context) error { var params GetNMTParams // ------------- Required query parameter "node" ------------- - err = runtime.BindQueryParameter("form", true, true, "node", ctx.QueryParams(), ¶ms.Node) + err = runtime.BindQueryParameterWithOptions("form", true, true, "node", ctx.QueryParams(), ¶ms.Node, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter node: %s", err)) } @@ -186,7 +222,7 @@ func (w *ServerInterfaceWrapper) PostNMT(ctx echo.Context) error { var params PostNMTParams // ------------- Required query parameter "node" ------------- - err = runtime.BindQueryParameter("form", true, true, "node", ctx.QueryParams(), ¶ms.Node) + err = runtime.BindQueryParameterWithOptions("form", true, true, "node", ctx.QueryParams(), ¶ms.Node, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter node: %s", err)) } @@ -204,7 +240,7 @@ func (w *ServerInterfaceWrapper) PostNode(ctx echo.Context) error { var params PostNodeParams // ------------- Required query parameter "node" ------------- - err = runtime.BindQueryParameter("form", true, true, "node", ctx.QueryParams(), ¶ms.Node) + err = runtime.BindQueryParameterWithOptions("form", true, true, "node", ctx.QueryParams(), ¶ms.Node, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter node: %s", err)) } @@ -222,21 +258,21 @@ func (w *ServerInterfaceWrapper) GetSDO(ctx echo.Context) error { var params GetSDOParams // ------------- Required query parameter "node" ------------- - err = runtime.BindQueryParameter("form", true, true, "node", ctx.QueryParams(), ¶ms.Node) + err = runtime.BindQueryParameterWithOptions("form", true, true, "node", ctx.QueryParams(), ¶ms.Node, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter node: %s", err)) } // ------------- Required query parameter "index" ------------- - err = runtime.BindQueryParameter("form", true, true, "index", ctx.QueryParams(), ¶ms.Index) + err = runtime.BindQueryParameterWithOptions("form", true, true, "index", ctx.QueryParams(), ¶ms.Index, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter index: %s", err)) } // ------------- Optional query parameter "subindex" ------------- - err = runtime.BindQueryParameter("form", true, false, "subindex", ctx.QueryParams(), ¶ms.Subindex) + err = runtime.BindQueryParameterWithOptions("form", true, false, "subindex", ctx.QueryParams(), ¶ms.Subindex, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter subindex: %s", err)) } @@ -254,21 +290,21 @@ func (w *ServerInterfaceWrapper) PostSDO(ctx echo.Context) error { var params PostSDOParams // ------------- Required query parameter "node" ------------- - err = runtime.BindQueryParameter("form", true, true, "node", ctx.QueryParams(), ¶ms.Node) + err = runtime.BindQueryParameterWithOptions("form", true, true, "node", ctx.QueryParams(), ¶ms.Node, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter node: %s", err)) } // ------------- Required query parameter "index" ------------- - err = runtime.BindQueryParameter("form", true, true, "index", ctx.QueryParams(), ¶ms.Index) + err = runtime.BindQueryParameterWithOptions("form", true, true, "index", ctx.QueryParams(), ¶ms.Index, runtime.BindQueryParameterOptions{Type: "string", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter index: %s", err)) } // ------------- Optional query parameter "subindex" ------------- - err = runtime.BindQueryParameter("form", true, false, "subindex", ctx.QueryParams(), ¶ms.Subindex) + err = runtime.BindQueryParameterWithOptions("form", true, false, "subindex", ctx.QueryParams(), ¶ms.Subindex, runtime.BindQueryParameterOptions{Type: "integer", Format: ""}) if err != nil { return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter subindex: %s", err)) } @@ -319,22 +355,24 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "/xfu7+lHEgAA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/external/echoserver/generated/canopenrest/generate.go b/external/echoserver/generated/canopenrest/generate.go new file mode 100644 index 0000000..bc417ef --- /dev/null +++ b/external/echoserver/generated/canopenrest/generate.go @@ -0,0 +1,4 @@ +package canopenrest + +//go:generate go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@latest +//go:generate oapi-codegen --config=generate.yaml openapi.yaml diff --git a/external/echoserver/generated/canopenrest/generate.yaml b/external/echoserver/generated/canopenrest/generate.yaml new file mode 100644 index 0000000..d557921 --- /dev/null +++ b/external/echoserver/generated/canopenrest/generate.yaml @@ -0,0 +1,6 @@ +package: canopenrest +generate: + echo-server: true + models: true + embedded-spec: true +output: canopenrest.go \ No newline at end of file diff --git a/external/echoserver/generated/canopenrest/openapi.yaml b/external/echoserver/generated/canopenrest/openapi.yaml index c00c68c..8d10024 100644 --- a/external/echoserver/generated/canopenrest/openapi.yaml +++ b/external/echoserver/generated/canopenrest/openapi.yaml @@ -9,7 +9,7 @@ info: license: name: Apache 2.0 url: http://www.apache.org/licenses/LICENSE-2.0.html - version: 0.1.0 + version: 0.1.1 servers: - url: /canopenrest/api/v1 - url: "{url}" @@ -36,7 +36,7 @@ paths: '200': description: successful operation content: - application/json: + text/plain: schema: type: string '400': @@ -57,9 +57,18 @@ paths: pattern: '^(0[x])?[A-F0-9]+$' requestBody: content: - application/json: + text/plain: schema: type: string + enum: + - OPERATIONAL + - STOPPED + - SLEEP + - STANDBY + - PRE-OPERATIONAL + - INITIALISING + - RESET + - RESET COMMUNICATION responses: '200': description: successful operation @@ -97,13 +106,13 @@ paths: '200': description: successful operation content: - application/octet-stream: + text/plain: schema: type: string - format: binary - text/plain: + application/octet-stream: schema: type: string + format: binary '400': description: Invalid tag value post: @@ -135,13 +144,13 @@ paths: type: integer requestBody: content: - application/octet-stream: + text/plain: schema: type: string - format: binary - text/plain: + application/octet-stream: schema: type: string + format: binary responses: '200': description: Successful operation diff --git a/external/persistence/filestorage/filestorage.go b/external/persistence/filestorage/filestorage.go index 4ff2ee3..9415b55 100644 --- a/external/persistence/filestorage/filestorage.go +++ b/external/persistence/filestorage/filestorage.go @@ -1,6 +1,7 @@ package filestorage import ( + "bufio" "errors" "fmt" "io" @@ -12,7 +13,6 @@ import ( "time" "github.com/google/uuid" - "github.com/jaster-prj/canopenrest/common" "github.com/jaster-prj/canopenrest/entities" "github.com/jaster-prj/canopenrest/external/persistence" "gopkg.in/yaml.v3" @@ -57,16 +57,21 @@ func (f *Filestorage) SafeNode(id int, odsFile []byte) error { return err } nodeFile := path.Join(nodeDir, "objdict.eds") - file, err := os.OpenFile(nodeFile, os.O_CREATE|os.O_WRONLY, 0644) + file, err := os.OpenFile(nodeFile, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, 0644) if err != nil { return err } defer file.Close() - // Write the bytes to the file - if _, err := file.Write(odsFile); err != nil { + writer := bufio.NewWriter(file) + + if _, err = writer.Write(odsFile); err != nil { return err } + err = writer.Flush() + if err != nil { + return fmt.Errorf("flush file failed: %w", err) + } return nil } @@ -176,15 +181,15 @@ func (f *Filestorage) SetFlashState(id uuid.UUID, state entities.FlashState, err case entities.FlashRequested: flash.Requested = time.Now() case entities.FlashProgramStopBefore: - flash.Start = common.POINTER(time.Now()) + flash.Start = new(time.Now()) case entities.FlashProgramFinish: - flash.Finish = common.POINTER(time.Now()) + flash.Finish = new(time.Now()) case entities.FlashProgramError: - flash.Finish = common.POINTER(time.Now()) + flash.Finish = new(time.Now()) } flash.State = state if errState != nil { - flash.Error = common.POINTER(fmt.Sprintf("%w", *errState)) + flash.Error = new(fmt.Sprintf("%w", *errState)) } data, err := yaml.Marshal(flash) if err != nil { diff --git a/go.mod b/go.mod index a8427b5..b6220a0 100644 --- a/go.mod +++ b/go.mod @@ -1,16 +1,16 @@ module github.com/jaster-prj/canopenrest -go 1.23.6 +go 1.26.2 require ( - github.com/getkin/kin-openapi v0.132.0 + github.com/getkin/kin-openapi v0.135.0 github.com/google/uuid v1.6.0 github.com/jaster-prj/go-can v0.0.5 - github.com/jaster-prj/go-canopen v0.0.16 - github.com/labstack/echo/v4 v4.13.3 + github.com/jaster-prj/go-canopen v0.0.17 + github.com/labstack/echo/v4 v4.15.1 github.com/oapi-codegen/echo-middleware v1.0.2 - github.com/oapi-codegen/runtime v1.1.1 - github.com/rs/zerolog v1.34.0 + github.com/oapi-codegen/runtime v1.4.0 + github.com/rs/zerolog v1.35.0 gopkg.in/yaml.v3 v3.0.1 ) @@ -18,24 +18,25 @@ require ( github.com/angelodlfrtr/serial v0.0.0-20190912094943-d028474db63c // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect github.com/brutella/can v0.0.2 // indirect - github.com/go-openapi/jsonpointer v0.21.1 // indirect - github.com/go-openapi/swag v0.23.1 // indirect + github.com/go-openapi/jsonpointer v0.22.5 // indirect + github.com/go-openapi/swag/jsonname v0.26.0 // indirect github.com/gorilla/mux v1.8.1 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/labstack/gommon v0.4.2 // indirect - github.com/mailru/easyjson v0.9.0 // indirect + github.com/mailru/easyjson v0.9.2 // indirect github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.21 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect - github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect - github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect + github.com/oasdiff/yaml v0.0.9 // indirect + github.com/oasdiff/yaml3 v0.0.10 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - golang.org/x/crypto v0.38.0 // indirect - golang.org/x/net v0.40.0 // indirect - golang.org/x/sys v0.33.0 // indirect - golang.org/x/text v0.25.0 // indirect - golang.org/x/time v0.11.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect + github.com/woodsbury/decimal128 v1.4.0 // indirect + golang.org/x/crypto v0.50.0 // indirect + golang.org/x/net v0.53.0 // indirect + golang.org/x/sys v0.43.0 // indirect + golang.org/x/text v0.36.0 // indirect + golang.org/x/time v0.15.0 // indirect + gopkg.in/ini.v1 v1.67.1 // indirect ) diff --git a/go.sum b/go.sum index 506c9ec..cfa4584 100644 --- a/go.sum +++ b/go.sum @@ -6,98 +6,96 @@ github.com/apapsch/go-jsonmerge/v2 v2.0.0/go.mod h1:lvDnEdqiQrp0O42VQGgmlKpxL1AP github.com/bmatcuk/doublestar v1.1.1/go.mod h1:UD6OnuiIn0yFxxA2le/rnRU1G4RaI4UvFv1sNto9p6w= github.com/brutella/can v0.0.2 h1:8TyjZrBZSwQwSr5x3U9KtKzGW8HNE/NpUgsNcYDAVIM= github.com/brutella/can v0.0.2/go.mod h1:NYDxbQito3w4+4DcjWs/fpQ3xyaFdpXw/KYqtZFU98k= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= -github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58= -github.com/go-openapi/jsonpointer v0.21.1 h1:whnzv/pNXtK2FbX/W9yJfRmE2gsmkfahjMKB0fZvcic= -github.com/go-openapi/jsonpointer v0.21.1/go.mod h1:50I1STOfbY1ycR8jGz8DaMeLCdXiI6aDteEdRNNzpdk= -github.com/go-openapi/swag v0.23.1 h1:lpsStH0n2ittzTnbaSloVZLuB5+fvSY/+hnagBjSNZU= -github.com/go-openapi/swag v0.23.1/go.mod h1:STZs8TbRvEQQKUA+JZNAm3EWlgaOBGpyFDqQnDHMef0= +github.com/getkin/kin-openapi v0.135.0 h1:751SjYfbiwqukYuVjwYEIKNfrSwS5YpA7DZnKSwQgtg= +github.com/getkin/kin-openapi v0.135.0/go.mod h1:6dd5FJl6RdX4usBtFBaQhk9q62Yb2J0Mk5IhUO/QqFI= +github.com/go-openapi/jsonpointer v0.22.5 h1:8on/0Yp4uTb9f4XvTrM2+1CPrV05QPZXu+rvu2o9jcA= +github.com/go-openapi/jsonpointer v0.22.5/go.mod h1:gyUR3sCvGSWchA2sUBJGluYMbe1zazrYWIkWPjjMUY0= +github.com/go-openapi/swag/jsonname v0.25.5 h1:8p150i44rv/Drip4vWI3kGi9+4W9TdI3US3uUYSFhSo= +github.com/go-openapi/swag/jsonname v0.25.5/go.mod h1:jNqqikyiAK56uS7n8sLkdaNY/uq6+D2m2LANat09pKU= +github.com/go-openapi/swag/jsonname v0.26.0 h1:gV1NFX9M8avo0YSpmWogqfQISigCmpaiNci8cGECU5w= +github.com/go-openapi/swag/jsonname v0.26.0/go.mod h1:urBBR8bZNoDYGr653ynhIx+gTeIz0ARZxHkAPktJK2M= +github.com/go-openapi/testify/v2 v2.4.0 h1:8nsPrHVCWkQ4p8h1EsRVymA2XABB4OT40gcvAu+voFM= +github.com/go-openapi/testify/v2 v2.4.0/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-openapi/testify/v2 v2.4.2 h1:tiByHpvE9uHrrKjOszax7ZvKB7QOgizBWGBLuq0ePx4= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= github.com/jaster-prj/go-can v0.0.5 h1:yoaEW7m2PQumU8gps9riQFvZBoPJIliTIBfJubNjSuo= github.com/jaster-prj/go-can v0.0.5/go.mod h1:oebpIJeUB7V0IFtF2MaDYI/pOkd2xDT5qphlGxoOsGE= -github.com/jaster-prj/go-canopen v0.0.16 h1:I0SpGeFT5Jm62B0fXJ7otY26XoXcEQ8m9XMg4Di6m6c= -github.com/jaster-prj/go-canopen v0.0.16/go.mod h1:Q3G74p9dln+O1VgSgz01fYO/xmXFs9VN3covQ24b3fc= +github.com/jaster-prj/go-canopen v0.0.17 h1:DeMJC4PmrxIE06pPSi5bUjsnl9JxYPehCBC4ujEoEBE= +github.com/jaster-prj/go-canopen v0.0.17/go.mod h1:NUP2tw4ggkBjS4Qrow4teMluA1u/K2y9yGvCRr4rVuU= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d/go.mod h1:2PavIy+JPciBPrBUjwbNvtwB6RQlve+hkpll6QSNmOE= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= -github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= +github.com/labstack/echo/v4 v4.15.1 h1:S9keusg26gZpjMmPqB5hOEvNKnmd1lNmcHrbbH2lnFs= +github.com/labstack/echo/v4 v4.15.1/go.mod h1:xmw1clThob0BSVRX1CRQkGQ/vjwcpOMjQZSZa9fKA/c= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= -github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= -github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mailru/easyjson v0.9.2 h1:dX8U45hQsZpxd80nLvDGihsQ/OxlvTkVUXH2r/8cb2M= +github.com/mailru/easyjson v0.9.2/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.21 h1:xYae+lCNBP7QuW4PUnNG61ffM4hVIfm+zUzDuSzYLGs= +github.com/mattn/go-isatty v0.0.21/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/oapi-codegen/echo-middleware v1.0.2 h1:oNBqiE7jd/9bfGNk/bpbX2nqWrtPc+LL4Boya8Wl81U= github.com/oapi-codegen/echo-middleware v1.0.2/go.mod h1:5J6MFcGqrpWLXpbKGZtRPZViLIHyyyUHlkqg6dT2R4E= -github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= -github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= -github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= -github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= -github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= -github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/oapi-codegen/runtime v1.4.0 h1:KLOSFOp7UzkbS7Cs1ms6NBEKYr0WmH2wZG0KKbd2er4= +github.com/oapi-codegen/runtime v1.4.0/go.mod h1:5sw5fxCDmnOzKNYmkVNF8d34kyUeejJEY8HNT2WaPec= +github.com/oasdiff/yaml v0.0.9 h1:zQOvd2UKoozsSsAknnWoDJlSK4lC0mpmjfDsfqNwX48= +github.com/oasdiff/yaml v0.0.9/go.mod h1:8lvhgJG4xiKPj3HN5lDow4jZHPlx1i7dIwzkdAo6oAM= +github.com/oasdiff/yaml3 v0.0.9 h1:rWPrKccrdUm8J0F3sGuU+fuh9+1K/RdJlWF7O/9yw2g= +github.com/oasdiff/yaml3 v0.0.9/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= +github.com/oasdiff/yaml3 v0.0.10 h1:tXiMwxYfnP5Uh2ai5HlALPI6nVBqjtJjvzW2PGeBje4= +github.com/oasdiff/yaml3 v0.0.10/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= -github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= -github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY= -github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ= +github.com/rs/zerolog v1.35.0 h1:VD0ykx7HMiMJytqINBsKcbLS+BJ4WYjz+05us+LRTdI= +github.com/rs/zerolog v1.35.0/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad/go.mod h1:qLr4V1qq6nMqFKkMo8ZTx3f+BZEkzsRUY10Xsm2mwU0= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= -github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= -github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE= +github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8= -golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw= -golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= -golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= +github.com/woodsbury/decimal128 v1.4.0 h1:xJATj7lLu4f2oObouMt2tgGiElE5gO6mSWUjQsBgUlc= +github.com/woodsbury/decimal128 v1.4.0/go.mod h1:BP46FUrVjVhdTbKT+XuQh2xfQaGki9LMIRJSFuh6THU= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/sys v0.0.0-20181213200352-4d1cda033e06/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= -golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= -golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= -golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= -golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= -golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U= +golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.1 h1:tVBILHy0R6e4wkYOn3XmiITt/hEVH4TFMYvAX2Ytz6k= +gopkg.in/ini.v1 v1.67.1/go.mod h1:x/cyOwCgZqOkJoDIJ3c1KNHMo10+nLGAhh+kn3Zizss= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/usecases/canopenuc/canopenuc.go b/usecases/canopenuc/canopenuc.go index a524570..b2cb977 100644 --- a/usecases/canopenuc/canopenuc.go +++ b/usecases/canopenuc/canopenuc.go @@ -6,7 +6,6 @@ import ( "time" "github.com/google/uuid" - "github.com/jaster-prj/canopenrest/common" "github.com/jaster-prj/canopenrest/entities" "github.com/jaster-prj/canopenrest/external/persistence" canopen "github.com/jaster-prj/go-canopen" @@ -18,8 +17,8 @@ const ( MANUFACTURER_SOFTWARE_VERSION = 4106 //0x100A PROGRAM_DATA = 8016 //0x1F50 PROGRAM_CONTROL = 8017 //0x1F51 - PROGRAM_SOFTWARE_IDENT = 8022 - FLASH_STATUS_IDENT = 8023 + PROGRAM_SOFTWARE_IDENT = 8022 //0x1F56 + FLASH_STATUS_IDENT = 8023 //0x1F57 ) type ProgramControlState int @@ -74,6 +73,9 @@ func (c *CanOpenUC) ReadNmt(id int) (*string, error) { status := node.NMTMaster.GetStateString() return &status, nil } + +// WriteNmt sets the NMT state of the node with the given id. +// The state can be "OPERATIONAL", "PRE-OPERATIONAL", "STOPPED" or "RESET". func (c *CanOpenUC) WriteNmt(id int, state string) error { node, err := c.getNode(id) if err != nil { @@ -135,7 +137,7 @@ func (c *CanOpenUC) FlashNode(id int, flashFile []byte, version *string) (*uuid. log.Debug().Str("Function", "FlashNode").Msgf("Add to Channel %s", order.String()) c.flashOrders <- flashOrder log.Debug().Str("Function", "FlashNode").Msgf("Finished %s", order.String()) - return common.POINTER(order), nil + return new(order), nil } func (c *CanOpenUC) GetFlashState(id uuid.UUID) (*entities.FlashOrderState, error) { @@ -145,7 +147,7 @@ func (c *CanOpenUC) GetFlashState(id uuid.UUID) (*entities.FlashOrderState, erro func (c *CanOpenUC) flashNode(flashOrder entities.FlashOrder) { node, err := c.getNode(flashOrder.Id) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(err)) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(err)) return } c.mu.Lock() @@ -153,43 +155,43 @@ func (c *CanOpenUC) flashNode(flashOrder entities.FlashOrder) { c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashPreOperational, nil) err = node.NMTMaster.SetState("PRE-OPERATIONAL") if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("Set PRE-OPERATIONAL failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("Set PRE-OPERATIONAL failed: %v", err))) return } c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramStopBefore, nil) err = node.SDOClient.Write(PROGRAM_CONTROL, 1, false, []byte{byte(PROGRAM_CONTROL_STOP)}) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("PROGRAM_CONTROL_STOP failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("PROGRAM_CONTROL_STOP failed: %v", err))) return } c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramClear, nil) err = node.SDOClient.Write(PROGRAM_CONTROL, 1, false, []byte{byte(PROGRAM_CONTROL_CLEAR)}) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("PROGRAM_CONTROL_CLEAR failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("PROGRAM_CONTROL_CLEAR failed: %v", err))) return } c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramWriteData, nil) err = node.SDOClient.Write(PROGRAM_DATA, 1, false, flashOrder.FlashFile) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("PROGRAM_DATA failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("PROGRAM_DATA failed: %v", err))) return } c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramWriteFinish, nil) flashStatus, err := node.SDOClient.Read(FLASH_STATUS_IDENT, 1) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("Read FLASH_STATUS_IDENT failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("Read FLASH_STATUS_IDENT failed: %v", err))) node.NMTMaster.SetState("RESET") return } if int(flashStatus[0]) != 0 { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("FlashStatus failed: %d", int(flashStatus[0])))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("FlashStatus failed: %d", int(flashStatus[0])))) node.NMTMaster.SetState("RESET") return } c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramStopAfter, nil) err = node.SDOClient.Write(PROGRAM_CONTROL, 1, false, []byte{byte(PROGRAM_CONTROL_STOP)}) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("PROGRAM_CONTROL_STOP2 failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("PROGRAM_CONTROL_STOP2 failed: %v", err))) node.NMTMaster.SetState("RESET") return } @@ -197,7 +199,7 @@ func (c *CanOpenUC) flashNode(flashOrder entities.FlashOrder) { c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramStart, nil) err = node.SDOClient.Write(PROGRAM_CONTROL, 1, false, []byte{byte(PROGRAM_CONTROL_START)}) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("PROGRAM_CONTROL_START failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("PROGRAM_CONTROL_START failed: %v", err))) node.NMTMaster.SetState("RESET") return } @@ -205,19 +207,19 @@ func (c *CanOpenUC) flashNode(flashOrder entities.FlashOrder) { c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramCheckError, nil) response, err := node.SDOClient.Read(ERROR_REGISTER, 0) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("Read ERROR_REGISTER failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("Read ERROR_REGISTER failed: %v", err))) node.NMTMaster.SetState("RESET") return } if response[0] != 0 { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("Read ERROR_REGISTER not 0: %d", response[0]))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("Read ERROR_REGISTER not 0: %d", response[0]))) node.NMTMaster.SetState("RESET") return } c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramCheckVersion, nil) response, err = node.SDOClient.Read(MANUFACTURER_SOFTWARE_VERSION, 0) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("Read MANUFACTURER_SOFTWARE_VERSION failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("Read MANUFACTURER_SOFTWARE_VERSION failed: %v", err))) node.NMTMaster.SetState("RESET") return } @@ -227,7 +229,7 @@ func (c *CanOpenUC) flashNode(flashOrder entities.FlashOrder) { if string(response) == *flashOrder.Version { err = node.SDOClient.Write(PROGRAM_CONTROL, 1, false, []byte{byte(PROGRAM_CONTROL_ACK)}) if err != nil { - c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, common.POINTER(fmt.Errorf("PROGRAM_CONTROL_ACK failed: %v", err))) + c.persistence.SetFlashState(flashOrder.FlashOrderId, entities.FlashProgramError, new(fmt.Errorf("PROGRAM_CONTROL_ACK failed: %v", err))) node.NMTMaster.SetState("RESET") return } From a1ebf28a597adae7a064f9d15930e0175ec632af Mon Sep 17 00:00:00 2001 From: Tobias Jaster Date: Wed, 15 Apr 2026 20:40:28 +0000 Subject: [PATCH 2/2] Add workflow --- .github/workflows/ci-release.yml | 39 +++++++++++ .github/workflows/ci-stable.yml | 15 +++++ .github/workflows/ci.yml | 107 +++++++++++++++++++++++++++++++ LICENSE | 21 ++++++ license_whitelist | 4 ++ 5 files changed, 186 insertions(+) create mode 100644 .github/workflows/ci-release.yml create mode 100644 .github/workflows/ci-stable.yml create mode 100644 .github/workflows/ci.yml create mode 100644 LICENSE create mode 100644 license_whitelist diff --git a/.github/workflows/ci-release.yml b/.github/workflows/ci-release.yml new file mode 100644 index 0000000..ade766e --- /dev/null +++ b/.github/workflows/ci-release.yml @@ -0,0 +1,39 @@ +name: go - ci/cd release + +on: + push: + tags: + - 'v[0-9]+.[0-9]+.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+-rc.[0-9]+' + - 'v[0-9]+.[0-9]+.[0-9]+-dev.[0-9]+' + +env: + SERVICE: canopenrest + +jobs: + release-binaries: + name: release + runs-on: ubuntu-latest + strategy: + matrix: + goos: [linux, darwin] + goarch: [amd64, arm64, arm] + exclude: + - goos: darwin + goarch: arm + steps: + + - name: Check out code into the Go module directory + uses: actions/checkout@v6 + + - uses: wangyoucao577/go-release-action@v1.49 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + goos: ${{ matrix.goos }} + goarch: ${{ matrix.goarch }} + goversion: 1.26 + binary_name: canopenrest + compress_assets: false + ldflags: -X "main.version=${{ github.ref_name }}" + env: + CGO_ENABLED: 0 diff --git a/.github/workflows/ci-stable.yml b/.github/workflows/ci-stable.yml new file mode 100644 index 0000000..5c9bdd1 --- /dev/null +++ b/.github/workflows/ci-stable.yml @@ -0,0 +1,15 @@ +name: go - ci/cd stable + +on: + push: + branches: [ "main" ] + workflow_dispatch: + +env: + SERVICE: canopenrest + + +jobs: + + ci: + uses: ./.github/workflows/ci.yml \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f52d629 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,107 @@ +name: go ci + +env: + SERVICE: canopenrest + +on: + pull_request: + branches: [ "main" ] + +jobs: + build: + name: Build + runs-on: ubuntu-latest + steps: + + - name: Check out code into the Go module directory + uses: actions/checkout@v6 + + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version-file: go.mod + + - name: Setup gotestsum + run: | + go install gotest.tools/gotestsum@latest + + - name: Get dependencies + run: | + go get -v -t -d + + - name: Test + run: | + gotestsum --format testname --junitfile report.xml ./... + + - name: Publish test results + uses: actions/upload-artifact@v7 + with: + name: test-results + path: report.xml + + - name: Build + run: | + go build -trimpath -ldflags="-s -w" -o bin/${{ env.SERVICE }} ./cmd + + - name: Upload service for job sharing + uses: actions/upload-artifact@v3 + with: + name: ${{ env.SERVICE }} + path: bin/${{ env.SERVICE }} + retention-days: 5 + + name: Test Report + uses: dorny/test-reporter@v3 + with: + name: go tests + path: report.xml + reporter: java-junit + + check: + runs-on: ubuntu-latest + steps: + + - name: Check out code into the Go module directory + uses: actions/checkout@v6 + + - name: Set up Go + uses: actions/setup-go@v6 + with: + go-version-file: go.mod + + - name: Static-Check + run: | + go install honnef.co/go/tools/cmd/staticcheck@latest + staticcheck ./... + + - name: Dependency-Update-Check + if: github.ref != 'refs/heads/main' + run: | + go get -u ./... + go mod tidy + if git diff --quiet -- go.mod go.sum + then + echo Project dependencies are up to date. + else + echo Project dependencies are outdatet. + echo Run \'go get -u ./... && go mod tidy\' to update project dependecies. + exit 1 + fi + + - name: Misspell-Check + run: | + go install github.com/client9/misspell/cmd/misspell@latest + find . -type f -name '*.go' | xargs misspell -error + + - name: Vulnerability-Check + if: github.ref != 'refs/heads/main' + run: | + go install golang.org/x/vuln/cmd/govulncheck@latest + govulncheck ./... + + - name: Install go-licenses + run: go install github.com/google/go-licenses@latest + + - name: Check Licenses + run: | + go-licenses check ./cmd/... --skip_headers --allowed_licenses="$(paste -sd, license_whitelist)" \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..648e4d9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 C3Re + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/license_whitelist b/license_whitelist new file mode 100644 index 0000000..77e3b3b --- /dev/null +++ b/license_whitelist @@ -0,0 +1,4 @@ +Apache-2.0 +BSD-2-Clause +BSD-3-Clause +MIT \ No newline at end of file