All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] [PATCH] refactor and enhance rtcanrecv/send
@ 2006-08-30 20:52 Jan Kiszka
  2006-09-03 12:38 ` [Xenomai-core] " Wolfgang Grandegger
  0 siblings, 1 reply; 2+ messages in thread
From: Jan Kiszka @ 2006-08-30 20:52 UTC (permalink / raw)
  To: xenomai-core, Wolfgang Grandegger


[-- Attachment #1.1: Type: text/plain, Size: 446 bytes --]

For review:

This patch folds the rt-threads of rtcanrecv/send into the main thread,
assigns unique thread names, and lowers the priorities to some less
critical level. Furthermore, rtcanrecv is enhanced by a printout of the
CAN device and support for listening on all interfaces. On reception of
RTR frames, no more data is printing now. I also kicked out the
rt_timer_set_mode call, please speak up if it was there for a reason.

Jan

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1.2: rtcan-utils.patch --]
[-- Type: text/x-patch; name="rtcan-utils.patch", Size: 6470 bytes --]

Index: src/utils/can/rtcansend.c
===================================================================
--- src/utils/can/rtcansend.c	(Revision 1525)
+++ src/utils/can/rtcansend.c	(Arbeitskopie)
@@ -69,7 +69,7 @@ void cleanup_and_exit(int sig)
     exit(0);
 }
 
-void rt_task(void *arg)
+void rt_task(void)
 {
     int i, j, ret;
 
@@ -107,7 +107,6 @@ void rt_task(void *arg)
 	    printf("\n");
 	}
     }
-    loops = 0;
 }
 
 int main(int argc, char **argv)
@@ -115,6 +114,7 @@ int main(int argc, char **argv)
     struct sockaddr_can addr;
     int i, opt, ret;
     struct ifreq ifr;
+    char name[32];
 
     struct option long_options[] = {
 	{ "help", no_argument, 0, 'h' },
@@ -252,16 +252,14 @@ int main(int argc, char **argv)
 	}
     }
 
-     rt_timer_set_mode(TM_ONESHOT);
-
-    ret = rt_task_spawn(&rt_task_desc, "", 0, 99, 0, &rt_task, 0);
+    snprintf(name, sizeof(name), "rtcansend-%d", getpid());
+    ret = rt_task_shadow(&rt_task_desc, name, 1, 0);
     if (ret) {
-        fprintf(stderr, "rt_task_spawn: %s\n", strerror(-ret));
+	fprintf(stderr, "rt_task_shadow: %s\n", strerror(-ret));
 	goto failure;
     }
 
-    while (loops)
-	usleep(100000);
+    rt_task();
 
     cleanup();
     return 0;
Index: src/utils/can/rtcanrecv.c
===================================================================
--- src/utils/can/rtcanrecv.c	(Revision 1525)
+++ src/utils/can/rtcanrecv.c	(Arbeitskopie)
@@ -15,14 +15,13 @@
 static void print_usage(char *prg)
 {
     fprintf(stderr,
-	    "Usage: %s <can-interface> [Options]\n"
+	    "Usage: %s [<can-interface>] [Options]\n"
 	    "Options:\n"
 	    " -f  --filter=id:mask[:id:mask]... apply filter\n"
 	    " -e  --error=mask      receive error messages\n"
 	    " -t, --timeout=MS      timeout in ms\n"
 	    " -v, --verbose         be verbose\n"
 	    " -p, --print=MODULO    print every MODULO message\n"
-	    " -n, --name=STRING     name of the RT task\n"
 	    " -h, --help            this help\n",
 	    prg);
 }
@@ -30,7 +29,7 @@ static void print_usage(char *prg)
 
 extern int optind, opterr, optopt;
 
-static int s = -1, running = 1, verbose = 0, print = 1;
+static int s = -1, verbose = 0, print = 1;
 static nanosecs_rel_t timeout = 0;
 
 RT_TASK rt_task_desc;
@@ -75,18 +74,20 @@ void cleanup_and_exit(int sig)
 {
     if (verbose)
 	printf("Signal %d received\n", sig);
-    running = 0;
     cleanup();
     exit(0);
 }
 
-void rt_task(void *arg)
+void rt_task(void)
 {
     int i, ret, count = 0;
     struct can_frame frame;
+    struct sockaddr_can addr;
+    socklen_t addrlen = sizeof(addr);
 
-    while (running) {
-	ret = rt_dev_recv(s, (void *)&frame, sizeof(can_frame_t), 0);
+    while (1) {
+	ret = rt_dev_recvfrom(s, (void *)&frame, sizeof(can_frame_t), 0,
+	                      (struct sockaddr *)&addr, &addrlen);
 	if (ret < 0) {
 	    switch (ret) {
 	    case -ETIMEDOUT:
@@ -100,12 +101,11 @@ void rt_task(void *arg)
 	    default:
 		fprintf(stderr, "rt_dev_recv: %s\n", strerror(-ret));
 	    }
-	    running = 0;
 	    break;
 	}
 
 	if (print && (count % print) == 0) {
-	    printf("#%d: ", count);
+	    printf("#%d: (%d) ", count, addr.can_ifindex);
 	    if (frame.can_id & CAN_ERR_FLAG)
 		printf("!0x%08x!", frame.can_id & CAN_ERR_MASK);
 	    else if (frame.can_id & CAN_EFF_FLAG)
@@ -114,9 +114,10 @@ void rt_task(void *arg)
 		printf("<0x%03x>", frame.can_id & CAN_SFF_MASK);
 
 	    printf(" [%d]", frame.can_dlc);
-	    for (i = 0; i < frame.can_dlc; i++) {
-		printf(" %02x", frame.data[i]);
-	    }
+	    if (!(frame.can_id & CAN_RTR_FLAG))
+		for (i = 0; i < frame.can_dlc; i++) {
+		    printf(" %02x", frame.data[i]);
+		}
 	    if (frame.can_id & CAN_ERR_FLAG) {
 		printf(" ERROR ");
 		if (frame.can_id & CAN_ERR_BUSOFF)
@@ -138,6 +139,7 @@ int main(int argc, char **argv)
     u_int32_t err_mask = 0;
     struct ifreq ifr;
     char *ptr;
+    char name[32];
 
     struct option long_options[] = {
 	{ "help", no_argument, 0, 'h' },
@@ -153,7 +155,7 @@ int main(int argc, char **argv)
     signal(SIGTERM, cleanup_and_exit);
     signal(SIGINT, cleanup_and_exit);
 
-    while ((opt = getopt_long(argc, argv, "hve:f:t:p:n:",
+    while ((opt = getopt_long(argc, argv, "hve:f:t:p:",
 			      long_options, NULL)) != -1) {
 	switch (opt) {
 	case 'h':
@@ -200,19 +202,6 @@ int main(int argc, char **argv)
 	}
     }
 
-    if (optind == argc) {
-	print_usage(argv[0]);
-	exit(0);
-    }
-
-    if (argv[optind] == NULL) {
-	fprintf(stderr, "No Interface supplied\n");
-	exit(-1);
-    }
-
-    if (verbose)
-	printf("interface %s\n", argv[optind]);
-
     ret = rt_dev_socket(PF_CAN, SOCK_RAW, 0);
     if (ret < 0) {
 	fprintf(stderr, "rt_dev_socket: %s\n", strerror(-ret));
@@ -220,17 +209,26 @@ int main(int argc, char **argv)
     }
     s = ret;
 
-    strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
-    if (verbose)
-	printf("s=%d, ifr_name=%s\n", s, ifr.ifr_name);
+    if (argv[optind] == NULL) {
+	if (verbose)
+	    printf("interface all\n");
 
-    ret = rt_dev_ioctl(s, SIOCGIFINDEX, &ifr);
-    if (ret < 0) {
-	fprintf(stderr, "rt_dev_ioctl GET_IFINDEX: %s\n", strerror(-ret));
-	goto failure;
+	ifr.ifr_ifindex = 0;
+    } else {
+	if (verbose)
+	    printf("interface %s\n", argv[optind]);
+	
+	strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
+	if (verbose)
+	    printf("s=%d, ifr_name=%s\n", s, ifr.ifr_name);
+	
+	ret = rt_dev_ioctl(s, SIOCGIFINDEX, &ifr);
+	if (ret < 0) {
+	    fprintf(stderr, "rt_dev_ioctl GET_IFINDEX: %s\n", strerror(-ret));
+	    goto failure;
+	}
     }
 
-
     if (err_mask) {
 	ret = rt_dev_setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,
 				&err_mask, sizeof(err_mask));
@@ -271,19 +269,15 @@ int main(int argc, char **argv)
 	}
     }
 
-    rt_timer_set_mode(TM_ONESHOT);
-
-    ret = rt_task_spawn(&rt_task_desc, "", 0, 99, 0, &rt_task, 0);
+    snprintf(name, sizeof(name), "rtcanrecv-%d", getpid());
+    ret = rt_task_shadow(&rt_task_desc, name, 1, 0);
     if (ret) {
-        fprintf(stderr, "rt_task_spawn: %s\n", strerror(-ret));
+	fprintf(stderr, "rt_task_shadow: %s\n", strerror(-ret));
 	goto failure;
     }
 
-    while (running)
-	usleep(100000);
-
-    cleanup();
-    return 0;
+    rt_task();
+    /* never returns */
 
  failure:
     cleanup();

[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 249 bytes --]

^ permalink raw reply	[flat|nested] 2+ messages in thread

* [Xenomai-core] Re: [PATCH] refactor and enhance rtcanrecv/send
  2006-08-30 20:52 [Xenomai-core] [PATCH] refactor and enhance rtcanrecv/send Jan Kiszka
@ 2006-09-03 12:38 ` Wolfgang Grandegger
  0 siblings, 0 replies; 2+ messages in thread
From: Wolfgang Grandegger @ 2006-09-03 12:38 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai-core

Hi Jan,

Jan Kiszka wrote:
> For review:
> 
> This patch folds the rt-threads of rtcanrecv/send into the main thread,
> assigns unique thread names, and lowers the priorities to some less
> critical level. Furthermore, rtcanrecv is enhanced by a printout of the
> CAN device and support for listening on all interfaces. On reception of
> RTR frames, no more data is printing now. I also kicked out the
> rt_timer_set_mode call, please speak up if it was there for a reason.

Looks good and still works. I was also thinking to use recvmsg in 
rtcanrecv to show timestamps on request. Will provide a patch sooner 
than later.

Wolfgang.

> Jan
> 
> 
> ------------------------------------------------------------------------
> 
> Index: src/utils/can/rtcansend.c
> ===================================================================
> --- src/utils/can/rtcansend.c	(Revision 1525)
> +++ src/utils/can/rtcansend.c	(Arbeitskopie)
> @@ -69,7 +69,7 @@ void cleanup_and_exit(int sig)
>      exit(0);
>  }
>  
> -void rt_task(void *arg)
> +void rt_task(void)
>  {
>      int i, j, ret;
>  
> @@ -107,7 +107,6 @@ void rt_task(void *arg)
>  	    printf("\n");
>  	}
>      }
> -    loops = 0;
>  }
>  
>  int main(int argc, char **argv)
> @@ -115,6 +114,7 @@ int main(int argc, char **argv)
>      struct sockaddr_can addr;
>      int i, opt, ret;
>      struct ifreq ifr;
> +    char name[32];
>  
>      struct option long_options[] = {
>  	{ "help", no_argument, 0, 'h' },
> @@ -252,16 +252,14 @@ int main(int argc, char **argv)
>  	}
>      }
>  
> -     rt_timer_set_mode(TM_ONESHOT);
> -
> -    ret = rt_task_spawn(&rt_task_desc, "", 0, 99, 0, &rt_task, 0);
> +    snprintf(name, sizeof(name), "rtcansend-%d", getpid());
> +    ret = rt_task_shadow(&rt_task_desc, name, 1, 0);
>      if (ret) {
> -        fprintf(stderr, "rt_task_spawn: %s\n", strerror(-ret));
> +	fprintf(stderr, "rt_task_shadow: %s\n", strerror(-ret));
>  	goto failure;
>      }
>  
> -    while (loops)
> -	usleep(100000);
> +    rt_task();
>  
>      cleanup();
>      return 0;
> Index: src/utils/can/rtcanrecv.c
> ===================================================================
> --- src/utils/can/rtcanrecv.c	(Revision 1525)
> +++ src/utils/can/rtcanrecv.c	(Arbeitskopie)
> @@ -15,14 +15,13 @@
>  static void print_usage(char *prg)
>  {
>      fprintf(stderr,
> -	    "Usage: %s <can-interface> [Options]\n"
> +	    "Usage: %s [<can-interface>] [Options]\n"
>  	    "Options:\n"
>  	    " -f  --filter=id:mask[:id:mask]... apply filter\n"
>  	    " -e  --error=mask      receive error messages\n"
>  	    " -t, --timeout=MS      timeout in ms\n"
>  	    " -v, --verbose         be verbose\n"
>  	    " -p, --print=MODULO    print every MODULO message\n"
> -	    " -n, --name=STRING     name of the RT task\n"
>  	    " -h, --help            this help\n",
>  	    prg);
>  }
> @@ -30,7 +29,7 @@ static void print_usage(char *prg)
>  
>  extern int optind, opterr, optopt;
>  
> -static int s = -1, running = 1, verbose = 0, print = 1;
> +static int s = -1, verbose = 0, print = 1;
>  static nanosecs_rel_t timeout = 0;
>  
>  RT_TASK rt_task_desc;
> @@ -75,18 +74,20 @@ void cleanup_and_exit(int sig)
>  {
>      if (verbose)
>  	printf("Signal %d received\n", sig);
> -    running = 0;
>      cleanup();
>      exit(0);
>  }
>  
> -void rt_task(void *arg)
> +void rt_task(void)
>  {
>      int i, ret, count = 0;
>      struct can_frame frame;
> +    struct sockaddr_can addr;
> +    socklen_t addrlen = sizeof(addr);
>  
> -    while (running) {
> -	ret = rt_dev_recv(s, (void *)&frame, sizeof(can_frame_t), 0);
> +    while (1) {
> +	ret = rt_dev_recvfrom(s, (void *)&frame, sizeof(can_frame_t), 0,
> +	                      (struct sockaddr *)&addr, &addrlen);
>  	if (ret < 0) {
>  	    switch (ret) {
>  	    case -ETIMEDOUT:
> @@ -100,12 +101,11 @@ void rt_task(void *arg)
>  	    default:
>  		fprintf(stderr, "rt_dev_recv: %s\n", strerror(-ret));
>  	    }
> -	    running = 0;
>  	    break;
>  	}
>  
>  	if (print && (count % print) == 0) {
> -	    printf("#%d: ", count);
> +	    printf("#%d: (%d) ", count, addr.can_ifindex);
>  	    if (frame.can_id & CAN_ERR_FLAG)
>  		printf("!0x%08x!", frame.can_id & CAN_ERR_MASK);
>  	    else if (frame.can_id & CAN_EFF_FLAG)
> @@ -114,9 +114,10 @@ void rt_task(void *arg)
>  		printf("<0x%03x>", frame.can_id & CAN_SFF_MASK);
>  
>  	    printf(" [%d]", frame.can_dlc);
> -	    for (i = 0; i < frame.can_dlc; i++) {
> -		printf(" %02x", frame.data[i]);
> -	    }
> +	    if (!(frame.can_id & CAN_RTR_FLAG))
> +		for (i = 0; i < frame.can_dlc; i++) {
> +		    printf(" %02x", frame.data[i]);
> +		}
>  	    if (frame.can_id & CAN_ERR_FLAG) {
>  		printf(" ERROR ");
>  		if (frame.can_id & CAN_ERR_BUSOFF)
> @@ -138,6 +139,7 @@ int main(int argc, char **argv)
>      u_int32_t err_mask = 0;
>      struct ifreq ifr;
>      char *ptr;
> +    char name[32];
>  
>      struct option long_options[] = {
>  	{ "help", no_argument, 0, 'h' },
> @@ -153,7 +155,7 @@ int main(int argc, char **argv)
>      signal(SIGTERM, cleanup_and_exit);
>      signal(SIGINT, cleanup_and_exit);
>  
> -    while ((opt = getopt_long(argc, argv, "hve:f:t:p:n:",
> +    while ((opt = getopt_long(argc, argv, "hve:f:t:p:",
>  			      long_options, NULL)) != -1) {
>  	switch (opt) {
>  	case 'h':
> @@ -200,19 +202,6 @@ int main(int argc, char **argv)
>  	}
>      }
>  
> -    if (optind == argc) {
> -	print_usage(argv[0]);
> -	exit(0);
> -    }
> -
> -    if (argv[optind] == NULL) {
> -	fprintf(stderr, "No Interface supplied\n");
> -	exit(-1);
> -    }
> -
> -    if (verbose)
> -	printf("interface %s\n", argv[optind]);
> -
>      ret = rt_dev_socket(PF_CAN, SOCK_RAW, 0);
>      if (ret < 0) {
>  	fprintf(stderr, "rt_dev_socket: %s\n", strerror(-ret));
> @@ -220,17 +209,26 @@ int main(int argc, char **argv)
>      }
>      s = ret;
>  
> -    strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
> -    if (verbose)
> -	printf("s=%d, ifr_name=%s\n", s, ifr.ifr_name);
> +    if (argv[optind] == NULL) {
> +	if (verbose)
> +	    printf("interface all\n");
>  
> -    ret = rt_dev_ioctl(s, SIOCGIFINDEX, &ifr);
> -    if (ret < 0) {
> -	fprintf(stderr, "rt_dev_ioctl GET_IFINDEX: %s\n", strerror(-ret));
> -	goto failure;
> +	ifr.ifr_ifindex = 0;
> +    } else {
> +	if (verbose)
> +	    printf("interface %s\n", argv[optind]);
> +	
> +	strncpy(ifr.ifr_name, argv[optind], IFNAMSIZ);
> +	if (verbose)
> +	    printf("s=%d, ifr_name=%s\n", s, ifr.ifr_name);
> +	
> +	ret = rt_dev_ioctl(s, SIOCGIFINDEX, &ifr);
> +	if (ret < 0) {
> +	    fprintf(stderr, "rt_dev_ioctl GET_IFINDEX: %s\n", strerror(-ret));
> +	    goto failure;
> +	}
>      }
>  
> -
>      if (err_mask) {
>  	ret = rt_dev_setsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER,
>  				&err_mask, sizeof(err_mask));
> @@ -271,19 +269,15 @@ int main(int argc, char **argv)
>  	}
>      }
>  
> -    rt_timer_set_mode(TM_ONESHOT);
> -
> -    ret = rt_task_spawn(&rt_task_desc, "", 0, 99, 0, &rt_task, 0);
> +    snprintf(name, sizeof(name), "rtcanrecv-%d", getpid());
> +    ret = rt_task_shadow(&rt_task_desc, name, 1, 0);
>      if (ret) {
> -        fprintf(stderr, "rt_task_spawn: %s\n", strerror(-ret));
> +	fprintf(stderr, "rt_task_shadow: %s\n", strerror(-ret));
>  	goto failure;
>      }
>  
> -    while (running)
> -	usleep(100000);
> -
> -    cleanup();
> -    return 0;
> +    rt_task();
> +    /* never returns */
>  
>   failure:
>      cleanup();



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-09-03 12:38 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-08-30 20:52 [Xenomai-core] [PATCH] refactor and enhance rtcanrecv/send Jan Kiszka
2006-09-03 12:38 ` [Xenomai-core] " Wolfgang Grandegger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.