Added -dir and -file options to support printing a single file or custom folder
This commit is contained in:
parent
69d3550851
commit
6241c45c87
|
@ -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.
|
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
|
## 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`.
|
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`.
|
||||||
|
|
65
main.go
65
main.go
|
@ -2,9 +2,11 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
phomemofilter "brainbaking.com/phomemoprinter/filter"
|
phomemofilter "brainbaking.com/phomemoprinter/filter"
|
||||||
|
"flag"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
@ -12,16 +14,33 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
var adapter = bluetooth.DefaultAdapter
|
var adapter = bluetooth.DefaultAdapter
|
||||||
var phomemoFolder = "/Downloads/phomemo"
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
home, _ := os.UserHomeDir()
|
var home, _ = os.UserHomeDir()
|
||||||
inDir := home + phomemoFolder
|
var defaultDir = filepath.Join(home, "Downloads", "phomemo")
|
||||||
|
|
||||||
files, err := os.ReadDir(inDir)
|
dir := flag.String("dir", defaultDir, "Directory to pick up any images from")
|
||||||
must(phomemoFolder + " does not exist", err)
|
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 {
|
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)
|
os.Exit(0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,11 +48,6 @@ func main() {
|
||||||
|
|
||||||
log.Println("Scanning for Bluetooth devices...")
|
log.Println("Scanning for Bluetooth devices...")
|
||||||
ch := make(chan bluetooth.ScanResult, 1)
|
ch := make(chan bluetooth.ScanResult, 1)
|
||||||
timeout := make(chan bool, 1)
|
|
||||||
go func() {
|
|
||||||
time.Sleep(10 * time.Second)
|
|
||||||
timeout <- true
|
|
||||||
}()
|
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
err = adapter.Scan(func(adapter *bluetooth.Adapter, device bluetooth.ScanResult) {
|
err = adapter.Scan(func(adapter *bluetooth.Adapter, device bluetooth.ScanResult) {
|
||||||
|
@ -46,13 +60,27 @@ func main() {
|
||||||
}()
|
}()
|
||||||
|
|
||||||
select {
|
select {
|
||||||
case device := <- ch:
|
case device := <-ch:
|
||||||
log.Println("Found device: ", device.Address.String(), device.RSSI, device.LocalName())
|
log.Println("Found device: ", device.Address.String(), device.RSSI, device.LocalName())
|
||||||
tryToPrint(device, inDir, files)
|
tryToPrint(device, *dir, files)
|
||||||
case <- timeout:
|
case <-time.After(10 * time.Second):
|
||||||
log.Fatal("Timeout trying to locate Phomemo M02, is it on? Quitting.")
|
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) {
|
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)
|
chars, err := srvc.DiscoverCharacteristics(nil)
|
||||||
must("failed to discover characteristics of service", err)
|
must("failed to discover characteristics of service", err)
|
||||||
|
|
||||||
pyfilterloc := dir + "/" + "phomemo-filter.py"
|
pyfilterloc := filepath.Join(dir, "phomemo-filter.py")
|
||||||
dumpFilter(pyfilterloc)
|
dumpFilter(pyfilterloc)
|
||||||
defer func() {
|
defer func() {
|
||||||
os.RemoveAll(pyfilterloc)
|
os.RemoveAll(pyfilterloc)
|
||||||
|
@ -89,7 +117,7 @@ func tryToPrint(phomemoAddress bluetooth.ScanResult, dir string, files []os.DirE
|
||||||
filePath := dir + "/" + file.Name()
|
filePath := dir + "/" + file.Name()
|
||||||
if isPossibleToPrint(filePath) {
|
if isPossibleToPrint(filePath) {
|
||||||
writeData(pyfilterloc, filePath, chars[1]) // 0000ff02-...
|
writeData(pyfilterloc, filePath, chars[1]) // 0000ff02-...
|
||||||
readResult(chars[0]) // 0000ff01-...
|
readResult(chars[0]) // 0000ff01-...
|
||||||
os.RemoveAll(filePath)
|
os.RemoveAll(filePath)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,6 +172,7 @@ func readResult(char bluetooth.DeviceCharacteristic) {
|
||||||
|
|
||||||
func must(action string, err error) {
|
func must(action string, err error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("failed to " + action + ": " + err.Error())
|
log.Fatalf("Fatal error: Failed to "+action+": %w \n", err)
|
||||||
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue