aboutsummaryrefslogtreecommitdiff
path: root/sercp.c
diff options
context:
space:
mode:
authorPavel Vymetálek <pavel@vym.cz>2026-06-04 11:00:14 +0200
committerPavel Vymetálek <pavel@vym.cz>2026-06-04 11:00:14 +0200
commitebd248bfe4be0b6892e91d451af01894f126cdd2 (patch)
tree588a8459d4d108254ac406f94c52e1e6348d6ff2 /sercp.c
parentad54bc3e014ed6e92fd6f74ad3944e6feb9fc2b7 (diff)
downloadsercp-pc-ebd248bfe4be0b6892e91d451af01894f126cdd2.tar.gz
Add OSC progress reporting
- ConEmu-style progress reporting - is_osc_progress_supported - replace obsolete bzero with memset
Diffstat (limited to 'sercp.c')
-rw-r--r--sercp.c49
1 files changed, 38 insertions, 11 deletions
diff --git a/sercp.c b/sercp.c
index d119af4..2683769 100644
--- a/sercp.c
+++ b/sercp.c
@@ -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) {