void Logger::vlogWrite(const char*fmt , va_list va) { _writer(fmt, va); }
int xmodem_get(unsigned char *dest, int destsz) { unsigned char xbuff[1030]; /* 1024 for XModem 1k + 3 head chars + 2 crc + nul */ unsigned char *p; int bufsz, crc = 0; unsigned char trychar = 'C'; unsigned char packetno = 1; int i, c, len = 0; int retry, retrans = MAXRETRANS; for (;;) { for ( retry = 0; retry < 160; ++retry) { if (trychar) { putchar(trychar); // sleep(0x008f0000); } if ((c = try_getc((DLY_1S)<<1)) >= 0) { switch (c) { case SOH: bufsz = 128; goto start_recv; case STX: bufsz = 1024; goto start_recv; case EOT: flushinput(); putchar(ACK); return len; /* normal end */ case CAN: if ((c = try_getc(DLY_1S)) == CAN) { flushinput(); putchar(ACK); return -1; /* canceled by remote */ } break; default: break; } } } if (trychar == 'C') { trychar = NAK; continue; } flushinput(); putchar(CAN); putchar(CAN); putchar(CAN); return -2; /* sync error */ start_recv: if (trychar == 'C') crc = 1; trychar = 0; p = xbuff; *p++ = c; for (i = 0; i < (bufsz+(crc?1:0)+3); ++i) { if ((c = try_getc(DLY_1S)) < 0) goto reject; *p++ = c; } if (xbuff[1] == (unsigned char)(~xbuff[2]) && (xbuff[1] == packetno || xbuff[1] == (unsigned char)packetno-1) && check(crc, &xbuff[3], bufsz)) { if (xbuff[1] == packetno) { unsigned int count = destsz - len; if (count > bufsz) count = bufsz; if (count > 0) { //memcpy (&dest[len], &xbuff[3], count); _writer(&xbuff[3], count); len += count; } ++packetno; retrans = MAXRETRANS+1; } if (--retrans <= 0) { flushinput(); putchar(CAN); putchar(CAN); putchar(CAN); return -3; /* too many retry error */ } putchar(ACK); continue; } reject: flushinput(); putchar(NAK); } }