From 45a631e2a17231bd3d75271b90ca171ca477cc8d Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Thu, 30 Oct 2025 16:05:53 +0100 Subject: [PATCH 1/8] feat: improve sketch template --- .../app/generator/app_template/sketch/sketch.ino | 16 ++++++++++++++-- .../generator/app_template/sketch/sketch.yaml | 2 ++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/internal/orchestrator/app/generator/app_template/sketch/sketch.ino b/internal/orchestrator/app/generator/app_template/sketch/sketch.ino index 612c51b8..a408c54a 100644 --- a/internal/orchestrator/app/generator/app_template/sketch/sketch.ino +++ b/internal/orchestrator/app/generator/app_template/sketch/sketch.ino @@ -1,3 +1,15 @@ -void setup() {} +#include -void loop() {} \ No newline at end of file +void setup() { + // setup the bridge for comunicating with the Linux subsystem. + Bridge.begin(); + + // start the monitor for debugging logs. + Monitor.begin(); + + // put your setup code here, to run once: +} + +void loop() { + // put your main code here, to run repeatedly: +} diff --git a/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml b/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml index d9fe917e..b5e31875 100644 --- a/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml @@ -4,6 +4,8 @@ profiles: platforms: - platform: arduino:zephyr libraries: + - Arduino_RouterBridge (0.2.2) + - Arduino_RPClite (0.2.0) - MsgPack (0.4.2) - DebugLog (0.8.4) - ArxContainer (0.7.0) From d9d8d527ccc5aa75651800d43a89f7431a6567e8 Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Thu, 30 Oct 2025 16:55:12 +0100 Subject: [PATCH 2/8] remove not used libraries --- .../app/generator/app_template/sketch/sketch.ino | 10 ++-------- .../app/generator/app_template/sketch/sketch.yaml | 6 ------ 2 files changed, 2 insertions(+), 14 deletions(-) diff --git a/internal/orchestrator/app/generator/app_template/sketch/sketch.ino b/internal/orchestrator/app/generator/app_template/sketch/sketch.ino index a408c54a..95c2b6eb 100644 --- a/internal/orchestrator/app/generator/app_template/sketch/sketch.ino +++ b/internal/orchestrator/app/generator/app_template/sketch/sketch.ino @@ -1,15 +1,9 @@ -#include - void setup() { - // setup the bridge for comunicating with the Linux subsystem. - Bridge.begin(); - - // start the monitor for debugging logs. - Monitor.begin(); - // put your setup code here, to run once: + } void loop() { // put your main code here, to run repeatedly: + } diff --git a/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml b/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml index b5e31875..580185f5 100644 --- a/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml @@ -4,10 +4,4 @@ profiles: platforms: - platform: arduino:zephyr libraries: - - Arduino_RouterBridge (0.2.2) - - Arduino_RPClite (0.2.0) - - MsgPack (0.4.2) - - DebugLog (0.8.4) - - ArxContainer (0.7.0) - - ArxTypeTraits (0.3.1) default_profile: default From d9f047f17eaa740f5937717648506fe1d894cc6f Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Mon, 3 Nov 2025 19:09:39 +0100 Subject: [PATCH 3/8] update golden files --- .../testdata/app-all.golden/sketch/sketch.ino | 10 ++++++++-- .../testdata/app-all.golden/sketch/sketch.yaml | 4 ---- .../testdata/app-no-python.golden/sketch/sketch.ino | 10 ++++++++-- .../testdata/app-no-python.golden/sketch/sketch.yaml | 4 ---- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino index 612c51b8..95c2b6eb 100644 --- a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.ino @@ -1,3 +1,9 @@ -void setup() {} +void setup() { + // put your setup code here, to run once: -void loop() {} \ No newline at end of file +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml index d9fe917e..580185f5 100644 --- a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml @@ -4,8 +4,4 @@ profiles: platforms: - platform: arduino:zephyr libraries: - - MsgPack (0.4.2) - - DebugLog (0.8.4) - - ArxContainer (0.7.0) - - ArxTypeTraits (0.3.1) default_profile: default diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino index 612c51b8..95c2b6eb 100644 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino +++ b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.ino @@ -1,3 +1,9 @@ -void setup() {} +void setup() { + // put your setup code here, to run once: -void loop() {} \ No newline at end of file +} + +void loop() { + // put your main code here, to run repeatedly: + +} diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml index d9fe917e..580185f5 100644 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml @@ -4,8 +4,4 @@ profiles: platforms: - platform: arduino:zephyr libraries: - - MsgPack (0.4.2) - - DebugLog (0.8.4) - - ArxContainer (0.7.0) - - ArxTypeTraits (0.3.1) default_profile: default From 9508fa512fa659ba8af5468fdd58238bdcd40fab Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Tue, 18 Nov 2025 10:10:27 +0100 Subject: [PATCH 4/8] revert sketch change for now --- .../app/generator/app_template/sketch/sketch.yaml | 4 ++++ .../app/generator/testdata/app-all.golden/sketch/sketch.yaml | 4 ++++ .../testdata/app-no-python.golden/sketch/sketch.yaml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml b/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml index 580185f5..d9fe917e 100644 --- a/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/app_template/sketch/sketch.yaml @@ -4,4 +4,8 @@ profiles: platforms: - platform: arduino:zephyr libraries: + - MsgPack (0.4.2) + - DebugLog (0.8.4) + - ArxContainer (0.7.0) + - ArxTypeTraits (0.3.1) default_profile: default diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml index 580185f5..d9fe917e 100644 --- a/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/sketch/sketch.yaml @@ -4,4 +4,8 @@ profiles: platforms: - platform: arduino:zephyr libraries: + - MsgPack (0.4.2) + - DebugLog (0.8.4) + - ArxContainer (0.7.0) + - ArxTypeTraits (0.3.1) default_profile: default diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml index 580185f5..d9fe917e 100644 --- a/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml +++ b/internal/orchestrator/app/generator/testdata/app-no-python.golden/sketch/sketch.yaml @@ -4,4 +4,8 @@ profiles: platforms: - platform: arduino:zephyr libraries: + - MsgPack (0.4.2) + - DebugLog (0.8.4) + - ArxContainer (0.7.0) + - ArxTypeTraits (0.3.1) default_profile: default From f733769c9bec5c8df036e96cb24d431053077d76 Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Tue, 18 Nov 2025 10:13:24 +0100 Subject: [PATCH 5/8] add gitignore --- internal/orchestrator/app/generator/app_template/.gitignore | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 internal/orchestrator/app/generator/app_template/.gitignore diff --git a/internal/orchestrator/app/generator/app_template/.gitignore b/internal/orchestrator/app/generator/app_template/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/app_template/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ From dab7bd3f23cc0594847ea984f9b6cb25026a7f9d Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Tue, 18 Nov 2025 12:57:52 +0100 Subject: [PATCH 6/8] support additional files --- .../app/generator/app_generator.go | 130 ++++++++++++------ 1 file changed, 90 insertions(+), 40 deletions(-) diff --git a/internal/orchestrator/app/generator/app_generator.go b/internal/orchestrator/app/generator/app_generator.go index 3dab7e53..10f4d0a2 100644 --- a/internal/orchestrator/app/generator/app_generator.go +++ b/internal/orchestrator/app/generator/app_generator.go @@ -19,7 +19,6 @@ import ( "embed" "fmt" "io" - "log/slog" "os" "path" "strconv" @@ -41,7 +40,7 @@ const ( SkipPython ) -//go:embed app_template +//go:embed all:app_template var fsApp embed.FS func GenerateApp(basePath *paths.Path, app app.AppDescriptor, options Opts) error { @@ -50,6 +49,7 @@ func GenerateApp(basePath *paths.Path, app app.AppDescriptor, options Opts) erro } isSkipSketchSet := options&SkipSketch != 0 isSkipPythonSet := options&SkipPython != 0 + if !isSkipSketchSet { if err := generateSketch(basePath); err != nil { return fmt.Errorf("failed to create sketch: %w", err) @@ -60,58 +60,108 @@ func GenerateApp(basePath *paths.Path, app app.AppDescriptor, options Opts) erro return fmt.Errorf("failed to create python: %w", err) } } - if err := generateReadme(basePath, app); err != nil { - slog.Warn("error generating readme for app %q: %w", app.Name, err) - } - if err := generateAppYaml(basePath, app); err != nil { - return fmt.Errorf("failed to create app content: %w", err) + + if err := generateApp(basePath, app); err != nil { + return fmt.Errorf("failed to create app.yaml: %w", err) } return nil } -func generateAppYaml(basePath *paths.Path, app app.AppDescriptor) error { - appYamlTmpl := template.Must( - template.New("app.yaml"). - Funcs(template.FuncMap{"joinInts": formatPorts}). - ParseFS(fsApp, path.Join(templateRoot, "app.yaml.template")), - ) +func generateApp(basePath *paths.Path, appDesc app.AppDescriptor) error { + generateAppYaml := func(basePath *paths.Path, app app.AppDescriptor) error { + appYamlTmpl := template.Must( + template.New("app.yaml"). + Funcs(template.FuncMap{"joinInts": formatPorts}). + ParseFS(fsApp, path.Join(templateRoot, "app.yaml.template")), + ) - outputPath := basePath.Join("app.yaml") - file, err := os.Create(outputPath.String()) - if err != nil { - return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) - } - defer file.Close() + outputPath := basePath.Join("app.yaml") + file, err := os.Create(outputPath.String()) + if err != nil { + return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) + } + defer file.Close() + + return appYamlTmpl.ExecuteTemplate(file, "app.yaml.template", app) + } + + generateReadme := func(basePath *paths.Path, app app.AppDescriptor) error { + readmeTmpl := template.Must(template.ParseFS(fsApp, path.Join(templateRoot, "README.md.template"))) + data := struct { + Title string + Icon string + Description string + Ports string + }{ + Title: app.Name, + Icon: app.Icon, + Description: app.Description, + } - return appYamlTmpl.ExecuteTemplate(file, "app.yaml.template", app) -} + if len(app.Ports) > 0 { + data.Ports = "Available application ports: " + formatPorts(app.Ports) + } -func generateReadme(basePath *paths.Path, app app.AppDescriptor) error { - readmeTmpl := template.Must(template.ParseFS(fsApp, path.Join(templateRoot, "README.md.template"))) - data := struct { - Title string - Icon string - Description string - Ports string - }{ - Title: app.Name, - Icon: app.Icon, - Description: app.Description, + outputPath := basePath.Join("README.md") + file, err := os.Create(outputPath.String()) + if err != nil { + return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) + } + defer file.Close() + + return readmeTmpl.Execute(file, data) } - if len(app.Ports) > 0 { - data.Ports = "Available application ports: " + formatPorts(app.Ports) + copyRootFiles := func() error { + fileList, err := fsApp.ReadDir(templateRoot) + if err != nil { + return fmt.Errorf("read template directory: %w", err) + } + for _, filePath := range fileList { + if filePath.IsDir() { + continue + } + if path.Ext(filePath.Name()) == ".template" { + continue + } + + srcPath := path.Join(templateRoot, filePath.Name()) + destPath := basePath.Join(filePath.Name()) + + if err := func() error { + srcFile, err := fsApp.Open(srcPath) + if err != nil { + return err + } + defer srcFile.Close() + + destFile, err := destPath.Create() + if err != nil { + return fmt.Errorf("create %q file: %w", destPath, err) + } + defer destFile.Close() + + _, err = io.Copy(destFile, srcFile) + return err + }(); err != nil { + return fmt.Errorf("copy file %s: %w", filePath.Name(), err) + } + } + return nil } - outputPath := basePath.Join("README.md") - file, err := os.Create(outputPath.String()) - if err != nil { - return fmt.Errorf("failed to create file %s: %w", outputPath.String(), err) + if err := copyRootFiles(); err != nil { + return fmt.Errorf("copy root files: %w", err) + } + if err := generateAppYaml(basePath, appDesc); err != nil { + return fmt.Errorf("generate app.yaml: %w", err) + } + if err := generateReadme(basePath, appDesc); err != nil { + return fmt.Errorf("generate README.md: %w", err) } - defer file.Close() - return readmeTmpl.Execute(file, data) + return nil } func generatePython(basePath *paths.Path) error { From 6df53b22ba6c1dd01ae5b2efd6d9d98b4da20897 Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Tue, 18 Nov 2025 14:11:36 +0100 Subject: [PATCH 7/8] refresh golden files --- .../app/generator/testdata/app-all.golden/.gitignore | 2 ++ .../app/generator/testdata/app-no-python.golden/.gitignore | 2 ++ .../app/generator/testdata/app-no-sketch.golden/.gitignore | 2 ++ 3 files changed, 6 insertions(+) create mode 100644 internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore create mode 100644 internal/orchestrator/app/generator/testdata/app-no-python.golden/.gitignore create mode 100644 internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore diff --git a/internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore b/internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/testdata/app-all.golden/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ diff --git a/internal/orchestrator/app/generator/testdata/app-no-python.golden/.gitignore b/internal/orchestrator/app/generator/testdata/app-no-python.golden/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/testdata/app-no-python.golden/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ diff --git a/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore b/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore new file mode 100644 index 00000000..90ae0403 --- /dev/null +++ b/internal/orchestrator/app/generator/testdata/app-no-sketch.golden/.gitignore @@ -0,0 +1,2 @@ +# ignore app cache folder +.cache/ From fa882999c1fde50b48aa2819b2354bcd67810405 Mon Sep 17 00:00:00 2001 From: lucarin91 Date: Tue, 18 Nov 2025 15:16:28 +0100 Subject: [PATCH 8/8] move some generation to warning --- internal/orchestrator/app/generator/app_generator.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/internal/orchestrator/app/generator/app_generator.go b/internal/orchestrator/app/generator/app_generator.go index 10f4d0a2..0eec26ae 100644 --- a/internal/orchestrator/app/generator/app_generator.go +++ b/internal/orchestrator/app/generator/app_generator.go @@ -19,6 +19,7 @@ import ( "embed" "fmt" "io" + "log/slog" "os" "path" "strconv" @@ -152,14 +153,15 @@ func generateApp(basePath *paths.Path, appDesc app.AppDescriptor) error { } if err := copyRootFiles(); err != nil { - return fmt.Errorf("copy root files: %w", err) + slog.Warn("error copying root files for app %q: %w", appDesc.Name, err) } + if err := generateReadme(basePath, appDesc); err != nil { + slog.Warn("error generating readme for app %q: %w", appDesc.Name, err) + } + if err := generateAppYaml(basePath, appDesc); err != nil { return fmt.Errorf("generate app.yaml: %w", err) } - if err := generateReadme(basePath, appDesc); err != nil { - return fmt.Errorf("generate README.md: %w", err) - } return nil }