@ -6,6 +6,7 @@ import (
"os"
"os/exec"
"strconv"
"strings"
"time"
"tinygo.org/x/bluetooth"
)
@ -18,29 +19,40 @@ func main() {
inDir := home + phomemoFolder
files , err := os . ReadDir ( inDir )
must ( phomemoFolder , err )
must ( phomemoFolder + " does not exist" , err )
if len ( files ) == 0 {
log . Printf ( "No files to print found in %s . Quitting.\n", inDir )
log . Printf ( "No files to print found in %s , nothing to do . Quitting.\n", inDir )
os . Exit ( 0 )
}
// Enable BLE interface.
must ( "enable BLE stack" , adapter . Enable ( ) )
must ( "Enable Bluetooth stack" , adapter . Enable ( ) )
// Start scanning. Use this to figure out your device's UUID. Phomemo uses a non-random one.
println ( "scanning..." )
var phomemoAddress bluetooth . ScanResult
err = adapter . Scan ( func ( adapter * bluetooth . Adapter , device bluetooth . ScanResult ) {
if device . LocalName ( ) == "Mr.in_M02" {
phomemoAddress = device
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
} ( )
println ( "found device: " , device . Address . String ( ) , device . RSSI , device . LocalName ( ) )
adapter . StopScan ( )
}
} )
must ( "start scan" , err )
go func ( ) {
err = adapter . Scan ( func ( adapter * bluetooth . Adapter , device bluetooth . ScanResult ) {
if device . LocalName ( ) == "Mr.in_M02" {
ch <- device
adapter . StopScan ( )
}
} )
must ( "start scan" , err )
} ( )
select {
case device := <- ch :
log . Println ( "Found device: " , device . Address . String ( ) , device . RSSI , device . LocalName ( ) )
tryToPrint ( device , inDir , files )
case <- timeout :
log . Fatal ( "Timeout trying to locate Phomemo M02, is it on? Quitting." )
}
tryToPrint ( phomemoAddress , inDir , files )
}
func tryToPrint ( phomemoAddress bluetooth . ScanResult , dir string , files [ ] os . DirEntry ) {
@ -66,31 +78,42 @@ func tryToPrint(phomemoAddress bluetooth.ScanResult, dir string, files []os.DirE
chars , err := srvc . DiscoverCharacteristics ( nil )
must ( "failed to discover characteristics of service" , err )
dumpFilter ( "phomemo-filter.py" )
pyfilterloc := dir + "/" + "phomemo-filter.py"
dumpFilter ( pyfilterloc )
defer func ( ) {
os . RemoveAll ( "phomemo-filter.py" )
os . RemoveAll ( pyfilterloc )
} ( )
// 3 characteristics to discover 0000ff01, 0000ff02, and 0000ff03
for _ , file := range files {
filePath := dir + "/" + file . Name ( )
writeData ( filePath , chars [ 1 ] ) // 0000ff02-...
readResult ( chars [ 0 ] ) // 0000ff01-...
os . RemoveAll ( filePath )
if isPossibleToPrint ( filePath ) {
writeData ( pyfilterloc , filePath , chars [ 1 ] ) // 0000ff02-...
readResult ( chars [ 0 ] ) // 0000ff01-...
os . RemoveAll ( filePath )
}
}
log . Println ( "-- DONE" )
}
func isPossibleToPrint ( filename string ) bool {
return strings . HasSuffix ( filename , ".jpg" ) ||
strings . HasSuffix ( filename , ".JPG" ) ||
strings . HasSuffix ( filename , ".png" ) ||
strings . HasSuffix ( filename , ".PNG" )
}
func dumpFilter ( filename string ) {
err := os . WriteFile ( filename , phomemofilter . Pyfilter , 0666 )
must ( "unable to dump python filter for use" , err )
}
func writeData ( path string , char bluetooth . DeviceCharacteristic ) {
func writeData ( p yfilterloc string , p ath string , char bluetooth . DeviceCharacteristic ) {
// first, it needs to be prepared for the printer
pathpho := path + ".pho"
argstr := [ ] string { "-c" , "python phomemo-filter.py " + path + " > " + pathpho }
argstr := [ ] string { "-c" , "/usr/local/bin/python " + pyfilterloc + " " + path + " > " + pathpho }
log . Println ( "args" , argstr )
_ , err := exec . Command ( "/bin/zsh" , argstr ... ) . Output ( )
must ( "something went wrong while filtering phomemo data py" , err )