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 }