1 /* Conversion of logged cells to KML file */
3 /* (C) 2010 by Andreas Eversberg <jolly@eversberg.eu>
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.
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.
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.
26 #include <osmocom/bb/common/osmocom_data.h>
30 extern struct power power;
31 extern struct sysinfo sysinfo;
32 extern struct node_power *node_power_first;
33 extern struct node_power **node_power_last_p;
34 extern struct node_mcc *node_mcc_first;
36 struct node_mcc *get_node_mcc(uint16_t mcc)
38 struct node_mcc *node_mcc;
39 struct node_mcc **node_mcc_p = &node_mcc_first;
41 //printf("add mcc %d\n", mcc);
44 if ((*node_mcc_p)->mcc == mcc)
46 /* insert into list */
47 if ((*node_mcc_p)->mcc > mcc)
49 node_mcc_p = &((*node_mcc_p)->next);
52 //printf("new mcc %d\n", mcc);
53 /* append or insert to list */
54 node_mcc = calloc(1, sizeof(struct node_mcc));
58 node_mcc->next = *node_mcc_p;
59 *node_mcc_p = node_mcc;
63 struct node_mnc *get_node_mnc(struct node_mcc *mcc, uint16_t mnc)
65 struct node_mnc *node_mnc;
66 struct node_mnc **node_mnc_p = &mcc->mnc;
70 if ((*node_mnc_p)->mnc == mnc)
72 /* insert into list */
73 if ((*node_mnc_p)->mnc > mnc)
75 node_mnc_p = &((*node_mnc_p)->next);
78 /* append or insert to list */
79 node_mnc = calloc(1, sizeof(struct node_mnc));
83 node_mnc->next = *node_mnc_p;
84 *node_mnc_p = node_mnc;
88 struct node_lac *get_node_lac(struct node_mnc *mnc, uint16_t lac)
90 struct node_lac *node_lac;
91 struct node_lac **node_lac_p = &mnc->lac;
95 if ((*node_lac_p)->lac == lac)
97 /* insert into list */
98 if ((*node_lac_p)->lac > lac)
100 node_lac_p = &((*node_lac_p)->next);
103 /* append or insert to list */
104 node_lac = calloc(1, sizeof(struct node_lac));
108 node_lac->next = *node_lac_p;
109 *node_lac_p = node_lac;
113 struct node_cell *get_node_cell(struct node_lac *lac, uint16_t cellid)
115 struct node_cell *node_cell;
116 struct node_cell **node_cell_p = &lac->cell;
118 while (*node_cell_p) {
120 if ((*node_cell_p)->cellid == cellid)
122 /* insert into list */
123 if ((*node_cell_p)->cellid > cellid)
125 node_cell_p = &((*node_cell_p)->next);
128 /* append or insert to list */
129 node_cell = calloc(1, sizeof(struct node_cell));
132 node_cell->meas_last_p = &node_cell->meas;
133 node_cell->cellid = cellid;
134 node_cell->next = *node_cell_p;
135 *node_cell_p = node_cell;
139 struct node_meas *add_node_meas(struct node_cell *cell)
141 struct node_meas *node_meas;
144 node_meas = calloc(1, sizeof(struct node_meas));
147 node_meas->gmt = sysinfo.gmt;
148 node_meas->rxlev = sysinfo.rxlev;
149 if (sysinfo.ta_valid) {
150 node_meas->ta_valid = 1;
151 node_meas->ta = sysinfo.ta;
153 if (sysinfo.gps_valid) {
154 node_meas->gps_valid = 1;
155 node_meas->longitude = sysinfo.longitude;
156 node_meas->latitude = sysinfo.latitude;
158 *cell->meas_last_p = node_meas;
159 cell->meas_last_p = &node_meas->next;
163 /* read "<ncc>,<bcc>" */
164 static void read_log_bsic(char *buffer)
169 /* skip first spaces */
170 while (*buffer == ' ')
175 while (*p > ' ' && *p != ',')
178 return; /* no value */
180 bsic = atoi(buffer) << 3;
184 bsic |= atoi(buffer);
189 /* read "<longitude> <latitude>" */
190 static void read_log_pos(char *buffer, double *longitude, double *latitude,
195 /* skip first spaces */
196 while (*buffer == ' ')
204 return; /* no value after longitude */
206 *longitude = atof(buffer);
209 /* skip second spaces */
210 while (*buffer == ' ')
214 *latitude = atof(buffer);
219 /* read "<arfcn> <value> <next value> ...." */
220 static void read_log_power(char *buffer)
225 /* skip first spaces */
226 while (*buffer == ' ')
234 return; /* no value after arfcn */
236 arfcn = atoi(buffer);
241 if (arfcn < 0 || arfcn > 1023)
244 while (*buffer == ' ')
252 power.rxlev[arfcn] = atoi(buffer);
256 power.rxlev[arfcn] = atoi(buffer);
262 /* read "xx xx xx xx xx...." */
263 static void read_log_si(char *buffer, uint8_t *data)
268 // printf("%s ", buffer);
269 for (i = 0; i < 23; i++) {
270 while (*buffer == ' ')
272 if (*buffer >= '0' && *buffer <= '9')
273 si[i] = (*buffer - '0') << 4;
274 else if (*buffer >= 'a' && *buffer <= 'f')
275 si[i] = (*buffer - 'a' + 10) << 4;
276 else if (*buffer >= 'A' && *buffer <= 'F')
277 si[i] = (*buffer - 'A' + 10) << 4;
281 if (*buffer >= '0' && *buffer <= '9')
282 si[i] += *buffer - '0';
283 else if (*buffer >= 'a' && *buffer <= 'f')
284 si[i] += *buffer - 'a' + 10;
285 else if (*buffer >= 'A' && *buffer <= 'F')
286 si[i] += *buffer - 'A' + 10;
290 // printf("%02x ", si[i]);
295 memcpy(data, si, 23);
298 /* read next record from log file */
299 int read_log(FILE *infp)
301 static int type = LOG_TYPE_NONE, ret;
304 memset(&sysinfo, 0, sizeof(sysinfo));
305 memset(&power, 0, sizeof(power));
306 memset(&power.rxlev, -128, sizeof(power.rxlev));
309 return LOG_TYPE_NONE;
311 while (fgets(buffer, sizeof(buffer), infp)) {
312 buffer[sizeof(buffer) - 1] = 0;
314 buffer[strlen(buffer) - 1] = '\0';
315 if (buffer[0] == '[') {
316 if (!strcmp(buffer, "[sysinfo]")) {
318 type = LOG_TYPE_SYSINFO;
319 if (ret != LOG_TYPE_NONE)
322 if (!strcmp(buffer, "[power]")) {
324 type = LOG_TYPE_POWER;
325 if (ret != LOG_TYPE_NONE)
328 type = LOG_TYPE_NONE;
333 case LOG_TYPE_SYSINFO:
334 if (!strncmp(buffer, "arfcn ", 6))
335 sysinfo.arfcn = atoi(buffer + 6);
336 else if (!strncmp(buffer, "si1 ", 4))
337 read_log_si(buffer + 4, sysinfo.si1);
338 else if (!strncmp(buffer, "si2 ", 4))
339 read_log_si(buffer + 4, sysinfo.si2);
340 else if (!strncmp(buffer, "si2bis ", 7))
341 read_log_si(buffer + 7, sysinfo.si2bis);
342 else if (!strncmp(buffer, "si2ter ", 7))
343 read_log_si(buffer + 7, sysinfo.si2ter);
344 else if (!strncmp(buffer, "si3 ", 4))
345 read_log_si(buffer + 4, sysinfo.si3);
346 else if (!strncmp(buffer, "si4 ", 4))
347 read_log_si(buffer + 4, sysinfo.si4);
348 else if (!strncmp(buffer, "time ", 5))
349 sysinfo.gmt = strtoul(buffer + 5, NULL, 0);
350 else if (!strncmp(buffer, "position ", 9))
351 read_log_pos(buffer + 9, &sysinfo.longitude,
352 &sysinfo.latitude, &sysinfo.gps_valid);
353 else if (!strncmp(buffer, "rxlev ", 5))
355 strtoul(buffer + 5, NULL, 0);
356 else if (!strncmp(buffer, "bsic ", 5))
357 read_log_bsic(buffer + 5);
358 else if (!strncmp(buffer, "ta ", 3)) {
359 sysinfo.ta_valid = 1;
360 sysinfo.ta = atoi(buffer + 3);
364 if (!strncmp(buffer, "arfcn ", 6))
365 read_log_power(buffer + 6);
366 else if (!strncmp(buffer, "time ", 5))
367 power.gmt = strtoul(buffer + 5, NULL, 0);
368 else if (!strncmp(buffer, "position ", 9))
369 read_log_pos(buffer + 9, &power.longitude,
370 &power.latitude, &sysinfo.gps_valid);