Skip to content

Commit 53c8cea

Browse files
committed
fix: cyclop linter issues
1 parent 932c160 commit 53c8cea

File tree

2 files changed

+121
-97
lines changed

2 files changed

+121
-97
lines changed

pkg/export/prometheus/writer.go

Lines changed: 51 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,30 @@ func (w *expWriter) write() error {
119119

120120
defer mboxOpen.Close()
121121

122-
/*
123-
* NB: As a convention, write headers before retrieving values so the output will indicate where
124-
* something went wrong.
125-
*/
126-
127-
/*
128-
* Hardware.
129-
*/
122+
if err := w.writeHardware(mboxOpen); err != nil {
123+
return err
124+
}
125+
126+
if err := w.writePower(mboxOpen); err != nil {
127+
return err
128+
}
129+
130+
if err := w.writeClocks(mboxOpen); err != nil {
131+
return err
132+
}
133+
134+
if err := w.writeTemperatures(mboxOpen); err != nil {
135+
return err
136+
}
137+
138+
if err := w.writeVoltages(mboxOpen); err != nil {
139+
return err
140+
}
141+
142+
return nil
143+
}
144+
145+
func (w *expWriter) writeHardware(mboxOpen *mbox.Mailbox) error {
130146
w.writeHeaderGauge("rpi_vc_revision", "Firmware revision of the VideoCore device.", metricTypeGauge)
131147

132148
rev, err := mboxOpen.GetFirmwareRevision()
@@ -154,48 +170,45 @@ func (w *expWriter) write() error {
154170

155171
w.writeSample(rev)
156172

157-
/*
158-
* Power.
159-
*/
160-
w.writeHeaderGauge(
161-
"rpi_power_state",
162-
"Component power state (0: off, 1: on, 2: missing).",
163-
metricTypeGauge,
164-
"id",
165-
)
173+
return nil
174+
}
175+
176+
func (w *expWriter) writePower(mboxOpen *mbox.Mailbox) error {
177+
w.writeHeaderGauge("rpi_power_state", "Component power state (0: off, 1: on, 2: missing).", metricTypeGauge, "id")
166178

167179
for id, label := range powerLabelsByID {
168-
powerState, err := mboxOpen.GetPowerState(id)
180+
state, err := mboxOpen.GetPowerState(id)
169181
if err != nil {
170182
return fmt.Errorf("unable to get power state: %w", err)
171183
}
172184

173-
w.writeSample(powerState, label)
185+
w.writeSample(state, label)
174186
}
175187

176-
/*
177-
* Clocks.
178-
*/
188+
return nil
189+
}
190+
191+
func (w *expWriter) writeClocks(mboxOpen *mbox.Mailbox) error {
179192
w.writeHeaderGauge("rpi_clock_rate_hz", "Clock rate in Hertz.", metricTypeGauge, "id")
180193

181194
for id, label := range clockLabelsByID {
182-
clockRate, err := mboxOpen.GetClockRate(id)
195+
rate, err := mboxOpen.GetClockRate(id)
183196
if err != nil {
184197
return fmt.Errorf("unable to get clock rate: %w", err)
185198
}
186199

187-
w.writeSample(clockRate, label)
200+
w.writeSample(rate, label)
188201
}
189202

190203
w.writeHeaderGauge("rpi_clock_rate_measured_hz", "Measured clock rate in Hertz.", metricTypeGauge, "id")
191204

192205
for id, label := range clockLabelsByID {
193-
clockRate, err := mboxOpen.GetClockRateMeasured(id)
206+
rate, err := mboxOpen.GetClockRateMeasured(id)
194207
if err != nil {
195208
return fmt.Errorf("unable to get measured clock rate: %w", err)
196209
}
197210

198-
w.writeSample(clockRate, label)
211+
w.writeSample(rate, label)
199212
}
200213

201214
w.writeHeaderGauge("rpi_turbo", "Turbo state.", metricTypeGauge)
@@ -207,59 +220,38 @@ func (w *expWriter) write() error {
207220

208221
w.writeSample(formatBool(turbo))
209222

210-
/*
211-
* Temperature sensors.
212-
*/
223+
return nil
224+
}
213225

214-
// Current SoC temperature
215-
w.writeHeaderGauge(
216-
"rpi_temperature_c",
217-
"Temperature of the SoC in degrees celsius.",
218-
metricTypeGauge,
219-
"id",
220-
)
226+
func (w *expWriter) writeTemperatures(mboxOpen *mbox.Mailbox) error {
227+
w.writeHeaderGauge("rpi_temperature_c", "Temperature of the SoC in degrees celsius.", metricTypeGauge, "id")
221228

222229
temp, err := mboxOpen.GetTemperature()
223230
if err != nil {
224231
return fmt.Errorf("unable to get temperature: %w", err)
225232
}
226233

227234
w.writeSample(formatTemp(temp), "soc")
228-
w.writeHeaderGauge(
229-
"rpi_temperature_f",
230-
"Temperature of the SoC in degrees fahrenheit.",
231-
metricTypeGauge,
232-
"id",
233-
)
235+
236+
w.writeHeaderGauge("rpi_temperature_f", "Temperature of the SoC in degrees fahrenheit.", metricTypeGauge, "id")
234237
w.writeSample(formatTemp(temp*9/5+32), "soc")
235238

236-
// Max SoC temperature
237-
w.writeHeaderGauge(
238-
"rpi_max_temperature_c",
239-
"Maximum temperature of the SoC in degrees celsius.",
240-
metricTypeGauge,
241-
"id",
242-
)
239+
w.writeHeaderGauge("rpi_max_temperature_c", "Maximum temperature of the SoC in degrees celsius.", metricTypeGauge, "id")
243240

244241
maxTemp, err := mboxOpen.GetMaxTemperature()
245242
if err != nil {
246243
return fmt.Errorf("unable to get maximum temperature: %w", err)
247244
}
248245

249246
w.writeSample(formatTemp(maxTemp), "soc")
250-
w.writeHeaderGauge(
251-
"rpi_max_temperature_f",
252-
"Maximum temperature of the SoC in degrees fahrenheit.",
253-
metricTypeGauge,
254-
"id",
255-
)
247+
248+
w.writeHeaderGauge("rpi_max_temperature_f", "Maximum temperature of the SoC in degrees fahrenheit.", metricTypeGauge, "id")
256249
w.writeSample(formatTemp(maxTemp*9/5+32), "soc")
257250

258-
/*
259-
* Voltages
260-
*/
251+
return nil
252+
}
261253

262-
// Current voltages.
254+
func (w *expWriter) writeVoltages(mboxOpen *mbox.Mailbox) error {
263255
w.writeHeaderGauge("rpi_voltage", "Current component voltage.", metricTypeGauge, "id")
264256

265257
for id, label := range voltageLabelsByID {

pkg/mbox/mailbox.go

Lines changed: 70 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -179,76 +179,108 @@ func (m *Mailbox) Close() {
179179
// Do sends a single command tag and returns all response tags. Returned memory is only usable until
180180
// the next request is made.
181181
func (m *Mailbox) Do(tagID uint32, bufferBytes int, args ...uint32) ([]Tag, error) {
182-
// Align buffer to 16-byte boundary
182+
// Ensure buffer is aligned to 16-byte boundary
183+
m.alignBuffer()
184+
185+
// Prepare buffer size for arguments
186+
bufferBytes = m.ensureBufferSize(bufferBytes, len(args))
187+
188+
// Write request and tag to buffer
189+
m.writeRequestHeader(bufferBytes, tagID, args)
190+
191+
debugf("TX:\n")
192+
m.debugBuffer(" %02d: 0x%08X\n", m.buf[:5+len(args)])
193+
194+
// Send request
195+
if err := m.sendIOCTL(); err != nil {
196+
return nil, fmt.Errorf("unable to send message via ioctl: %w", err)
197+
}
198+
199+
debugf("RX:\n")
200+
m.debugBuffer(" %02d: 0x%08X\n", m.buf[:16])
201+
202+
// Validate response code
203+
if err := m.checkResponse(); err != nil {
204+
return nil, err
205+
}
206+
207+
// Parse tags
208+
return m.readAllTags()
209+
}
210+
211+
// alignBuffer ensures the buffer is aligned to a 16-byte boundary.
212+
func (m *Mailbox) alignBuffer() {
183213
if m.buf == nil {
184214
offset := uintptr(unsafe.Pointer(&m.bufUnaligned[0])) & 15
185215
m.buf = m.bufUnaligned[16-offset : uintptr(len(m.bufUnaligned))-offset]
186216
}
217+
}
187218

188-
// Compute value buffer length
189-
// TODO: ensure 32-bit aligned
190-
if bufferBytes < len(args)*4 {
191-
bufferBytes = len(args) * 4
219+
// ensureBufferSize sets the buffer size ensuring it can hold all args.
220+
func (m *Mailbox) ensureBufferSize(bufferBytes, numArgs int) int {
221+
if bufferBytes < numArgs*4 {
222+
return numArgs * 4
192223
}
193224

194-
// Write request header
225+
return bufferBytes
226+
}
227+
228+
// writeRequestHeader writes the message header and tag into the buffer.
229+
func (m *Mailbox) writeRequestHeader(bufferBytes int, tagID uint32, args []uint32) {
195230
m.buf[0] = uint32(len(m.buf)) * 4 // buffer size
196231
m.buf[1] = RequestCodeDefault // request code
197-
198-
// Write request tag
199232
m.buf[2] = tagID
200233
m.buf[3] = uint32(bufferBytes) // Value buffer size in bytes
201234
m.buf[4] = 0 // This is a request
202-
copy(m.buf[5:], args) // Write value buffer
203-
// TODO: zero remaining buffer and end tag
204-
205-
debugf("TX:\n")
235+
copy(m.buf[5:], args) // Write value buffer // TODO: zero remaining buffer and end tag
236+
}
206237

207-
for i, v := range m.buf[:5+len(args)] {
208-
debugf(" %02d: 0x%08X\n", i, v)
238+
// debugBuffer prints out buffer values for debugging
239+
func (m *Mailbox) debugBuffer(format string, buf []uint32) {
240+
for i, v := range buf {
241+
debugf(format, i, v)
209242
}
243+
}
210244

211-
err := ioctl.Ioctl(m.f.Fd(), uintptr(mbIoctl), uintptr(unsafe.Pointer(&m.buf[0])))
212-
if err != nil {
213-
return nil, fmt.Errorf("unable to send message via ioctl: %w", err)
245+
// sendIOCTL sends the buffer via ioctl.
246+
func (m *Mailbox) sendIOCTL() error {
247+
if err := ioctl.Ioctl(m.f.Fd(), uintptr(mbIoctl), uintptr(unsafe.Pointer(&m.buf[0]))); err != nil {
248+
return fmt.Errorf("failed to send via ioctl: %w", err)
214249
}
215250

216-
debugf("RX:\n")
217-
218-
for i, v := range m.buf[:16] {
219-
debugf(" %02d: 0x%08X\n", i, v)
220-
}
251+
return nil
252+
}
221253

222-
// Check response header
223-
if m.buf[1] == replyFail {
224-
return nil, ErrRequestBuffer
254+
// checkResponse checks for errors in the response header.
255+
func (m *Mailbox) checkResponse() error {
256+
switch {
257+
case m.buf[1] == replyFail:
258+
return ErrRequestBuffer
259+
case m.buf[1]&replySuccess != replySuccess:
260+
return fmt.Errorf("vcio: unexpected response code: 0x%08x", m.buf[1])
225261
}
226262

227-
if m.buf[1]&replySuccess != replySuccess {
228-
return nil, fmt.Errorf("vcio: unexpected response code: 0x%08x", m.buf[1])
229-
}
263+
return nil
264+
}
230265

231-
remainingBytesAfterFirstTwoTag := m.buf[2:]
266+
// readAllTags parses all tags from response buffer.
267+
func (m *Mailbox) readAllTags() ([]Tag, error) {
268+
remaining := m.buf[2:]
232269

233270
var tags []Tag
234271

235272
for {
236-
readTag, err := ReadTag(remainingBytesAfterFirstTwoTag)
273+
tag, err := ReadTag(remaining)
237274
if err != nil {
238275
return nil, err
239276
}
240277

241-
if readTag.IsEnd() {
278+
if tag.IsEnd() {
242279
break
243280
}
244281

245-
if tags == nil {
246-
tags = make([]Tag, 0, 1)
247-
}
248-
249-
tags = append(tags, readTag)
250-
251-
remainingBytesAfterFirstTwoTag = remainingBytesAfterFirstTwoTag[len(readTag):]
282+
tags = append(tags, tag)
283+
remaining = remaining[len(tag):]
252284
}
253285

254286
return tags, nil

0 commit comments

Comments
 (0)