2013-12-02 14:50:02 -08:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
2014-12-24 09:53:48 -08:00
|
|
|
"io/ioutil"
|
2013-12-02 14:50:02 -08:00
|
|
|
"os"
|
2014-06-09 19:59:59 -07:00
|
|
|
"strings"
|
2013-12-02 14:50:02 -08:00
|
|
|
"text/template"
|
2014-07-12 09:49:18 -07:00
|
|
|
|
|
|
|
"github.com/codegangsta/cli"
|
2013-12-02 14:50:02 -08:00
|
|
|
)
|
|
|
|
|
2014-06-09 19:59:59 -07:00
|
|
|
type generate struct {
|
|
|
|
Name string
|
|
|
|
UpperName string
|
|
|
|
FirstLetter string
|
2013-12-02 14:50:02 -08:00
|
|
|
}
|
|
|
|
|
2014-06-09 19:59:59 -07:00
|
|
|
func Generate() cli.Command {
|
|
|
|
return cli.Command{
|
|
|
|
Name: "generate",
|
|
|
|
Usage: "Generate new Gobot skeleton project",
|
|
|
|
Action: func(c *cli.Context) {
|
|
|
|
args := c.Args()
|
|
|
|
if len(args) == 0 || len(args) > 1 {
|
|
|
|
fmt.Println("Please provide a one word package name.")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
pwd, _ := os.Getwd()
|
2014-12-24 09:53:48 -08:00
|
|
|
dir := fmt.Sprintf("%s/%s", pwd, "gobot-"+args[0])
|
2014-06-09 19:59:59 -07:00
|
|
|
fmt.Println("Creating", dir)
|
|
|
|
err := os.MkdirAll(dir, 0700)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
examplesDir := dir + "/examples"
|
|
|
|
fmt.Println("Creating", examplesDir)
|
|
|
|
err = os.MkdirAll(examplesDir, 0700)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
|
|
|
|
2014-07-12 09:49:18 -07:00
|
|
|
upperName := fmt.Sprintf("%s%s",
|
|
|
|
strings.ToUpper(string(args[0][0])),
|
|
|
|
string(args[0][1:]))
|
2014-06-09 19:59:59 -07:00
|
|
|
|
2014-07-12 09:49:18 -07:00
|
|
|
name := generate{
|
|
|
|
UpperName: upperName,
|
|
|
|
Name: string(args[0]),
|
|
|
|
FirstLetter: string(args[0][0]),
|
|
|
|
}
|
2014-06-09 19:59:59 -07:00
|
|
|
|
|
|
|
adaptor, _ := template.New("").Parse(adaptor())
|
2014-06-10 15:16:11 -07:00
|
|
|
fileLocation := fmt.Sprintf("%s/%s_adaptor.go", dir, args[0])
|
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err := os.Create(fileLocation)
|
2014-06-09 19:59:59 -07:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
|
|
|
adaptor.Execute(f, name)
|
|
|
|
f.Close()
|
|
|
|
|
|
|
|
driver, _ := template.New("").Parse(driver())
|
2014-06-10 15:16:11 -07:00
|
|
|
fileLocation = fmt.Sprintf("%s/%s_driver.go", dir, args[0])
|
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err = os.Create(fileLocation)
|
2014-06-09 19:59:59 -07:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
|
|
|
driver.Execute(f, name)
|
|
|
|
f.Close()
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
fileLocation = fmt.Sprintf("%s/LICENSE", dir)
|
2014-06-10 15:16:11 -07:00
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err = os.Create(fileLocation)
|
2014-06-09 19:59:59 -07:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
|
|
|
f.Close()
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
driverTest, _ := template.New("").Parse(driverTest())
|
|
|
|
fileLocation = fmt.Sprintf("%s/%s_driver_test.go", dir, args[0])
|
2014-06-10 15:16:11 -07:00
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err = os.Create(fileLocation)
|
2014-06-09 19:59:59 -07:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
2014-12-24 09:53:48 -08:00
|
|
|
driverTest.Execute(f, name)
|
2014-06-09 19:59:59 -07:00
|
|
|
f.Close()
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
adaptorTest, _ := template.New("").Parse(adaptorTest())
|
|
|
|
fileLocation = fmt.Sprintf("%s/%s_adaptor_test.go", dir, args[0])
|
2014-06-10 15:16:11 -07:00
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err = os.Create(fileLocation)
|
2014-06-09 19:59:59 -07:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
2014-12-24 09:53:48 -08:00
|
|
|
adaptorTest.Execute(f, name)
|
2014-06-09 19:59:59 -07:00
|
|
|
f.Close()
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
example, _ := template.New("").Parse(example())
|
|
|
|
fileLocation = fmt.Sprintf("%s/main.go", examplesDir)
|
2014-06-10 15:16:11 -07:00
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err = os.Create(fileLocation)
|
2014-06-09 19:59:59 -07:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
2014-12-24 09:53:48 -08:00
|
|
|
example.Execute(f, name)
|
|
|
|
f.Close()
|
|
|
|
|
|
|
|
readme, _ := template.New("").Parse(readme())
|
|
|
|
fileLocation = fmt.Sprintf("%s/README.md", dir)
|
|
|
|
fmt.Println("Creating", fileLocation)
|
|
|
|
f, err = os.Create(fileLocation)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
err = nil
|
|
|
|
}
|
|
|
|
|
|
|
|
ex, _ := ioutil.ReadFile(examplesDir + "/main.go")
|
|
|
|
data := struct {
|
|
|
|
Name string
|
|
|
|
Example string
|
|
|
|
}{
|
|
|
|
name.Name,
|
|
|
|
string(ex),
|
|
|
|
}
|
|
|
|
readme.Execute(f, data)
|
2014-06-09 19:59:59 -07:00
|
|
|
f.Close()
|
|
|
|
},
|
2014-02-24 20:18:12 -08:00
|
|
|
}
|
2013-12-02 14:50:02 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
func adaptor() string {
|
2014-12-24 09:53:48 -08:00
|
|
|
return `package {{.Name}}
|
2013-12-02 14:50:02 -08:00
|
|
|
|
|
|
|
import (
|
2014-12-24 09:53:48 -08:00
|
|
|
"github.com/hybridgroup/gobot"
|
2013-12-02 14:50:02 -08:00
|
|
|
)
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
var _ gobot.Adaptor = (*{{.UpperName}}Adaptor)(nil)
|
|
|
|
|
|
|
|
type {{.UpperName}}Adaptor struct {
|
|
|
|
name string
|
2014-02-24 20:18:12 -08:00
|
|
|
}
|
|
|
|
|
2014-06-09 19:59:59 -07:00
|
|
|
func New{{.UpperName}}Adaptor(name string) *{{.UpperName}}Adaptor {
|
2014-12-24 09:53:48 -08:00
|
|
|
return &{{.UpperName}}Adaptor{
|
|
|
|
name: name,
|
|
|
|
}
|
2014-02-24 20:18:12 -08:00
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Name() string { return {{.FirstLetter}}.name }
|
2013-12-02 14:50:02 -08:00
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Connect() []error { return nil }
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Finalize() []error { return nil }
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Adaptor) Ping() string { return "pong" }
|
2013-12-02 14:50:02 -08:00
|
|
|
`
|
|
|
|
}
|
|
|
|
|
|
|
|
func driver() string {
|
2014-12-24 09:53:48 -08:00
|
|
|
return `package {{.Name }}
|
2013-12-02 14:50:02 -08:00
|
|
|
|
|
|
|
import (
|
2014-12-24 09:53:48 -08:00
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/hybridgroup/gobot"
|
2013-12-02 14:50:02 -08:00
|
|
|
)
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
var _ gobot.Driver = (*{{.UpperName}}Driver)(nil)
|
|
|
|
|
|
|
|
const Hello string = "hello"
|
2013-12-02 14:50:02 -08:00
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
type {{.UpperName}}Driver struct {
|
|
|
|
name string
|
|
|
|
connection gobot.Connection
|
|
|
|
interval time.Duration
|
|
|
|
halt chan bool
|
|
|
|
gobot.Eventer
|
|
|
|
gobot.Commander
|
2014-02-24 20:18:12 -08:00
|
|
|
}
|
|
|
|
|
2014-06-09 19:59:59 -07:00
|
|
|
func New{{.UpperName}}Driver(a *{{.UpperName}}Adaptor, name string) *{{.UpperName}}Driver {
|
2014-12-24 09:53:48 -08:00
|
|
|
{{.FirstLetter}} := &{{.UpperName}}Driver{
|
|
|
|
name: name,
|
|
|
|
connection: a,
|
|
|
|
interval: 500*time.Millisecond,
|
|
|
|
halt: make(chan bool, 0),
|
|
|
|
Eventer: gobot.NewEventer(),
|
|
|
|
Commander: gobot.NewCommander(),
|
|
|
|
}
|
|
|
|
|
|
|
|
{{.FirstLetter}}.AddEvent(Hello)
|
|
|
|
|
|
|
|
{{.FirstLetter}}.AddCommand(Hello, func(params map[string]interface{}) interface{} {
|
|
|
|
return {{.FirstLetter}}.Hello()
|
|
|
|
})
|
|
|
|
|
|
|
|
return {{.FirstLetter}}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) Name() string { return {{.FirstLetter}}.name }
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) Connection() gobot.Connection {
|
|
|
|
return {{.FirstLetter}}.connection
|
|
|
|
}
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) adaptor() *{{.UpperName}}Adaptor {
|
|
|
|
return {{.FirstLetter}}.Connection().(*{{.UpperName}}Adaptor)
|
2013-12-02 14:50:02 -08:00
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) Hello() string {
|
|
|
|
return "hello from " + {{.FirstLetter}}.Name() + "!"
|
|
|
|
}
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) Ping() string {
|
|
|
|
return {{.FirstLetter}}.adaptor().Ping()
|
|
|
|
}
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) Start() []error {
|
|
|
|
go func() {
|
|
|
|
for {
|
|
|
|
gobot.Publish({{.FirstLetter}}.Event(Hello), {{.FirstLetter}}.Hello())
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <- time.After({{.FirstLetter}}.interval):
|
|
|
|
case <- {{.FirstLetter}}.halt:
|
|
|
|
return
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}()
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func ({{.FirstLetter}} *{{.UpperName}}Driver) Halt() []error {
|
|
|
|
{{.FirstLetter}}.halt <- true
|
|
|
|
return nil
|
2014-06-15 17:27:51 -07:00
|
|
|
}
|
|
|
|
|
2014-04-01 19:20:38 -07:00
|
|
|
`
|
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func example() string {
|
|
|
|
return `
|
|
|
|
package main
|
2014-04-01 19:20:38 -07:00
|
|
|
|
|
|
|
import (
|
2014-12-24 09:53:48 -08:00
|
|
|
"../"
|
|
|
|
"fmt"
|
|
|
|
"time"
|
|
|
|
|
2014-06-13 15:09:04 -07:00
|
|
|
"github.com/hybridgroup/gobot"
|
2014-04-01 19:20:38 -07:00
|
|
|
)
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func main() {
|
|
|
|
gbot := gobot.NewGobot()
|
2014-04-01 19:20:38 -07:00
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
conn := {{.Name}}.New{{.UpperName}}Adaptor("conn")
|
|
|
|
dev := {{.Name}}.New{{.UpperName}}Driver(conn, "dev")
|
|
|
|
|
|
|
|
work := func() {
|
|
|
|
gobot.On(dev.Event({{.Name}}.Hello), func(data interface{}) {
|
|
|
|
fmt.Println(data)
|
|
|
|
})
|
|
|
|
|
|
|
|
gobot.Every(1200*time.Millisecond, func() {
|
|
|
|
fmt.Println(dev.Ping())
|
|
|
|
})
|
|
|
|
}
|
2014-04-01 19:20:38 -07:00
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
robot := gobot.NewRobot(
|
|
|
|
"robot",
|
|
|
|
[]gobot.Connection{conn},
|
|
|
|
[]gobot.Device{dev},
|
|
|
|
work,
|
|
|
|
)
|
|
|
|
|
|
|
|
gbot.AddRobot(robot)
|
|
|
|
gbot.Start()
|
2014-06-13 15:09:04 -07:00
|
|
|
}
|
2014-04-01 19:20:38 -07:00
|
|
|
`
|
2013-12-02 14:50:02 -08:00
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func driverTest() string {
|
|
|
|
return `package {{.Name}}
|
2014-04-01 19:20:38 -07:00
|
|
|
|
|
|
|
import (
|
2014-12-24 09:53:48 -08:00
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/hybridgroup/gobot"
|
2014-04-01 19:20:38 -07:00
|
|
|
)
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func Test{{.UpperName}}Driver(t *testing.T) {
|
|
|
|
d := New{{.UpperName}}Driver(New{{.UpperName}}Adaptor("conn"), "dev")
|
|
|
|
|
|
|
|
gobot.Assert(t, d.Name(), "dev")
|
|
|
|
gobot.Assert(t, d.Connection().Name(), "conn")
|
|
|
|
|
|
|
|
ret := d.Command(Hello)(nil)
|
|
|
|
gobot.Assert(t, ret.(string), "hello from dev!")
|
|
|
|
|
|
|
|
gobot.Assert(t, d.Ping(), "pong")
|
|
|
|
|
|
|
|
gobot.Assert(t, len(d.Start()), 0)
|
|
|
|
|
|
|
|
<-time.After(d.interval)
|
|
|
|
|
|
|
|
sem := make(chan bool, 0)
|
|
|
|
|
|
|
|
gobot.On(d.Event(Hello), func(data interface{}) {
|
|
|
|
sem <- true
|
|
|
|
})
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-sem:
|
|
|
|
case <-time.After(600 * time.Millisecond):
|
|
|
|
t.Errorf("Hello Event was not published")
|
|
|
|
}
|
|
|
|
|
|
|
|
gobot.Assert(t, len(d.Halt()), 0)
|
|
|
|
|
|
|
|
gobot.On(d.Event(Hello), func(data interface{}) {
|
|
|
|
sem <- true
|
|
|
|
})
|
|
|
|
|
|
|
|
select {
|
|
|
|
case <-sem:
|
|
|
|
t.Errorf("Hello Event should not publish after Halt")
|
|
|
|
case <-time.After(600 * time.Millisecond):
|
|
|
|
}
|
2014-06-13 15:09:04 -07:00
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
`
|
2014-06-13 15:09:04 -07:00
|
|
|
}
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
func adaptorTest() string {
|
|
|
|
return `package {{.Name}}
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/hybridgroup/gobot"
|
|
|
|
)
|
|
|
|
|
|
|
|
func Test{{.UpperName}}Adaptor(t *testing.T) {
|
|
|
|
a := New{{.UpperName}}Adaptor("tester")
|
|
|
|
|
|
|
|
gobot.Assert(t, a.Name(), "tester")
|
|
|
|
|
|
|
|
gobot.Assert(t, len(a.Connect()), 0)
|
|
|
|
|
|
|
|
gobot.Assert(t, a.Ping(), "pong")
|
|
|
|
|
|
|
|
gobot.Assert(t, len(a.Connect()), 0)
|
|
|
|
|
|
|
|
gobot.Assert(t, len(a.Finalize()), 0)
|
2013-12-02 14:50:02 -08:00
|
|
|
}
|
|
|
|
`
|
|
|
|
}
|
2014-02-24 20:18:12 -08:00
|
|
|
|
|
|
|
func readme() string {
|
2014-12-24 09:53:48 -08:00
|
|
|
return `# {{.Name}}
|
2014-02-24 20:18:12 -08:00
|
|
|
|
2014-06-09 19:59:59 -07:00
|
|
|
Gobot (http://gobot.io/) is a framework for robotics and physical computing using Go
|
2014-02-24 20:18:12 -08:00
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
This repository contains the Gobot adaptor and driver for {{.Name}}.
|
2014-02-24 20:18:12 -08:00
|
|
|
|
|
|
|
For more information about Gobot, check out the github repo at
|
|
|
|
https://github.com/hybridgroup/gobot
|
|
|
|
|
|
|
|
## Installing
|
2014-12-24 09:53:48 -08:00
|
|
|
` + "```bash\ngo get path/to/repo/{{.Name}}\n```" + `
|
2014-02-24 20:18:12 -08:00
|
|
|
|
|
|
|
## Using
|
2014-12-24 09:53:48 -08:00
|
|
|
` + "```go{{.Example}}\n```" + `
|
2014-02-24 20:18:12 -08:00
|
|
|
|
|
|
|
## Connecting
|
|
|
|
|
2014-12-24 09:53:48 -08:00
|
|
|
Explain how to connect to the device here...
|
2014-02-24 20:18:12 -08:00
|
|
|
|
|
|
|
## License
|
|
|
|
|
|
|
|
Copyright (c) 2014 Your Name Here. See LICENSE for more details
|
|
|
|
`
|
|
|
|
}
|