| 
 | 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