-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexport.go
More file actions
135 lines (124 loc) · 4.32 KB
/
Copy pathexport.go
File metadata and controls
135 lines (124 loc) · 4.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// ┌──────────────────────────────────────────────────────────────────────┐
// │ export.go — Pin Configuration Export │
// └──────────────────────────────────────────────────────────────────────┘
package main
import (
"fmt"
"os"
"path/filepath"
"strings"
"github.com/amken3d/Pingo/pindata"
"github.com/ncruces/zenity"
)
// lastExportDir remembers the last directory the user exported to.
var lastExportDir = defaultExportDir()
func defaultExportDir() string {
home, err := os.UserHomeDir()
if err != nil {
return "."
}
return home
}
// saveExport opens a native save-file dialog with the given default filename
// and file type filter, then writes the content to the chosen path.
func saveExport(defaultName, filterName, filterPattern, content string) {
go func() {
path, err := zenity.SelectFileSave(
zenity.Title("Export Pin Configuration"),
zenity.Filename(filepath.Join(lastExportDir, defaultName)),
zenity.FileFilter{Name: filterName, Patterns: []string{filterPattern}},
zenity.ConfirmOverwrite(),
)
if err != nil || path == "" {
return
}
if err := os.WriteFile(path, []byte(content), 0644); err != nil {
exportStatus.Set("Error: " + err.Error())
return
}
lastExportDir = filepath.Dir(path)
exportStatus.Set(fmt.Sprintf("Exported to %s", path))
}()
}
// ─── Export Formatters ───────────────────────────────────────────────
func exportCHeader(sel map[int]pindata.Function, names map[int]string) string {
var b strings.Builder
spec := currentSpec()
b.WriteString("// Pin configuration generated by Pingo\n")
b.WriteString(fmt.Sprintf("// Board: %s\n\n", spec.Name))
b.WriteString("#ifndef PINGO_PINS_H\n#define PINGO_PINS_H\n\n")
for _, gp := range sortedGPIOs(sel) {
fn := sel[gp]
name := names[gp]
if name == "" {
name = sanitizeIdentifier(fn.Name)
} else {
name = sanitizeIdentifier(name)
}
b.WriteString(fmt.Sprintf("#define PIN_%-20s %d // GP%d - %s (%s)\n",
strings.ToUpper(name), gp, gp, fn.Name, fn.Category))
}
b.WriteString("\n#endif // PINGO_PINS_H\n")
return b.String()
}
func exportTinyGo(sel map[int]pindata.Function, names map[int]string) string {
var b strings.Builder
spec := currentSpec()
b.WriteString("// Pin configuration generated by Pingo\n")
b.WriteString(fmt.Sprintf("// Board: %s\n\n", spec.Name))
b.WriteString("package main\n\nimport \"machine\"\n\nvar (\n")
for _, gp := range sortedGPIOs(sel) {
fn := sel[gp]
name := names[gp]
if name == "" {
name = sanitizeIdentifier(fn.Name)
} else {
name = sanitizeIdentifier(name)
}
b.WriteString(fmt.Sprintf("\t%s = machine.GP%d // %s (%s)\n",
name, gp, fn.Name, fn.Category))
}
b.WriteString(")\n")
return b.String()
}
func exportMicroPython(sel map[int]pindata.Function, names map[int]string) string {
var b strings.Builder
spec := currentSpec()
b.WriteString("# Pin configuration generated by Pingo\n")
b.WriteString(fmt.Sprintf("# Board: %s\n\n", spec.Name))
b.WriteString("from machine import Pin\n\n")
for _, gp := range sortedGPIOs(sel) {
fn := sel[gp]
name := names[gp]
if name == "" {
name = sanitizeIdentifier(fn.Name)
} else {
name = sanitizeIdentifier(name)
}
b.WriteString(fmt.Sprintf("%-20s = %d # GP%d - %s (%s)\n",
strings.ToUpper(name), gp, gp, fn.Name, fn.Category))
}
return b.String()
}
func exportCSV(sel map[int]pindata.Function, names map[int]string) string {
var b strings.Builder
b.WriteString("GPIO,Function,Category,Custom Name\n")
for _, gp := range sortedGPIOs(sel) {
fn := sel[gp]
name := names[gp]
b.WriteString(fmt.Sprintf("GP%d,%s,%s,%s\n", gp, fn.Name, fn.Category, name))
}
return b.String()
}
// sanitizeIdentifier converts a string to a valid C/Go identifier.
func sanitizeIdentifier(s string) string {
var b strings.Builder
for _, c := range s {
if (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_' {
b.WriteRune(c)
} else {
b.WriteRune('_')
}
}
return b.String()
}