spokecharinterleaved.py
来自「旋转16个LED灯控制程序」· Python 代码 · 共 1,043 行 · 第 1/3 页
PY
1,043 行
writebutton = wx.Button(buttonpanel, -1, "Upload INTERLEAVED Charset")
verifybutton = wx.Button(buttonpanel, -1, "Verify INTERLEAVED Charset")
messagebutton = wx.Button(buttonpanel, -1, "Upload Message")
self.Bind(wx.EVT_BUTTON, self.OnUploadButton, writebutton);
self.Bind(wx.EVT_BUTTON, self.OnVerifyButton, verifybutton);
self.Bind(wx.EVT_BUTTON, self.OnMessageButton, messagebutton);
buttonpanelsizer.Add(writebutton, 0, wx.ALL, 0)
buttonpanelsizer.Add(verifybutton, 0, wx.ALL, 0)
buttonpanelsizer.Add(messagebutton, 0, wx.ALL, 0)
buttonpanel.SetSizer(buttonpanelsizer)
buttonpanel.Layout()
# add button panel to lower panel
lowerpanelsizer.Add(buttonpanel, 1, wx.EXPAND|wx.ALL, 10)
# size and layout the lower panel
lowerpanel.SetSizer(lowerpanelsizer)
lowerpanelsizer.Layout();
# add lower panel to main panel
mainpanelsizer.Add(lowerpanel, 0, wx.ALL | wx.ALIGN_CENTER, 10)
# size and layout the main panel
mainpanel.SetSizer(mainpanelsizer)
mainpanel.Layout()
# menu handlers for wrap, center
def OnWrap(self,evt):
self.Wrap()
def OnCenter(self,evt):
self.Center()
# wrap the text in the editor
def Wrap(self):
# get the text from the editor
theLines = self.ed.GetText()
# start with an empty output buffer
newLines = []
# wrap each line in turn
for cLine in theLines:
while len(cLine) > 16:
newLines = newLines + [cLine[:16]]
cLine = cLine[16:]
newLines = newLines + [cLine]
# update the editor
self.ed.SetText(newLines)
def Center(self):
# the first thing we do is wrap the text, because
# we can't center on 16 character lines without wrapping
self.Wrap()
# get the text from the editor
theLines = self.ed.GetText()
# start with an empty output buffer
newLines = []
# and preset a line of blanks
blanks = ' '
# center each line in turn
for cLine in theLines:
# first, strip of leading and trailing blanks
cLine = cLine.strip()
# if the line isn't empty (pointless to center)
if cLine != "":
# how many characters do we need to prepend?
n = int((16-len(cLine))/2)
# if that number is > 0, add the characters
if n > 0:
cLine = blanks[:n] + cLine
# add the revised line to the buffer we'll be updating
newLines = newLines + [cLine]
# update the editor
self.ed.SetText(newLines)
# stupid dialog box function
def Alert(self,title,msg):
dlg = wx.MessageDialog(self, msg,
title,
wx.OK | wx.ICON_INFORMATION
#wx.YES_NO | wx.NO_DEFAULT | wx.CANCEL | wx.ICON_INFORMATION
)
dlg.ShowModal()
dlg.Destroy()
# load a txt file and stuff it in the editor
def OnOpen(self, evt):
# the first step is to determine what charset must be loaded
dialog = wx.FileDialog(self,
"Select Message File...", # title
"", "", # no defaults
"TEXT files (*.txt)|*.txt", # TXT only
wx.OPEN); # open a file
# quit if they cancelled on us
if (dialog.ShowModal() == wx.ID_CANCEL):
return
try:
# open the file
theFile = open(dialog.GetPath(),'r')
# read the lines
lines = theFile.readlines()
# close the file
theFile.close()
# set the lines
self.ed.SetText(lines)
# update the filename
self.filename = dialog.GetPath()
self.SetTitle("SpokeChar - SpokePOV Character Set Utility - " + self.filename)
# since we now have a filename, we can enable the
# save menu...
self.filemenu.Enable(1,True)
except IOError:
self.SetStatus("Error reading the file!")
# save the text file
def OnSave(self, evt):
# we will only be called when self.filename has a value
try:
f = open(self.filename, 'w')
theLines = self.ed.GetText()
for cLine in theLines:
f.write(cLine + '\n')
f.close()
except IOError:
self.SetStatus("Error writing the file!")
# save the text file as a new file
def OnSaveAs(self, evt):
# ask where to save file
if self.filename == None:
dFName = ""
else:
dFname = self.filename
dialog = wx.FileDialog(self,
"Save Message File as...", # title
"", dFName, # defaults
"TEXT file (*.txt)|*.txt", # TXT only
wx.SAVE); # open a file
# did he want us to do so?
if (dialog.ShowModal() == wx.ID_CANCEL):
return
# save the file, update filename
try:
# same basic procedure as the load
f = open(dialog.GetPath(), 'w')
theLines = self.ed.GetText()
for cLine in theLines:
f.write(cLine + '\n')
f.close()
self.filename = dialog.GetPath()
self.SetTitle("SpokeChar - SpokePOV Character Set Utility - " + self.filename)
self.filemenu.Enable(1,True)
except IOError:
self.SetStatus("Error writing the file!")
# read the EEPROM and verify that it contains the current charset
def OnVerifyButton(self, evt):
# the first step is to determine what charset must be loaded
dialog = wx.FileDialog(self,
"Choose an charset to verify against EEPROM...", # title
"", "", # no defaults
"BMP files (*.bmp)|*.bmp", # BMP only
wx.OPEN); # open a file
# quit if they cancelled on us
if (dialog.ShowModal() == wx.ID_CANCEL):
return
# get the image from the file
charset = wx.Image(dialog.GetPath())
# ensure it's a charset (more or less, mostly less)
if (charset.GetWidth() != 768) or (charset.GetHeight() != 32):
self.SetStatusText("Cannot load - A SpokePOV character set is a 768 x 32 bitmap; the file you selected is %d x %d " % (charset.GetWidth(), charset.GetHeight()) )
return
# convert the image to monochrome (it ought to be that already)
# and get access to the bits
charset.ConvertToMono(0,0,0)
imagedata = charset.GetData()
# now we check the character set against the SpokePOV. This
# code is heavily cribbed from SpokePOV.py. Basically,
# we send the character set in blocks of 16 bytes. Each
# 32 pixel column in the character set is 4 bytes, so we
# check 4 columns at a time.
spov = SpokePOVComm()
try:
# x is the actual column number in the bitmap
x = 0
lasttime = time.time();
# while we still have columns to check
while x < 3072:
# clear out our buffer of 16 bytes
buff16 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]
# assume the bits are in simple order
# for each byte in the block
# print ""
# print "16 bytes starting at column ",x
# I must mention that the python "range" function
# defies all common sense. range(0,15) actually only
# executes values 0-14! Someone was on serious
# drugs...
for b in range(0,16):
# print ""
# print " Byte ",b
# now the issue is remapping from the character set
# to the byte position. In interleaved character sets,
# character X (0..95) starts at byte X*2, with 2 byte
# blocks repeating every 96 bytes.
# first figure out the character number in the actual character
# set...
orig_cNum = (x+b) % 96
# next, what byte in the original character do we need
orig_bNum = (x+b) / 96
# from this, we can figure out the column to look in
x1 = ( int(orig_cNum/2) * 16 ) + int(orig_bNum / 2)
# and what row do we start at?
y1 = ( 16 * (orig_cNum % 2) ) + ( 8 * (orig_bNum % 2) )
# assemble the byte
foo = 0
for cBit in range(y1,y1+8):
# x1,cBit is the pixel address of the pixel we want. The bitmap
# is a linear array, 3 bytes per pixel, in row order...
pixel = ord(imagedata[((cBit*768)+x1)*3])
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?