|
| 1 | +#!/usr/bin/env python3 |
| 2 | +''' |
| 3 | +Created on 08/11/2011 |
| 4 | +
|
| 5 | +@author: aes |
| 6 | +
|
| 7 | +Original version: |
| 8 | +https://stash.silabs.com/projects/UIC/repos/uic/commits/c95879e16432600fc20897b9b90b909ee268c794#scripts/serial_decode_zpc.py |
| 9 | +''' |
| 10 | + |
| 11 | +import shutil |
| 12 | +import sys |
| 13 | + |
| 14 | +SOF=0x01 |
| 15 | +ACK=0x06 |
| 16 | +CAN=0x18 |
| 17 | +NAK=0x15 |
| 18 | + |
| 19 | +funcids=dict() |
| 20 | + |
| 21 | +funcids[0x01] = "FUNC_ID_SERIAL_API_HELO" |
| 22 | +funcids[0x02] = "FUNC_ID_SERIAL_API_GET_INIT_DATA" |
| 23 | +funcids[0x03] = "FUNC_ID_SERIAL_API_APPL_NODE_INFORMATION" |
| 24 | +funcids[0x04] = "FUNC_ID_APPLICATION_COMMAND_HANDLER" |
| 25 | +funcids[0x05] = "FUNC_ID_ZW_GET_CONTROLLER_CAPABILITIES" |
| 26 | +funcids[0x06] = "FUNC_ID_SERIAL_API_SET_TIMEOUTS" |
| 27 | +funcids[0x07] = "FUNC_ID_SERIAL_API_GET_CAPABILITIES" |
| 28 | +funcids[0x08] = "FUNC_ID_SERIAL_API_SOFT_RESET" |
| 29 | +funcids[0x09] = "FUNC_ID_ZW_GET_PROTOCOL_VERSION" |
| 30 | +funcids[0x10] = "FUNC_ID_ZW_SET_RF_RECEIVE_MODE" |
| 31 | +funcids[0x0a] = "FUNC_ID_SERIALAPI_STARTED" |
| 32 | +funcids[0x0b] = "FUNC_ID_SERIALAPI_SETUP" |
| 33 | +funcids[0x11] = "FUNC_ID_ZW_SET_SLEEP_MODE" |
| 34 | +funcids[0x12] = "FUNC_ID_ZW_SEND_NODE_INFORMATION" |
| 35 | +funcids[0x13] = "FUNC_ID_ZW_SEND_DATA" |
| 36 | +funcids[0x14] = "FUNC_ID_ZW_SEND_DATA_MULTI" |
| 37 | +funcids[0x15] = "FUNC_ID_ZW_GET_VERSION" |
| 38 | +funcids[0x16] = "FUNC_ID_ZW_SEND_DATA_ABORT" |
| 39 | +funcids[0x17] = "FUNC_ID_ZW_RF_POWER_LEVEL_SET" |
| 40 | +funcids[0x18] = "FUNC_ID_ZW_SEND_DATA_META" |
| 41 | +funcids[0x19] = "FUNC_ID_ZW_RESERVED_SD" |
| 42 | +funcids[0x1A] = "FUNC_ID_ZW_RESERVED_SDM" |
| 43 | +funcids[0x1B] = "FUNC_ID_ZW_RESERVED_SRI" |
| 44 | +funcids[0x1B] = "FUNC_ID_ZW_SET_ROUTING_INFO" |
| 45 | +funcids[0x1C] = "FUNC_ID_ZW_GET_RANDOM" |
| 46 | +funcids[0x1D] = "FUNC_ID_ZW_RANDOM" |
| 47 | +funcids[0x1E] = "FUNC_ID_ZW_RF_POWER_LEVEL_REDISCOVERY_SET" |
| 48 | +funcids[0x20] = "FUNC_ID_MEMORY_GET_ID" |
| 49 | +funcids[0x21] = "FUNC_ID_MEMORY_GET_BYTE" |
| 50 | +funcids[0x22] = "FUNC_ID_MEMORY_PUT_BYTE" |
| 51 | +funcids[0x23] = "FUNC_ID_MEMORY_GET_BUFFER" |
| 52 | +funcids[0x24] = "FUNC_ID_MEMORY_PUT_BUFFER" |
| 53 | +funcids[0x25] = "FUNC_ID_SERIAL_API_GET_APPL_HOST_MEMORY_OFFSET" |
| 54 | +funcids[0x26] = "FUNC_ID_DEBUG_OUTPUT" |
| 55 | +funcids[0x27] = "FUNC_ID_AUTO_PROGRAMMING" |
| 56 | +funcids[0x28] = "FUNC_ID_NVR_GET_VALUE" |
| 57 | +funcids[0x29] = "FUNC_ID_NVM_GET_ID" |
| 58 | +funcids[0x2A] = "FUNC_ID_NVM_EXT_READ_LONG_BUFFER" |
| 59 | +funcids[0x2B] = "FUNC_ID_NVM_EXT_WRITE_LONG_BUFFER" |
| 60 | +funcids[0x2C] = "FUNC_ID_NVM_EXT_READ_LONG_BYTE" |
| 61 | +funcids[0x2D] = "FUNC_ID_NVM_EXT_WRITE_LONG_BYTE" |
| 62 | +funcids[0x2E] = "FUNC_ID_NVM_BACKUP_RESTORE" |
| 63 | +funcids[0x30] = "FUNC_ID_CLOCK_SET" |
| 64 | +funcids[0x31] = "FUNC_ID_CLOCK_GET" |
| 65 | +funcids[0x32] = "FUNC_ID_CLOCK_CMP" |
| 66 | +funcids[0x33] = "FUNC_ID_RTC_TIMER_CREATE" |
| 67 | +funcids[0x34] = "FUNC_ID_RTC_TIMER_READ" |
| 68 | +funcids[0x35] = "FUNC_ID_RTC_TIMER_DELETE" |
| 69 | +funcids[0x36] = "FUNC_ID_RTC_TIMER_CALL" |
| 70 | +funcids[0x37] = "FUNC_ID_CLEAR_TX_TIMERS" |
| 71 | +funcids[0x38] = "FUNC_ID_GET_TX_TIMERS" |
| 72 | +funcids[0x3B] = "FUNC_ID_ZW_GET_BACKGROUND_RSSI" |
| 73 | +funcids[0x3F] = "FUNC_ID_ZW_REMOVE_NODE_ID_FROM_NETWORK" |
| 74 | +funcids[0x40] = "FUNC_ID_ZW_SET_LEARN_NODE_STATE" |
| 75 | +funcids[0x41] = "FUNC_ID_ZW_GET_NODE_PROTOCOL_INFO" |
| 76 | +funcids[0x42] = "FUNC_ID_ZW_SET_DEFAULT" |
| 77 | +funcids[0x43] = "FUNC_ID_ZW_NEW_CONTROLLER" |
| 78 | +funcids[0x44] = "FUNC_ID_ZW_REPLICATION_COMMAND_COMPLETE" |
| 79 | +funcids[0x45] = "FUNC_ID_ZW_REPLICATION_SEND_DATA" |
| 80 | +funcids[0x46] = "FUNC_ID_ZW_ASSIGN_RETURN_ROUTE" |
| 81 | +funcids[0x47] = "FUNC_ID_ZW_DELETE_RETURN_ROUTE" |
| 82 | +funcids[0x48] = "FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE" |
| 83 | +funcids[0x49] = "FUNC_ID_ZW_APPLICATION_UPDATE" |
| 84 | +funcids[0x49] = "FUNC_ID_ZW_APPLICATION_CONTROLLER_UPDATE" |
| 85 | +funcids[0x4A] = "FUNC_ID_ZW_ADD_NODE_TO_NETWORK" |
| 86 | +funcids[0x4B] = "FUNC_ID_ZW_REMOVE_NODE_FROM_NETWORK" |
| 87 | +funcids[0x4C] = "FUNC_ID_ZW_CREATE_NEW_PRIMARY" |
| 88 | +funcids[0x4D] = "FUNC_ID_ZW_CONTROLLER_CHANGE" |
| 89 | +funcids[0x4E] = "FUNC_ID_ZW_RESERVED_FN" |
| 90 | +funcids[0x4F] = "FUNC_ID_ZW_RESERVED_AR" |
| 91 | +funcids[0x50] = "FUNC_ID_ZW_SET_LEARN_MODE" |
| 92 | +funcids[0x51] = "FUNC_ID_ZW_ASSIGN_SUC_RETURN_ROUTE" |
| 93 | +funcids[0x52] = "FUNC_ID_ZW_ENABLE_SUC" |
| 94 | +funcids[0x53] = "FUNC_ID_ZW_REQUEST_NETWORK_UPDATE" |
| 95 | +funcids[0x54] = "FUNC_ID_ZW_SET_SUC_NODE_ID" |
| 96 | +funcids[0x55] = "FUNC_ID_ZW_DELETE_SUC_RETURN_ROUTE" |
| 97 | +funcids[0x56] = "FUNC_ID_ZW_GET_SUC_NODE_ID" |
| 98 | +funcids[0x57] = "FUNC_ID_ZW_SEND_SUC_ID" |
| 99 | +funcids[0x58] = "FUNC_ID_ZW_RESERVED_ASR" |
| 100 | +funcids[0x59] = "FUNC_ID_ZW_REDISCOVERY_NEEDED" |
| 101 | +funcids[0x5A] = "FUNC_ID_ZW_REQUEST_NODE_NEIGHBOR_UPDATE_OPTION" |
| 102 | +funcids[0x5B] = "FUNC_ID_ZW_SUPPORT9600_ONLY" |
| 103 | +funcids[0x5C] = "FUNC_ID_ZW_REQUEST_NEW_ROUTE_DESTINATIONS" |
| 104 | +funcids[0x5D] = "FUNC_ID_ZW_IS_NODE_WITHIN_DIRECT_RANGE" |
| 105 | +funcids[0x5E] = "FUNC_ID_ZW_EXPLORE_REQUEST_INCLUSION" |
| 106 | +funcids[0x5F] = "FUNC_ID_ZW_EXPLORE_REQUEST_EXCLUSION" |
| 107 | +funcids[0x60] = "FUNC_ID_ZW_REQUEST_NODE_INFO" |
| 108 | +funcids[0x61] = "FUNC_ID_ZW_REMOVE_FAILED_NODE_ID" |
| 109 | +funcids[0x62] = "FUNC_ID_ZW_IS_FAILED_NODE_ID" |
| 110 | +funcids[0x63] = "FUNC_ID_ZW_REPLACE_FAILED_NODE" |
| 111 | +funcids[0x65] = "FUNC_ID_ZW_SET_ROUTING_MAX_6_00" |
| 112 | +funcids[0x66] = "FUNC_ID_ZW_IS_PRIMARY_CTRL" |
| 113 | +funcids[0x67] = "FUNC_ID_ZW_AES_ECB" |
| 114 | +funcids[0x70] = "FUNC_ID_TIMER_START" |
| 115 | +funcids[0x71] = "FUNC_ID_TIMER_RESTART" |
| 116 | +funcids[0x72] = "FUNC_ID_TIMER_CANCEL" |
| 117 | +funcids[0x73] = "FUNC_ID_TIMER_CALL" |
| 118 | +funcids[0x80] = "FUNC_ID_GET_ROUTING_TABLE_LINE" |
| 119 | +funcids[0x81] = "FUNC_ID_GET_TX_COUNTER" |
| 120 | +funcids[0x82] = "FUNC_ID_RESET_TX_COUNTER" |
| 121 | +funcids[0x83] = "FUNC_ID_STORE_NODEINFO" |
| 122 | +funcids[0x84] = "FUNC_ID_STORE_HOMEID" |
| 123 | +funcids[0x90] = "FUNC_ID_LOCK_ROUTE_RESPONSE" |
| 124 | +funcids[0x91] = "FUNC_ID_ZW_SEND_DATA_ROUTE_DEMO" |
| 125 | +funcids[0x92] = "FUNC_ID_ZW_GET_LAST_WORKING_ROUTE" |
| 126 | +funcids[0x93] = "FUNC_ID_ZW_SET_LAST_WORKING_ROUTE" |
| 127 | +funcids[0x95] = "FUNC_ID_SERIAL_API_TEST" |
| 128 | +funcids[0x98] = "FUNC_ID_SERIAL_API_EXT" |
| 129 | +funcids[0xA0] = "FUNC_ID_SERIAL_API_APPL_SLAVE_NODE_INFORMATION" |
| 130 | +funcids[0xA1] = "FUNC_ID_APPLICATION_SLAVE_COMMAND_HANDLER" |
| 131 | +funcids[0xA2] = "FUNC_ID_ZW_SEND_SLAVE_NODE_INFORMATION" |
| 132 | +funcids[0xA3] = "FUNC_ID_ZW_SEND_SLAVE_DATA" |
| 133 | +funcids[0xA4] = "FUNC_ID_ZW_SET_SLAVE_LEARN_MODE" |
| 134 | +funcids[0xA5] = "FUNC_ID_ZW_GET_VIRTUAL_NODES" |
| 135 | +funcids[0xA6] = "FUNC_ID_ZW_IS_VIRTUAL_NODE" |
| 136 | +funcids[0xA7] = "FUNC_ID_ZW_RESERVED_SSD" |
| 137 | +funcids[0xA8] = "FUNC_ID_APPLICATION_COMMAND_HANDLER_BRIDGE" |
| 138 | +funcids[0xA9] = "FUNC_ID_ZW_SEND_DATA_BRIDGE" |
| 139 | +funcids[0xAA] = "FUNC_ID_ZW_SEND_DATA_META_BRIDGE" |
| 140 | +funcids[0xAB] = "FUNC_ID_ZW_SEND_DATA_MULTI_BRIDGE" |
| 141 | +funcids[0xB0] = "FUNC_ID_PWR_SETSTOPMODE" |
| 142 | +funcids[0xB1] = "FUNC_ID_PWR_CLK_PD" |
| 143 | +funcids[0xB2] = "FUNC_ID_PWR_CLK_PUP" |
| 144 | +funcids[0xB3] = "FUNC_ID_PWR_SELECT_CLK" |
| 145 | +funcids[0xB4] = "FUNC_ID_ZW_SET_WUT_TIMEOUT" |
| 146 | +funcids[0xB5] = "FUNC_ID_ZW_IS_WUT_KICKED" |
| 147 | +funcids[0xB6] = "FUNC_ID_ZW_WATCHDOG_ENABLE" |
| 148 | +funcids[0xB7] = "FUNC_ID_ZW_WATCHDOG_DISABLE" |
| 149 | +funcids[0xB8] = "FUNC_ID_ZW_WATCHDOG_KICK" |
| 150 | +funcids[0xB9] = "FUNC_ID_ZW_SET_EXT_INT_LEVEL" |
| 151 | +funcids[0xB9] = "FUNC_ID_ZW_INT_EXT_LEVEL_SET" |
| 152 | +funcids[0xBA] = "FUNC_ID_ZW_RF_POWER_LEVEL_GET" |
| 153 | +funcids[0xBB] = "FUNC_ID_ZW_GET_NEIGHBOR_COUNT" |
| 154 | +funcids[0xBC] = "FUNC_ID_ZW_ARE_NODES_NEIGHBOURS" |
| 155 | +funcids[0xBD] = "FUNC_ID_ZW_TYPE_LIBRARY" |
| 156 | +funcids[0xBE] = "FUNC_ID_ZW_SEND_TEST_FRAME" |
| 157 | +funcids[0xBF] = "FUNC_ID_ZW_GET_PROTOCOL_STATUS" |
| 158 | +funcids[0xD0] = "FUNC_ID_ZW_SET_PROMISCUOUS_MODE" |
| 159 | +funcids[0xD1] = "FUNC_ID_PROMISCUOUS_APPLICATION_COMMAND_HANDLER" |
| 160 | +funcids[0xD2] = "FUNC_ID_ZW_WATCHDOG_START" |
| 161 | +funcids[0xD3] = "FUNC_ID_ZW_WATCHDOG_STOP" |
| 162 | +funcids[0xD4] = "FUNC_ID_ZW_SET_ROUTING_MAX" |
| 163 | +funcids[0xD5] = "FUNC_ID_ZW_GET_ROUTING_MAX" |
| 164 | +funcids[0xE0] = "FUNC_ID_ZW_NUNIT_CMD" |
| 165 | +funcids[0xE1] = "FUNC_ID_ZW_NUNIT_INIT" |
| 166 | +funcids[0xE2] = "FUNC_ID_ZW_NUNIT_LIST" |
| 167 | +funcids[0xE3] = "FUNC_ID_ZW_NUNIT_RUN" |
| 168 | +funcids[0xE4] = "FUNC_ID_ZW_NUNIT_END" |
| 169 | +funcids[0xE5] = "FUNC_ID_IO_PORT_STATUS" |
| 170 | +funcids[0xE6] = "FUNC_ID_IO_PORT" |
| 171 | +funcids[0xEE] = "FUNC_ID_SERIAL_API_POWER_MANAGEMENT" |
| 172 | +funcids[0xEF] = "FUNC_ID_SERIAL_API_READY" |
| 173 | +funcids[0xF0] = "FUNC_ID_PROPRIETARY_0" |
| 174 | +funcids[0xF1] = "FUNC_ID_PROPRIETARY_1" |
| 175 | +funcids[0xF2] = "FUNC_ID_PROPRIETARY_2" |
| 176 | +funcids[0xF3] = "FUNC_ID_PROPRIETARY_3" |
| 177 | +funcids[0xF4] = "FUNC_ID_PROPRIETARY_4" |
| 178 | +funcids[0xF5] = "FUNC_ID_PROPRIETARY_5" |
| 179 | +funcids[0xF6] = "FUNC_ID_PROPRIETARY_6" |
| 180 | +funcids[0xF7] = "FUNC_ID_PROPRIETARY_7" |
| 181 | +funcids[0xF8] = "FUNC_ID_PROPRIETARY_8" |
| 182 | +funcids[0xF9] = "FUNC_ID_PROPRIETARY_9" |
| 183 | +funcids[0xFA] = "FUNC_ID_PROPRIETARY_A" |
| 184 | +funcids[0xFB] = "FUNC_ID_PROPRIETARY_B" |
| 185 | +funcids[0xFC] = "FUNC_ID_PROPRIETARY_C" |
| 186 | +funcids[0xFD] = "FUNC_ID_PROPRIETARY_D" |
| 187 | +funcids[0xFE] = "FUNC_ID_PROPRIETARY_E" |
| 188 | +funcids[0xFF] = "FUNC_ID_UNKNOWN" |
| 189 | + |
| 190 | +def frame_tostring(frame): |
| 191 | + if len(frame) < 2: |
| 192 | + return "EEE" |
| 193 | + try: |
| 194 | + req = int(frame[0],16) |
| 195 | + fid = int(frame[1],16) |
| 196 | + except ValueError: |
| 197 | + return "" |
| 198 | + |
| 199 | + if req==0x00: |
| 200 | + s="\033[34;1m REQ " |
| 201 | + else: |
| 202 | + s="\033[33;1m RES " |
| 203 | + |
| 204 | + try: |
| 205 | + return s + funcids[fid]+"("+hex(fid)+") "+ str(frame[2:-1]) + "\033[0m" |
| 206 | + except KeyError: |
| 207 | + return s + "Unknown(%2.2x) " % fid + str(frame[2:-1]) + "\033[0m" |
| 208 | + |
| 209 | + |
| 210 | +def perror(*args, **kwargs): |
| 211 | + print('Error: ', *args, file=sys.stderr, **kwargs) |
| 212 | + |
| 213 | + |
| 214 | +if __name__ == '__main__': |
| 215 | + POS_FRAME_START = 1 |
| 216 | + MIN_FRAME_LEN = 2 |
| 217 | + |
| 218 | + term_columns = shutil.get_terminal_size((80, 20)).columns |
| 219 | + |
| 220 | + if len(sys.argv) < 2: |
| 221 | + print("Usage:") |
| 222 | + print("{} <path-to-serial-log-file>".format(sys.argv[0])) |
| 223 | + sys.exit() |
| 224 | + |
| 225 | + try: |
| 226 | + f = open(sys.argv[1], "r") |
| 227 | + except OSError: |
| 228 | + perror("Could not open file:", sys.argv[1]) |
| 229 | + sys.exit() |
| 230 | + |
| 231 | + t0 = 0 |
| 232 | + n=0 |
| 233 | + try: |
| 234 | + lines = f.readlines() |
| 235 | + except OSError: |
| 236 | + print("Could not read file:", sys.argv[1]) |
| 237 | + sys.exit() |
| 238 | + |
| 239 | + for line in lines: |
| 240 | + print('-' * term_columns) |
| 241 | + |
| 242 | + t = line.split(' ') |
| 243 | + |
| 244 | + if "Start of new log" in line: |
| 245 | + continue |
| 246 | + |
| 247 | + if len(t) < MIN_FRAME_LEN: |
| 248 | + perror(line) |
| 249 | + continue |
| 250 | + |
| 251 | + print(line.strip()) |
| 252 | + |
| 253 | + n=n+1 |
| 254 | + try: |
| 255 | + # hdr = "%4.4i %s %s " % (n,t[0],t[1]) |
| 256 | + hdr = "%4.4i %s " % (n, t[0]) |
| 257 | + except ValueError: |
| 258 | + sys.exit() |
| 259 | + |
| 260 | + if t[1] == "W": |
| 261 | + hdr+= " TX--> " |
| 262 | + if t[1] == "R": |
| 263 | + hdr+= " RX<-- " |
| 264 | + |
| 265 | + p=2 |
| 266 | + while p< len(t)-1: |
| 267 | + try: |
| 268 | + cmd = int(t[p],16) |
| 269 | + except ValueError: |
| 270 | + cmd = 0xff |
| 271 | + |
| 272 | + if cmd == ACK: |
| 273 | + print (hdr + "ACK") |
| 274 | + p = p +1 |
| 275 | + elif cmd == CAN: |
| 276 | + print (hdr + "CAN") |
| 277 | + p = p +1 |
| 278 | + elif cmd == NAK: |
| 279 | + print (hdr + "NAK") |
| 280 | + p = p +1 |
| 281 | + elif cmd == SOF: |
| 282 | + try: |
| 283 | + framelen= int(t[p+1],16) |
| 284 | + except ValueError: |
| 285 | + break |
| 286 | + print (hdr + frame_tostring(t[p+2:p+2+framelen])) |
| 287 | + p = p + framelen + 2 |
| 288 | + else: |
| 289 | + print ("BAD Token %x" % cmd) |
| 290 | + p = p +1 |
| 291 | + f.close() |
0 commit comments