diff options
Diffstat (limited to 'sercp.c')
| -rw-r--r-- | sercp.c | 49 |
1 files changed, 38 insertions, 11 deletions
@@ -80,6 +80,10 @@ unsigned char buff[32768]; unsigned char *p_buff; unsigned int is_binary = 0; +static int is_osc_progress_supported = -1; // test KDE Konsole +static volatile int interrupted = 0; // ctrl+c signalization + +size_t out_indx; float width; // width of terminal long pos = 0; int scp = 0; @@ -244,15 +248,15 @@ void ParseCfg() { snprintf(cfg_path, sizeof(cfg_path), "%s/%s", home, CFG_NAME); #endif if (!(fp = fopen(cfg_path, "rb"))) return; - + fgets(opt, sizeof(opt), fp); while (!feof(fp)) { if ((val=strchr(opt, '\r'))) *val = '\0'; if ((val=strchr(opt, '\n'))) *val = '\0'; - + val = strchr(opt, ' '); if (val) *val++ = '\0'; - + for (optidx = 0; long_options[optidx].name; optidx++) { if (!strcmp(opt, long_options[optidx].name)) { switch (long_options[optidx].val) { @@ -314,6 +318,9 @@ void FlushSerialPort() { } while (len > 1); #endif } + if (is_osc_progress_supported) { + fprintf(stderr, "\x1b]9;4;0;0\x07"); + } } //***************************************************************************** @@ -330,6 +337,13 @@ void CloseSerialPort() { } } +static void SignalHandler(int sig) { + interrupted = 1; + FlushSerialPort(); + CloseSerialPort(); + printf("\n"); + exit(EXIT_FAILURE); +} //***************************************************************************** // @@ -365,7 +379,7 @@ int GetTerminalWidth(void) { #define PROGRESS_ERROR_CSUM 2 /************************************************************************/ -void DoProgress(size_t pos, size_t max, unsigned char csum_ok) { +void DoProgress(size_t pos, size_t max, unsigned char progress_mode) { width = GetTerminalWidth(); float percent, p, m; int imax = width - 40; @@ -383,12 +397,21 @@ void DoProgress(size_t pos, size_t max, unsigned char csum_ok) { if (px < ipercent) printf ("%c", progress_char); else printf (" "); } - if (csum_ok == 0) { + if (progress_mode == PROGRESS_PERCENT) { printf ("] %3d %%\r", (int)percent); - } else if (csum_ok == 1) { + if (is_osc_progress_supported) { + fprintf(stderr, "\x1b]9;4;1;%d\x07", (int)percent); + } + } else if (progress_mode == PROGRESS_COMPLETTE) { printf ("] OK \r"); + if (is_osc_progress_supported) { + fprintf(stderr, "\x1b]9;4;0;0\x07"); + } } else { printf ("] ERR \r"); + if (is_osc_progress_supported) { + fprintf(stderr, "\x1b]9;4;0;0\x07"); + } } fflush (stdout); } @@ -718,6 +741,7 @@ void sercpRecv(void) { } if (expected_len == 0 || block_index == 255) { printf ("\nTransfer successful\n"); + DoProgress(0, 0, PROGRESS_COMPLETTE); is_continue = 0; recv_phase++; break; @@ -880,6 +904,7 @@ void sercpSend(void) { blck_num++; } printf("\nFile sent...\n"); + DoProgress(0, 0, PROGRESS_COMPLETTE); #ifdef __APPLE__ // FIXME on __APPLE__ this waiting helps sleep_ms(wait_ms); @@ -960,9 +985,7 @@ int OpenUart() { #endif tcgetattr(serial_fd, &oldtio); /* save current port settings */ - // bzero(&newtio, sizeof (newtio)); - memset(&newtio, 0x00, sizeof(newtio)); - cfmakeraw(&newtio); + memset(&newtio, 0, sizeof (newtio)); switch (baud_rate){ case 921600: newtio.c_cflag = B921600; @@ -1035,8 +1058,12 @@ int OpenUart() { /************************************************************************/ /************************************************************************/ -int main(int argc, char** argv, char** env) -{ +int main(int argc, char** argv, char** env) { + signal(SIGINT, SignalHandler); // ctrl+c + is_osc_progress_supported = (getenv("KONSOLE_VERSION") != NULL) + || (getenv("WT_SESSION") != NULL) + || (getenv("ITERM_SESSION_ID") != NULL) + || (getenv("VTE_VERSION") != NULL); width = GetTerminalWidth(); ParseCfg(); if (argc < 2) { |
