1# -*- coding: utf-8 -*-
2#
3# (c) Copyright 2001-2015 HP Development Company, L.P.
4#
5# This program is free software; you can redistribute it and/or modify
6# it under the terms of the GNU General Public License as published by
7# the Free Software Foundation; either version 2 of the License, or
8# (at your option) any later version.
9#
10# This program is distributed in the hope that it will be useful,
11# but WITHOUT ANY WARRANTY; without even the implied warranty of
12# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13# GNU General Public License for more details.
14#
15# You should have received a copy of the GNU General Public License
16# along with this program; if not, write to the Free Software
17# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
18#
19# Authors: Don Welch, Naga Samrat Chowdary Narla,
20#
21
22# StdLib
23import operator
24import signal
25
26# Local
27from base.g import *
28from base import device, utils, maint, status
29#from prnt import cups
30from base.codes import *
31from .ui_utils import *
32
33# Qt
34from PyQt5.QtCore import *
35from PyQt5.QtGui import *
36from PyQt5.QtWidgets import *
37
38# Ui
39from .aligndialog_base import Ui_Dialog
40
41PAGE_START = 0
42PAGE_LOAD_PAPER = 1
43PAGE_EDGE = 2
44PAGE_ALIGNMENT_NUMBER = 3
45PAGE_COLOR_ADJ = 4 # types 4, 5 & 7
46PAGE_LBOW = 5 # types 10 & 11
47PAGE_AIO = 6 # Place on scanner, ...
48PAGE_FRONT_PANEL = 7 # Use front panel menu
49
50BUTTON_ALIGN = 0
51BUTTON_NEXT = 1
52BUTTON_FINISH = 2
53
54ALIGN_TYPE_INITIAL = 1000
55ALIGN_TYPE_TEST = 1001
56
57# xBow offset types
58ALIGN_TYPE_XBOW_OFFSET = 100
59ALIGN_TYPE_XBOW_BLACK_ONLY = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_BLACK_ONLY
60ALIGN_TYPE_XBOW_PHOTO_ONLY = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_PHOTO_ONLY
61ALIGN_TYPE_XBOW_COLOR_ONLY =  ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_COLOR_ONLY
62ALIGN_TYPE_XBOW_COLOR_AND_BLACK =  ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_COLOR_AND_BLACK
63ALIGN_TYPE_XBOW_COLOR_AND_PHOTO = ALIGN_TYPE_XBOW_OFFSET + AGENT_CONFIG_COLOR_AND_PHOTO
64
65
66def true():
67    return True
68
69
70class AlignDialog(QDialog, Ui_Dialog):
71    def __init__(self, parent, device_uri):
72        QDialog.__init__(self, parent)
73        self.device_uri = device_uri
74        self.mq = {}
75        self.step_max = 0
76        self.align_type = ALIGN_TYPE_INITIAL
77        self.step = 1
78        self.a, self.b, self.c, self.d, self.zca = 0, 0, 0, 0, 0
79        self.e, self.f, self.g = 0, 0, 0
80        self.num_inks = 0 # type 8
81        self.pattern = 0 # type 10
82        self.values = [] # type 10
83        self.abort = False
84        self.seq_index = 0
85
86        self.max_steps = {
87            ALIGN_TYPE_UNSUPPORTED : 1,
88            ALIGN_TYPE_AUTO : 2,
89            ALIGN_TYPE_9XX : 7,
90            ALIGN_TYPE_8XX : 7,
91            ALIGN_TYPE_LIDIL_0_3_8 : 0,
92            ALIGN_TYPE_LIDIL_0_4_3 : 0,
93            ALIGN_TYPE_LIDIL_AIO : 3,
94            ALIGN_TYPE_LIDIL_VIP : 0,
95            ALIGN_TYPE_DESKJET_450 : 0,
96            ALIGN_TYPE_9XX_NO_EDGE_ALIGN : 6,
97            ALIGN_TYPE_LBOW : 0,
98            ALIGN_TYPE_LIDIL_0_5_4 : 0,
99            ALIGN_TYPE_OJ_PRO : 0,
100            ALIGN_TYPE_TEST : 0,
101            ALIGN_TYPE_AIO : 3,
102            ALIGN_TYPE_LIDIL_DJ_D1600: 0,
103            ALIGN_TYPE_LEDM: 0,
104            ALIGN_TYPE_LEDM_MANUAL: 0,
105            ALIGN_TYPE_LEDM_FF_CC_0: 0,
106            }
107
108        self.seq = { # (func|method, tuple of params|None)
109            ALIGN_TYPE_TEST : [ # testing only
110                               (self.showColorAdjustPage, ('F', 21)),
111                               (self.endColorAdjustPage, ('F',)),
112                               (self.showColorAdjustPage, ('G', 11)),
113                               (self.endColorAdjustPage, ('G',)),
114                               (self.close, None),
115                            ],
116
117            ALIGN_TYPE_INITIAL : [ # (used when starting up and align-type isn't known)
118                               (self.showStartPage, None),
119                               (self.endStartPage, None), # switch to a valid align-type here
120                            ],
121
122            ALIGN_TYPE_UNSUPPORTED : [ # -1
123                                (self.showFrontPanelPage, None),
124                                (self.endFronPanelPage, None),
125                                (self.close, None),
126                            ],
127
128#            ALIGN_TYPE_NONE : [ # 0
129#                               (self.close, None)
130#                            ],
131
132            ALIGN_TYPE_AUTO : [ # 1
133                               (self.showLoadPaperPage, None),
134                               (maint.AlignType1PML, (lambda : self.dev, lambda: true)),
135                               (self.closeAll, None),
136                               (self.close, None),
137                            ],
138
139            ALIGN_TYPE_8XX : [ # 2
140                                (self.checkType2PenConfig, None),
141                                (self.showLoadPaperPage, None),
142                                (maint.alignType2Phase1, (lambda: self.dev,)),
143                                (self.showAlignmentNumberPage, ('A', 'h', 'kc', 2, 11)),
144                                (self.endAlignmentNumberPage, ('A',)),
145                                (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
146                                (self.endAlignmentNumberPage, ('B',)),
147                                (self.showAlignmentNumberPage, ('C', 'v', 'kc', 2, 5)),
148                                (self.endAlignmentNumberPage, ('C',)),
149                                (self.showAlignmentNumberPage, ('D', 'v', 'c', 2, 5)),
150                                (self.endAlignmentNumberPage, ('D',)),
151                                (self.setAlignButton, (BUTTON_ALIGN,)),
152                                (self.showLoadPaperPage, (lambda: True,)),
153                                (maint.alignType2Phase2, (lambda: self.dev, lambda: self.a, lambda: self.b,
154                                                          lambda: self.c, lambda: self.d)),
155                                (self.closeAll, None),
156                                (self.close, None),
157                              ],
158
159            ALIGN_TYPE_9XX : [  # 3
160                                (self.showLoadPaperPage, None),
161                                (self.showAlignmentNumberPage, ('A', 'h', 'kc', 2, 11)),
162                                (self.endAlignmentNumberPage, ('A',)),
163                                (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
164                                (self.endAlignmentNumberPage, ('B',)),
165                                (self.showAlignmentNumberPage, ('C', 'v', 'k', 2, 11)),
166                                (self.endAlignmentNumberPage, ('C',)),
167                                (self.setAlignButton, (BUTTON_ALIGN,)),
168                                (self.showAlignmentNumberPage, ('D', 'v', 'kc', 2, 11)),
169                                (self.endAlignmentNumberPage, ('D',)),
170                                (maint.alignType3Phase2, (lambda: self.dev, lambda: self.a, lambda: self.b,
171                                                          lambda: self.c, lambda: self.d)),
172                                (maint.alignType3Phase3, (lambda: self.dev,)),
173                                (self.showPageEdgePage, None),
174                                (self.endPageEdgePage, None),
175                                (maint.alignType3Phase4, (lambda: self.dev, lambda: self.zca)),
176                                (self.closeAll, None),
177                                (self.close, None),
178                             ],
179
180            ALIGN_TYPE_LIDIL_0_3_8 : [ # 4
181                                (self.showLoadPaperPage, None),
182                                (self.setPenConfig, None),
183                                (maint.alignType4Phase1, (lambda: self.dev,)),
184                                (self.setXBow, None),
185                                # switches to offset align_type here
186                            ],
187
188            ALIGN_TYPE_LIDIL_0_4_3 : [ # 5
189                                (self.showLoadPaperPage, None),
190                                (self.setPenConfig, None),
191                                (maint.alignType5Phase1, (lambda: self.dev,)),
192                                (self.showPageEdgePage, ('A',)),
193                                (self.endPageEdgePage, None),
194                                (self.setXBow, None),
195                                # switches to offset align_type here
196                            ],
197
198            ALIGN_TYPE_LIDIL_VIP : [ # 7
199                                (self.showLoadPaperPage, None),
200                                (self.setPenConfig, None),
201                                (maint.alignType7Phase1, (lambda: self.dev,)),
202                                (self.showPageEdgePage, ('A',)),
203                                (self.endPageEdgePage, None),
204                                (self.setXBow, None),
205                                # switches to offset align_type here (next 5 types)
206                            ],
207
208            # xBow offset alignment type
209            ALIGN_TYPE_XBOW_BLACK_ONLY : [ # 4, 5 & 7
210                            (self.showAlignmentNumberPage, ('B', 'v', 'k', 2, 11)),
211                            (self.endAlignmentNumberPage, ('B',)),
212                            (self.setXBowValues, None),
213                            (self.closeAll, None),
214                            (self.close, None),
215                            ],
216
217            # xBow offset alignment type
218            ALIGN_TYPE_XBOW_PHOTO_ONLY : [ # 4, 5 & 7
219                            (self.showAlignmentNumberPage, ('B', 'v', 'k', 2, 11)),
220                            (self.endAlignmentNumberPage, ('B',)),
221                            (self.setXBowValues, None),
222                            (self.closeAll, None),
223                            (self.close, None),
224                            ],
225
226            # xBow offset alignment type
227            ALIGN_TYPE_XBOW_COLOR_ONLY : [ # 4, 5 & 7
228                            (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
229                            (self.endAlignmentNumberPage, ('B',)),
230                            (self.setXBowValues, None),
231                            (self.closeAll, None),
232                            (self.close, None),
233                            ],
234
235            # xBow offset alignment type
236            ALIGN_TYPE_XBOW_COLOR_AND_BLACK : [ # 4, 5 & 7
237                            (self.showAlignmentNumberPage, ('B', 'h', 'kc', 2, 17)),
238                            (self.endAlignmentNumberPage, ('B',)),
239                            (self.showAlignmentNumberPage, ('C', 'v', 'kc', 2, 17)),
240                            (self.endAlignmentNumberPage, ('C',)),
241                            (self.showAlignmentNumberPage, ('D', 'v', 'k', 2, 11)),
242                            (self.endAlignmentNumberPage, ('D',)),
243                            (self.showAlignmentNumberPage, ('E', 'v', 'kc', 2, 11)),
244                            (self.endAlignmentNumberPage, ('E',)),
245                            (self.setXBowValues, None),
246                            (self.closeAll, None),
247                            (self.close, None),
248                            ],
249
250            # xBow offset alignment type
251            ALIGN_TYPE_XBOW_COLOR_AND_PHOTO : [ # 4, 5 & 7
252                            (self.showAlignmentNumberPage, ('B', 'h', 'kc', 2, 17)),
253                            (self.endAlignmentNumberPage, ('B',)),
254                            (self.showAlignmentNumberPage, ('C', 'v', 'kc', 2, 17)),
255                            (self.endAlignmentNumberPage, ('C',)),
256                            (self.showAlignmentNumberPage, ('D', 'v', 'k', 2, 11)),
257                            (self.endAlignmentNumberPage, ('D',)),
258                            (self.showAlignmentNumberPage, ('E', 'v', 'kc', 2, 11)),
259                            (self.endAlignmentNumberPage, ('E',)),
260                            (self.showColorAdjustPage, ('F', 21)),
261                            (self.endColorAdjustPage, ('F',)),
262                            (self.showColorAdjustPage, ('G', 21)),
263                            (self.endColorAdjustPage, ('G',)),
264                            (self.setXBowValues, None),
265                            (self.close, None),
266                            ],
267
268            ALIGN_TYPE_LIDIL_AIO : [ # 6 (semi-auto)
269                                (self.showLoadPaperPage, None),
270                                (maint.alignType6Phase1, (lambda: self.dev,)),
271                                (self.setAlignButton, (BUTTON_FINISH,)),
272                                (self.showAioPage, None),
273                                (self.closeAll, None),
274                                (self.close, None),
275                            ],
276
277            ALIGN_TYPE_DESKJET_450 : [ # 8
278                                (self.showLoadPaperPage, None),
279                                (self.alignType8Phase1, None), # sets num_inks
280                                (self.showAlignmentNumberPage, ('A', 'v', 'k', 3, 9)),
281                                (self.endAlignmentNumberPage, ('A',)),
282                                (self.showAlignmentNumberPage, ('B', 'v', 'c', 3, 9)),
283                                (self.endAlignmentNumberPage, ('B',)),
284                                (self.showAlignmentNumberPage, ('C', 'v', 'kc', 3, 9)),
285                                (self.endAlignmentNumberPage, ('C',)),
286                                (self.setAlignButton, (BUTTON_ALIGN,)),
287                                (self.showAlignmentNumberPage, ('D', 'h', 'kc', 3, 9)),
288                                (self.endAlignmentNumberPage, ('D',)),
289                                (maint.alignType3Phase2, (lambda: self.dev, lambda: self.num_inks, lambda: self.a,
290                                                          lambda: self.b, lambda: self.c, lambda: self.d)),
291                                (self.closeAll, None),
292                                (self.close, None),
293                            ],
294
295            ALIGN_TYPE_9XX_NO_EDGE_ALIGN : [  # 9
296                                (self.showLoadPaperPage, None),
297                                (self.showAlignmentNumberPage, ('A', 'h', 'kc', 2, 11)),
298                                (self.endAlignmentNumberPage, ('A',)),
299                                (self.showAlignmentNumberPage, ('B', 'v', 'kc', 2, 11)),
300                                (self.endAlignmentNumberPage, ('B',)),
301                                (self.showAlignmentNumberPage, ('C', 'v', 'k', 2, 11)),
302                                (self.endAlignmentNumberPage, ('C',)),
303                                (self.setAlignButton, (BUTTON_ALIGN,)),
304                                (self.showAlignmentNumberPage, ('D', 'v', 'kc', 2, 11)),
305                                (self.endAlignmentNumberPage, ('D',)),
306                                (maint.alignType3Phase2, (lambda: self.dev, lambda: self.a, lambda: self.b,
307                                                          lambda: self.c, lambda: self.d)),
308                                (self.closeAll, None),
309                                (self.close, None),
310                            ],
311
312            ALIGN_TYPE_LBOW : [ # 10
313                               (self.showLoadPaperPage, None),
314                               (maint.alignType10Phase1, (lambda: self.dev,)),
315                               (self.setAlignButton, (BUTTON_ALIGN,)),
316                               (self.showLBowPage, (lambda: self.pattern,)),
317                               (self.endLBowPage, None), # sets values
318                               (maint.alignType10Phase2, (lambda: self.dev, lambda: self.values,
319                                                          lambda: self.pattern)),
320                               (self.setAlignButton, (BUTTON_FINISH,)),
321                               (self.showLoadPaperPage, (lambda: True,)),
322                               (maint.alignType10Phase3, (lambda: self.dev,)),
323                               (self.closeAll, None),
324                               (self.close, None),
325                            ],
326
327            ALIGN_TYPE_LIDIL_0_5_4 : [ # 11
328                               (self.showLoadPaperPage, None),
329                               (maint.alignType11Phase1, (lambda: self.dev,)),
330                               (self.setAlignButton, (BUTTON_ALIGN,)),
331                               (self.showLBowPage, (lambda: self.pattern,)),
332                               (self.endLBowPage, None), # sets values
333                               (maint.alignType11Phase2, (lambda: self.dev, lambda: self.values,
334                                                          lambda: self.pattern, lambda: self.dev.pen_config)),
335                               (self.setAlignButton, (BUTTON_FINISH,)),
336                               (self.showLoadPaperPage, (lambda: True,)),
337                               (maint.alignType11Phase3, (lambda: self.dev,)),
338                               (self.closeAll, None),
339                               (self.close, None),
340                            ],
341
342            ALIGN_TYPE_OJ_PRO : [ # 12
343                                (self.showLoadPaperPage, None),
344                                (maint.AlignType12, (lambda : self.dev, lambda: true)),
345                                (self.closeAll, None),
346                                (self.close, None),
347                            ],
348
349            ALIGN_TYPE_AIO : [ #13
350                              (self.showLoadPaperPage, None),
351                              (maint.alignType13Phase1, (lambda: self.dev,)),
352                              (self.setAlignButton, (BUTTON_FINISH,)),
353                              (self.showAioPage, None),
354                              (self.closeAll, None),
355                              (self.close, None),
356                            ],
357
358            ALIGN_TYPE_LIDIL_DJ_D1600 : [ # 14
359                               (self.showLoadPaperPage, None),
360                               (maint.alignType14Phase1, (lambda: self.dev,)),
361                               (self.setAlignButton, (BUTTON_ALIGN,)),
362                               (self.showLBowPage, (lambda: self.pattern,)),
363                               (self.endLBowPage, None), # sets values
364                               (maint.alignType14Phase2, (lambda: self.dev, lambda: self.values,
365                                                          lambda: self.pattern, lambda: self.dev.pen_config)),
366                               (self.setAlignButton, (BUTTON_FINISH,)),
367                               (self.showLoadPaperPage, (lambda: True,)),
368                               (maint.alignType14Phase3, (lambda: self.dev,)),
369                               (self.closeAll, None),
370                               (self.close, None),
371                            ],
372
373            ALIGN_TYPE_LEDM : [ # 15
374                               (self.showLoadPaperPage, None),
375                               (maint.AlignType15Phase1, (lambda : self.dev, lambda: self.showAioPage)),
376                               (self.close, None),
377                            ],
378
379            ALIGN_TYPE_LEDM_MANUAL : [ # 16
380                               (self.showLoadPaperPage, None),
381                               (maint.AlignType15Phase1, (lambda : self.dev, lambda: true)),
382                               (self.showAlignmentNumberPage, ('A', 'v', 'kc', 3, 23)),
383                               (self.endAlignmentNumberPage, ('A',)),
384                               (self.showAlignmentNumberPage, ('B', 'h', 'kc', 3, 17)),
385                               (self.endAlignmentNumberPage, ('B',)),
386                               (self.showAlignmentNumberPage, ('C', 'v', 'k', 3, 23)),
387                               (self.endAlignmentNumberPage, ('C',)),
388                               (self.showAlignmentNumberPage, ('D', 'v', 'c', 3, 23)),
389                               (self.endAlignmentNumberPage, ('D',)),
390                               (self.showAlignmentNumberPage, ('E', 'h', 'k', 3, 11)),
391                               (self.endAlignmentNumberPage, ('E',)),
392                               (self.showAlignmentNumberPage, ('F', 'h', 'k', 3, 11)),
393                               (self.endAlignmentNumberPage, ('F',)),
394                               (self.showAlignmentNumberPage, ('G', 'h', 'k', 3, 11)),
395                               (self.endAlignmentNumberPage, ('G',)),
396                               (self.showAlignmentNumberPage, ('H', 'v', 'k', 3, 11)),
397                               (self.endAlignmentNumberPage, ('H',)),
398                               (self.showAlignmentNumberPage, ('I', 'v', 'c', 3, 19)),
399                               (self.endAlignmentNumberPage, ('I',)),
400                               (self.showAlignmentNumberPage, ('J', 'v', 'c', 3, 19)),
401                               (self.endAlignmentNumberPage, ('J',)),
402                               (maint.AlignType16Phase1, (lambda: self.dev, lambda: self.a, lambda: self.b,
403                                                          lambda: self.c, lambda: self.d, lambda: self.e,
404                                                          lambda: self.f, lambda: self.g, lambda: self.h,
405                                                          lambda: self.i, lambda: self.j)),
406                               (self.closeAll, None),
407                               (self.close, None),
408                            ],
409           ALIGN_TYPE_LEDM_FF_CC_0 : [ # 17
410                               (self.showLoadPaperPage, None),
411                               (maint.AlignType17Phase1, (lambda : self.dev, lambda: self.showAioPage)),
412                               (self.close, None),
413                            ],
414            }
415
416        self.setupUi(self)
417        self.initUi()
418
419        QTimer.singleShot(0, self.nextSequence)
420
421
422    def initUi(self):
423        # connect signals/slots
424        self.CancelButton.clicked.connect(self.CancelButton_clicked)
425        self.NextButton.clicked.connect(self.NextButton_clicked)
426        #self.BackButton.clicked.connect(self.BackButton_clicked)
427        self.DeviceComboBox.DeviceUriComboBox_noDevices.connect(self.DeviceUriComboBox_noDevices)
428        self.DeviceComboBox.DeviceUriComboBox_currentChanged.connect(self.DeviceUriComboBox_currentChanged)
429        self.DeviceComboBox.setFilter({'align-type': (operator.ne, ALIGN_TYPE_NONE)})
430
431        signal.signal(signal.SIGINT, signal.SIG_DFL)
432
433        # Application icon
434        self.setWindowIcon(QIcon(load_pixmap('hp_logo', '128x128')))
435
436        if self.device_uri:
437            self.DeviceComboBox.setInitialDevice(self.device_uri)
438
439
440    def DeviceUriComboBox_noDevices(self):
441        FailureUI(self, self.__tr("<b>No devices that support print cartridge alignment found.</b><p>Click <i>OK</i> to exit.</p>"))
442        self.close()
443
444
445    def DeviceUriComboBox_currentChanged(self, device_uri):
446        self.device_uri = device_uri
447
448
449    def CancelButton_clicked(self):
450        self.close()
451
452
453    def NextButton_clicked(self):
454        self.nextSequence()
455
456
457    def nextSequence(self):
458        while True:
459            try:
460                seq, params = self.seq[self.align_type][self.seq_index]
461            except IndexError:
462                break
463
464            if seq is None:
465                self.seq_index += 1
466                continue
467
468            self.new_page = False
469
470            t = []
471            if params is not None:
472                for p in params:
473                    try:
474                        t.append(p())
475                    except:
476                        t.append(p)
477
478            try:
479                log.debug("%s(%s)" % (seq.__name__, ','.join([repr(x) for x in t])))
480            except AttributeError:
481                pass
482
483            try:
484                seq(*t)
485            except Error:
486                CheckDeviceUI(self)
487                break
488
489            self.seq_index += 1
490
491            if self.new_page:
492                break
493
494            if self.abort:
495                self.close()
496
497
498
499    def showStartPage(self):
500#       self.BackButton.setEnabled(False)
501        num_devices = self.DeviceComboBox.setDevices()
502
503        if num_devices == 1:
504            self.skipPage()
505            return
506
507        self.DeviceComboBox.updateUi()
508        self.displayPage(PAGE_START)
509
510
511    def endStartPage(self):
512        self.mq = device.queryModelByURI(self.device_uri)
513        self.align_type = self.mq.get('align-type', ALIGN_TYPE_NONE)
514        self.seq_index = -1
515
516        #self.align_type = ALIGN_TYPE_TEST# XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
517
518        log.debug("align-type=%d" % self.align_type)
519        self.step_max = self.max_steps[self.align_type]
520
521        try:
522            self.dev = device.Device(self.device_uri)
523        except Error:
524            CheckDeviceUI(self)
525            return
526
527
528    def showLoadPaperPage(self, finish=False):
529        if finish:
530            self.LoadPaper.button_name = self.__tr("Finish >")
531        self.LoadPaper.updateUi()
532        self.displayPage(PAGE_LOAD_PAPER)
533
534
535    def endLoadPaperPage(self):
536        pass
537
538
539    def showAlignmentNumberPage(self, line_id, orientation, colors, line_count, choice_count):
540        # line_id: 'A', 'B', etc.
541        # orientation: 'v' or 'h'
542        # colors: 'k' or 'c' or 'kc'
543        # line_count: 2 or 3
544        # choice_count: 5, 7, 9, 11, etc. (odd)
545        self.AlignmentNumberTitle.setText(self.__tr("From the printed Alignment page, Choose the set of lines in group %s where the line segments are <b>best</b> aligned." % line_id))
546        self.AlignmentNumberIcon.setPixmap(load_pixmap('%s-%s-%d' % (orientation, colors, line_count), 'other'))
547        self.AlignmentNumberComboBox.clear()
548
549        for x in range(choice_count):
550            self.AlignmentNumberComboBox.addItem(str("%s%s"% (line_id, x+1)))
551
552        self.displayPage(PAGE_ALIGNMENT_NUMBER)
553        return
554
555
556    def endAlignmentNumberPage(self, line_id):
557        v = int(str(self.AlignmentNumberComboBox.currentText())[1:])
558
559        if line_id == 'A':
560            self.a = v
561            log.debug("A=%d" % v)
562
563        elif line_id == 'B':
564            self.b = v
565            log.debug("B=%d" % v)
566
567        elif line_id == 'C':
568            self.c = v
569            log.debug("C=%d" % v)
570
571        elif line_id == 'D':
572            self.d = v
573            log.debug("D=%d" % v)
574
575        elif line_id == 'E':
576            self.e = v
577            log.debug("E=%d" % v)
578
579        elif line_id == 'F':
580            self.f = v
581            log.debug("F=%d" % v)
582
583        elif line_id == 'G':
584            self.g = v
585            log.debug("G=%d" % v)
586
587        elif line_id == 'H':
588            self.h = v
589            log.debug("H=%d" % v)
590
591        elif line_id == 'I':
592            self.i = v
593            log.debug("I=%d" % v)
594
595        elif line_id == 'J':
596            self.j = v
597            log.debug("J=%d" % v)
598
599    def showPageEdgePage(self, prefix=None, count=13):
600        self.PageEdgeTitle.setText(self.__tr("Choose the <b>numbered arrow</b> that <b>best </b>marks the edge of the paper."))
601        self.PageEdgeIcon.setPixmap(load_pixmap('zca.png', 'other'))
602
603        self.PageEdgeComboBox.clear()
604        for x in range(count):
605            if prefix is None:
606                self.PageEdgeComboBox.addItem(str("%s" % x+1))
607            else:
608                self.PageEdgeComboBox.addItem(str("%s%s" % (prefix, x+1))) # for xBow
609
610        self.displayPage(PAGE_EDGE)
611
612
613    def endPageEdgePage(self):
614        v = int(str(self.PageEdgeComboBox.currentText())[1:])
615        self.zca = v
616        log.debug("ZCA=%d" % v)
617
618
619    def showLBowPage(self, pattern):
620        self.LBowIcon.setPixmap(load_pixmap('align10', 'other'))
621
622        if self.align_type == ALIGN_TYPE_LBOW:
623            pattern = maint.alignType10SetPattern(self.dev)
624
625        elif self.align_type == ALIGN_TYPE_LIDIL_DJ_D1600:
626            pattern = maint.alignType14SetPattern(self.dev)
627
628        else: # ALIGN_TYPE_LIDIL_0_5_4
629            pattern = maint.alignType11SetPattern(self.dev)
630
631        if pattern is None:
632            log.error("Invalid pattern!")
633            # TODO: ...
634
635        self.controls = maint.align10and11and14Controls(pattern, self.align_type)
636        keys = list(self.controls.keys())
637        keys.sort()
638        max_line = 'A'
639        for line in keys:
640            if self.controls[line][0]:
641                max_line = line
642            else:
643                break
644
645        self.LBowTitle.setText(self.__tr("For each row A - %s, select the label representing the box in which in the inner lines are the <b>least</b> visible." % max_line))
646
647        for line in self.controls:
648            if not self.controls[line][0]:
649                eval('self.%sComboBox.setEnabled(False)' % line.lower())
650            else:
651                for x in range(self.controls[line][1]):
652                    eval('self.%sComboBox.addItem("%s%d")' % (line.lower(), line, x + 1))
653
654        self.displayPage(PAGE_LBOW)
655
656
657
658    def endLBowPage(self):
659        self.values = []
660        controls = list(self.controls.keys())
661        controls.sort()
662
663        for line in controls:
664            if not self.controls[line][0]:
665                self.values.append(0)
666            else:
667                exec('selected = unicode(self.%sComboBox.currentText())' % line.lower())
668                try:
669                    selected = int(selected[1:])
670                except ValueError:
671                    selected = 0
672
673                self.values.append(selected)
674
675
676    def showAioPage(self):
677        self.AioIcon.setPixmap(load_pixmap('aio_align', 'other'))
678        self.displayPage(PAGE_AIO)
679
680
681    def endAioPage(self):
682        pass
683
684
685    def showColorAdjustPage(self, line_id, count=21):
686        self.ColorAdjustComboBox.clear()
687        self.ColorAdjustIcon.setPixmap(load_pixmap('color_adj', 'other'))
688        self.ColorAdjustLabel.setText(self.__tr("Line %s:" % line_id))
689
690        for x in range(count):
691            self.ColorAdjustComboBox.addItem(str("%s%s" % (line_id, x+1)))
692
693        self.displayPage(PAGE_COLOR_ADJ)
694
695
696    def endColorAdjustPage(self, line_id):
697        v = int(str(self.ColorAdjustComboBox.currentText())[1:])
698
699        if line_id == 'F':
700            self.f = v
701            log.debug("F=%d" % v)
702
703        elif line_id == 'G':
704            self.g = v
705            log.debug("G=%d" % v)
706
707
708    def showFrontPanelPage(self):
709#       self.BackButton.setEnabled(False)
710        self.setAlignButton(BUTTON_FINISH)
711        self.displayPage(PAGE_FRONT_PANEL)
712
713
714    def endFronPanelPage(self):
715        pass
716
717    #
718    #  ALIGN-TYPE SPECIFIC
719    #
720
721    def checkType2PenConfig(self):
722        pass
723        # TODO: set abort if problem
724
725
726    def alignType8Phase1(self):
727        self.num_inks = maint.alignType8Phase1(self.dev)
728
729
730    def setXBow(self):
731        # TODO: set abort if invalid pen config
732        self.real_align_type = self.align_type
733        self.align_type = ALIGN_TYPE_XBOW_OFFSET + self.dev.pen_config
734        self.seq_index = -1
735
736
737    def setXBowValues(self):
738        if self.real_align_type ==  ALIGN_TYPE_LIDIL_0_3_8:
739            maint.alignType4Phase2(self.dev, self.zca, self.b, self.c, self.d, self.e)
740            maint.alignType4Phase3(self.dev)
741
742        elif self.real_align_type == ALIGN_TYPE_LIDIL_0_4_3:
743            maint.alignType5Phase2(self.dev, self.zca, self.b, self.c, self.d, self.e, self.f, self.g)
744            maint.alignType5Phase3(self.dev)
745
746        elif self.real_align_type == ALIGN_TYPE_LIDIL_VIP:
747            maint.alignType7Phase2(self.dev, self.zca, self.b, self.c, self.d, self.e, self.f, self.g)
748            maint.alignType7Phase3(self.dev)
749
750
751    #
752    # Misc
753    #
754
755    def displayPage(self, page):
756        self.updateStepText(self.step)
757        self.step += 1
758        self.new_page = True
759        self.StackedWidget.setCurrentIndex(page)
760
761
762    def skipPage(self):
763        self.step += 1
764        self.new_page = False
765
766
767    def updateStepText(self, p=None):
768        if p is None or not self.step_max:
769            self.StepText.setText(str(""))
770        else:
771            self.StepText.setText(self.__tr("Step %s of %s" % (p, self.step_max)))
772
773
774    def setAlignButton(self, typ=BUTTON_ALIGN):
775        if typ == BUTTON_ALIGN:
776            self.NextButton.setText(self.__tr("Align"))
777        elif typ == BUTTON_NEXT:
778            self.NextButton.setText(self.__tr("Next >"))
779        elif typ == BUTTON_FINISH:
780            self.NextButton.setText(self.__tr("Finish"))
781
782
783    def setPenConfig(self):
784        self.dev.pen_config = status.getPenConfiguration(self.dev.getStatusFromDeviceID())
785
786
787    def closeAll(self):
788        if self.dev is not None:
789            self.dev.close()
790
791
792    def __tr(self,s,c = None):
793        return qApp.translate("AlignDialog",s,c)
794