]> rtime.felk.cvut.cz Git - linux-lin.git/commitdiff
lin_config: Run as daemon when configuring sllin tty line discipline
authorRostislav Lisovy <lisovy@gmail.com>
Thu, 19 Jul 2012 16:19:47 +0000 (18:19 +0200)
committerRostislav Lisovy <lisovy@gmail.com>
Thu, 19 Jul 2012 16:19:47 +0000 (18:19 +0200)
lin_config/src/Makefile
lin_config/src/lin_config.c
lin_config/src/lin_config.h
lin_config/src/linc_parse_xml.c
lin_config/src/pcl_config.c
lin_config/src/sllin_config.c

index 52b7c2d10dd3066fe563ad5c87755dd07662ff08..7e95d781f840d4cedcdf7dbfe90a41e09c69b982 100644 (file)
@@ -8,7 +8,7 @@ objects = linc_parse_xml.o pcl_config.o sllin_config.o lin_config.o
 lin_config: $(objects)
        $(CC) $(objects) $(LIBS) -o lin_config
 
-%.o : %.c
+%.o : %.c %.h
        $(CC) $(CFLAGS) $(LIBS) -c $< -o $@
 
 .PHONY: clean
index 891494c7325bc8018e6f672ebea4bf9adc335686..96b56d1d2d7f41e91ef91530d6c695502b530825 100644 (file)
@@ -30,6 +30,8 @@
 #include "sllin_config.h"
 #include "lin_config.h"
 
+struct linc_lin_state linc_lin_state;
+
 
 void linc_explain(int argc, char *argv[])
 {
@@ -117,12 +119,22 @@ int main(int argc, char *argv[])
        //ret = pcl_config(&linc_lin_state);
        ret = sllin_config(&linc_lin_state);
 
-//     printf("Press any key to detach %s ...\n", linc_lin_state.dev);
-//     getchar();
+       if (ret < 0)
+               return EXIT_FAILURE;
+       if (ret == LIN_EXIT_OK) {
 
+               return EXIT_SUCCESS;
+       }
 
-       if (ret < 0)
+       printf("Running in background ...\n");
+       ret = daemon(0, 0);
+       if (ret < 0) {
+               perror("daemon()");
                return EXIT_FAILURE;
+       }
+
+       /* Sleep to keep the line discipline active. */
+       pause();
 
        return EXIT_SUCCESS;
 }
index e46cf8af19bf1249cf66340082c3683943c1df16..6d4ea1b8a8b68ce7d55077344b5ce6aebd5c85a6 100644 (file)
@@ -1,6 +1,9 @@
 #ifndef _LIN_CONFIG_H_
 #define _LIN_CONFIG_H_
 
+#define LIN_EXIT_OK                            1
+
+/* Flags passed to configuration functions */
 #define FLASH_CONF_fl                          (1 << 0)
 #define RESET_DEVICE_fl                                (1 << 1)
 #define SLLIN_ATTACH_fl                                (1 << 2)
@@ -28,7 +31,7 @@ struct linc_lin_state {
        int bus_termination;    /* LIN bus termination in device -- Master or Slave */
 
        /* Subscriber/publisher table entries */
-       struct linc_frame_entry frame_entry[MAX_LIN_ID];
+       struct linc_frame_entry frame_entry[MAX_LIN_ID + 1];
        /* Scheduler table entries */
        // FIXME max value
        struct linc_scheduler_entry scheduler_entry[100];
@@ -38,7 +41,5 @@ struct linc_lin_state {
        int flags;              /* Flags passed to configuration function
                                of particular device */
 };
-struct linc_lin_state linc_lin_state;
-
 
 #endif /* _LIN_CONFIG_H_ */
index 00e4abe5f1154dba8dbfa013fdfe7812e918cc34..160ef845846e8a090c68fa9163c93435fcb24689 100644 (file)
@@ -47,7 +47,8 @@ void linc_parse_scheduler_entries(struct linc_lin_state *linc_lin_state, xmlDocP
                        linc_lin_state->scheduler_entry[linc_lin_state->scheduler_entries_cnt].interval_ms = interval;
                        linc_lin_state->scheduler_entries_cnt++;
 
-                       //printf("Time = %d Entry = %d\n", interval, linid);
+                       //printf("Time = %d Lin ID = %d Entry no. = %d\n",
+                       //      interval, linid, linc_lin_state->scheduler_entries_cnt-1);
                }
                cur = cur->next;
        }
@@ -104,7 +105,7 @@ void linc_parse_frame_configuration(struct linc_lin_state *linc_lin_state, xmlDo
                                tmp_node = tmp_node->next;
                        }
 
-                       if (linid >= 0) {
+                       if (linid >= 0 && linid <= MAX_LIN_ID) {
                                memcpy(&linc_lin_state->frame_entry[linid], &tmp_fr_entry,
                                        sizeof(struct linc_frame_entry));
                        }
index 503f1d5210ca9fd21fb8cc83cc086aed62128a1b..03ccae16c9025b0fbf75e0749228fea58221b6b8 100644 (file)
@@ -320,8 +320,8 @@ int pcl_lin_init(int tty, struct linc_lin_state *linc_lin_state)
        pkt.seq_frlen = 0x2;
        pkt.ctrl_tiface = PCL_PACKET_LIN_IFACE;
        pkt.ctrl_comc = 0x1F;
-       pkt.parms[0] = pcl_lin_state.baudrate & 0xFF;
-       pkt.parms[1] = (pcl_lin_state.baudrate >> 8) & 0xFF;
+       pkt.parms[0] = linc_lin_state->baudrate & 0xFF;
+       pkt.parms[1] = (linc_lin_state->baudrate >> 8) & 0xFF;
 
        pcl_send_frame(tty, &pkt);
        pcl_read_response(tty);
@@ -451,6 +451,6 @@ int pcl_config(struct linc_lin_state *linc_lin_state)
        pcl_reset_input_mode(tty);
        close(tty);
 
-       return 0;
+       return LIN_EXIT_OK;
 }
 
index f2c24fa3eef4b98033c245cf2e94f78881a3e384..06751c5662249418866af6e524c6361757630087 100644 (file)
@@ -28,6 +28,19 @@ struct sllin_connection {
        char iface[IFNAMSIZ+1];
 };
 
+void sllin_ms_to_timeval(int ms, struct timeval *tv)
+{
+       tv->tv_sec = (int) ms/1000;
+       tv->tv_usec = (ms % 1000) * 1000;
+}
+
+int sllin_cache_config(struct linc_lin_state *linc_lin_state,
+                       struct sllin_connection *sllin_connection)
+{
+
+       return 0;
+}
+
 int sllin_bcm_config(struct linc_lin_state *linc_lin_state,
                        struct sllin_connection *sllin_connection)
 {
@@ -38,8 +51,6 @@ int sllin_bcm_config(struct linc_lin_state *linc_lin_state,
        int ret;
        int i;
 
-       //printf("tty %s to netdevice %s\n", linc_lin_state->dev, sllin_connection->iface);
-
        s = socket(PF_CAN, SOCK_DGRAM, CAN_BCM);
        if (s < 0) {
                perror("socket(): bcmsocket");
@@ -68,24 +79,29 @@ int sllin_bcm_config(struct linc_lin_state *linc_lin_state,
        }
 
        for (i = 0; i < linc_lin_state->scheduler_entries_cnt; i++) {
+               struct timeval time;
                memset(&msg, 0, sizeof(msg));
+
                msg.msg_head.nframes = 1;
                msg.msg_head.opcode = TX_SETUP;
                msg.msg_head.flags |= SETTIMER | STARTTIMER;
-               //msg.msg_head.ival2.tv_sec =  // FIXME
-               msg.msg_head.ival2.tv_usec =
-                       linc_lin_state->scheduler_entry[i].interval_ms * 1000;
-               msg.msg_head.can_id =
-                       linc_lin_state->scheduler_entry[i].lin_id | CAN_RTR_FLAG;
+               sllin_ms_to_timeval(
+                       linc_lin_state->scheduler_entry[i].interval_ms, &time);
+               msg.msg_head.ival2.tv_sec = time.tv_sec;
+               msg.msg_head.ival2.tv_usec = time.tv_usec;
+               msg.msg_head.can_id = (
+                       linc_lin_state->scheduler_entry[i].lin_id | CAN_RTR_FLAG);
                msg.frame.can_dlc = 0;
+               msg.frame.can_id = msg.msg_head.can_id;
+
+               //printf("tv_sec = %i, tv_usec = %i\n", time.tv_sec, time.tv_usec);
 
                sendto(s, &msg, sizeof(msg), 0,
                        (struct sockaddr*)&caddr, sizeof(caddr));
-               printf(".\n");
                //read_response(s); // FIXME
        }
 
-       close(s);
+       /* Do not close "s" to make BCM configuration running */
 
        printf("Configuration finished\n");
        return 0;
@@ -119,7 +135,8 @@ int sllin_config(struct linc_lin_state *linc_lin_state)
                        return -1;
                }
 
-               printf("Attached tty %s to netdevice %s\n", linc_lin_state->dev, sllin_connection.iface);
+               printf("Attached tty %s to netdevice %s\n",
+                       linc_lin_state->dev, sllin_connection.iface);
        }
 
        if (linc_lin_state->flags & SLLIN_DETACH_fl) {
@@ -130,15 +147,22 @@ int sllin_config(struct linc_lin_state *linc_lin_state)
                        return -1;
                }
 
-               printf("Detached sllin line discipline from %s\n", linc_lin_state->dev);
-               return 0;
+               printf("Detached sllin line discipline from %s\n",
+                       linc_lin_state->dev);
+
+               close(tty);
+               return LIN_EXIT_OK;
        }
 
        ret = sllin_bcm_config(linc_lin_state, &sllin_connection);
+       if (ret < 0)
+               return ret;
+
+       ret = sllin_cache_config(linc_lin_state, &sllin_connection);
+
+       /* !!! Do not close "tty" to enable newly
+          configured tty line discipline */
 
-       printf("Press any key to detach %s ...\n", linc_lin_state->dev);
-       getchar();
-       close(tty);
        return ret;
 }