src: use new libosmogsm and include/osmocom/[gsm|core] path to headers
[osmocom-bb.git] / src / host / layer23 / src / misc / app_cell_log.c
1 /* "Application" code of the layer2/3 stack */
2
3 /* (C) 2010 by Andreas Eversberg <jolly@eversberg.eu>
4  *
5  * All Rights Reserved
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  */
22
23 #include <signal.h>
24 #include <stdlib.h>
25 #include <time.h>
26 #include <getopt.h>
27
28 #include <osmocom/bb/common/osmocom_data.h>
29 #include <osmocom/bb/common/l1ctl.h>
30 #include <osmocom/bb/common/l23_app.h>
31 #include <osmocom/bb/common/logging.h>
32 #include <osmocom/bb/common/gps.h>
33 #include <osmocom/bb/misc/cell_log.h>
34
35 #include <osmocom/core/talloc.h>
36 #include <osmocom/core/utils.h>
37
38 extern struct log_target *stderr_target;
39 extern void *l23_ctx;
40
41 char *logname = "/var/log/osmocom.log";
42 int RACH_MAX = 2;
43
44 int _scan_work(struct osmocom_ms *ms)
45 {
46         return 0;
47 }
48
49 int _scan_exit(struct osmocom_ms *ms)
50 {
51         /* in case there is a lockup during exit */
52         signal(SIGINT, SIG_DFL);
53         signal(SIGHUP, SIG_DFL);
54         signal(SIGTERM, SIG_DFL);
55         signal(SIGPIPE, SIG_DFL);
56
57         scan_exit();
58
59         return 0;
60 }
61
62 int l23_app_init(struct osmocom_ms *ms)
63 {
64         int rc;
65
66         srand(time(NULL));
67
68 //      log_parse_category_mask(stderr_target, "DL1C:DRSL:DRR:DGPS:DSUM");
69         log_parse_category_mask(stderr_target, "DSUM");
70         log_set_log_level(stderr_target, LOGL_INFO);
71
72         l23_app_work = _scan_work;
73         l23_app_exit = _scan_exit;
74
75         rc = scan_init(ms);
76         if (rc)
77                 return rc;
78
79         l1ctl_tx_reset_req(ms, L1CTL_RES_T_FULL);
80         printf("Mobile initialized, please start phone now!\n");
81         return 0;
82 }
83
84 static int l23_cfg_supported()
85 {
86         return L23_OPT_TAP | L23_OPT_DBG;
87 }
88
89 static int l23_getopt_options(struct option **options)
90 {
91         static struct option opts [] = {
92                 {"logfile", 1, 0, 'l'},
93                 {"rach", 1, 0, 'r'},
94                 {"no-rach", 1, 0, 'n'},
95 #ifdef _HAVE_GPSD
96                 {"gpsd-host", 1, 0, 'g'},
97                 {"gpsd-port", 1, 0, 'p'},
98 #endif
99                 {"gps", 1, 0, 'g'},
100                 {"baud", 1, 0, 'b'}
101         };
102
103         *options = opts;
104         return ARRAY_SIZE(opts);
105 }
106
107 static int l23_cfg_print_help()
108 {
109         printf("\nApplication specific\n");
110         printf("  -l --logfile LOGFILE  Logfile for the cell log.\n");
111         printf("  -r --rach RACH        Nr. of RACH bursts to send.\n");
112         printf("  -n --no-rach          Send no rach bursts.\n");
113         printf("  -g --gpsd-host HOST   127.0.0.1. gpsd host.\n");
114         printf("  -p --port PORT        2947. gpsd port\n");
115         printf("  -f --gps DEVICE       /dev/ttyACM0. GPS serial device.\n");
116         printf("  -b --baud BAUDRAT     The baud rate of the GPS device\n");
117
118         return 0;
119 }
120
121 static int l23_cfg_handle(int c, const char *optarg)
122 {
123         switch (c) {
124         case 'l':
125                 logname = talloc_strdup(l23_ctx, optarg);
126                 break;
127         case 'r':
128                 RACH_MAX = atoi(optarg);
129                 break;
130         case 'n':
131                 RACH_MAX = 0;
132                 break;
133         case 'g':
134 #ifdef _HAVE_GPSD
135                 snprintf(g.gpsd_host, ARRAY_SIZE(g.gpsd_host), "%s", optarg);
136                 /* force string terminator */
137                 g.gpsd_host[ARRAY_SIZE(g.gpsd_host) - 1] = '\0';
138                 if (g.gps_type != GPS_TYPE_UNDEF)
139                         goto cmd_line_error;
140                 g.gps_type = GPS_TYPE_GPSD;
141                 LOGP(DGPS, LOGL_INFO, "Using gpsd host %s\n", g.gpsd_host);
142 #else
143                 printf("Gpsd support not compiled.\n");
144                 exit(1);
145 #endif
146                 break;
147         case 'p':
148 #ifdef _HAVE_GPSD
149                 snprintf(g.gpsd_port, ARRAY_SIZE(g.gpsd_port), "%s", optarg);
150                 /* force string terminator */
151                 g.gpsd_port[ARRAY_SIZE(g.gpsd_port) - 1] = '\0';
152                 g.gps_type = GPS_TYPE_GPSD;
153                 LOGP(DGPS, LOGL_INFO, "Using gpsd port %s\n", g.gpsd_port);
154 #else
155                 printf("Gpsd support not compiled.\n");
156                 exit(1);
157 #endif
158                 break;
159         case 'f':
160                 snprintf(g.device, ARRAY_SIZE(g.device), "%s", optarg);
161                 /* force string terminator */
162                 g.device[ARRAY_SIZE(g.device) - 1] = '\0';
163                 if (g.gps_type != GPS_TYPE_UNDEF)
164                         goto cmd_line_error;
165                 g.gps_type = GPS_TYPE_SERIAL;
166                 LOGP(DGPS, LOGL_INFO, "Using GPS serial device %s\n", g.device);
167                 break;
168         case 'b':
169                 g.baud = atoi(optarg);
170                 g.gps_type = GPS_TYPE_SERIAL;
171                 LOGP(DGPS, LOGL_INFO, "Setting GPS baudrate to %u\n", g.baud);
172                 break;
173         }
174         return 0;
175
176 cmd_line_error:
177         printf("\nYou can't specify both gpsd and serial gps!!\n\n");
178         exit(1);
179 }
180
181 static struct l23_app_info info = {
182         .copyright      = "Copyright (C) 2010 Andreas Eversberg\n",
183         .getopt_string  = "g:p:l:r:nf:b:",
184         .cfg_supported  = l23_cfg_supported,
185         .cfg_getopt_opt = l23_getopt_options,
186         .cfg_handle_opt = l23_cfg_handle,
187         .cfg_print_help = l23_cfg_print_help,
188 };
189
190 struct l23_app_info *l23_app_info()
191 {
192         return &info;
193 }