28def readGPIOPortOverIPMI(ipmi_connection, port):
29 raw_gpio_cmd = b'\x01'
30 mode=b'\x00'
31 cmd = raw_gpio_cmd+struct.pack("B", port)+mode
32
33 cmd_result = []
34 result = ipmi_connection.raw_command(0x00, 0x30, cmd)
35
36 for char in result:
37 cmd_result.append(char)
38
39
40 port_directions_flag=0b0
41 for i in range(4,0,-1):
42 port_directions_flag = (port_directions_flag << 8) | cmd_result[i]
43
44
45 port_states_flag=0b0
46 for i in range(8,4,-1):
47 port_states_flag = (port_states_flag << 8) | cmd_result[i]
48
49 portTable = Texttable(max_width=0)
50 portTable.set_deco(Texttable.VLINES | Texttable.BORDER | Texttable.HEADER)
51 portTable.set_cols_align(["l", "l", "l"])
52 portTable.set_chars(['-', '|', '+', '-'])
53 portTable.header( ['Pin', 'Direction', 'State'] )
54
55 for i in range(32):
56 pin_dir = 'In'
57 pin_dir_colour = 'yellow'
58 if port_directions_flag & (0x1 << i):
59 pin_dir = 'Out'
60 pin_dir_colour = 'green'
61
62 pin_state = 'Low'
63 pin_state_colour = 'blue'
64 if port_states_flag & (0x1 << i):
65 pin_state = 'High'
66 pin_state_colour = 'red'
67
68 portTable.add_row( [i, style(pin_dir, fg=pin_dir_colour), style(pin_state, fg=pin_state_colour)] )
69
70 print("Port {} pins".format(port))
71 return portTable.draw()
72
73
74
75