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
136
137
138
139
140
141
142
143
144
145
146
|
package compressor
import (
"github.com/BurntSushi/toml"
"io/fs"
fp "path/filepath"
"time"
"github.com/sam-anthony/volute/mass"
"github.com/sam-anthony/volute/util"
)
const root = "compressor/res/"
type Compressor struct {
Name string
FileName string
// MinX is the distance of the y-axis from left of image in pixels.
MinX int
// MinY is the distance of the x-axis from the top of the image in
//pixels.
MinY int
// MaxX is the distance of the end of the graph from the left of the
// image in pixels.
MaxX int
// MaxY is the distance of the top of the graph from the top of the
// image in pixels.
MaxY int
// MaxFlow is the mass flow rate at MaxX.
MaxFlow mass.FlowRate
// MaxPressureRatio is the pressure ratio at MaxY.
MaxPressureRatio float32
}
// [manufacturer][series][model]
var compressors = make(map[string]map[string]map[string]Compressor)
func init() {
// Walk root, looking for .toml files describing a compressor.
// Parse these toml files, create a Compressor and add it to compressors.
err := fp.WalkDir(root, func(path string, d fs.DirEntry, err error) error {
if err != nil {
return err
}
if fp.Ext(path) != ".toml" {
return nil
}
path = path[len(root):]
// manufacturer/series, model
manSer, mod := fp.Split(path)
manSer = fp.Clean(manSer) // Clean trailing slash
mod = mod[:len(mod)-len(".toml")] // Trim .toml extension
// manufacturer, series
man, ser := fp.Split(manSer)
man = fp.Clean(man) // Clean trailing slash
var exists bool
_, exists = compressors[man]
if !exists {
compressors[man] = make(map[string]map[string]Compressor)
}
_, exists = compressors[man][ser]
if !exists {
compressors[man][ser] = make(map[string]Compressor)
}
tomlFile := fp.Join(root, path)
var c Compressor
_, err = toml.DecodeFile(tomlFile, &c)
if err != nil {
return err
}
// Replace .toml with .jpg
imageFile := tomlFile[:len(tomlFile)-len(".toml")] + ".jpg"
c.FileName = imageFile
// Must parse MaxFlow seperately because the MassFlowRateUnit
// is stored as a string and must be converted with
// FlowRateUnitFromString().
flow := struct {
FlowVal float32
FlowUnit string
}{}
_, err = toml.DecodeFile(tomlFile, &flow)
if err != nil {
return err
}
u, err := mass.FlowRateUnitFromString(flow.FlowUnit)
if err != nil {
return err
}
c.MaxFlow = mass.FlowRate{flow.FlowVal, u}
compressors[man][ser][mod] = c
return nil
})
util.Check(err)
}
func Compressors() map[string]map[string]map[string]Compressor {
return compressors
}
func borgwarnerK04() Compressor {
maxFlow, err := mass.NewFlowRate(
mass.Mass{0.18, mass.Kilogram},
time.Second,
mass.KilogramsPerSecond,
)
util.Check(err)
return Compressor{
"Borgwarner K04",
"compressor/res/borgwarner/k/04.jpg",
33,
712,
1090,
2,
maxFlow,
2.8,
}
}
func borgwarnerK03() Compressor {
maxFlow, err := mass.NewFlowRate(
mass.Mass{0.13, mass.Kilogram},
time.Second,
mass.KilogramsPerSecond,
)
util.Check(err)
return Compressor{
"BorgWarner K03",
"compressor/res/borgwarner/k/03.jpg",
30,
714,
876,
4,
maxFlow,
2.8,
}
}
|