Skip to content

Commit da0f61b

Browse files
committed
No need for a temporary job file, simply pass the
job which is already in memory as an io.Reader. This also makes it Windows-ready. Tested with Creality CR-10 V2 on a Windows laptop.
1 parent 45b3b2e commit da0f61b

5 files changed

Lines changed: 25 additions & 41 deletions

File tree

daemon.go

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"encoding/json"
66
"fmt"
77
"net/http"
8-
"os"
8+
"strings"
99
"time"
1010

1111
"github.com/leoleovich/3djuggler/gcodefeeder"
@@ -15,7 +15,6 @@ import (
1515

1616
type Daemon struct {
1717
config *Config
18-
jobfile string
1918
job *juggler.Job
2019
ie *InternEndpoint
2120
feeder *gcodefeeder.Feeder
@@ -105,15 +104,10 @@ func (daemon *Daemon) Start() {
105104

106105
log.Info("Sending to printer")
107106
log.Debug("FileSize: ", len(daemon.job.FileContent))
108-
err := os.WriteFile(daemon.jobfile, []byte(daemon.job.FileContent), 0644)
109-
if err != nil {
110-
log.Error(err)
111-
break
112-
}
113107

114108
daemon.feeder, err = gcodefeeder.NewFeeder(
115109
daemon.config.Serial,
116-
daemon.jobfile,
110+
strings.NewReader(daemon.job.FileContent),
117111
)
118112
if err != nil {
119113
log.Error("Failed to create Feeder: ", err)
@@ -232,15 +226,16 @@ func (daemon *Daemon) StartHandler(w http.ResponseWriter, _ *http.Request) {
232226
// Add headers to allow AJAX
233227
juggler.SetHeaders(w)
234228

235-
if daemon.job.Status == juggler.StatusWaitingButton {
229+
switch daemon.job.Status {
230+
case juggler.StatusWaitingButton:
236231
// Initial start
237232
daemon.UpdateStatus(juggler.StatusSending)
238233
for daemon.job.Status != juggler.StatusSending {
239234
log.Infof("Waiting for %s status to be set", juggler.StatusSending)
240235
time.Sleep(1 * time.Second)
241236
}
242237
return
243-
} else if daemon.job.Status == juggler.StatusPaused {
238+
case juggler.StatusPaused:
244239
// Unpause
245240
daemon.feeder.Start()
246241
daemon.UpdateStatus(juggler.StatusPrinting)

gcodefeeder/examples/client.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package main
22

33
import (
4-
"github.com/leoleovich/3djuggler/gcodefeeder"
5-
log "github.com/sirupsen/logrus"
64
"os"
5+
"strings"
76
"time"
7+
8+
"github.com/leoleovich/3djuggler/gcodefeeder"
9+
log "github.com/sirupsen/logrus"
810
)
911

1012
func main() {
@@ -13,7 +15,7 @@ func main() {
1315

1416
feeder, _ := gcodefeeder.NewFeeder(
1517
"/dev/tty.usbmodem14601",
16-
"/Users/leoleovich/3d/M5.0_Nut_0.3mm_PLA_MK3.gcode",
18+
strings.NewReader("M140 S0\nM104 S0\nM107\nM84 X Y E\n"),
1719
)
1820
go func() {
1921
for {

gcodefeeder/feeder.go

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import (
55
"context"
66
"errors"
77
"fmt"
8-
"os"
8+
"io"
99
"regexp"
1010
"strconv"
1111
"strings"
@@ -51,7 +51,7 @@ func (s Status) String() string {
5151

5252
type Feeder struct {
5353
deviceName string
54-
fileName string
54+
gcode io.Reader
5555
printerAck chan bool
5656
progress int
5757
status Status
@@ -65,10 +65,10 @@ type Feeder struct {
6565
cancelFunc context.CancelFunc
6666
}
6767

68-
func NewFeeder(deviceName, fileName string) (*Feeder, error) {
68+
func NewFeeder(deviceName string, gcode io.Reader) (*Feeder, error) {
6969
f := Feeder{
7070
deviceName: deviceName,
71-
fileName: fileName,
71+
gcode: gcode,
7272
printerAck: make(chan bool),
7373
progressRegexp: regexp.MustCompile("M73 P([0-9]+).*"),
7474
}
@@ -79,11 +79,6 @@ func NewFeeder(deviceName, fileName string) (*Feeder, error) {
7979
return nil, fmt.Errorf("failed to connect to %s: %w", deviceName, err)
8080
}
8181
f.status = Ready
82-
83-
if _, err := os.Stat(fileName); os.IsNotExist(err) {
84-
return nil, fmt.Errorf("failed to open %s: %w", fileName, err)
85-
}
86-
8782
return &f, nil
8883
}
8984

@@ -211,7 +206,7 @@ func (f *Feeder) write(ctx context.Context, command string) error {
211206
case <-f.printerAck:
212207
break
213208
case <-ctx.Done():
214-
return errors.New("Context is Done")
209+
return errors.New("context is Done")
215210
}
216211
return nil
217212
}
@@ -235,27 +230,20 @@ func (f *Feeder) Feed() error {
235230
<-f.printerAck
236231
f.Start()
237232

238-
file, err := os.Open(f.fileName)
239-
if err != nil {
240-
f.status = Error
241-
return err
242-
}
243-
defer file.Close()
244-
245-
scanner := bufio.NewScanner(file)
233+
scanner := bufio.NewScanner(f.gcode)
246234
for scanner.Scan() {
247235
line := scanner.Text()
248236
for f.status == ManuallyPaused {
249237
select {
250238
case <-ctx.Done():
251-
return errors.New("Context is Done")
239+
return errors.New("context is Done")
252240
default:
253241
time.Sleep(5 * time.Second)
254242
log.Info("Feeder: paused manually")
255243
}
256244
}
257245
f.status = Printing
258-
err = f.write(ctx, line)
246+
err := f.write(ctx, line)
259247
if err != nil {
260248
f.status = Error
261249
return err

internendpoint.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import (
55
"encoding/json"
66
"errors"
77
"fmt"
8-
"github.com/leoleovich/3djuggler/gcodefeeder"
9-
"github.com/leoleovich/3djuggler/juggler"
108
"net/http"
119
"net/url"
1210
"time"
1311

12+
"github.com/leoleovich/3djuggler/gcodefeeder"
13+
"github.com/leoleovich/3djuggler/juggler"
14+
1415
log "github.com/sirupsen/logrus"
1516
)
1617

@@ -162,7 +163,7 @@ func (ie *InternEndpoint) getJob(id int) error {
162163
ie.job = result.Content
163164

164165
if ie.job.ID == 0 {
165-
return errors.New("Nothing to print")
166+
return errors.New("nothing to print")
166167
}
167168

168169
return nil

main.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,15 @@ import (
44
"encoding/json"
55
"flag"
66
"fmt"
7-
"github.com/leoleovich/3djuggler/juggler"
8-
log "github.com/sirupsen/logrus"
97
"io"
108
"os"
119
"time"
10+
11+
"github.com/leoleovich/3djuggler/juggler"
12+
log "github.com/sirupsen/logrus"
1213
)
1314

1415
var (
15-
jobfile = "/tmp/job"
1616
waitingForButtonInterval = 10 * time.Minute
1717
pollingInterval = 5 * time.Second
1818
defaultListen = "[::1]:8888"
@@ -89,8 +89,6 @@ func main() {
8989
daemon.config.Serial = defaultSerial
9090
}
9191

92-
daemon.jobfile = jobfile
93-
9492
daemon.ie = &InternEndpoint{
9593
APIApp: daemon.config.InternEndpoint.APIApp,
9694
APIKey: daemon.config.InternEndpoint.APIKey,

0 commit comments

Comments
 (0)