mirror of
https://github.com/NaitLee/Cat-Printer.git
synced 2025-05-16 15:20:12 -07:00
Important fixes to 0.5.0
This commit is contained in:
parent
367c901259
commit
39e29deb5b
2
.gitignore
vendored
2
.gitignore
vendored
@ -14,7 +14,7 @@ build-android/dist
|
|||||||
*.apk
|
*.apk
|
||||||
*.apk.*
|
*.apk.*
|
||||||
cat-printer*.zip
|
cat-printer*.zip
|
||||||
*-sha256.txt
|
cat-printer-sha256-*.txt
|
||||||
# bleak, the bare pip package as a folder
|
# bleak, the bare pip package as a folder
|
||||||
build-common/bleak
|
build-common/bleak
|
||||||
# python embeddable package, with bleak_winrt inside
|
# python embeddable package, with bleak_winrt inside
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# For ultimate laziness!
|
# For ultimate laziness!
|
||||||
rm -rf cat-printer-*.zip cat-printer-*.apk* cat-printer-*-sha256.txt
|
rm -rf cat-printer-*.zip cat-printer-*.apk* cat-printer-sha256-*.txt
|
||||||
echo -n 'Version tag: '
|
echo -n 'Version tag: '
|
||||||
read version
|
read version
|
||||||
echo -n $version > version
|
echo -n $version > version
|
||||||
@ -16,5 +16,5 @@ echo 'Signing apk with keyfile...'
|
|||||||
./4-sign.sh $signkey
|
./4-sign.sh $signkey
|
||||||
cd ../
|
cd ../
|
||||||
echo 'SHA256 Hash...'
|
echo 'SHA256 Hash...'
|
||||||
sha256sum cat-printer-* > cat-printer-$version-sha256.txt
|
sha256sum cat-printer-* > cat-printer-sha256-$version.txt
|
||||||
echo 'Complete!'
|
echo 'Complete!'
|
||||||
|
27
printer.py
27
printer.py
@ -131,7 +131,7 @@ class PrinterError(Exception):
|
|||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
super().__init__(*args)
|
super().__init__(*args)
|
||||||
self.message = args[0]
|
self.message = args[0]
|
||||||
self.message_localized = i18n(args)
|
self.message_localized = i18n(*args)
|
||||||
|
|
||||||
class PrinterData():
|
class PrinterData():
|
||||||
''' The image data to be used by `PrinterDriver`.
|
''' The image data to be used by `PrinterDriver`.
|
||||||
@ -277,6 +277,7 @@ class PrinterDriver(Commander):
|
|||||||
rtl: bool = False
|
rtl: bool = False
|
||||||
|
|
||||||
energy: int = None
|
energy: int = None
|
||||||
|
quality: int = 24
|
||||||
|
|
||||||
mtu: int = 200
|
mtu: int = 200
|
||||||
|
|
||||||
@ -427,20 +428,23 @@ class PrinterDriver(Commander):
|
|||||||
|
|
||||||
def _prepare(self):
|
def _prepare(self):
|
||||||
self.get_device_state()
|
self.get_device_state()
|
||||||
self.set_dpi_as_200()
|
|
||||||
self.use_energy_control(True)
|
|
||||||
if self.energy is not None:
|
|
||||||
self.set_energy(self.energy * 0xff)
|
|
||||||
if self.model.is_new_kind:
|
if self.model.is_new_kind:
|
||||||
self.start_printing_new()
|
self.start_printing_new()
|
||||||
else:
|
else:
|
||||||
self.start_printing()
|
self.start_printing()
|
||||||
self.set_speed(8) # already fine if above 4. maybe just enough
|
self.set_dpi_as_200()
|
||||||
self.get_device_state()
|
if self.quality: # well, slower makes stable heating
|
||||||
|
self.set_speed(self.quality)
|
||||||
|
if self.energy is not None:
|
||||||
|
self.set_energy(self.energy * 0xff)
|
||||||
|
self.apply_energy()
|
||||||
self.update_device()
|
self.update_device()
|
||||||
|
self.flush()
|
||||||
|
self.start_lattice()
|
||||||
|
|
||||||
def _finish(self):
|
def _finish(self):
|
||||||
self.end_lattice()
|
self.end_lattice()
|
||||||
|
self.set_speed(8)
|
||||||
self.feed_paper(128)
|
self.feed_paper(128)
|
||||||
self.get_device_state()
|
self.get_device_state()
|
||||||
self.flush()
|
self.flush()
|
||||||
@ -450,7 +454,6 @@ class PrinterDriver(Commander):
|
|||||||
flip(data.data, data.width, data.height, self.flip_h, self.flip_v, overwrite=True)
|
flip(data.data, data.width, data.height, self.flip_h, self.flip_v, overwrite=True)
|
||||||
self._prepare()
|
self._prepare()
|
||||||
# TODO: consider compression on new devices
|
# TODO: consider compression on new devices
|
||||||
self.start_lattice()
|
|
||||||
for chunk in data.read(paper_width // 8):
|
for chunk in data.read(paper_width // 8):
|
||||||
if self.dry_run:
|
if self.dry_run:
|
||||||
chunk = b'\x00' * len(chunk)
|
chunk = b'\x00' * len(chunk)
|
||||||
@ -615,8 +618,10 @@ def _main():
|
|||||||
help=i18n('image-printing-options'))
|
help=i18n('image-printing-options'))
|
||||||
parser.add_argument('-t', '--text', metavar='Size[,FontFamily][,pf2][,nowrap][,rtl]', type=str,
|
parser.add_argument('-t', '--text', metavar='Size[,FontFamily][,pf2][,nowrap][,rtl]', type=str,
|
||||||
default='', help=i18n('text-printing-mode-with-options'))
|
default='', help=i18n('text-printing-mode-with-options'))
|
||||||
parser.add_argument('-e', '--energy', metavar='<0.0-1.0>', type=float, default=None,
|
parser.add_argument('-e', '--energy', metavar='0.0-1.0', type=float, default=None,
|
||||||
help=i18n('control-printer-thermal-strength'))
|
help=i18n('control-printer-thermal-strength'))
|
||||||
|
parser.add_argument('-q', '--quality', metavar='1-4', type=int, default=3,
|
||||||
|
help=i18n('print-quality'))
|
||||||
parser.add_argument('-d', '--dry', action='store_true',
|
parser.add_argument('-d', '--dry', action='store_true',
|
||||||
help=i18n('dry-run-test-print-process-only'))
|
help=i18n('dry-run-test-print-process-only'))
|
||||||
parser.add_argument('-f', '--fake', metavar='XY01', type=str, default='',
|
parser.add_argument('-f', '--fake', metavar='XY01', type=str, default='',
|
||||||
@ -638,7 +643,9 @@ def _main():
|
|||||||
printer.scan_timeout = float(scan_param[0])
|
printer.scan_timeout = float(scan_param[0])
|
||||||
identifier = ','.join(scan_param[1:])
|
identifier = ','.join(scan_param[1:])
|
||||||
if args.energy is not None:
|
if args.energy is not None:
|
||||||
printer.energy = args.energy * 0xff
|
printer.energy = int(args.energy * 0xff)
|
||||||
|
if args.quality is not None:
|
||||||
|
printer.quality = 4 * (args.quality + 5)
|
||||||
|
|
||||||
image_param = args.image.split(',')
|
image_param = args.image.split(',')
|
||||||
if 'flip' in image_param:
|
if 'flip' in image_param:
|
||||||
|
@ -82,12 +82,10 @@ class Commander(metaclass=ABCMeta):
|
|||||||
'Start printing on newer printers'
|
'Start printing on newer printers'
|
||||||
self.send( bytearray([0x12, 0x51, 0x78, 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff]) )
|
self.send( bytearray([0x12, 0x51, 0x78, 0xa3, 0x00, 0x01, 0x00, 0x00, 0x00, 0xff]) )
|
||||||
|
|
||||||
def use_energy_control(self, enable: bool):
|
def apply_energy(self):
|
||||||
''' Whether enable energy control (with set_energy) or not
|
''' Apply previously set energy to printer
|
||||||
Note: I remember I can't disable it, when I (incorrectly)
|
|
||||||
thought it was "image/text mode"
|
|
||||||
'''
|
'''
|
||||||
self.send( self.make_command(0xbe, int_to_bytes(0x01 if enable else 0x00)) )
|
self.send( self.make_command(0xbe, int_to_bytes(0x01)) )
|
||||||
|
|
||||||
def get_device_state(self):
|
def get_device_state(self):
|
||||||
'(unknown). seems it could refresh device state & apply config'
|
'(unknown). seems it could refresh device state & apply config'
|
||||||
|
@ -188,6 +188,7 @@ class PrinterServerHandler(BaseHTTPRequestHandler):
|
|||||||
self.printer.fake = self.settings.fake
|
self.printer.fake = self.settings.fake
|
||||||
self.printer.dump = self.settings.dump
|
self.printer.dump = self.settings.dump
|
||||||
self.printer.energy = self.settings.energy
|
self.printer.energy = self.settings.energy
|
||||||
|
self.printer.quality = self.settings.quality
|
||||||
self.printer.flip_h = self.settings.flip_h or self.settings.flip
|
self.printer.flip_h = self.settings.flip_h or self.settings.flip
|
||||||
self.printer.flip_v = self.settings.flip_v or self.settings.flip
|
self.printer.flip_v = self.settings.flip_v or self.settings.flip
|
||||||
self.printer.rtl = self.settings.force_rtl
|
self.printer.rtl = self.settings.force_rtl
|
||||||
|
@ -17,19 +17,25 @@
|
|||||||
<a target="_blank" href="https://github.com/NaitLee/Cat-Printer">GitHub</a>
|
<a target="_blank" href="https://github.com/NaitLee/Cat-Printer">GitHub</a>
|
||||||
</p>
|
</p>
|
||||||
<h2 data-i18n="contributors">Contributors</h2>
|
<h2 data-i18n="contributors">Contributors</h2>
|
||||||
<dl>
|
<div class="contributors">
|
||||||
<dt>
|
<dl>
|
||||||
<a target="_blank" href="https://github.com/NaitLee">NaitLee</a>
|
<dt>
|
||||||
</dt>
|
<a target="_blank" href="https://github.com/NaitLee">NaitLee</a>
|
||||||
<dd data-i18n="developer">Developer</dd>
|
</dt>
|
||||||
<dt>
|
<dd data-i18n="developer">Developer</dd>
|
||||||
<a target="_blank" href="https://github.com/frankenstein91">frankenstein91</a>
|
</dl>
|
||||||
</dt>
|
<dl>
|
||||||
<dd data-i18n="developer">Developer</dd>
|
<dt>
|
||||||
<dd data-i18n="translator">Translator</dd>
|
<a target="_blank" href="https://github.com/frankenstein91">frankenstein91</a>
|
||||||
<dt data-i18n="all-testers-and-users">All testers & users</dt>
|
</dt>
|
||||||
<dd data-i18n="everyone-is-awesome">Everyone is awesome!</dd>
|
<dd data-i18n="developer">Developer</dd>
|
||||||
</dl>
|
<dd data-i18n="translator">Translator</dd>
|
||||||
|
</dl>
|
||||||
|
<dl>
|
||||||
|
<dt data-i18n="all-testers-and-users">All testers & users</dt>
|
||||||
|
<dd data-i18n="everyone-is-awesome">Everyone is awesome!</dd>
|
||||||
|
</dl>
|
||||||
|
</div>
|
||||||
<h2 data-i18n="copyright-and-license">Copyright</h2>
|
<h2 data-i18n="copyright-and-license">Copyright</h2>
|
||||||
<p>
|
<p>
|
||||||
<span>Copyright © 2021-2022 NaitLee Soft.</span>
|
<span>Copyright © 2021-2022 NaitLee Soft.</span>
|
||||||
|
@ -20,27 +20,38 @@
|
|||||||
</select>
|
</select>
|
||||||
<button id="device-refresh" data-i18n="refresh" data-key>Refresh</button>
|
<button id="device-refresh" data-i18n="refresh" data-key>Refresh</button>
|
||||||
<hr />
|
<hr />
|
||||||
<label data-i18n="process-as-">Process as:</label>
|
<dl>
|
||||||
<label>
|
<dt><label data-i18n="process-as-">Process as:</label></dt>
|
||||||
<input type="radio" name="algo" value="algo-direct" data-key />
|
<dd>
|
||||||
<span data-i18n="text">Text</span>
|
<label>
|
||||||
</label>
|
<input type="radio" name="algo" value="algo-direct" data-key />
|
||||||
<label>
|
<span data-i18n="text">Text</span>
|
||||||
<input type="radio" name="algo" value="algo-steinberg" data-key checked />
|
</label>
|
||||||
<span data-i18n="picture">Picture</span>
|
<label>
|
||||||
</label>
|
<input type="radio" name="algo" value="algo-steinberg" data-key checked />
|
||||||
<!-- <label>
|
<span data-i18n="picture">Picture</span>
|
||||||
<input type="radio" name="algo" value="algo-halftone" data-key />
|
</label>
|
||||||
<span data-i18n="pattern">Pattern</span>
|
</dd>
|
||||||
</label> --><br />
|
<!-- <label>
|
||||||
|
<input type="radio" name="algo" value="algo-halftone" data-key />
|
||||||
|
<span data-i18n="pattern">Pattern</span>
|
||||||
|
</label> -->
|
||||||
|
</dl>
|
||||||
<!-- "brightness" is historically "threshold" -->
|
<!-- "brightness" is historically "threshold" -->
|
||||||
<label for="threshold" data-i18n="brightness-">Brightness:</label>
|
<dl>
|
||||||
<input type="range" min="0" max="256" value="86" step="16" id="threshold" data-key data-default />
|
<dt><label for="threshold" data-i18n="brightness-">Brightness:</label></dt>
|
||||||
<br />
|
<dd><input type="range" min="0" max="256" value="86" step="16" id="threshold" data-key data-default /></dd>
|
||||||
|
</dl>
|
||||||
<!-- "Strength", so-called "darkness", or internally "energy" -->
|
<!-- "Strength", so-called "darkness", or internally "energy" -->
|
||||||
<label for="energy" data-i18n="strength-">Strength:</label>
|
<dl>
|
||||||
<input type="range" min="0" max="256" value="64" step="16" id="energy" data-key data-default />
|
<dt><label for="energy" data-i18n="strength-">Strength:</label></dt>
|
||||||
<br />
|
<dd><input type="range" min="0" max="256" value="64" step="16" id="energy" data-key data-default /></dd>
|
||||||
|
</dl>
|
||||||
|
<!-- "Quality", just speed of paper feeding, but slower makes better heating -->
|
||||||
|
<dl>
|
||||||
|
<dt><label for="quality" data-i18n="quality-">Quality:</label></dt>
|
||||||
|
<dd><input type="range" min="24" max="36" value="32" step="4" id="quality" data-key data-default /></dd>
|
||||||
|
</dl>
|
||||||
<input type="checkbox" name="transparent-as-white" id="transparent-as-white" data-key checked />
|
<input type="checkbox" name="transparent-as-white" id="transparent-as-white" data-key checked />
|
||||||
<label for="transparent-as-white" data-i18n="transparent-as-white">Transparent as White</label>
|
<label for="transparent-as-white" data-i18n="transparent-as-white">Transparent as White</label>
|
||||||
</div>
|
</div>
|
||||||
|
@ -124,5 +124,7 @@
|
|||||||
"strength-": "Strength:",
|
"strength-": "Strength:",
|
||||||
"or-drag-file-to-below": "Or drag file to below",
|
"or-drag-file-to-below": "Or drag file to below",
|
||||||
"reset": "Reset",
|
"reset": "Reset",
|
||||||
"cat-face-toward": "Cat Face Toward"
|
"cat-face-toward": "Cat Face Toward",
|
||||||
|
"quality-": "Quality:",
|
||||||
|
"print-quality": "Print quality"
|
||||||
}
|
}
|
@ -119,5 +119,7 @@
|
|||||||
"strength-": "力度:",
|
"strength-": "力度:",
|
||||||
"or-drag-file-to-below": "或拖拽文件至下方",
|
"or-drag-file-to-below": "或拖拽文件至下方",
|
||||||
"reset": "重置",
|
"reset": "重置",
|
||||||
"cat-face-toward": "猫脸朝上"
|
"cat-face-toward": "猫脸朝上",
|
||||||
|
"quality-": "质量:",
|
||||||
|
"print-quality": "打印质量"
|
||||||
}
|
}
|
12
www/main.css
12
www/main.css
@ -227,7 +227,7 @@ p {
|
|||||||
height: calc(var(--panel-height) - var(--compact-menu-height));
|
height: calc(var(--panel-height) - var(--compact-menu-height));
|
||||||
padding: var(--span-double) var(--span);
|
padding: var(--span-double) var(--span);
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
/* overflow-y: scroll; */
|
overflow-y: scroll;
|
||||||
}
|
}
|
||||||
.panel.sub.active {
|
.panel.sub.active {
|
||||||
height: calc(var(--panel-height) / 2);
|
height: calc(var(--panel-height) / 2);
|
||||||
@ -284,8 +284,14 @@ dl {
|
|||||||
margin: var(--span) 0;
|
margin: var(--span) 0;
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
dd { display: inline; }
|
dt { display: inline-block; min-width: 6em; text-align: end; }
|
||||||
dd+dd { margin-left: var(--font-size); }
|
dd { display: inline-block; margin: 0 calc(var(--font-size) / 4); }
|
||||||
|
.contributors dt {
|
||||||
|
min-width: 12em;
|
||||||
|
text-align: center;
|
||||||
|
padding: 0 calc(var(--font-size) / 4);
|
||||||
|
border-right: var(--border) solid var(--fore-color);
|
||||||
|
}
|
||||||
hr {
|
hr {
|
||||||
border: none;
|
border: none;
|
||||||
border-top: var(--border) solid var(--fore-color);
|
border-top: var(--border) solid var(--fore-color);
|
||||||
|
@ -326,7 +326,7 @@ class CanvasController {
|
|||||||
this.algorithm = name;
|
this.algorithm = name;
|
||||||
this.threshold = CanvasController.defaultThreshold;
|
this.threshold = CanvasController.defaultThreshold;
|
||||||
this._thresholdRange.dispatchEvent(new Event('change'));
|
this._thresholdRange.dispatchEvent(new Event('change'));
|
||||||
this.energy = name == 'algo-direct' ? 72 : 48;
|
this.energy = name == 'algo-direct' ? 96 : 64;
|
||||||
this._energyRange.dispatchEvent(new Event('change'));
|
this._energyRange.dispatchEvent(new Event('change'));
|
||||||
this.activatePreview();
|
this.activatePreview();
|
||||||
}
|
}
|
||||||
@ -590,6 +590,7 @@ class Main {
|
|||||||
);
|
);
|
||||||
this.attachSetter('#threshold', 'change', 'threshold');
|
this.attachSetter('#threshold', 'change', 'threshold');
|
||||||
this.attachSetter('#energy', 'change', 'energy');
|
this.attachSetter('#energy', 'change', 'energy');
|
||||||
|
this.attachSetter('#quality', 'change', 'quality');
|
||||||
this.attachSetter('#flip', 'change', 'flip');
|
this.attachSetter('#flip', 'change', 'flip');
|
||||||
// this.attachSetter('#flip-h', 'change', 'flip_h');
|
// this.attachSetter('#flip-h', 'change', 'flip_h');
|
||||||
// this.attachSetter('#flip-v', 'change', 'flip_v');
|
// this.attachSetter('#flip-v', 'change', 'flip_v');
|
||||||
|
Loading…
x
Reference in New Issue
Block a user