5 #include <posix/unistd.h>
7 #define printf rtl_printf
9 #include "../include/can.h"
12 unsigned long canmsg_id = 5;
19 char *can_dev_name = "/dev/can0";
21 #define PRT_PREFIX_SIZE 40
22 char prt_prefix[PRT_PREFIX_SIZE];
24 char *prt_prefix_in = "CAN %s : ";
26 MODULE_PARM_DESC(can_dev_name,"name of CAN device [/dev/can0]");
27 MODULE_PARM(can_dev_name,"1s");
28 MODULE_PARM_DESC(canmsg_id,"ID of generated messages");
29 MODULE_PARM(canmsg_id,"1i");
30 MODULE_PARM_DESC(canmsg_flags,"CAN filter flags");
31 MODULE_PARM(canmsg_flags,"1i");
32 MODULE_PARM_DESC(o_sync_fl,"open in synchronous mode");
33 MODULE_PARM(o_sync_fl,"1i");
34 MODULE_PARM_DESC(can_wait_sec,"number of seconds to wait between messages");
35 MODULE_PARM(can_wait_sec,"1i");
36 MODULE_PARM_DESC(block,"number of messages in block");
37 MODULE_PARM(block,"1i");
38 MODULE_PARM_DESC(count,"number of sent blocks of messages");
39 MODULE_PARM(count,"1i");
40 MODULE_PARM_DESC(prt_prefix_in,"string prefix for output");
41 MODULE_PARM(prt_prefix_in,"1i");
44 MODULE_SUPPORTED_DEVICE("sendburst_rtl");
45 MODULE_AUTHOR("Pavel Pisa <pisa@cmp.felk.cvut.cz>");
46 MODULE_DESCRIPTION("sendburst_rtl: generatot of CAN messages for RT-Linux interface to LinCAN driver");
47 MODULE_LICENSE("GPL");
49 void sendburst_cleanup(void *arg)
51 printf("%scleanup handler called\n", prt_prefix);
55 int sendburst_main(void *arg)
57 #ifdef CAN_MSG_VERSION_2
58 struct canmsg_t sendmsg={0,0,5,{0,0},8,{1,2,3,4,5,6,7,8}};
59 #else /* CAN_MSG_VERSION_2 */
60 struct canmsg_t sendmsg={0,0,5,0,8,{1,2,3,4,5,6,7,8}};
61 #endif /* CAN_MSG_VERSION_2 */
65 if ((fd=open(can_dev_name, O_RDWR | (o_sync_fl? O_SYNC:0))) < 0) {
66 printf("Error opening %s\n", can_dev_name);
69 pthread_cleanup_push(sendburst_cleanup,(void*)fd);
71 snprintf(prt_prefix, PRT_PREFIX_SIZE, prt_prefix_in, can_dev_name);
75 for(i=0;i<block;i++) {
76 sendmsg.flags=canmsg_flags;
80 if ((ret=write(fd,&sendmsg,sizeof(struct canmsg_t))) < 0) {
81 printf("%sError sending message\n", prt_prefix);
85 printf("%sSent block of %d messages #: %u\n", prt_prefix, block, j);
88 usleep(1000000*can_wait_sec);
93 /* close(fd); is called by cleanup handler*/
94 pthread_cleanup_pop(1);
99 /*===========================================================*/
102 void * t1_routine(void *arg)
104 sendburst_main(NULL);
115 int init_module(void) {
117 return pthread_create (&t1, NULL, t1_routine, 0);
121 void cleanup_module(void) {
122 /*pthread_delete_np (t1);*/
125 pthread_join(t1, NULL);