Files
bj_power/bj_power_workstation/internal/app/collector.go
T

116 lines
1.9 KiB
Go

package app
import (
"fmt"
"bjhardman.cn/bjhardman/hougai_insize_micrometer/insize"
)
type Unit int8
const (
UnitMM Unit = 0
UnitInch Unit = 1
)
const MmPerInch = 25.4
type Collector struct {
values []float64
filled []bool
current int
serial uint32
lastSeq byte
itemDefs []string
}
func NewCollector(itemDefs []string) *Collector {
n := len(itemDefs)
return &Collector{
values: make([]float64, n),
filled: make([]bool, n),
current: 0,
itemDefs: itemDefs,
}
}
func (c *Collector) ApplyFrame(f insize.Frame) {
mm := f.Value
if f.Unit == insize.UnitInch {
mm = f.Value * MmPerInch
}
c.values[c.current] = mm
c.filled[c.current] = true
c.serial = f.SerialNo
c.lastSeq = f.SeqNo
if c.current < len(c.values)-1 {
c.current++
}
}
func (c *Collector) SetValue(i int, mm float64) {
if i < 0 || i >= len(c.values) {
return
}
c.values[i] = mm
c.filled[i] = true
c.current = i
}
func (c *Collector) SetCurrent(i int) {
if i >= 0 && i < len(c.values) {
c.current = i
}
}
func (c *Collector) CurrentIndex() int { return c.current }
func (c *Collector) DisplayValue(i int, u Unit) (string, bool) {
if i < 0 || i >= len(c.values) || !c.filled[i] {
return "----", false
}
mm := c.values[i]
if u == UnitInch {
return fmt.Sprintf("%.5f", mm/MmPerInch), true
}
return fmt.Sprintf("%.3f", mm), true
}
func (c *Collector) AllFilled() bool {
for _, ok := range c.filled {
if !ok {
return false
}
}
return true
}
func (c *Collector) Clear() {
for i := range c.values {
c.values[i] = 0
c.filled[i] = false
}
c.current = 0
c.serial = 0
c.lastSeq = 0
}
func (c *Collector) Serial() (uint32, byte) {
return c.serial, c.lastSeq
}
func (c *Collector) Value(i int) float64 {
if i < 0 || i >= len(c.values) {
return 0
}
return c.values[i]
}
func (c *Collector) Count() int {
return len(c.values)
}
func (c *Collector) ItemDefs() []string {
return c.itemDefs
}