Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
c939773
initial commit of theirs code
OndroMih Jul 22, 2013
ec36be7
PDD emulator in tk application
OndroMih Jul 22, 2013
1d82edd
Fix of PDD: emulator not blocking event loop
OndroMih Jul 22, 2013
6ff2111
Restructuring of application code
OndroMih Jul 24, 2013
f675e74
Listeners on PDD emulator.
OndroMih Jul 24, 2013
97476e2
Bug fix in emulator loop
OndroMih Jul 24, 2013
32cf227
Read datFile from config and change default window size.
OndroMih Jul 24, 2013
69586ed
Display list of patterns in dat file and bitmap for selected pattern.
OndroMih Jul 26, 2013
52917bc
Scrollbar to list of patterns, printed pattern rsizes after window re…
OndroMih Jul 28, 2013
d4bb8dd
Inserting bitmap
OndroMih Jul 30, 2013
fcb1275
Insert pattern to load to machine
OndroMih Aug 3, 2013
930b546
Fix of display of patterns, added grid in pattern display
OndroMih Nov 26, 2013
447fc93
Fix for kh940 (tested only pattern display yet, not pattern insert)
OndroMih Nov 29, 2013
c0ecc0d
Black in bmp is inserted as black into machine (not inverse)
OndroMih Nov 29, 2013
ea9a2de
Generalized new algorithm to work with any memory size.
OndroMih Nov 29, 2013
d8fcc9e
Removed rubbish code
OndroMih Nov 30, 2013
ce7c02b
import convenience functions from brother module
OndroMih Nov 30, 2013
a922e34
Merge branch 'master' of https://github.com/OndrejM/knitting_machine.git
OndroMih Nov 30, 2013
6b84009
Added some documentation about my changes
OndroMih Nov 30, 2013
4ce4693
moved document into common docs folder
OndroMih Nov 30, 2013
59be3ab
Fixed insert pattern script, fixed emulator putting CUP to 100% when …
OndroMih Nov 30, 2013
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 14 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# specific to knitting machine source
img
img.start
docs
test-data

# binary files
*.bmp
*.xcf
*.png
*.dat

# python files
*.pyc
3 changes: 3 additions & 0 deletions Changelog
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
======================================================================
Nov 29, 2013
Added new graphical interface.
Added new algorithm for reading patterns based in pointers (should work with most brother machines)
Feb 19, 2012
Renamed PDDemulate-1.0.py to PDDemulate.py, and put the version number in the script.
Print version number on script start
Expand Down
Empty file modified PDDemu-debug.py
100755 → 100644
Empty file.
74 changes: 49 additions & 25 deletions PDDemulate.py
100755 → 100644
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,17 @@ def dumpId(self):
print

class Disk():
"""
Fields:
self.lastDatFilePath : string
"""

def __init__(self, basename):
self.numSectors = 80
self.Sectors = []
self.filespath = ""
""
self.lastDatFilePath = None
# Set up disk Files and internal buffers

# if absolute path, just accept it
Expand Down Expand Up @@ -261,6 +268,7 @@ def writeSector(self, psn, lsn, indata):
outfn = os.path.join(self.filespath, filename)
cmd = 'cat %s %s > %s' % (fn1, fn2, outfn)
os.system(cmd)
self.lastDatFilePath = outfn
return

def readSector(self, psn, lsn):
Expand All @@ -269,6 +277,7 @@ def readSector(self, psn, lsn):
class PDDemulator():

def __init__(self, basename):
self.listeners = [] # list of PDDEmulatorListener
self.verbose = True
self.noserial = False
self.ser = None
Expand All @@ -285,6 +294,7 @@ def __del__(self):
def open(self, cport='/dev/ttyUSB0'):
if self.noserial is False:
self.ser = serial.Serial(port=cport, baudrate=9600, parity='N', stopbits=1, timeout=1, xonxoff=0, rtscts=0, dsrdtr=0)
# self.ser.setRTS(True)
if self.ser == None:
print 'Unable to open serial device %s' % cport
raise IOError
Expand Down Expand Up @@ -377,20 +387,26 @@ def readOpmodeRequest(self, req):
def handleRequests(self):
synced = False
while True:
inc = self.readchar()
if self.FDCmode:
self.handleFDCmodeRequest(inc)
else:
# in OpMode, look for ZZ
#inc = self.readchar()
if inc != 'Z':
continue
inc = self.readchar()
if inc == 'Z':
self.handleOpModeRequest()
self.handleRequest()
# never returns
return

def handleRequest(self, blocking = True):
if not blocking:
if self.ser.inWaiting() == 0:
return
inc = self.readchar()
if self.FDCmode:
self.handleFDCmodeRequest(inc)
else:
# in OpMode, look for ZZ
#inc = self.readchar()
if inc != 'Z':
return
inc = self.readchar()
if inc == 'Z':
self.handleOpModeRequest()

def handleOpModeRequest(self):
req = ord(self.ser.read())
print 'Request: 0X%02X' % req
Expand Down Expand Up @@ -601,6 +617,9 @@ def handleFDCmodeRequest(self, cmd):
indata = self.readsomechars(1024)
try:
self.disk.writeSector(psn, lsn, indata)
for l in self.listeners:
l.dataReceived(self.disk.lastDatFilePath)
print 'Saved data in dat file: ', self.disk.lastDatFilePath
except:
print 'Failed to write data for sector %d, quitting' % psn
self.writebytes('80000000')
Expand All @@ -614,23 +633,28 @@ def handleFDCmodeRequest(self, cmd):
# return to Operational Mode
return

class PDDEmulatorListener:
def dataReceived(self, fullFilePath):
pass

# meat and potatos here

if len(sys.argv) < 3:
print '%s version %s' % (sys.argv[0], version)
print 'Usage: %s basedir serialdevice' % sys.argv[0]
sys.exit()
if __name__ == "__main__":
if len(sys.argv) < 3:
print '%s version %s' % (sys.argv[0], version)
print 'Usage: %s basedir serialdevice' % sys.argv[0]
sys.exit()

print 'Preparing . . . Please Wait'
emu = PDDemulator(sys.argv[1])
print 'Preparing . . . Please Wait'
emu = PDDemulator(sys.argv[1])

emu.open(cport=sys.argv[2])
emu.open(cport=sys.argv[2])

print 'PDDtmulate Version 1.1 Ready!'
try:
while 1:
emu.handleRequests()
except (KeyboardInterrupt):
pass
print 'PDDtmulate Version 1.1 Ready!'
try:
while 1:
emu.handleRequests()
except (KeyboardInterrupt):
pass

emu.close()
emu.close()
8 changes: 8 additions & 0 deletions README
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
Please see the Changelog file for the latest changes

=== QUICK START ===

Execute script guimain.py to start graphical application.
This application can start floppy disk emulator and provides means to download/upload patterns and modify them.
It is based on existing python scripts, which were slightly modified for better user experience in graphical application.

=================

These files are related to the Brother KH-930E knitting machine, and other similar models.

=== NOTE ===
Expand Down
Binary file removed adafabric.bmp
Binary file not shown.
Empty file added app/__init__.py
Empty file.
141 changes: 141 additions & 0 deletions app/gui/Gui.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,141 @@
import Tkinter

class Gui:
def initializeMainWindow(self,w):
self.initMainWindow(w)

self._maxColumns = 1000
self._maxRows = 1000
self._row = 0
self.createDeviceWidgets()
self.createEmulatorButton()

self._row += 1
self.createDatFileWidgets()

self._row += 1
self.createPatternsPanel()

self._row += 1
self.createInfoMessagesLabel()

def initMainWindow(self, mainWindow):
self.mainWindow = mainWindow
self.mainWindow.title('Knitting pattern uploader')
self.mainWindow.geometry("600x400")
self.mainWindow.grid()
self.mainWindow.grid_columnconfigure(1,weight=10)
self.mainWindow.grid_columnconfigure(2,weight=1)
self.mainWindow.resizable(True,True)

def createDeviceWidgets(self):
label = Tkinter.Label(self.mainWindow, text=u"Device path (port):")
label.grid(column=0, row=self._row, sticky='W')

entryText = Tkinter.StringVar()
self.mainWindow.deviceEntry = Tkinter.Entry(self.mainWindow, textvariable=entryText)
self.mainWindow.deviceEntry.grid(column=1,row=self._row,sticky='EW')
self.mainWindow.deviceEntry.entryText = entryText

def createEmulatorButton(self):
caption = Tkinter.StringVar()
self.emuButton = Tkinter.Button(self.mainWindow, textvariable = caption, command = self.mainWindow.emuButtonClicked)
self.emuButton.caption = caption
self.emuButton.grid(column=2,row=self._row, columnspan=2, sticky='EW')
self.setEmuButtonStopped()

but = Tkinter.Button(self.mainWindow, text = u'Help...', command = self.mainWindow.helpButtonClicked)
but.grid(column=4,row=self._row, sticky='E')

def createDatFileWidgets(self):
label = Tkinter.Label(self.mainWindow, text=u"Dat file:")
label.grid(column=0, row=self._row, sticky='W')

entryText = Tkinter.StringVar()
self.mainWindow.datFileEntry = Tkinter.Entry(self.mainWindow, textvariable=entryText)
self.mainWindow.datFileEntry.grid(column=1,row=self._row,sticky='EW')
self.mainWindow.datFileEntry.entryText = entryText

self.chooseDatFileButton = Tkinter.Button(self.mainWindow, text=u"...", command = self.mainWindow.chooseDatFileButtonClicked)
self.chooseDatFileButton.grid(column=2,row=self._row,sticky='W')

self.reloadDatFileButton = Tkinter.Button(self.mainWindow, text=u"Reload file", command = self.mainWindow.reloadDatFileButtonClicked)
self.reloadDatFileButton.grid(column=3,row=self._row,sticky='EW')

but = Tkinter.Button(self.mainWindow, text=u"Store track", command = self.mainWindow.storeTrackButtonClicked)
but.grid(column=4,row=self._row,sticky='EW')
self.storeTrackButton = but

def createInfoMessagesLabel(self):
labelText = Tkinter.StringVar()
label = Tkinter.Label(self.mainWindow, anchor="w",fg="white",bg="blue",textvariable=labelText)
label.grid(column=0,row=self._row,columnspan=self._maxColumns,sticky='EW')
label.caption = labelText
self.mainWindow.infoLabel = label

def createPatternsPanel(self):
patternFrame = Tkinter.Frame(self.mainWindow)
patternFrame.grid(column=0, row=self._row, columnspan = self._maxColumns,sticky='EWNS')
self.mainWindow.grid_rowconfigure(self._row,weight=1)
patternFrame.grid_columnconfigure(0,weight=0)
patternFrame.grid_columnconfigure(1,weight=1)
patternFrame.grid_rowconfigure(1,weight=1)

listboxFrame = Tkinter.Frame(patternFrame)
listboxFrame.grid(column=0, row=0, sticky='EWNS', rowspan=self._maxRows)
scrollbar = Tkinter.Scrollbar(listboxFrame, orient=Tkinter.VERTICAL)
listvar = Tkinter.StringVar()
lb = Tkinter.Listbox(listboxFrame, listvariable=listvar, exportselection=0, width=40, yscrollcommand=scrollbar.set)
scrollbar.config(command=lb.yview)
lb.items = ListboxVar(lb, listvar)
scrollbar.pack(side=Tkinter.RIGHT, fill=Tkinter.Y)
lb.pack(side=Tkinter.LEFT, fill=Tkinter.BOTH, expand=1)
self.mainWindow.patternListBox = lb;

textvar = Tkinter.StringVar()
label = Tkinter.Label(patternFrame, anchor="w", textvariable = textvar)
label.grid(column=1, row=0, sticky='EW')
label.caption = textvar
self.mainWindow.patternTitle = label

self.insertBitmapButton = Tkinter.Button(patternFrame, text=u"Insert bitmap...", command = self.mainWindow.insertBitmapButtonClicked)
self.insertBitmapButton.grid(column=2,row=0,sticky='EW')

self.exportBitmapButton = Tkinter.Button(patternFrame, text=u"Export bitmap...", command = self.mainWindow.exportBitmapButtonClicked)
self.exportBitmapButton.grid(column=3,row=0,sticky='EW')

pc = ExtendedCanvas(patternFrame, bg='white')
pc.grid(column=1, row=1, sticky='EWNS', columnspan=3)
self.mainWindow.patternCanvas = pc

def setEmuButtonStopped(self):
b = self.emuButton
b.caption.set(u"Start emulator...")

def setEmuButtonStarted(self):
b = self.emuButton
b.caption.set(u"...stop emulator")

class ExtendedCanvas(Tkinter.Canvas):

def getWidth(self):
w = self.winfo_width()
return w

def getHeight(self):
h = self.winfo_height()
return h

def clear(self):
maxsize = 10000
self.create_rectangle(0,0,maxsize, maxsize, width=0, fill=self.cget('bg'))

class ListboxVar:
def __init__(self, listbox, stringvar):
self._stringvar = stringvar
self._listbox = listbox

def set(self, list):
self._listbox.delete(0, Tkinter.END)
for item in list:
self._listbox.insert(Tkinter.END, item)
Empty file added app/gui/__init__.py
Empty file.
12 changes: 12 additions & 0 deletions app/tkapp/Config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import os

class Config:
def __init__(self):
self.imgdir = "img";
if os.sys.platform == 'win32':
self.device = "com34"
# self.datFile = 'C:/Documents and Settings/ondro/VirtualBox shared folder/knitting/knitting_machine-master/img/zaloha vzory stroj python.dat'
self.datFile = 'C:/Documents and Settings/ondro/VirtualBox shared folder/knitting/knitting_machine-master/file-06.dat'
self.simulateEmulator = True
else:
self.device = "/dev/ttyUSB0"
Loading