2 # -*- coding: utf-8 -*-
4 # (c) Copyright 2003-2009 Hewlett-Packard Development Company, L.P.
6 # This program is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
24 __title__ = 'Printer Cartridge Color Calibration Utility'
25 __mod__ = 'hp-colorcal'
26 __doc__ = "Perform color calibration on HPLIP supported inkjet printers. (Note: Not all printers require the use of this utility)."
37 from base import device, status, utils, maint, tui, module
41 def enterAlignmentNumber(letter, hortvert, colors, minimum, maximum):
42 return tui.enter_range("Enter the best aligned value for line %s (%d-%d or q=quit): " %
43 (letter, minimum, maximum), minimum, maximum)
45 def enterPaperEdge(maximum):
46 return tui.enter_range("Enter numbered arrow that is best aligned with the paper edge (1-%d or q=quit): " %
49 def colorAdj(line, maximum):
50 return tui.enter_range("Enter the numbered box on line %s that is best color matched to the background color (1-%d or q=quit): " %
51 (line, maximum), 1, maximum)
54 return tui.enter_range("""Enter the numbered image labeled "1" thru "7" that is best color matched to the image labeled "X""", 1, 7)
57 return tui.enter_range("""Select the number between 1 and 81 of the numbered patch that best matches the background.""", 1, 81)
60 log.error("Invalid cartridge(s) installed.\nPlease install valid cartridges and try again.")
62 def photoPenRequired():
63 log.error("Photo cartridge not installed.\nPlease install the photo cartridge and try again.")
65 def photoPenRequired2():
66 log.error("Photo cartridge or photo blue cartridge not installed.\nPlease install the photo (or photo blue) cartridge and try again.")
70 log.info("""Instructions:\n1. Hold the calibration page at arm's length in front of your eyes.
71 2. Tilt the page away from you. Look at the two large squares, each containing colored patches. For each large square, find the colored path that most closely matches the background color. Each patch has an associated letter and number.
76 x = raw_input(log.bold("""Enter the letter ('A' thru 'N') and number (1 thru 14) for the GRAY plot (eg, "C5") or "q" to quit: """))
78 if x.lower().strip() == 'q':
82 if x.lower().strip() == 'd': # use defaults
83 values[0], values[1] = -1, -1
87 log.error("You must enter at least two characters (a letter and a number)")
91 log.error('Enter only a single letter and a one or two digit number (eg, "C5").')
96 if letter not in 'abcdefghijklmn':
97 log.error("You must enter a letter 'A' thru 'N'")
103 log.error("You must enter a letter 'A' thru 'N' followed by a number 1 thru 14.")
106 if number < 0 or number > 14:
107 log.error("You must enter a letter 'A' thru 'N' followed by a number 1 thru 14.")
110 values[0] = ord(str(letter).upper()) - ord('A')
111 values[1] = number - 1
116 x = raw_input(log.bold("""Enter the letter ('P' thru 'V') and number (1 thru 7) for the COLOR plot (eg, "R3") or "q" to quit: """))
118 if x.lower().strip() == 'q':
122 if x.lower().strip() == 'd': # use defaults
123 values[2], values[3] = -1, -1
127 log.error("You must enter at least two characters (a letter and a number)")
131 log.error('Enter only a single letter and a one or two digit number (eg, "R3").')
134 letter = x[0].lower()
136 if letter not in 'pqrstuv':
137 log.error("You must enter a letter 'P' thru 'V'")
143 log.error("You must enter a letter 'P' thru 'V' followed by a number 1 thru 7.")
146 if number < 0 or number > 7:
147 log.error("You must enter a letter 'P' thru 'V' followed by a number 1 thru 7.")
150 values[2] = ord(str(letter).upper()) - ord('P')
151 values[3] = number - 1
158 mod = module.Module(__mod__, __title__, __version__, __doc__, None,
159 (INTERACTIVE_MODE, GUI_MODE), (UI_TOOLKIT_QT4,))
161 mod.setUsage(module.USAGE_FLAG_DEVICE_ARGS,
162 see_also_list=['hp-align', 'hp-clean', 'hp-linefeedcal',
165 opts, device_uri, printer_name, mode, ui_toolkit, lang = \
168 device_uri = mod.getDeviceUri(device_uri, printer_name,
169 filter={'color-cal-type': (operator.ne, COLOR_CAL_TYPE_NONE)})
172 if not utils.canEnterGUIMode4():
173 log.error("%s -u/--gui requires Qt4 GUI support. Entering interactive mode." % __mod__)
174 mode = INTERACTIVE_MODE
176 if mode == INTERACTIVE_MODE:
178 d = device.Device(device_uri, printer_name)
180 log.error("Unable to open device: %s" % e.msg)
187 log.error("Unable to print to printer. Please check device and try again.")
190 if d.isIdleAndNoError():
191 color_cal_type = d.mq.get('color-cal-type', COLOR_CAL_TYPE_NONE)
192 log.debug("Color calibration type=%d" % color_cal_type)
194 if color_cal_type == COLOR_CAL_TYPE_UNSUPPORTED:
195 log.error("Color calibration through HPLIP not supported for this printer. Please use the printer's front panel to perform color calibration.")
197 elif color_cal_type == COLOR_CAL_TYPE_DESKJET_450: #1
198 maint.colorCalType1(d, tui.load_paper_prompt, colorCal, photoPenRequired)
200 elif color_cal_type == COLOR_CAL_TYPE_MALIBU_CRICK: #2
201 maint.colorCalType2(d, tui.load_paper_prompt, colorCal2, invalidPen)
203 elif color_cal_type == COLOR_CAL_TYPE_STRINGRAY_LONGBOW_TORNADO: #2
204 maint.colorCalType3(d, tui.load_paper_prompt, colorAdj, photoPenRequired2)
206 elif color_cal_type == COLOR_CAL_TYPE_CONNERY: # 4
207 maint.colorCalType4(d, tui.load_paper_prompt, colorCal4, None)
209 elif color_cal_type == COLOR_CAL_TYPE_COUSTEAU: # 5
210 maint.colorCalType5(d, tui.load_paper_prompt)
212 elif color_cal_type == COLOR_CAL_TYPE_CARRIER: # 6
213 maint.colorCalType6(d, tui.load_paper_prompt)
215 elif color_cal_type == COLOR_CAL_TYPE_TYPHOON: # 7
216 maint.colorCalType7(d, tui.load_photo_paper_prompt)
219 log.error("Invalid color calibration type.")
222 log.error("Device is busy or in an error state. Please check device and try again.")
229 from PyQt4.QtGui import QApplication
230 from ui4.colorcaldialog import ColorCalDialog
232 log.error("Unable to load Qt4 support. Is it installed?")
237 app = QApplication(sys.argv)
239 dlg = ColorCalDialog(None, device_uri)
242 log.debug("Starting GUI loop...")
244 except KeyboardInterrupt:
251 except KeyboardInterrupt:
252 log.error("User exit")