#include #include #include #include #include #include #include using namespace mesh::ota; struct HostStream : Stream { bool request=false, noise=false, bad_checksum=false, error=false; bool stalled=false, short_write=false; uint32_t byte_delay=0; int stale_reads=0, stale_at_request=0; size_t response_pos=0; std::vector response; int available() override { return request ? int(response.size()-response_pos) : (noise ? 3 : 0); } int read() override { if (!request) { if (noise && stale_reads<100) { ++stale_reads; return 0x5a; } return -1; } if (stalled || response_pos==response.size()) return -1; g_mock_millis+=byte_delay; return response[response_pos++]; } int peek() override { return -1; } void flush() override { assert(false); } size_t write(uint8_t) override { assert(false); return 0; } size_t write(const uint8_t* data, size_t size) override { if(short_write) return size-1; assert(size>=4 && data[0]==MOTA_SEEDER_REQ_MAGIC0 && data[1]==MOTA_SEEDER_REQ_MAGIC1); uint8_t op=data[2], xor_sum=0; for(size_t i=2;i