116 lines
1.9 KiB
Go
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
|
||
|
|
}
|