Added -dir and -file options to support printing a single file or custom folder

This commit is contained in:
Wouter Groeneveld 2023-03-18 08:47:45 +01:00
parent 69d3550851
commit 6241c45c87
2 changed files with 54 additions and 18 deletions

View File

@ -17,6 +17,13 @@ The script checks a folder for files (intended to be set up as a cron job), if t
See `main.go`, you'll probably want to edit some variables. I hacked everything together in a day for our specific case.
To inspect the possible command-line options, use `phomemoprinter --help`:
- `-dir [dir]` customize the dir to scan (by default `~/Downloads/phomemo`)
- `-file [file]` print only that image
If `-file` is used, `-dir` will be ignored.
## Launchd service
To install as a `launchd` service (mac's "cron"), copy the binary to `/usr/local/bin` and the file `com.brainbaking.PhomemoPrinter.plist` to `~/Library/LaunchAgents`. Then, in a terminal, type `launchctl load com.brainbaking.PhomemoPrinter.plist`.

63
main.go
View File

@ -2,9 +2,11 @@ package main
import (
phomemofilter "brainbaking.com/phomemoprinter/filter"
"flag"
"log"
"os"
"os/exec"
"path/filepath"
"strconv"
"strings"
"time"
@ -12,16 +14,33 @@ import (
)
var adapter = bluetooth.DefaultAdapter
var phomemoFolder = "/Downloads/phomemo"
func main() {
home, _ := os.UserHomeDir()
inDir := home + phomemoFolder
var home, _ = os.UserHomeDir()
var defaultDir = filepath.Join(home, "Downloads", "phomemo")
files, err := os.ReadDir(inDir)
must(phomemoFolder + " does not exist", err)
dir := flag.String("dir", defaultDir, "Directory to pick up any images from")
file := flag.String("file", "", "Print only a specific image. If provided, -dir will be ignored.")
flag.Parse()
if *file != "" {
log.Printf("Attempting to print file %s...\n", *file)
*dir = filepath.Join(os.TempDir(), "phomemo")
os.Mkdir(*dir, os.ModePerm) // ignore error in case still existing
err := copyFileToFolder(*file, *dir)
if err != nil {
log.Fatalf("Cannot copy %s to %s: %w. Quitting. \n", *file, *dir, err)
os.Exit(1)
}
} else {
log.Printf("Attempting to scan dir %s for files to print...\n", *dir)
}
files, err := os.ReadDir(*dir)
must("Open directory target", err)
if len(files) == 0 {
log.Printf("No files to print found in %s, nothing to do. Quitting.\n", inDir)
log.Fatalf("No files to print found in %s, nothing to do. Quitting.\n", *dir)
os.Exit(0)
}
@ -29,11 +48,6 @@ func main() {
log.Println("Scanning for Bluetooth devices...")
ch := make(chan bluetooth.ScanResult, 1)
timeout := make(chan bool, 1)
go func() {
time.Sleep(10 * time.Second)
timeout <- true
}()
go func() {
err = adapter.Scan(func(adapter *bluetooth.Adapter, device bluetooth.ScanResult) {
@ -46,13 +60,27 @@ func main() {
}()
select {
case device := <- ch:
case device := <-ch:
log.Println("Found device: ", device.Address.String(), device.RSSI, device.LocalName())
tryToPrint(device, inDir, files)
case <- timeout:
tryToPrint(device, *dir, files)
case <-time.After(10 * time.Second):
log.Fatal("Timeout trying to locate Phomemo M02, is it on? Quitting.")
os.Exit(1)
}
}
func copyFileToFolder(file string, folder string) error {
contents, err := os.ReadFile(file)
if err != nil {
return err
}
err = os.WriteFile(filepath.Join(folder, "toprint.jpg"), contents, os.ModePerm)
if err != nil {
return err
}
return nil
}
func tryToPrint(phomemoAddress bluetooth.ScanResult, dir string, files []os.DirEntry) {
@ -78,7 +106,7 @@ func tryToPrint(phomemoAddress bluetooth.ScanResult, dir string, files []os.DirE
chars, err := srvc.DiscoverCharacteristics(nil)
must("failed to discover characteristics of service", err)
pyfilterloc := dir + "/" + "phomemo-filter.py"
pyfilterloc := filepath.Join(dir, "phomemo-filter.py")
dumpFilter(pyfilterloc)
defer func() {
os.RemoveAll(pyfilterloc)
@ -89,7 +117,7 @@ func tryToPrint(phomemoAddress bluetooth.ScanResult, dir string, files []os.DirE
filePath := dir + "/" + file.Name()
if isPossibleToPrint(filePath) {
writeData(pyfilterloc, filePath, chars[1]) // 0000ff02-...
readResult(chars[0]) // 0000ff01-...
readResult(chars[0]) // 0000ff01-...
os.RemoveAll(filePath)
}
}
@ -144,6 +172,7 @@ func readResult(char bluetooth.DeviceCharacteristic) {
func must(action string, err error) {
if err != nil {
panic("failed to " + action + ": " + err.Error())
log.Fatalf("Fatal error: Failed to "+action+": %w \n", err)
os.Exit(1)
}
}