diff --git a/cmd/go-tr/main.go b/cmd/go-tr/main.go index f7b1808..6a294e5 100644 --- a/cmd/go-tr/main.go +++ b/cmd/go-tr/main.go @@ -14,14 +14,15 @@ const ( ) func main() { - mode, source, target, header_file := getFlags() + mode, source, target, header_file, addArduinoH := getFlags() checkFlagsAreValid(source) - safeTranspile(mode, source, target, header_file) + safeTranspile(mode, source, target, header_file, addArduinoH) } -func getFlags() (int, string, string, string) { +func getFlags() (int, string, string, string, bool) { pmode := flag.Bool("p", false, "Mode: C++ or Python") header_file := flag.String("h", "", "Write headers to file also") + addArduinoH := flag.Bool("a", false, "Add Arduino.h") flag.Parse() source := flag.Arg(0) @@ -32,7 +33,7 @@ func getFlags() (int, string, string, string) { mode = PYTHON_MODE } - return mode, source, target, *header_file + return mode, source, target, *header_file, *addArduinoH } func checkFlagsAreValid(source string) { @@ -48,10 +49,10 @@ func printUsage() { flag.PrintDefaults() fmt.Print("\n") fmt.Print("Example:\n") - fmt.Printf("\tgo-tr [-p] controller.go controller.ino\n\n") + fmt.Printf("\tgo-tr [-a] [-h header.h] [-p] controller.go [output.cpp]\n\n") } -func safeTranspile(mode int, source, target, header_file string) { +func safeTranspile(mode int, source, target, header_file string, addArduinoH bool) { // Read the Golang source file. in, err := os.Open(source) if err != nil { @@ -85,6 +86,7 @@ func safeTranspile(mode int, source, target, header_file string) { // Transpiles the Golang source into Arduino sketch. service := transpile.NewService(in, out) service.SetHeaderWriter(header_f) + service.AddIncludeArduinoH(addArduinoH) if err := service.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) diff --git a/transpile/service.go b/transpile/service.go index 777d041..548774f 100644 --- a/transpile/service.go +++ b/transpile/service.go @@ -16,6 +16,7 @@ import ( type Service interface { Start() error SetHeaderWriter(io.Writer) error + AddIncludeArduinoH(bool) } const ( @@ -35,9 +36,10 @@ var ( // defaultService specifies the api logic of transforming a source code format into another target format. type defaultService struct { - in io.Reader - out io.Writer - header io.Writer + in io.Reader + out io.Writer + header io.Writer + addIncludeArduinoH bool } // NewService creates a a new transpile and returns its address. @@ -57,6 +59,10 @@ func (s *defaultService) SetHeaderWriter(w io.Writer) error { return nil } +func (s *defaultService) AddIncludeArduinoH(add bool) { + s.addIncludeArduinoH = add +} + // Start ... func (s *defaultService) Start() error { if s.in == nil { @@ -100,6 +106,7 @@ func (s *defaultService) Start() error { } } + s.printIncludeHeaders() s.printFunctionDeclarations() s.printGoHelperDeclarations() @@ -117,6 +124,14 @@ func (s *defaultService) Start() error { return nil } +func (s *defaultService) printIncludeHeaders() { + if !s.addIncludeArduinoH { + return + } + + h := "#include \n\n" + s.out.Write([]byte(h)) +} func (s *defaultService) printFunctionDeclarations() { dlock.Lock() defer dlock.Unlock()