Initial commit
This commit is contained in:
commit
2d8f958386
|
@ -0,0 +1,28 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gopkg.in/yaml.v2"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
LineCharts []LineChartConfig `yaml:"line-charts"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func Load(location string) *Config {
|
||||||
|
|
||||||
|
yamlFile, err := ioutil.ReadFile(location)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Can't read config file: %s", location)
|
||||||
|
}
|
||||||
|
|
||||||
|
cfg := new(Config)
|
||||||
|
err = yaml.Unmarshal(yamlFile, cfg)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("Can't read config file: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return cfg
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"os/exec"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Data struct {
|
||||||
|
Label string `yaml:"label"`
|
||||||
|
Color string `yaml:"color"`
|
||||||
|
Script string `yaml:"script"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *Data) NextValue() (float64, error) {
|
||||||
|
|
||||||
|
output, err := exec.Command("sh", "-c", d.Script).Output()
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("%s", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
trimmedOutput := strings.TrimSpace(string(output))
|
||||||
|
floatValue, err := strconv.ParseFloat(trimmedOutput, 64)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return floatValue, nil
|
||||||
|
}
|
|
@ -0,0 +1,9 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
type LineChartConfig struct {
|
||||||
|
Title string `yaml:"title"`
|
||||||
|
Data []Data `yaml:"data"`
|
||||||
|
Position Position `yaml:"position"`
|
||||||
|
RefreshRateMs int `yaml:"refresh-rate-ms"`
|
||||||
|
Scale string `yaml:"scale"`
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
type Position struct {
|
||||||
|
X int `yaml:"x"`
|
||||||
|
Y int `yaml:"y"`
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
package config
|
||||||
|
|
||||||
|
type Size struct {
|
||||||
|
X int `yaml:"x"`
|
||||||
|
Y int `yaml:"y"`
|
||||||
|
}
|
|
@ -0,0 +1,92 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/sqshq/plot-try/app/config"
|
||||||
|
ui "github.com/sqshq/termui"
|
||||||
|
"github.com/sqshq/termui/widgets"
|
||||||
|
"log"
|
||||||
|
"math"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
|
||||||
|
cfg := config.Load("/Users/sqshq/config.yml")
|
||||||
|
|
||||||
|
for _, linechart := range cfg.LineCharts {
|
||||||
|
for _, data := range linechart.Data {
|
||||||
|
value, _ := data.NextValue()
|
||||||
|
log.Printf("%s: %s - %v", linechart.Title, data.Label, value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printChart()
|
||||||
|
}
|
||||||
|
|
||||||
|
func printChart() {
|
||||||
|
if err := ui.Init(); err != nil {
|
||||||
|
log.Fatalf("failed to initialize termui: %v", err)
|
||||||
|
}
|
||||||
|
defer ui.Close()
|
||||||
|
|
||||||
|
sinData := func() [][]float64 {
|
||||||
|
n := 220
|
||||||
|
data := make([][]float64, 2)
|
||||||
|
data[0] = make([]float64, n)
|
||||||
|
data[1] = make([]float64, n)
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
data[0][i] = 1 + math.Sin(float64(i)/5)
|
||||||
|
data[1][i] = 1 + math.Cos(float64(i)/5)
|
||||||
|
}
|
||||||
|
return data
|
||||||
|
}()
|
||||||
|
|
||||||
|
p0 := widgets.NewPlot()
|
||||||
|
p0.Title = "braille-mode Line Chart"
|
||||||
|
p0.Data = sinData
|
||||||
|
p0.SetRect(0, 0, 50, 15)
|
||||||
|
p0.AxesColor = ui.ColorWhite
|
||||||
|
p0.LineColors[0] = ui.ColorGreen
|
||||||
|
|
||||||
|
p1 := widgets.NewPlot()
|
||||||
|
p1.Title = "dot-mode line Chart"
|
||||||
|
p1.Marker = widgets.MarkerDot
|
||||||
|
p1.Data = [][]float64{[]float64{1, 2, 3, 4, 5}}
|
||||||
|
p1.SetRect(50, 0, 75, 10)
|
||||||
|
p1.DotRune = '+'
|
||||||
|
p1.AxesColor = ui.ColorWhite
|
||||||
|
p1.LineColors[0] = ui.ColorYellow
|
||||||
|
p1.DrawDirection = widgets.DrawLeft
|
||||||
|
|
||||||
|
p2 := widgets.NewPlot()
|
||||||
|
p2.Title = "dot-mode Scatter Plot"
|
||||||
|
p2.Marker = widgets.MarkerDot
|
||||||
|
p2.Data = make([][]float64, 2)
|
||||||
|
p2.Data[0] = []float64{1, 2, 3, 4, 5}
|
||||||
|
p2.Data[1] = sinData[1][4:]
|
||||||
|
p2.SetRect(0, 15, 50, 30)
|
||||||
|
p2.AxesColor = ui.ColorWhite
|
||||||
|
p2.LineColors[0] = ui.ColorCyan
|
||||||
|
p2.Type = widgets.ScatterPlot
|
||||||
|
|
||||||
|
p3 := widgets.NewPlot()
|
||||||
|
p3.Title = "braille-mode Scatter Plot"
|
||||||
|
p3.Data = make([][]float64, 2)
|
||||||
|
p3.Data[0] = []float64{1, 2, 3, 4, 5}
|
||||||
|
p3.Data[1] = sinData[1][4:]
|
||||||
|
p3.SetRect(45, 15, 80, 30)
|
||||||
|
p3.AxesColor = ui.ColorWhite
|
||||||
|
p3.LineColors[0] = ui.ColorCyan
|
||||||
|
p3.Marker = widgets.MarkerBraille
|
||||||
|
p3.Type = widgets.ScatterPlot
|
||||||
|
|
||||||
|
ui.Render(p0, p1, p2, p3)
|
||||||
|
|
||||||
|
uiEvents := ui.PollEvents()
|
||||||
|
for {
|
||||||
|
e := <-uiEvents
|
||||||
|
switch e.ID {
|
||||||
|
case "q", "<C-c>":
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
module github.com/sqshq/plot-try
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/mattn/go-runewidth v0.0.4 // indirect
|
||||||
|
github.com/mitchellh/go-wordwrap v1.0.0 // indirect
|
||||||
|
github.com/sqshq/termui v0.0.0-20190125032456-731556c09f2c
|
||||||
|
gopkg.in/yaml.v2 v2.2.2
|
||||||
|
)
|
|
@ -0,0 +1,19 @@
|
||||||
|
github.com/google/pprof v0.0.0-20190109223431-e84dfd68c163/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
|
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y=
|
||||||
|
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
|
||||||
|
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||||
|
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
|
||||||
|
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
|
||||||
|
github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d h1:x3S6kxmy49zXVVyhcnrFqxvNVCBPb2KZ9hV2RBdS840=
|
||||||
|
github.com/nsf/termbox-go v0.0.0-20190121233118-02980233997d/go.mod h1:IuKpRQcYE1Tfu+oAQqaLisqDeXgjyyltCfsaoYN18NQ=
|
||||||
|
github.com/sqshq/termui v0.0.0-20190125032456-731556c09f2c h1:BBEmIcD4UhAHDVWi3PVuA5TxVTZxcjmYzmdvhWkPfvE=
|
||||||
|
github.com/sqshq/termui v0.0.0-20190125032456-731556c09f2c/go.mod h1:puWaguPLLYPPKabYPVhZ8sDNe0nKSMiKWRfLVaaX8Zs=
|
||||||
|
golang.org/x/arch v0.0.0-20181203225421-5a4828bb7045/go.mod h1:cYlCBUl1MsqxdiKgmc4uh7TxZfWSFLOGSRR090WDxt8=
|
||||||
|
golang.org/x/crypto v0.0.0-20190103213133-ff983b9c42bc/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
|
golang.org/x/sys v0.0.0-20190116161447-11f53e031339/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||||
|
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
Loading…
Reference in New Issue