// Start a response, returns the partial CRC uint16_t ICACHE_FLASH_ATTR CMD_ResponseStart(uint16_t cmd, uint32_t callback, uint32_t _return, uint16_t argc) { uint16_t crc = 0; uart0_write_char(SLIP_START); CMD_ProtoWriteBuf((uint8_t*)&cmd, 2); crc = crc16_data((uint8_t*)&cmd, 2, crc); CMD_ProtoWriteBuf((uint8_t*)&callback, 4); crc = crc16_data((uint8_t*)&callback, 4, crc); CMD_ProtoWriteBuf((uint8_t*)&_return, 4); crc = crc16_data((uint8_t*)&_return, 4, crc); CMD_ProtoWriteBuf((uint8_t*)&argc, 2); crc = crc16_data((uint8_t*)&argc, 2, crc); return crc; }
ICACHE_FLASH_ATTR uint16_t CMD_ResponseEnd(uint16_t crc) { CMD_ProtoWriteBuf((uint8_t*)&crc, 2); uart0_write(SLIP_END); return 0; }
// Adds data to a response, returns the partial CRC uint16_t ICACHE_FLASH_ATTR CMD_ResponseBody(uint16_t crc_in, uint8_t* data, short len) { short pad_len = len+3 - (len+3)%4; // round up to multiple of 4 CMD_ProtoWriteBuf((uint8_t*)&pad_len, 2); crc_in = crc16_data((uint8_t*)&pad_len, 2, crc_in); CMD_ProtoWriteBuf(data, len); crc_in = crc16_data(data, len, crc_in); if (pad_len > len) { uint32_t temp = 0; CMD_ProtoWriteBuf((uint8_t*)&temp, pad_len-len); crc_in = crc16_data((uint8_t*)&temp, pad_len-len, crc_in); } return crc_in; }
ICACHE_FLASH_ATTR uint16 CMD_ResponseBody(uint16_t crc_in, uint8_t* data, uint16_t len) { uint8_t temp = 0; uint16_t pad_len = len; while(pad_len % 4 != 0) pad_len++; CMD_ProtoWriteBuf((uint8_t*)&pad_len, 2); crc_in = crc16_data((uint8_t*)&pad_len, 2, crc_in); while(len --){ CMD_ProtoWrite(*data); crc_in = crc16_data((uint8_t*)data, 1, crc_in); data ++; if(pad_len > 0) pad_len --; } while(pad_len --){ CMD_ProtoWrite(temp); crc_in = crc16_data((uint8_t*)&temp, 1, crc_in); } return crc_in; }
// Ends a response void ICACHE_FLASH_ATTR CMD_ResponseEnd(uint16_t crc) { CMD_ProtoWriteBuf((uint8_t*)&crc, 2); uart0_write_char(SLIP_END); }