127
133
STATUS_REV_04 : 20}
129
135
def parseSStatus(s, z=''):
138
top_door = TOP_DOOR_NOT_PRESENT
139
stat = STATUS_UNKNOWN
140
supply_door = SUPPLY_DOOR_NOT_PRESENT
141
duplexer = DUPLEXER_NOT_PRESENT
142
photo_tray = PHOTO_TRAY_NOT_PRESENT
143
in_tray1 = IN_TRAY_NOT_PRESENT
144
in_tray2 = IN_TRAY_NOT_PRESENT
145
media_path = MEDIA_PATH_NOT_PRESENT
134
z_fields = z.split(',')
136
for z_field in z_fields:
138
if len(z_field) > 2 and z_field[:2] == '05':
140
z1 = [int(x, 16) for x in z1s]
142
s1 = [int(x, 16) for x in s]
146
assert STATUS_REV_00 <= revision <= STATUS_REV_04
148
top_door = bool(s1[2] & 0x8L) + s1[2] & 0x1L
149
supply_door = bool(s1[3] & 0x8L) + s1[3] & 0x1L
150
duplexer = bool(s1[4] & 0xcL) + s1[4] & 0x1L
151
photo_tray = bool(s1[5] & 0x8L) + s1[5] & 0x1L
153
if revision == STATUS_REV_02:
154
in_tray1 = bool(s1[6] & 0x8L) + s1[6] & 0x1L
155
in_tray2 = bool(s1[7] & 0x8L) + s1[7] & 0x1L
157
in_tray1 = bool(s1[6] & 0x8L)
158
in_tray2 = bool(s1[7] & 0x8L)
160
media_path = bool(s1[8] & 0x8L) + (s1[8] & 0x1L) + ((bool(s1[18] & 0x2L))<<1)
161
status_pos = STATUS_POS[revision]
162
status_byte = (s1[status_pos]<<4) + s1[status_pos + 1]
163
stat = status_byte + STATUS_PRINTER_BASE
165
pens, pen, c, d = [], {}, NUM_PEN_POS[revision]+1, 0
166
num_pens = s1[NUM_PEN_POS[revision]]
167
log.debug("Num pens=%d" % num_pens)
169
pen_data_size = PEN_DATA_SIZE[revision]
171
for p in range(num_pens):
172
info = long(s[c : c + pen_data_size], 16)
176
if pen_data_size == 4:
177
pen['type'] = REVISION_2_TYPE_MAP.get(int((info & 0xf000L) >> 12L), 0)
179
if index < (num_pens / 2):
180
pen['kind'] = AGENT_KIND_HEAD
151
z_fields = z.split(',')
153
for z_field in z_fields:
155
if len(z_field) > 2 and z_field[:2] == '05':
157
z1 = [int(x, 16) for x in z1s]
159
s1 = [int(x, 16) for x in s]
163
assert STATUS_REV_00 <= revision <= STATUS_REV_04
165
top_door = bool(s1[2] & 0x8L) + s1[2] & 0x1L
166
supply_door = bool(s1[3] & 0x8L) + s1[3] & 0x1L
167
duplexer = bool(s1[4] & 0xcL) + s1[4] & 0x1L
168
photo_tray = bool(s1[5] & 0x8L) + s1[5] & 0x1L
170
if revision == STATUS_REV_02:
171
in_tray1 = bool(s1[6] & 0x8L) + s1[6] & 0x1L
172
in_tray2 = bool(s1[7] & 0x8L) + s1[7] & 0x1L
174
in_tray1 = bool(s1[6] & 0x8L)
175
in_tray2 = bool(s1[7] & 0x8L)
177
media_path = bool(s1[8] & 0x8L) + (s1[8] & 0x1L) + ((bool(s1[18] & 0x2L))<<1)
178
status_pos = STATUS_POS[revision]
179
status_byte = (s1[status_pos]<<4) + s1[status_pos + 1]
180
stat = status_byte + STATUS_PRINTER_BASE
182
pen, c, d = {}, NUM_PEN_POS[revision]+1, 0
183
num_pens = s1[NUM_PEN_POS[revision]]
185
pen_data_size = PEN_DATA_SIZE[revision]
187
log.debug("num_pens = %d" % num_pens)
188
for p in range(num_pens):
189
info = long(s[c : c + pen_data_size], 16)
193
if pen_data_size == 4:
194
pen['type'] = REVISION_2_TYPE_MAP.get(int((info & 0xf000L) >> 12L), 0)
196
if index < (num_pens / 2):
197
pen['kind'] = AGENT_KIND_HEAD
199
pen['kind'] = AGENT_KIND_SUPPLY
201
pen['level-trigger'] = int ((info & 0x0e00L) >> 9L)
202
pen['health'] = int((info & 0x0180L) >> 7L)
203
pen['level'] = int(info & 0x007fL)
206
elif pen_data_size == 8:
207
pen['kind'] = bool(info & 0x80000000L) + ((bool(info & 0x40000000L))<<1L)
208
pen['type'] = int((info & 0x3f000000L) >> 24L)
209
pen['id'] = int((info & 0xf80000) >> 19L)
210
pen['level-trigger'] = int((info & 0x70000L) >> 16L)
211
pen['health'] = int((info & 0xc000L) >> 14L)
212
pen['level'] = int(info & 0xffL)
182
pen['kind'] = AGENT_KIND_SUPPLY
184
pen['level-trigger'] = int ((info & 0x0e00L) >> 9L)
185
pen['health'] = int((info & 0x0180L) >> 7L)
186
pen['level'] = int(info & 0x007fL)
189
elif pen_data_size == 8:
190
pen['kind'] = bool(info & 0x80000000L) + ((bool(info & 0x40000000L))<<1L)
191
pen['type'] = int((info & 0x3f000000L) >> 24L)
192
pen['id'] = int((info & 0xf80000) >> 19L)
193
pen['level-trigger'] = int((info & 0x70000L) >> 16L)
194
pen['health'] = int((info & 0xc000L) >> 14L)
195
pen['level'] = int(info & 0xffL)
198
log.error("Pen data size error")
201
# TODO: Determine cause of IndexError for C6100 (defect #1111)
203
pen['dvc'] = long(z1s[d+1:d+5], 16)
204
pen['virgin'] = bool(z1[d+5] & 0x8L)
205
pen['hp-ink'] = bool(z1[d+5] & 0x4L)
206
pen['known'] = bool(z1[d+5] & 0x2L)
207
pen['ack'] = bool(z1[d+5] & 0x1L)
215
log.error("Pen data size error")
218
# TODO: Determine cause of IndexError for C6100 (defect #1111)
220
pen['dvc'] = long(z1s[d+1:d+5], 16)
221
pen['virgin'] = bool(z1[d+5] & 0x8L)
222
pen['hp-ink'] = bool(z1[d+5] & 0x4L)
223
pen['known'] = bool(z1[d+5] & 0x2L)
224
pen['ack'] = bool(z1[d+5] & 0x1L)
232
log.debug("pen %d %s" % (index, pen))
240
except (IndexError, ValueError, TypeError), e:
241
log.warn("Status parsing error: %s" % str(e))
221
243
return {'revision' : revision,
1459
element_type10_xlate = { 'ink' : AGENT_KIND_SUPPLY,
1460
'printhead' : AGENT_KIND_HEAD,
1463
pen_type10_xlate = { 'pK' : AGENT_TYPE_PG,
1464
'M' : AGENT_TYPE_MAGENTA,
1465
'C' : AGENT_TYPE_CYAN,
1466
'Y' : AGENT_TYPE_YELLOW,
1467
'K' : AGENT_TYPE_BLACK,
1470
pen_level10_xlate = { 'ok' : AGENT_LEVEL_TRIGGER_SUFFICIENT_0,
1471
'low' : AGENT_LEVEL_TRIGGER_MAY_BE_LOW,
1472
'out' : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
1473
'empty' : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
1474
'missing' : AGENT_LEVEL_TRIGGER_ALMOST_DEFINITELY_OUT,
1477
pen_health10_xlate = { 'ok' : AGENT_HEALTH_OK,
1478
'misinstalled' : AGENT_HEALTH_MISINSTALLED,
1479
'missing' : AGENT_HEALTH_MISINSTALLED,
1482
def StatusType10FetchUrl(dev, url):
1484
# data_fp = cStringIO.StringIO()
1485
# dev.getEWSUrl(url, data_fp)
1486
# data = data_fp.getvalue()
1487
data = parseStatus(dev.deviceID)
1488
log.error("status %s" % data)
1492
status, ip = hpmudext.get_zc_ip_address(dev.zc)
1493
if status != hpmudext.HPMUD_R_OK:
1494
log.error("unable to get IP address of mDNS configured device")
1499
# Get the agent status XML
1500
addr = "http://%s:8080%s" % (ip, url)
1501
feed = urllib.urlopen(addr)
1508
def StatusType10(dev): # Low End Data Model
1509
status_block = { 'revision' : STATUS_REV_UNKNOWN,
1511
'top-door' : TOP_DOOR_NOT_PRESENT,
1512
'supply-door' : TOP_DOOR_NOT_PRESENT,
1513
'duplexer' : DUPLEXER_NOT_PRESENT,
1514
'photo-tray' : PHOTO_TRAY_NOT_PRESENT,
1515
'in-tray1' : IN_TRAY_NOT_PRESENT,
1516
'in-tray2' : IN_TRAY_NOT_PRESENT,
1517
'media-path' : MEDIA_PATH_NOT_PRESENT,
1518
'status-code' : STATUS_PRINTER_IDLE,
1521
if not etree_loaded:
1522
log.error("cannot get status for printer...please load ElementTree module")
1525
# Get the dynamic consumables configuration
1526
data = StatusType10FetchUrl(dev, "/DevMgmt/ConsumableConfigDyn.xml")
1528
log.error("unable to fetch pen status")
1530
data = data.replace("ccdyn:", "").replace("dd:", "")
1532
# Parse the agent status XML
1534
tree = ElementTree.XML(data)
1535
elements = tree.findall("ConsumableInfo")
1537
# ElementTree.dump(e)
1538
health = AGENT_HEALTH_OK
1540
type = e.find("ConsumableTypeEnum").text
1541
state = e.find("ConsumableLifeState/ConsumableState").text
1545
ink_type = e.find("ConsumableLabelCode").text
1546
if state != "missing":
1548
ink_level = int(e.find("ConsumablePercentageLevelRemaining").text)
1556
log.debug("type '%s' state '%s' ink_type '%s' ink_level %d" % (type, state, ink_type, ink_level))
1558
entry = { 'kind' : element_type10_xlate.get(type, AGENT_KIND_NONE),
1559
'type' : pen_type10_xlate.get(ink_type, AGENT_TYPE_NONE),
1560
'health' : pen_health10_xlate.get(state, AGENT_HEALTH_OK),
1561
'level' : int(ink_level),
1562
'level-trigger' : pen_level10_xlate.get(state, AGENT_LEVEL_TRIGGER_SUFFICIENT_0)
1565
log.debug("%s" % entry)
1566
agents.append(entry)
1568
status_block['agents'] = agents
1570
# Get the media handling configuration
1571
data = StatusType10FetchUrl(dev, "/DevMgmt/MediaHandlingDyn.xml")
1573
log.error("unable to fetch media handling status")
1575
data = data.replace("mhdyn:", "").replace("dd:", "")
1577
# Parse the media handling XML
1578
tree = ElementTree.XML(data)
1579
elements = tree.findall("InputTray")
1581
# ElementTree.dump(e)
1582
bin_name = e.find("InputBin").text
1583
if bin_name == "Tray1":
1584
status_block['in-tray1'] = IN_TRAY_PRESENT
1585
elif bin_name == "Tray2":
1586
status_block['in-tray2'] = IN_TRAY_PRESENT
1587
elif bin_name == "PhotoTray":
1588
status_block['photo-tray'] = PHOTO_TRAY_ENGAGED
1590
log.error("found invalid bin name '%s'" % bin_name)
1592
elements = tree.findall("Accessories/MediaHandlingDeviceFunctionType")
1594
# ElementTree.dump(e)
1595
if e.text == "autoDuplexor":
1596
status_block['duplexer'] = DUPLEXER_DOOR_CLOSED
1598
log.error("found invalid media accessory '%s'" % e.text)
1600
# Get the product status
1601
data = StatusType10FetchUrl(dev, "/DevMgmt/ProductStatusDyn.xml")
1603
log.error("unable to fetch product status")
1605
data = data.replace("psdyn:", "").replace("locid:", "")
1606
data = data.replace("pscat:", "").replace("dd:", "").replace("ad:", "")
1608
# Parse the product status XML
1609
tree = ElementTree.XML(data)
1610
elements = tree.findall("Status/StatusCategory")
1612
# ElementTree.dump(e)
1613
if e.text == "closeDoorOrCover":
1614
status_block['top-door'] = TOP_DOOR_OPEN
1615
status_block['supply-door'] = TOP_DOOR_OPEN
1616
elif e.text == "shuttingDown":
1617
status_block['status-code'] = STATUS_PRINTER_TURNING_OFF
1618
elif e.text == "cancelJob":
1619
status_block['status-code'] = STATUS_PRINTER_CANCELING
1620
elif e.text == "trayEmptyOrOpen":
1621
status_block['status-code'] = STATUS_PRINTER_OUT_OF_PAPER
1622
elif e.text == "jamInPrinter":
1623
status_block['status-code'] = STATUS_PRINTER_MEDIA_JAM
1624
elif e.text == "hardError":
1625
status_block['status-code'] = STATUS_PRINTER_HARD_ERROR
1626
elif e.text == "outputBinFull":
1627
status_block['status-code'] = STATUS_PRINTER_OUTPUT_BIN_FULL
1628
elif e.text == "unexpectedSizeInTray":
1629
status_block['status-code'] = STATUS_PRINTER_MEDIA_SIZE_MISMATCH
1630
elif e.text == "insertOrCloseTray2":
1631
status_block['status-code'] = STATUS_PRINTER_TRAY_2_MISSING