static void ICACHE_FLASH_ATTR protoCompletedCb() { uint16_t crc = 0, argc, len, resp_crc, argn = 0; uint8_t *data_ptr; PACKET_CMD *packet; packet = (PACKET_CMD*)protoRxBuf; data_ptr = (uint8_t*)&packet->args ; crc = crc16_data((uint8_t*)&packet->cmd, 12, crc); argc = packet->argc; INFO("CMD: %d, cb: %d, ret: %d, argc: %d\r\n", packet->cmd, packet->callback, packet->_return, packet->argc); while(argc--){ len = *((uint16_t*)data_ptr); INFO("Arg[%d], len: %d:", argn++, len); crc = crc16_data(data_ptr, 2, crc); data_ptr += 2; crc = crc16_data(data_ptr, len, crc); while(len --){ INFO("%02X-", *data_ptr); data_ptr ++; } INFO("\r\n\r\n"); } resp_crc = *(uint16_t*)data_ptr; INFO("Read CRC: %04X, calculated crc: %04X\r\n", resp_crc, crc); if(crc != resp_crc) { INFO("ESP: Invalid CRC\r\n"); INFO(""); return; } CMD_Exec(commands, packet); }
// Parse a packet and print info about it void ICACHE_FLASH_ATTR CMD_parse_packet(uint8_t *buf, short len) { // minimum command length if (len < 12) return; // init pointers into buffer CmdPacket *packet = (CmdPacket*)buf; uint8_t *data_ptr = (uint8_t*)&packet->args; uint8_t *data_limit = data_ptr+len; #ifdef CMD_DBG uint16_t argn = 0; os_printf("CMD: cmd=%d(%s) argc=%d cb=%p ret=%lu\n", packet->cmd, cmd_names[packet->cmd], packet->argc, (void *)packet->callback, packet->_return); #endif #if 0 // print out arguments uint16_t argc = packet->argc; while (data_ptr+2 < data_limit && argc--) { short l = *(uint16_t*)data_ptr; os_printf("CMD: arg[%d] len=%d:", argn++, l); data_ptr += 2; while (data_ptr < data_limit && l--) { os_printf(" %02X", *data_ptr++); } os_printf("\n"); } #endif if (data_ptr <= data_limit) { CMD_Exec(commands, packet); } else { #ifdef CMD_DBG os_printf("CMD: packet length overrun, parsing arg %d\n", argn-1); #endif } }